Home | History | Annotate | Download | only in pipe
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 
     11 #ifndef SkGPipePriv_DEFINED
     12 #define SkGPipePriv_DEFINED
     13 
     14 #include "SkTypes.h"
     15 
     16 #define UNIMPLEMENTED
     17 
     18 // these must be contiguous, 0...N-1
     19 enum PaintFlats {
     20     kColorFilter_PaintFlat,
     21     kDrawLooper_PaintFlat,
     22     kImageFilter_PaintFlat,
     23     kMaskFilter_PaintFlat,
     24     kPathEffect_PaintFlat,
     25     kRasterizer_PaintFlat,
     26     kShader_PaintFlat,
     27     kXfermode_PaintFlat,
     28 
     29     kLast_PaintFlat = kXfermode_PaintFlat
     30 };
     31 #define kCount_PaintFlats   (kLast_PaintFlat + 1)
     32 
     33 enum DrawOps {
     34     kSkip_DrawOp,   // skip an addition N bytes (N == data)
     35 
     36     // these match Canvas apis
     37     kClipPath_DrawOp,
     38     kClipRegion_DrawOp,
     39     kClipRect_DrawOp,
     40     kClipRRect_DrawOp,
     41     kConcat_DrawOp,
     42     kDrawBitmap_DrawOp,
     43     kDrawBitmapNine_DrawOp,
     44     kDrawBitmapRectToRect_DrawOp,
     45     kDrawDRRect_DrawOp,
     46     kDrawImage_DrawOp,
     47     kDrawImageRect_DrawOp,
     48     kDrawOval_DrawOp,
     49     kDrawPaint_DrawOp,
     50     kDrawPatch_DrawOp,
     51     kDrawPath_DrawOp,
     52     kDrawPicture_DrawOp,
     53     kDrawPoints_DrawOp,
     54     kDrawPosText_DrawOp,
     55     kDrawPosTextH_DrawOp,
     56     kDrawRect_DrawOp,
     57     kDrawRRect_DrawOp,
     58     kDrawSprite_DrawOp,
     59     kDrawText_DrawOp,
     60     kDrawTextBlob_DrawOp,
     61     kDrawTextOnPath_DrawOp,
     62     kDrawVertices_DrawOp,
     63     kRestore_DrawOp,
     64     kRotate_DrawOp,
     65     kSave_DrawOp,
     66     kSaveLayer_DrawOp,
     67     kScale_DrawOp,
     68     kSetMatrix_DrawOp,
     69     kSkew_DrawOp,
     70     kTranslate_DrawOp,
     71 
     72     kPaintOp_DrawOp,
     73     kSetTypeface_DrawOp,
     74     kSetAnnotation_DrawOp,
     75 
     76     kDef_Typeface_DrawOp,
     77     kDef_Flattenable_DrawOp,
     78     kDef_Bitmap_DrawOp,
     79     kDef_Factory_DrawOp,
     80 
     81     // these are signals to playback, not drawing verbs
     82     kReportFlags_DrawOp,
     83     kShareBitmapHeap_DrawOp,
     84     kShareImageHeap_DrawOp,
     85     kDone_DrawOp,
     86 };
     87 
     88 /**
     89  *  DrawOp packs into a 32bit int as follows
     90  *
     91  *  DrawOp:8 - Flags:4 - Data:20
     92  *
     93  *  Flags and Data are called out separately, so we can reuse Data between
     94  *  different Ops that might have different Flags. e.g. Data might be a Paint
     95  *  index for both drawRect (no flags) and saveLayer (does have flags).
     96  *
     97  *  All Ops that take a SkPaint use their Data field to store the index to
     98  *  the paint (previously defined with kPaintOp_DrawOp).
     99  */
    100 
    101 #define DRAWOPS_OP_BITS     8
    102 #define DRAWOPS_FLAG_BITS   4
    103 #define DRAWOPS_DATA_BITS   20
    104 
    105 #define DRAWOPS_OP_MASK     ((1 << DRAWOPS_OP_BITS) - 1)
    106 #define DRAWOPS_FLAG_MASK   ((1 << DRAWOPS_FLAG_BITS) - 1)
    107 #define DRAWOPS_DATA_MASK   ((1 << DRAWOPS_DATA_BITS) - 1)
    108 
    109 static inline unsigned DrawOp_unpackOp(uint32_t op32) {
    110     return (op32 >> (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS));
    111 }
    112 
    113 static inline unsigned DrawOp_unpackFlags(uint32_t op32) {
    114     return (op32 >> DRAWOPS_DATA_BITS) & DRAWOPS_FLAG_MASK;
    115 }
    116 
    117 static inline unsigned DrawOp_unpackData(uint32_t op32) {
    118     return op32 & DRAWOPS_DATA_MASK;
    119 }
    120 
    121 static inline uint32_t DrawOp_packOpFlagData(DrawOps op, unsigned flags, unsigned data) {
    122     SkASSERT(0 == (op & ~DRAWOPS_OP_MASK));
    123     SkASSERT(0 == (flags & ~DRAWOPS_FLAG_MASK));
    124     SkASSERT(0 == (data & ~DRAWOPS_DATA_MASK));
    125 
    126     return (op << (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)) |
    127            (flags << DRAWOPS_DATA_BITS) |
    128             data;
    129 }
    130 
    131 /** DrawOp specific flag bits
    132  */
    133 
    134 enum {
    135     kSaveLayer_HasBounds_DrawOpFlag = 1 << 0,
    136     kSaveLayer_HasPaint_DrawOpFlag = 1 << 1,
    137 };
    138 enum {
    139     kDrawTextOnPath_HasMatrix_DrawOpFlag = 1 << 0
    140 };
    141 enum {
    142     kDrawVertices_HasTexs_DrawOpFlag     = 1 << 0,
    143     kDrawVertices_HasColors_DrawOpFlag   = 1 << 1,
    144     kDrawVertices_HasIndices_DrawOpFlag  = 1 << 2,
    145     kDrawVertices_HasXfermode_DrawOpFlag = 1 << 3,
    146 };
    147 // These are shared between drawbitmap and drawimage
    148 enum {
    149     kDrawBitmap_HasPaint_DrawOpFlag   = 1 << 0,
    150     // Specific to drawBitmapRect, but needs to be different from HasPaint,
    151     // which is used for all drawBitmap calls, so include it here.
    152     kDrawBitmap_HasSrcRect_DrawOpFlag = 1 << 1,
    153     // SkCanvas::DrawBitmapRectFlags::kBleed_DrawBitmapRectFlag is
    154     // converted into and out of this flag to save space
    155     kDrawBitmap_Bleed_DrawOpFlag      = 1 << 2,
    156 };
    157 enum {
    158     kClip_HasAntiAlias_DrawOpFlag = 1 << 0,
    159 };
    160 ///////////////////////////////////////////////////////////////////////////////
    161 
    162 class BitmapInfo : SkNoncopyable {
    163 public:
    164     BitmapInfo(SkBitmap* bitmap, uint32_t genID, int toBeDrawnCount)
    165         : fBitmap(bitmap)
    166         , fGenID(genID)
    167         , fBytesAllocated(0)
    168         , fMoreRecentlyUsed(NULL)
    169         , fLessRecentlyUsed(NULL)
    170         , fToBeDrawnCount(toBeDrawnCount)
    171     {}
    172 
    173     ~BitmapInfo() {
    174         SkASSERT(0 == fToBeDrawnCount);
    175         SkDELETE(fBitmap);
    176     }
    177 
    178     void addDraws(int drawsToAdd) {
    179         if (0 == fToBeDrawnCount) {
    180             // The readers will only ever decrement the count, so once the
    181             // count is zero, the writer will be the only one modifying it,
    182             // so it does not need to be an atomic operation.
    183             fToBeDrawnCount = drawsToAdd;
    184         } else {
    185             sk_atomic_add(&fToBeDrawnCount, drawsToAdd);
    186         }
    187     }
    188 
    189     void decDraws() {
    190         sk_atomic_dec(&fToBeDrawnCount);
    191     }
    192 
    193     int drawCount() const {
    194         return fToBeDrawnCount;
    195     }
    196 
    197     SkBitmap* fBitmap;
    198     // Store the generation ID of the original bitmap, since copying does
    199     // not copy this field, so fBitmap's generation ID will not be useful
    200     // for comparing.
    201     // FIXME: Is it reasonable to make copying a bitmap/pixelref copy the
    202     // generation ID?
    203     uint32_t fGenID;
    204     // Keep track of the bytes allocated for this bitmap. When replacing the
    205     // bitmap or removing this BitmapInfo we know how much memory has been
    206     // reclaimed.
    207     size_t fBytesAllocated;
    208     // TODO: Generalize the LRU caching mechanism
    209     BitmapInfo* fMoreRecentlyUsed;
    210     BitmapInfo* fLessRecentlyUsed;
    211 private:
    212     int      fToBeDrawnCount;
    213 };
    214 
    215 static inline bool shouldFlattenBitmaps(uint32_t flags) {
    216     return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag
    217             && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag));
    218 }
    219 
    220 class SkImageHeap : public SkRefCnt {
    221 public:
    222     SkImageHeap();
    223     virtual ~SkImageHeap();
    224 
    225     // slot must be "valid" -- 0 is never valid
    226     const SkImage* get(int32_t slot) const;
    227     // returns 0 if not found, else returns slot
    228     int32_t find(const SkImage*) const;
    229     // returns non-zero value for where the image was stored
    230     int32_t insert(const SkImage*);
    231 
    232 private:
    233     SkTDArray<const SkImage*> fArray;
    234 };
    235 
    236 ///////////////////////////////////////////////////////////////////////////////
    237 
    238 enum PaintOps {
    239     kReset_PaintOp,     // no arg
    240 
    241     kFlags_PaintOp,     // arg inline
    242     kColor_PaintOp,     // arg 32
    243     kFilterLevel_PaintOp,   // arg inline
    244     kStyle_PaintOp,     // arg inline
    245     kJoin_PaintOp,      // arg inline
    246     kCap_PaintOp,       // arg inline
    247     kWidth_PaintOp,     // arg scalar
    248     kMiter_PaintOp,     // arg scalar
    249 
    250     kEncoding_PaintOp,  // arg inline - text
    251     kHinting_PaintOp,   // arg inline - text
    252     kAlign_PaintOp,     // arg inline - text
    253     kTextSize_PaintOp,  // arg scalar - text
    254     kTextScaleX_PaintOp,// arg scalar - text
    255     kTextSkewX_PaintOp, // arg scalar - text
    256     kTypeface_PaintOp,  // arg inline (index) - text
    257 
    258     kFlatIndex_PaintOp, // flags=paintflat, data=index
    259 };
    260 
    261 #define PAINTOPS_OP_BITS     8
    262 #define PAINTOPS_FLAG_BITS   4
    263 #define PAINTOPS_DATA_BITS   20
    264 
    265 #define PAINTOPS_OP_MASK     ((1 << PAINTOPS_OP_BITS) - 1)
    266 #define PAINTOPS_FLAG_MASK   ((1 << PAINTOPS_FLAG_BITS) - 1)
    267 #define PAINTOPS_DATA_MASK   ((1 << PAINTOPS_DATA_BITS) - 1)
    268 
    269 static inline unsigned PaintOp_unpackOp(uint32_t op32) {
    270     return (op32 >> (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS));
    271 }
    272 
    273 static inline unsigned PaintOp_unpackFlags(uint32_t op32) {
    274     return (op32 >> PAINTOPS_DATA_BITS) & PAINTOPS_FLAG_MASK;
    275 }
    276 
    277 static inline unsigned PaintOp_unpackData(uint32_t op32) {
    278     return op32 & PAINTOPS_DATA_MASK;
    279 }
    280 
    281 static inline uint32_t PaintOp_packOp(PaintOps op) {
    282     SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
    283 
    284     return op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS);
    285 }
    286 
    287 static inline uint32_t PaintOp_packOpData(PaintOps op, unsigned data) {
    288     SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
    289     SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
    290 
    291     return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | data;
    292 }
    293 
    294 static inline uint32_t PaintOp_packOpFlagData(PaintOps op, unsigned flags, unsigned data) {
    295     SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
    296     SkASSERT(0 == (flags & ~PAINTOPS_FLAG_MASK));
    297     SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
    298 
    299     return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) |
    300     (flags << PAINTOPS_DATA_BITS) |
    301     data;
    302 }
    303 
    304 #endif
    305