Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkGrPriv_DEFINED
      9 #define SkGrPriv_DEFINED
     10 
     11 #include "GrTypes.h"
     12 #include "GrBlend.h"
     13 #include "SkImageInfo.h"
     14 #include "SkMatrix.h"
     15 #include "SkXfermode.h"
     16 
     17 class GrCaps;
     18 class GrContext;
     19 class GrFragmentProcessor;
     20 class GrPaint;
     21 class GrTexture;
     22 class GrTextureParams;
     23 class GrUniqueKey;
     24 class SkData;
     25 class SkPaint;
     26 class SkPixelRef;
     27 struct SkIRect;
     28 
     29 /**
     30  *  Our key includes the offset, width, and height so that bitmaps created by extractSubset()
     31  *  are unique.
     32  *
     33  *  The imageID is in the shared namespace (see SkNextID::ImageID())
     34  *      - SkBitmap/SkPixelRef
     35  *      - SkImage
     36  *      - SkImageGenerator
     37  *
     38  *  Note: width/height must fit in 16bits for this impl.
     39  */
     40 void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID, const SkIRect& imageBounds);
     41 
     42 /** Call this after installing a GrUniqueKey on texture. It will cause the texture's key to be
     43     removed should the bitmap's contents change or be destroyed. */
     44 void GrInstallBitmapUniqueKeyInvalidator(const GrUniqueKey& key, SkPixelRef* pixelRef);
     45 
     46 /** Converts an SkPaint to a GrPaint for a given GrContext. The matrix is required in order
     47     to convert the SkShader (if any) on the SkPaint. The primitive itself has no color. */
     48 bool SkPaintToGrPaint(GrContext*,
     49                       const SkPaint& skPaint,
     50                       const SkMatrix& viewM,
     51                       GrPaint* grPaint);
     52 
     53 /** Same as above but ignores the SkShader (if any) on skPaint. */
     54 bool SkPaintToGrPaintNoShader(GrContext* context,
     55                               const SkPaint& skPaint,
     56                               GrPaint* grPaint);
     57 
     58 /** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProcessor. The processor
     59     should expect an unpremul input color and produce a premultiplied output color. There is
     60     no primitive color. */
     61 bool SkPaintToGrPaintReplaceShader(GrContext*,
     62                                    const SkPaint& skPaint,
     63                                    const GrFragmentProcessor* shaderFP,
     64                                    GrPaint* grPaint);
     65 
     66 /** Blends the SkPaint's shader (or color if no shader) with the color which specified via a
     67     GrBatch's GrPrimitiveProcesssor. Currently there is a bool param to indicate whether the
     68     primitive color is the dst or src color to the blend in order to work around differences between
     69     drawVertices and drawAtlas. */
     70 bool SkPaintToGrPaintWithXfermode(GrContext* context,
     71                                   const SkPaint& skPaint,
     72                                   const SkMatrix& viewM,
     73                                   SkXfermode::Mode primColorMode,
     74                                   bool primitiveIsSrc,
     75                                   GrPaint* grPaint);
     76 
     77 /** This is used when there is a primitive color, but the shader should be ignored. Currently,
     78     the expectation is that the primitive color will be premultiplied, though it really should be
     79     unpremultiplied so that interpolation is done in unpremul space. The paint's alpha will be
     80     applied to the primitive color after interpolation. */
     81 inline bool SkPaintToGrPaintWithPrimitiveColor(GrContext* context, const SkPaint& skPaint,
     82                                                GrPaint* grPaint) {
     83     return SkPaintToGrPaintWithXfermode(context, skPaint, SkMatrix::I(), SkXfermode::kDst_Mode,
     84                                         false, grPaint);
     85 }
     86 
     87 /** This is used when there may or may not be a shader, and the caller wants to plugin a texture
     88     lookup.  If there is a shader, then its output will only be used if the texture is alpha8. */
     89 bool SkPaintToGrPaintWithTexture(GrContext* context,
     90                                  const SkPaint& paint,
     91                                  const SkMatrix& viewM,
     92                                  const GrFragmentProcessor* fp,
     93                                  bool textureIsAlphaOnly,
     94                                  GrPaint* grPaint);
     95 
     96 //////////////////////////////////////////////////////////////////////////////
     97 
     98 GrSurfaceDesc GrImageInfoToSurfaceDesc(const SkImageInfo&);
     99 
    100 bool GrPixelConfig2ColorAndProfileType(GrPixelConfig, SkColorType*, SkColorProfileType*);
    101 
    102 /**
    103  *  If the compressed data in the SkData is supported (as a texture format, this returns
    104  *  the pixel-config that should be used, and sets outStartOfDataToUpload to the ptr into
    105  *  the data where the actual raw data starts (skipping any header bytes).
    106  *
    107  *  If the compressed data is not supported, this returns kUnknown_GrPixelConfig, and
    108  *  ignores outStartOfDataToUpload.
    109  */
    110 GrPixelConfig GrIsCompressedTextureDataSupported(GrContext* ctx, SkData* data,
    111                                                  int expectedW, int expectedH,
    112                                                  const void** outStartOfDataToUpload);
    113 
    114 
    115 /**
    116  * Creates a new texture for the bitmap. Does not concern itself with cache keys or texture params.
    117  * The bitmap must have CPU-accessible pixels. Attempts to take advantage of faster paths for
    118  * compressed textures and yuv planes.
    119  */
    120 GrTexture* GrUploadBitmapToTexture(GrContext*, const SkBitmap&);
    121 
    122 //////////////////////////////////////////////////////////////////////////////
    123 
    124 GR_STATIC_ASSERT((int)kZero_GrBlendCoeff == (int)SkXfermode::kZero_Coeff);
    125 GR_STATIC_ASSERT((int)kOne_GrBlendCoeff == (int)SkXfermode::kOne_Coeff);
    126 GR_STATIC_ASSERT((int)kSC_GrBlendCoeff == (int)SkXfermode::kSC_Coeff);
    127 GR_STATIC_ASSERT((int)kISC_GrBlendCoeff == (int)SkXfermode::kISC_Coeff);
    128 GR_STATIC_ASSERT((int)kDC_GrBlendCoeff == (int)SkXfermode::kDC_Coeff);
    129 GR_STATIC_ASSERT((int)kIDC_GrBlendCoeff == (int)SkXfermode::kIDC_Coeff);
    130 GR_STATIC_ASSERT((int)kSA_GrBlendCoeff == (int)SkXfermode::kSA_Coeff);
    131 GR_STATIC_ASSERT((int)kISA_GrBlendCoeff == (int)SkXfermode::kISA_Coeff);
    132 GR_STATIC_ASSERT((int)kDA_GrBlendCoeff == (int)SkXfermode::kDA_Coeff);
    133 GR_STATIC_ASSERT((int)kIDA_GrBlendCoeff == (int)SkXfermode::kIDA_Coeff);
    134 GR_STATIC_ASSERT(SkXfermode::kCoeffCount == 10);
    135 
    136 #define SkXfermodeCoeffToGrBlendCoeff(X) ((GrBlendCoeff)(X))
    137 
    138 #endif
    139