gfx/skia/trunk/src/pipe/SkGPipePriv.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/pipe/SkGPipePriv.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,287 @@
     1.4 +
     1.5 +/*
     1.6 + * Copyright 2011 Google Inc.
     1.7 + *
     1.8 + * Use of this source code is governed by a BSD-style license that can be
     1.9 + * found in the LICENSE file.
    1.10 + */
    1.11 +
    1.12 +
    1.13 +
    1.14 +#ifndef SkGPipePriv_DEFINED
    1.15 +#define SkGPipePriv_DEFINED
    1.16 +
    1.17 +#include "SkTypes.h"
    1.18 +
    1.19 +#define UNIMPLEMENTED
    1.20 +
    1.21 +// these must be contiguous, 0...N-1
    1.22 +enum PaintFlats {
    1.23 +    kColorFilter_PaintFlat,
    1.24 +    kDrawLooper_PaintFlat,
    1.25 +    kImageFilter_PaintFlat,
    1.26 +    kMaskFilter_PaintFlat,
    1.27 +    kPathEffect_PaintFlat,
    1.28 +    kRasterizer_PaintFlat,
    1.29 +    kShader_PaintFlat,
    1.30 +    kXfermode_PaintFlat,
    1.31 +
    1.32 +    kLast_PaintFlat = kXfermode_PaintFlat
    1.33 +};
    1.34 +#define kCount_PaintFlats   (kLast_PaintFlat + 1)
    1.35 +
    1.36 +enum DrawOps {
    1.37 +    kSkip_DrawOp,   // skip an addition N bytes (N == data)
    1.38 +
    1.39 +    // these match Canvas apis
    1.40 +    kClipPath_DrawOp,
    1.41 +    kClipRegion_DrawOp,
    1.42 +    kClipRect_DrawOp,
    1.43 +    kClipRRect_DrawOp,
    1.44 +    kConcat_DrawOp,
    1.45 +    kDrawBitmap_DrawOp,
    1.46 +    kDrawBitmapMatrix_DrawOp,
    1.47 +    kDrawBitmapNine_DrawOp,
    1.48 +    kDrawBitmapRectToRect_DrawOp,
    1.49 +    kDrawClear_DrawOp,
    1.50 +    kDrawData_DrawOp,
    1.51 +    kDrawDRRect_DrawOp,
    1.52 +    kDrawOval_DrawOp,
    1.53 +    kDrawPaint_DrawOp,
    1.54 +    kDrawPath_DrawOp,
    1.55 +    kDrawPicture_DrawOp,
    1.56 +    kDrawPoints_DrawOp,
    1.57 +    kDrawPosText_DrawOp,
    1.58 +    kDrawPosTextH_DrawOp,
    1.59 +    kDrawRect_DrawOp,
    1.60 +    kDrawRRect_DrawOp,
    1.61 +    kDrawSprite_DrawOp,
    1.62 +    kDrawText_DrawOp,
    1.63 +    kDrawTextOnPath_DrawOp,
    1.64 +    kDrawVertices_DrawOp,
    1.65 +    kRestore_DrawOp,
    1.66 +    kRotate_DrawOp,
    1.67 +    kSave_DrawOp,
    1.68 +    kSaveLayer_DrawOp,
    1.69 +    kScale_DrawOp,
    1.70 +    kSetMatrix_DrawOp,
    1.71 +    kSkew_DrawOp,
    1.72 +    kTranslate_DrawOp,
    1.73 +
    1.74 +    kPaintOp_DrawOp,
    1.75 +    kSetTypeface_DrawOp,
    1.76 +    kSetAnnotation_DrawOp,
    1.77 +
    1.78 +    kDef_Typeface_DrawOp,
    1.79 +    kDef_Flattenable_DrawOp,
    1.80 +    kDef_Bitmap_DrawOp,
    1.81 +    kDef_Factory_DrawOp,
    1.82 +
    1.83 +    // these are signals to playback, not drawing verbs
    1.84 +    kReportFlags_DrawOp,
    1.85 +    kShareBitmapHeap_DrawOp,
    1.86 +    kDone_DrawOp,
    1.87 +};
    1.88 +
    1.89 +/**
    1.90 + *  DrawOp packs into a 32bit int as follows
    1.91 + *
    1.92 + *  DrawOp:8 - Flags:4 - Data:20
    1.93 + *
    1.94 + *  Flags and Data are called out separately, so we can reuse Data between
    1.95 + *  different Ops that might have different Flags. e.g. Data might be a Paint
    1.96 + *  index for both drawRect (no flags) and saveLayer (does have flags).
    1.97 + *
    1.98 + *  All Ops that take a SkPaint use their Data field to store the index to
    1.99 + *  the paint (previously defined with kPaintOp_DrawOp).
   1.100 + */
   1.101 +
   1.102 +#define DRAWOPS_OP_BITS     8
   1.103 +#define DRAWOPS_FLAG_BITS   4
   1.104 +#define DRAWOPS_DATA_BITS   20
   1.105 +
   1.106 +#define DRAWOPS_OP_MASK     ((1 << DRAWOPS_OP_BITS) - 1)
   1.107 +#define DRAWOPS_FLAG_MASK   ((1 << DRAWOPS_FLAG_BITS) - 1)
   1.108 +#define DRAWOPS_DATA_MASK   ((1 << DRAWOPS_DATA_BITS) - 1)
   1.109 +
   1.110 +static inline unsigned DrawOp_unpackOp(uint32_t op32) {
   1.111 +    return (op32 >> (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS));
   1.112 +}
   1.113 +
   1.114 +static inline unsigned DrawOp_unpackFlags(uint32_t op32) {
   1.115 +    return (op32 >> DRAWOPS_DATA_BITS) & DRAWOPS_FLAG_MASK;
   1.116 +}
   1.117 +
   1.118 +static inline unsigned DrawOp_unpackData(uint32_t op32) {
   1.119 +    return op32 & DRAWOPS_DATA_MASK;
   1.120 +}
   1.121 +
   1.122 +static inline uint32_t DrawOp_packOpFlagData(DrawOps op, unsigned flags, unsigned data) {
   1.123 +    SkASSERT(0 == (op & ~DRAWOPS_OP_MASK));
   1.124 +    SkASSERT(0 == (flags & ~DRAWOPS_FLAG_MASK));
   1.125 +    SkASSERT(0 == (data & ~DRAWOPS_DATA_MASK));
   1.126 +
   1.127 +    return (op << (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)) |
   1.128 +           (flags << DRAWOPS_DATA_BITS) |
   1.129 +            data;
   1.130 +}
   1.131 +
   1.132 +/** DrawOp specific flag bits
   1.133 + */
   1.134 +
   1.135 +enum {
   1.136 +    kSaveLayer_HasBounds_DrawOpFlag = 1 << 0,
   1.137 +    kSaveLayer_HasPaint_DrawOpFlag = 1 << 1,
   1.138 +};
   1.139 +enum {
   1.140 +    kClear_HasColor_DrawOpFlag  = 1 << 0
   1.141 +};
   1.142 +enum {
   1.143 +    kDrawTextOnPath_HasMatrix_DrawOpFlag = 1 << 0
   1.144 +};
   1.145 +enum {
   1.146 +    kDrawVertices_HasTexs_DrawOpFlag     = 1 << 0,
   1.147 +    kDrawVertices_HasColors_DrawOpFlag   = 1 << 1,
   1.148 +    kDrawVertices_HasIndices_DrawOpFlag  = 1 << 2,
   1.149 +    kDrawVertices_HasXfermode_DrawOpFlag = 1 << 3,
   1.150 +};
   1.151 +enum {
   1.152 +    kDrawBitmap_HasPaint_DrawOpFlag   = 1 << 0,
   1.153 +    // Specific to drawBitmapRect, but needs to be different from HasPaint,
   1.154 +    // which is used for all drawBitmap calls, so include it here.
   1.155 +    kDrawBitmap_HasSrcRect_DrawOpFlag = 1 << 1,
   1.156 +    // SkCanvas::DrawBitmapRectFlags::kBleed_DrawBitmapRectFlag is
   1.157 +    // converted into and out of this flag to save space
   1.158 +    kDrawBitmap_Bleed_DrawOpFlag      = 1 << 2,
   1.159 +};
   1.160 +enum {
   1.161 +    kClip_HasAntiAlias_DrawOpFlag = 1 << 0,
   1.162 +};
   1.163 +///////////////////////////////////////////////////////////////////////////////
   1.164 +
   1.165 +class BitmapInfo : SkNoncopyable {
   1.166 +public:
   1.167 +    BitmapInfo(SkBitmap* bitmap, uint32_t genID, int toBeDrawnCount)
   1.168 +        : fBitmap(bitmap)
   1.169 +        , fGenID(genID)
   1.170 +        , fBytesAllocated(0)
   1.171 +        , fMoreRecentlyUsed(NULL)
   1.172 +        , fLessRecentlyUsed(NULL)
   1.173 +        , fToBeDrawnCount(toBeDrawnCount)
   1.174 +    {}
   1.175 +
   1.176 +    ~BitmapInfo() {
   1.177 +        SkASSERT(0 == fToBeDrawnCount);
   1.178 +        SkDELETE(fBitmap);
   1.179 +    }
   1.180 +
   1.181 +    void addDraws(int drawsToAdd) {
   1.182 +        if (0 == fToBeDrawnCount) {
   1.183 +            // The readers will only ever decrement the count, so once the
   1.184 +            // count is zero, the writer will be the only one modifying it,
   1.185 +            // so it does not need to be an atomic operation.
   1.186 +            fToBeDrawnCount = drawsToAdd;
   1.187 +        } else {
   1.188 +            sk_atomic_add(&fToBeDrawnCount, drawsToAdd);
   1.189 +        }
   1.190 +    }
   1.191 +
   1.192 +    void decDraws() {
   1.193 +        sk_atomic_dec(&fToBeDrawnCount);
   1.194 +    }
   1.195 +
   1.196 +    int drawCount() const {
   1.197 +        return fToBeDrawnCount;
   1.198 +    }
   1.199 +
   1.200 +    SkBitmap* fBitmap;
   1.201 +    // Store the generation ID of the original bitmap, since copying does
   1.202 +    // not copy this field, so fBitmap's generation ID will not be useful
   1.203 +    // for comparing.
   1.204 +    // FIXME: Is it reasonable to make copying a bitmap/pixelref copy the
   1.205 +    // generation ID?
   1.206 +    uint32_t fGenID;
   1.207 +    // Keep track of the bytes allocated for this bitmap. When replacing the
   1.208 +    // bitmap or removing this BitmapInfo we know how much memory has been
   1.209 +    // reclaimed.
   1.210 +    size_t fBytesAllocated;
   1.211 +    // TODO: Generalize the LRU caching mechanism
   1.212 +    BitmapInfo* fMoreRecentlyUsed;
   1.213 +    BitmapInfo* fLessRecentlyUsed;
   1.214 +private:
   1.215 +    int      fToBeDrawnCount;
   1.216 +};
   1.217 +
   1.218 +static inline bool shouldFlattenBitmaps(uint32_t flags) {
   1.219 +    return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag
   1.220 +            && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag));
   1.221 +}
   1.222 +
   1.223 +///////////////////////////////////////////////////////////////////////////////
   1.224 +
   1.225 +enum PaintOps {
   1.226 +    kReset_PaintOp,     // no arg
   1.227 +
   1.228 +    kFlags_PaintOp,     // arg inline
   1.229 +    kColor_PaintOp,     // arg 32
   1.230 +    kStyle_PaintOp,     // arg inline
   1.231 +    kJoin_PaintOp,      // arg inline
   1.232 +    kCap_PaintOp,       // arg inline
   1.233 +    kWidth_PaintOp,     // arg scalar
   1.234 +    kMiter_PaintOp,     // arg scalar
   1.235 +
   1.236 +    kEncoding_PaintOp,  // arg inline - text
   1.237 +    kHinting_PaintOp,   // arg inline - text
   1.238 +    kAlign_PaintOp,     // arg inline - text
   1.239 +    kTextSize_PaintOp,  // arg scalar - text
   1.240 +    kTextScaleX_PaintOp,// arg scalar - text
   1.241 +    kTextSkewX_PaintOp, // arg scalar - text
   1.242 +    kTypeface_PaintOp,  // arg inline (index) - text
   1.243 +
   1.244 +    kFlatIndex_PaintOp, // flags=paintflat, data=index
   1.245 +};
   1.246 +
   1.247 +#define PAINTOPS_OP_BITS     8
   1.248 +#define PAINTOPS_FLAG_BITS   4
   1.249 +#define PAINTOPS_DATA_BITS   20
   1.250 +
   1.251 +#define PAINTOPS_OP_MASK     ((1 << PAINTOPS_OP_BITS) - 1)
   1.252 +#define PAINTOPS_FLAG_MASK   ((1 << PAINTOPS_FLAG_BITS) - 1)
   1.253 +#define PAINTOPS_DATA_MASK   ((1 << PAINTOPS_DATA_BITS) - 1)
   1.254 +
   1.255 +static inline unsigned PaintOp_unpackOp(uint32_t op32) {
   1.256 +    return (op32 >> (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS));
   1.257 +}
   1.258 +
   1.259 +static inline unsigned PaintOp_unpackFlags(uint32_t op32) {
   1.260 +    return (op32 >> PAINTOPS_DATA_BITS) & PAINTOPS_FLAG_MASK;
   1.261 +}
   1.262 +
   1.263 +static inline unsigned PaintOp_unpackData(uint32_t op32) {
   1.264 +    return op32 & PAINTOPS_DATA_MASK;
   1.265 +}
   1.266 +
   1.267 +static inline uint32_t PaintOp_packOp(PaintOps op) {
   1.268 +    SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
   1.269 +
   1.270 +    return op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS);
   1.271 +}
   1.272 +
   1.273 +static inline uint32_t PaintOp_packOpData(PaintOps op, unsigned data) {
   1.274 +    SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
   1.275 +    SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
   1.276 +
   1.277 +    return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | data;
   1.278 +}
   1.279 +
   1.280 +static inline uint32_t PaintOp_packOpFlagData(PaintOps op, unsigned flags, unsigned data) {
   1.281 +    SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
   1.282 +    SkASSERT(0 == (flags & ~PAINTOPS_FLAG_MASK));
   1.283 +    SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
   1.284 +
   1.285 +    return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) |
   1.286 +    (flags << PAINTOPS_DATA_BITS) |
   1.287 +    data;
   1.288 +}
   1.289 +
   1.290 +#endif

mercurial