Home | History | Annotate | Download | only in core
      1 #include "SkPictureFlat.h"
      2 
      3 #include "SkColorFilter.h"
      4 #include "SkDrawLooper.h"
      5 #include "SkMaskFilter.h"
      6 #include "SkRasterizer.h"
      7 #include "SkShader.h"
      8 #include "SkTypeface.h"
      9 #include "SkXfermode.h"
     10 
     11 SkFlatData* SkFlatData::Alloc(SkChunkAlloc* heap, int32_t size, int index) {
     12     SkFlatData* result = (SkFlatData*) heap->allocThrow(size + sizeof(SkFlatData));
     13     result->fIndex = index;
     14     result->fAllocSize = size + sizeof(result->fAllocSize);
     15     return result;
     16 }
     17 
     18 SkFlatBitmap* SkFlatBitmap::Flatten(SkChunkAlloc* heap, const SkBitmap& bitmap,
     19                                     int index, SkRefCntRecorder* rec) {
     20     SkFlattenableWriteBuffer buffer(1024);
     21     buffer.setRefCntRecorder(rec);
     22 
     23     bitmap.flatten(buffer);
     24     size_t size = buffer.size();
     25     SkFlatBitmap* result = (SkFlatBitmap*) INHERITED::Alloc(heap, size, index);
     26     buffer.flatten(result->fBitmapData);
     27     return result;
     28 }
     29 
     30 SkFlatMatrix* SkFlatMatrix::Flatten(SkChunkAlloc* heap, const SkMatrix& matrix, int index) {
     31     int32_t size = sizeof(SkMatrix);
     32     SkFlatMatrix* result = (SkFlatMatrix*) INHERITED::Alloc(heap, size, index);
     33     memcpy(&result->fMatrixData, &matrix, sizeof(SkMatrix));
     34     return result;
     35 }
     36 
     37 #ifdef SK_DEBUG_DUMP
     38 void SkFlatMatrix::dump() const {
     39     const SkMatrix* matrix = (const SkMatrix*) fMatrixData;
     40     char pBuffer[DUMP_BUFFER_SIZE];
     41     char* bufferPtr = pBuffer;
     42     bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     43     "matrix: ");
     44     SkScalar scaleX = matrix->getScaleX();
     45     SkMatrix defaultMatrix;
     46     defaultMatrix.reset();
     47     if (scaleX != defaultMatrix.getScaleX())
     48         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     49             "scaleX:%g ", SkScalarToFloat(scaleX));
     50     SkScalar scaleY = matrix->getScaleY();
     51     if (scaleY != defaultMatrix.getScaleY())
     52         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     53             "scaleY:%g ", SkScalarToFloat(scaleY));
     54     SkScalar skewX = matrix->getSkewX();
     55     if (skewX != defaultMatrix.getSkewX())
     56         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     57             "skewX:%g ", SkScalarToFloat(skewX));
     58     SkScalar skewY = matrix->getSkewY();
     59     if (skewY != defaultMatrix.getSkewY())
     60         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     61             "skewY:%g ", SkScalarToFloat(skewY));
     62     SkScalar translateX = matrix->getTranslateX();
     63     if (translateX != defaultMatrix.getTranslateX())
     64         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     65             "translateX:%g ", SkScalarToFloat(translateX));
     66     SkScalar translateY = matrix->getTranslateY();
     67     if (translateY != defaultMatrix.getTranslateY())
     68         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     69             "translateY:%g ", SkScalarToFloat(translateY));
     70     SkScalar perspX = matrix->getPerspX();
     71     if (perspX != defaultMatrix.getPerspX())
     72         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     73             "perspX:%g ", SkFractToFloat(perspX));
     74     SkScalar perspY = matrix->getPerspY();
     75     if (perspY != defaultMatrix.getPerspY())
     76         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
     77             "perspY:%g ", SkFractToFloat(perspY));
     78     SkDebugf("%s\n", pBuffer);
     79 }
     80 #endif
     81 
     82 ///////////////////////////////////////////////////////////////////////////////
     83 
     84 SkFlatPaint* SkFlatPaint::Flatten(SkChunkAlloc* heap, const SkPaint& paint,
     85                                   int index, SkRefCntRecorder* rec,
     86                                   SkRefCntRecorder* faceRecorder) {
     87     SkFlattenableWriteBuffer buffer(2*sizeof(SkPaint));
     88     buffer.setRefCntRecorder(rec);
     89     buffer.setTypefaceRecorder(faceRecorder);
     90 
     91     paint.flatten(buffer);
     92     uint32_t size = buffer.size();
     93     SkFlatPaint* result = (SkFlatPaint*) INHERITED::Alloc(heap, size, index);
     94     buffer.flatten(&result->fPaintData);
     95     return result;
     96 }
     97 
     98 void SkFlatPaint::Read(const void* storage, SkPaint* paint,
     99                    SkRefCntPlayback* rcp, SkTypefacePlayback* facePlayback) {
    100     SkFlattenableReadBuffer buffer(storage);
    101     if (rcp) {
    102         rcp->setupBuffer(buffer);
    103     }
    104     if (facePlayback) {
    105         facePlayback->setupBuffer(buffer);
    106     }
    107     paint->unflatten(buffer);
    108 }
    109 
    110 #ifdef SK_DEBUG_DUMP
    111 void SkFlatPaint::dump() const {
    112     SkPaint defaultPaint;
    113     SkFlattenableReadBuffer buffer(fPaintData);
    114     SkTypeface* typeface = (SkTypeface*) buffer.readPtr();
    115     char pBuffer[DUMP_BUFFER_SIZE];
    116     char* bufferPtr = pBuffer;
    117     bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    118         "paint: ");
    119     if (typeface != defaultPaint.getTypeface())
    120         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    121             "typeface:%p ", typeface);
    122     SkScalar textSize = buffer.readScalar();
    123     if (textSize != defaultPaint.getTextSize())
    124         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    125             "textSize:%g ", SkScalarToFloat(textSize));
    126     SkScalar textScaleX = buffer.readScalar();
    127     if (textScaleX != defaultPaint.getTextScaleX())
    128         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    129             "textScaleX:%g ", SkScalarToFloat(textScaleX));
    130     SkScalar textSkewX = buffer.readScalar();
    131     if (textSkewX != defaultPaint.getTextSkewX())
    132         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    133             "textSkewX:%g ", SkScalarToFloat(textSkewX));
    134     const SkPathEffect* pathEffect = (const SkPathEffect*) buffer.readFlattenable();
    135     if (pathEffect != defaultPaint.getPathEffect())
    136         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    137             "pathEffect:%p ", pathEffect);
    138     SkDELETE(pathEffect);
    139     const SkShader* shader = (const SkShader*) buffer.readFlattenable();
    140     if (shader != defaultPaint.getShader())
    141         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    142             "shader:%p ", shader);
    143     SkDELETE(shader);
    144     const SkXfermode* xfermode = (const SkXfermode*) buffer.readFlattenable();
    145     if (xfermode != defaultPaint.getXfermode())
    146         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    147             "xfermode:%p ", xfermode);
    148     SkDELETE(xfermode);
    149     const SkMaskFilter* maskFilter = (const SkMaskFilter*) buffer.readFlattenable();
    150     if (maskFilter != defaultPaint.getMaskFilter())
    151         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    152             "maskFilter:%p ", maskFilter);
    153     SkDELETE(maskFilter);
    154     const SkColorFilter* colorFilter = (const SkColorFilter*) buffer.readFlattenable();
    155     if (colorFilter != defaultPaint.getColorFilter())
    156         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    157             "colorFilter:%p ", colorFilter);
    158     SkDELETE(colorFilter);
    159     const SkRasterizer* rasterizer = (const SkRasterizer*) buffer.readFlattenable();
    160     if (rasterizer != defaultPaint.getRasterizer())
    161         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    162             "rasterizer:%p ", rasterizer);
    163     SkDELETE(rasterizer);
    164     const SkDrawLooper* drawLooper = (const SkDrawLooper*) buffer.readFlattenable();
    165     if (drawLooper != defaultPaint.getLooper())
    166         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    167             "drawLooper:%p ", drawLooper);
    168     SkDELETE(drawLooper);
    169     unsigned color = buffer.readU32();
    170     if (color != defaultPaint.getColor())
    171         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    172             "color:0x%x ", color);
    173     SkScalar strokeWidth = buffer.readScalar();
    174     if (strokeWidth != defaultPaint.getStrokeWidth())
    175         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    176             "strokeWidth:%g ", SkScalarToFloat(strokeWidth));
    177     SkScalar strokeMiter = buffer.readScalar();
    178     if (strokeMiter != defaultPaint.getStrokeMiter())
    179         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    180             "strokeMiter:%g ", SkScalarToFloat(strokeMiter));
    181     unsigned flags = buffer.readU16();
    182     if (flags != defaultPaint.getFlags())
    183         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    184             "flags:0x%x ", flags);
    185     int align = buffer.readU8();
    186     if (align != defaultPaint.getTextAlign())
    187         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    188             "align:0x%x ", align);
    189     int strokeCap = buffer.readU8();
    190     if (strokeCap != defaultPaint.getStrokeCap())
    191         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    192             "strokeCap:0x%x ", strokeCap);
    193     int strokeJoin = buffer.readU8();
    194     if (strokeJoin != defaultPaint.getStrokeJoin())
    195         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    196             "align:0x%x ", strokeJoin);
    197     int style = buffer.readU8();
    198     if (style != defaultPaint.getStyle())
    199         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    200             "style:0x%x ", style);
    201     int textEncoding = buffer.readU8();
    202     if (textEncoding != defaultPaint.getTextEncoding())
    203         bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer),
    204             "textEncoding:0x%x ", textEncoding);
    205     SkDebugf("%s\n", pBuffer);
    206 }
    207 #endif
    208 
    209 SkFlatRegion* SkFlatRegion::Flatten(SkChunkAlloc* heap, const SkRegion& region, int index) {
    210     uint32_t size = region.flatten(NULL);
    211     SkFlatRegion* result = (SkFlatRegion*) INHERITED::Alloc(heap, size, index);
    212     region.flatten(&result->fRegionData);
    213     return result;
    214 }
    215 
    216 ///////////////////////////////////////////////////////////////////////////////
    217 
    218 SkRefCntPlayback::SkRefCntPlayback() : fCount(0), fArray(NULL) {}
    219 
    220 SkRefCntPlayback::~SkRefCntPlayback() {
    221     this->reset(NULL);
    222 }
    223 
    224 void SkRefCntPlayback::reset(const SkRefCntRecorder* rec) {
    225     for (int i = 0; i < fCount; i++) {
    226         SkASSERT(fArray[i]);
    227         fArray[i]->unref();
    228     }
    229     SkDELETE_ARRAY(fArray);
    230 
    231     if (rec) {
    232         fCount = rec->count();
    233         fArray = SkNEW_ARRAY(SkRefCnt*, fCount);
    234         rec->get(fArray);
    235         for (int i = 0; i < fCount; i++) {
    236             fArray[i]->ref();
    237         }
    238     } else {
    239         fCount = 0;
    240         fArray = NULL;
    241     }
    242 }
    243 
    244 void SkRefCntPlayback::setCount(int count) {
    245     this->reset(NULL);
    246 
    247     fCount = count;
    248     fArray = SkNEW_ARRAY(SkRefCnt*, count);
    249     sk_bzero(fArray, count * sizeof(SkRefCnt*));
    250 }
    251 
    252 SkRefCnt* SkRefCntPlayback::set(int index, SkRefCnt* obj) {
    253     SkASSERT((unsigned)index < (unsigned)fCount);
    254     SkRefCnt_SafeAssign(fArray[index], obj);
    255     return obj;
    256 }
    257 
    258