| OLD | NEW |
| (Empty) |
| 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.readFlattenabl
e(); | |
| 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.readFlattenabl
e(); | |
| 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.readFlatten
able(); | |
| 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.readFlattenabl
e(); | |
| 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.readFlattenabl
e(); | |
| 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 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 | |
| OLD | NEW |