| OLD | NEW |
| (Empty) |
| 1 #include "SkPicturePlayback.h" | |
| 2 #include "SkPictureRecord.h" | |
| 3 #include "SkTypeface.h" | |
| 4 #include <new> | |
| 5 | |
| 6 SkPicturePlayback::SkPicturePlayback() { | |
| 7 this->init(); | |
| 8 } | |
| 9 | |
| 10 SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record) { | |
| 11 #ifdef SK_DEBUG_SIZE | |
| 12 size_t overallBytes, bitmapBytes, matricesBytes, | |
| 13 paintBytes, pathBytes, pictureBytes, regionBytes; | |
| 14 int bitmaps = record.bitmaps(&bitmapBytes); | |
| 15 int matrices = record.matrices(&matricesBytes); | |
| 16 int paints = record.paints(&paintBytes); | |
| 17 int paths = record.paths(&pathBytes); | |
| 18 int pictures = record.pictures(&pictureBytes); | |
| 19 int regions = record.regions(®ionBytes); | |
| 20 SkDebugf("picture record mem used %zd (stream %zd) ", record.size(), | |
| 21 record.streamlen()); | |
| 22 if (bitmaps != 0) | |
| 23 SkDebugf("bitmaps size %zd (bitmaps:%d) ", bitmapBytes, bitmaps); | |
| 24 if (matrices != 0) | |
| 25 SkDebugf("matrices size %zd (matrices:%d) ", matricesBytes, matrices); | |
| 26 if (paints != 0) | |
| 27 SkDebugf("paints size %zd (paints:%d) ", paintBytes, paints); | |
| 28 if (paths != 0) | |
| 29 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); | |
| 30 if (pictures != 0) | |
| 31 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); | |
| 32 if (regions != 0) | |
| 33 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); | |
| 34 if (record.fPointWrites != 0) | |
| 35 SkDebugf("points size %zd (points:%d) ", record.fPointBytes, record.fPoi
ntWrites); | |
| 36 if (record.fRectWrites != 0) | |
| 37 SkDebugf("rects size %zd (rects:%d) ", record.fRectBytes, record.fRectWr
ites); | |
| 38 if (record.fTextWrites != 0) | |
| 39 SkDebugf("text size %zd (text strings:%d) ", record.fTextBytes, record.f
TextWrites); | |
| 40 | |
| 41 SkDebugf("\n"); | |
| 42 #endif | |
| 43 #ifdef SK_DEBUG_DUMP | |
| 44 record.dumpMatrices(); | |
| 45 record.dumpPaints(); | |
| 46 #endif | |
| 47 | |
| 48 record.validate(); | |
| 49 const SkWriter32& writer = record.writeStream(); | |
| 50 init(); | |
| 51 if (writer.size() == 0) | |
| 52 return; | |
| 53 | |
| 54 { | |
| 55 size_t size = writer.size(); | |
| 56 void* buffer = sk_malloc_throw(size); | |
| 57 writer.flatten(buffer); | |
| 58 fReader.setMemory(buffer, size); // fReader owns buffer now | |
| 59 } | |
| 60 | |
| 61 // copy over the refcnt dictionary to our reader | |
| 62 // | |
| 63 fRCPlayback.reset(&record.fRCRecorder); | |
| 64 fRCPlayback.setupBuffer(fReader); | |
| 65 | |
| 66 fTFPlayback.reset(&record.fTFRecorder); | |
| 67 fTFPlayback.setupBuffer(fReader); | |
| 68 | |
| 69 const SkTDArray<const SkFlatBitmap* >& bitmaps = record.getBitmaps(); | |
| 70 fBitmapCount = bitmaps.count(); | |
| 71 if (fBitmapCount > 0) { | |
| 72 fBitmaps = SkNEW_ARRAY(SkBitmap, fBitmapCount); | |
| 73 for (const SkFlatBitmap** flatBitmapPtr = bitmaps.begin(); | |
| 74 flatBitmapPtr != bitmaps.end(); flatBitmapPtr++) { | |
| 75 const SkFlatBitmap* flatBitmap = *flatBitmapPtr; | |
| 76 int index = flatBitmap->index() - 1; | |
| 77 flatBitmap->unflatten(&fBitmaps[index], &fRCPlayback); | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 const SkTDArray<const SkFlatMatrix* >& matrices = record.getMatrices(); | |
| 82 fMatrixCount = matrices.count(); | |
| 83 if (fMatrixCount > 0) { | |
| 84 fMatrices = SkNEW_ARRAY(SkMatrix, fMatrixCount); | |
| 85 for (const SkFlatMatrix** matrixPtr = matrices.begin(); | |
| 86 matrixPtr != matrices.end(); matrixPtr++) { | |
| 87 const SkFlatMatrix* flatMatrix = *matrixPtr; | |
| 88 flatMatrix->unflatten(&fMatrices[flatMatrix->index() - 1]); | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 const SkTDArray<const SkFlatPaint* >& paints = record.getPaints(); | |
| 93 fPaintCount = paints.count(); | |
| 94 if (fPaintCount > 0) { | |
| 95 fPaints = SkNEW_ARRAY(SkPaint, fPaintCount); | |
| 96 for (const SkFlatPaint** flatPaintPtr = paints.begin(); | |
| 97 flatPaintPtr != paints.end(); flatPaintPtr++) { | |
| 98 const SkFlatPaint* flatPaint = *flatPaintPtr; | |
| 99 int index = flatPaint->index() - 1; | |
| 100 SkASSERT((unsigned)index < (unsigned)fPaintCount); | |
| 101 flatPaint->unflatten(&fPaints[index], &fRCPlayback, &fTFPlayback); | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 fPathHeap = record.fPathHeap; | |
| 106 fPathHeap->safeRef(); | |
| 107 | |
| 108 const SkTDArray<SkPicture* >& pictures = record.getPictureRefs(); | |
| 109 fPictureCount = pictures.count(); | |
| 110 if (fPictureCount > 0) { | |
| 111 fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); | |
| 112 for (int i = 0; i < fPictureCount; i++) { | |
| 113 fPictureRefs[i] = pictures[i]; | |
| 114 fPictureRefs[i]->ref(); | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 const SkTDArray<const SkFlatRegion* >& regions = record.getRegions(); | |
| 119 fRegionCount = regions.count(); | |
| 120 if (fRegionCount > 0) { | |
| 121 fRegions = SkNEW_ARRAY(SkRegion, fRegionCount); | |
| 122 for (const SkFlatRegion** flatRegionPtr = regions.begin(); | |
| 123 flatRegionPtr != regions.end(); flatRegionPtr++) { | |
| 124 const SkFlatRegion* flatRegion = *flatRegionPtr; | |
| 125 flatRegion->unflatten(&fRegions[flatRegion->index() - 1]); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 #ifdef SK_DEBUG_SIZE | |
| 130 int overall = fPlayback->size(&overallBytes); | |
| 131 bitmaps = fPlayback->bitmaps(&bitmapBytes); | |
| 132 paints = fPlayback->paints(&paintBytes); | |
| 133 paths = fPlayback->paths(&pathBytes); | |
| 134 pictures = fPlayback->pictures(&pictureBytes); | |
| 135 regions = fPlayback->regions(®ionBytes); | |
| 136 SkDebugf("playback size %zd (objects:%d) ", overallBytes, overall); | |
| 137 if (bitmaps != 0) | |
| 138 SkDebugf("bitmaps size %zd (bitmaps:%d) ", bitmapBytes, bitmaps); | |
| 139 if (paints != 0) | |
| 140 SkDebugf("paints size %zd (paints:%d) ", paintBytes, paints); | |
| 141 if (paths != 0) | |
| 142 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); | |
| 143 if (pictures != 0) | |
| 144 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); | |
| 145 if (regions != 0) | |
| 146 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); | |
| 147 SkDebugf("\n"); | |
| 148 #endif | |
| 149 } | |
| 150 | |
| 151 SkPicturePlayback::SkPicturePlayback(const SkPicturePlayback& src) { | |
| 152 this->init(); | |
| 153 | |
| 154 // copy the data from fReader | |
| 155 { | |
| 156 size_t size = src.fReader.size(); | |
| 157 void* buffer = sk_malloc_throw(size); | |
| 158 memcpy(buffer, src.fReader.base(), size); | |
| 159 fReader.setMemory(buffer, size); | |
| 160 } | |
| 161 | |
| 162 int i; | |
| 163 | |
| 164 fBitmapCount = src.fBitmapCount; | |
| 165 fBitmaps = SkNEW_ARRAY(SkBitmap, fBitmapCount); | |
| 166 for (i = 0; i < fBitmapCount; i++) { | |
| 167 fBitmaps[i] = src.fBitmaps[i]; | |
| 168 } | |
| 169 | |
| 170 fMatrixCount = src.fMatrixCount; | |
| 171 fMatrices = SkNEW_ARRAY(SkMatrix, fMatrixCount); | |
| 172 memcpy(fMatrices, src.fMatrices, fMatrixCount * sizeof(SkMatrix)); | |
| 173 | |
| 174 fPaintCount = src.fPaintCount; | |
| 175 fPaints = SkNEW_ARRAY(SkPaint, fPaintCount); | |
| 176 for (i = 0; i < fPaintCount; i++) { | |
| 177 fPaints[i] = src.fPaints[i]; | |
| 178 } | |
| 179 | |
| 180 fPathHeap = src.fPathHeap; | |
| 181 fPathHeap->safeRef(); | |
| 182 | |
| 183 fPictureCount = src.fPictureCount; | |
| 184 fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); | |
| 185 for (int i = 0; i < fPictureCount; i++) { | |
| 186 fPictureRefs[i] = src.fPictureRefs[i]; | |
| 187 fPictureRefs[i]->ref(); | |
| 188 } | |
| 189 | |
| 190 fRegionCount = src.fRegionCount; | |
| 191 fRegions = SkNEW_ARRAY(SkRegion, fRegionCount); | |
| 192 for (i = 0; i < fRegionCount; i++) { | |
| 193 fRegions[i] = src.fRegions[i]; | |
| 194 } | |
| 195 } | |
| 196 | |
| 197 void SkPicturePlayback::init() { | |
| 198 fBitmaps = NULL; | |
| 199 fMatrices = NULL; | |
| 200 fPaints = NULL; | |
| 201 fPathHeap = NULL; | |
| 202 fPictureRefs = NULL; | |
| 203 fRegions = NULL; | |
| 204 fBitmapCount = fMatrixCount = fPaintCount = fPictureCount = | |
| 205 fRegionCount = 0; | |
| 206 | |
| 207 fFactoryPlayback = NULL; | |
| 208 } | |
| 209 | |
| 210 SkPicturePlayback::~SkPicturePlayback() { | |
| 211 sk_free((void*) fReader.base()); | |
| 212 | |
| 213 SkDELETE_ARRAY(fBitmaps); | |
| 214 SkDELETE_ARRAY(fMatrices); | |
| 215 SkDELETE_ARRAY(fPaints); | |
| 216 SkDELETE_ARRAY(fRegions); | |
| 217 | |
| 218 fPathHeap->safeUnref(); | |
| 219 | |
| 220 for (int i = 0; i < fPictureCount; i++) { | |
| 221 fPictureRefs[i]->unref(); | |
| 222 } | |
| 223 SkDELETE_ARRAY(fPictureRefs); | |
| 224 | |
| 225 SkDELETE(fFactoryPlayback); | |
| 226 } | |
| 227 | |
| 228 void SkPicturePlayback::dumpSize() const { | |
| 229 SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] matrices=%d [%d] paints=%
d [%d] paths=%d regions=%d\n", | |
| 230 fReader.size(), | |
| 231 fBitmapCount, fBitmapCount * sizeof(SkBitmap), | |
| 232 fMatrixCount, fMatrixCount * sizeof(SkMatrix), | |
| 233 fPaintCount, fPaintCount * sizeof(SkPaint), | |
| 234 fPathHeap ? fPathHeap->count() : 0, | |
| 235 fRegionCount); | |
| 236 } | |
| 237 | |
| 238 /////////////////////////////////////////////////////////////////////////////// | |
| 239 /////////////////////////////////////////////////////////////////////////////// | |
| 240 | |
| 241 // The chunks are writte/read in this order... | |
| 242 | |
| 243 #define PICT_READER_TAG SkSetFourByteTag('r', 'e', 'a', 'd') | |
| 244 #define PICT_FACTORY_TAG SkSetFourByteTag('f', 'a', 'c', 't') | |
| 245 #define PICT_TYPEFACE_TAG SkSetFourByteTag('t', 'p', 'f', 'c') | |
| 246 #define PICT_PICTURE_TAG SkSetFourByteTag('p', 'c', 't', 'r') | |
| 247 #define PICT_ARRAYS_TAG SkSetFourByteTag('a', 'r', 'a', 'y') | |
| 248 // these are all inside the ARRAYS tag | |
| 249 #define PICT_BITMAP_TAG SkSetFourByteTag('b', 't', 'm', 'p') | |
| 250 #define PICT_MATRIX_TAG SkSetFourByteTag('m', 't', 'r', 'x') | |
| 251 #define PICT_PAINT_TAG SkSetFourByteTag('p', 'n', 't', ' ') | |
| 252 #define PICT_PATH_TAG SkSetFourByteTag('p', 't', 'h', ' ') | |
| 253 #define PICT_REGION_TAG SkSetFourByteTag('r', 'g', 'n', ' ') | |
| 254 | |
| 255 | |
| 256 #include "SkStream.h" | |
| 257 | |
| 258 static void writeTagSize(SkFlattenableWriteBuffer& buffer, uint32_t tag, | |
| 259 uint32_t size) { | |
| 260 buffer.write32(tag); | |
| 261 buffer.write32(size); | |
| 262 } | |
| 263 | |
| 264 static void writeTagSize(SkWStream* stream, uint32_t tag, | |
| 265 uint32_t size) { | |
| 266 stream->write32(tag); | |
| 267 stream->write32(size); | |
| 268 } | |
| 269 | |
| 270 static void writeFactories(SkWStream* stream, const SkFactoryRecorder& rec) { | |
| 271 int count = rec.count(); | |
| 272 | |
| 273 writeTagSize(stream, PICT_FACTORY_TAG, count); | |
| 274 | |
| 275 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); | |
| 276 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); | |
| 277 rec.get(array); | |
| 278 | |
| 279 for (int i = 0; i < count; i++) { | |
| 280 const char* name = SkFlattenable::FactoryToName(array[i]); | |
| 281 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); | |
| 282 if (NULL == name || 0 == *name) { | |
| 283 stream->writePackedUInt(0); | |
| 284 } else { | |
| 285 uint32_t len = strlen(name); | |
| 286 stream->writePackedUInt(len); | |
| 287 stream->write(name, len); | |
| 288 } | |
| 289 } | |
| 290 } | |
| 291 | |
| 292 static void writeTypefaces(SkWStream* stream, const SkRefCntRecorder& rec) { | |
| 293 int count = rec.count(); | |
| 294 | |
| 295 writeTagSize(stream, PICT_TYPEFACE_TAG, count); | |
| 296 | |
| 297 SkAutoSTMalloc<16, SkTypeface*> storage(count); | |
| 298 SkTypeface** array = (SkTypeface**)storage.get(); | |
| 299 rec.get((SkRefCnt**)array); | |
| 300 | |
| 301 for (int i = 0; i < count; i++) { | |
| 302 array[i]->serialize(stream); | |
| 303 } | |
| 304 } | |
| 305 | |
| 306 void SkPicturePlayback::serialize(SkWStream* stream) const { | |
| 307 writeTagSize(stream, PICT_READER_TAG, fReader.size()); | |
| 308 stream->write(fReader.base(), fReader.size()); | |
| 309 | |
| 310 SkRefCntRecorder typefaceRecorder; | |
| 311 SkFactoryRecorder factRecorder; | |
| 312 | |
| 313 SkFlattenableWriteBuffer buffer(1024); | |
| 314 | |
| 315 buffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); | |
| 316 buffer.setTypefaceRecorder(&typefaceRecorder); | |
| 317 buffer.setFactoryRecorder(&factRecorder); | |
| 318 | |
| 319 int i; | |
| 320 | |
| 321 writeTagSize(buffer, PICT_BITMAP_TAG, fBitmapCount); | |
| 322 for (i = 0; i < fBitmapCount; i++) { | |
| 323 fBitmaps[i].flatten(buffer); | |
| 324 } | |
| 325 | |
| 326 writeTagSize(buffer, PICT_MATRIX_TAG, fMatrixCount); | |
| 327 buffer.writeMul4(fMatrices, fMatrixCount * sizeof(SkMatrix)); | |
| 328 | |
| 329 writeTagSize(buffer, PICT_PAINT_TAG, fPaintCount); | |
| 330 for (i = 0; i < fPaintCount; i++) { | |
| 331 fPaints[i].flatten(buffer); | |
| 332 } | |
| 333 | |
| 334 { | |
| 335 int count = fPathHeap ? fPathHeap->count() : 0; | |
| 336 writeTagSize(buffer, PICT_PATH_TAG, count); | |
| 337 if (count > 0) { | |
| 338 fPathHeap->flatten(buffer); | |
| 339 } | |
| 340 } | |
| 341 | |
| 342 writeTagSize(buffer, PICT_REGION_TAG, fRegionCount); | |
| 343 for (i = 0; i < fRegionCount; i++) { | |
| 344 uint32_t size = fRegions[i].flatten(NULL); | |
| 345 buffer.write32(size); | |
| 346 SkAutoSMalloc<512> storage(size); | |
| 347 fRegions[i].flatten(storage.get()); | |
| 348 buffer.writePad(storage.get(), size); | |
| 349 } | |
| 350 | |
| 351 // now we can write to the stream again | |
| 352 | |
| 353 writeFactories(stream, factRecorder); | |
| 354 writeTypefaces(stream, typefaceRecorder); | |
| 355 | |
| 356 writeTagSize(stream, PICT_PICTURE_TAG, fPictureCount); | |
| 357 for (i = 0; i < fPictureCount; i++) { | |
| 358 fPictureRefs[i]->serialize(stream); | |
| 359 } | |
| 360 | |
| 361 writeTagSize(stream, PICT_ARRAYS_TAG, buffer.size()); | |
| 362 buffer.writeToStream(stream); | |
| 363 } | |
| 364 | |
| 365 /////////////////////////////////////////////////////////////////////////////// | |
| 366 | |
| 367 static int readTagSize(SkFlattenableReadBuffer& buffer, uint32_t expectedTag) { | |
| 368 uint32_t tag = buffer.readU32(); | |
| 369 if (tag != expectedTag) { | |
| 370 sk_throw(); | |
| 371 } | |
| 372 return buffer.readU32(); | |
| 373 } | |
| 374 | |
| 375 static int readTagSize(SkStream* stream, uint32_t expectedTag) { | |
| 376 uint32_t tag = stream->readU32(); | |
| 377 if (tag != expectedTag) { | |
| 378 sk_throw(); | |
| 379 } | |
| 380 return stream->readU32(); | |
| 381 } | |
| 382 | |
| 383 SkPicturePlayback::SkPicturePlayback(SkStream* stream) { | |
| 384 this->init(); | |
| 385 | |
| 386 int i; | |
| 387 | |
| 388 { | |
| 389 size_t size = readTagSize(stream, PICT_READER_TAG); | |
| 390 void* storage = sk_malloc_throw(size); | |
| 391 stream->read(storage, size); | |
| 392 fReader.setMemory(storage, size); | |
| 393 } | |
| 394 | |
| 395 int factoryCount = readTagSize(stream, PICT_FACTORY_TAG); | |
| 396 fFactoryPlayback = SkNEW_ARGS(SkFactoryPlayback, (factoryCount)); | |
| 397 for (i = 0; i < factoryCount; i++) { | |
| 398 SkString str; | |
| 399 int len = stream->readPackedUInt(); | |
| 400 str.resize(len); | |
| 401 stream->read(str.writable_str(), len); | |
| 402 // SkDebugf("--- factory playback [%d] <%s>\n", i, str.c_str()); | |
| 403 fFactoryPlayback->base()[i] = SkFlattenable::NameToFactory(str.c_str()); | |
| 404 } | |
| 405 | |
| 406 int typefaceCount = readTagSize(stream, PICT_TYPEFACE_TAG); | |
| 407 fTFPlayback.setCount(typefaceCount); | |
| 408 for (i = 0; i < typefaceCount; i++) { | |
| 409 fTFPlayback.set(i, SkTypeface::Deserialize(stream))->unref(); | |
| 410 } | |
| 411 | |
| 412 fPictureCount = readTagSize(stream, PICT_PICTURE_TAG); | |
| 413 fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); | |
| 414 for (i = 0; i < fPictureCount; i++) { | |
| 415 fPictureRefs[i] = SkNEW_ARGS(SkPicture, (stream)); | |
| 416 } | |
| 417 | |
| 418 /* | |
| 419 Now read the arrays chunk, and parse using a read buffer | |
| 420 */ | |
| 421 uint32_t size = readTagSize(stream, PICT_ARRAYS_TAG); | |
| 422 SkAutoMalloc storage(size); | |
| 423 stream->read(storage.get(), size); | |
| 424 | |
| 425 SkFlattenableReadBuffer buffer(storage.get(), size); | |
| 426 fFactoryPlayback->setupBuffer(buffer); | |
| 427 fTFPlayback.setupBuffer(buffer); | |
| 428 | |
| 429 fBitmapCount = readTagSize(buffer, PICT_BITMAP_TAG); | |
| 430 fBitmaps = SkNEW_ARRAY(SkBitmap, fBitmapCount); | |
| 431 for (i = 0; i < fBitmapCount; i++) { | |
| 432 fBitmaps[i].unflatten(buffer); | |
| 433 } | |
| 434 | |
| 435 fMatrixCount = readTagSize(buffer, PICT_MATRIX_TAG); | |
| 436 fMatrices = SkNEW_ARRAY(SkMatrix, fMatrixCount); | |
| 437 buffer.read(fMatrices, fMatrixCount * sizeof(SkMatrix)); | |
| 438 | |
| 439 fPaintCount = readTagSize(buffer, PICT_PAINT_TAG); | |
| 440 fPaints = SkNEW_ARRAY(SkPaint, fPaintCount); | |
| 441 for (i = 0; i < fPaintCount; i++) { | |
| 442 fPaints[i].unflatten(buffer); | |
| 443 } | |
| 444 | |
| 445 { | |
| 446 int count = readTagSize(buffer, PICT_PATH_TAG); | |
| 447 if (count > 0) { | |
| 448 fPathHeap = SkNEW_ARGS(SkPathHeap, (buffer)); | |
| 449 } | |
| 450 } | |
| 451 | |
| 452 fRegionCount = readTagSize(buffer, PICT_REGION_TAG); | |
| 453 fRegions = SkNEW_ARRAY(SkRegion, fRegionCount); | |
| 454 for (i = 0; i < fRegionCount; i++) { | |
| 455 uint32_t size = buffer.readU32(); | |
| 456 uint32_t bytes = fRegions[i].unflatten(buffer.skip(size)); | |
| 457 SkASSERT(size == bytes); | |
| 458 } | |
| 459 } | |
| 460 | |
| 461 /////////////////////////////////////////////////////////////////////////////// | |
| 462 /////////////////////////////////////////////////////////////////////////////// | |
| 463 | |
| 464 void SkPicturePlayback::draw(SkCanvas& canvas) { | |
| 465 #ifdef ENABLE_TIME_DRAW | |
| 466 SkAutoTime at("SkPicture::draw", 50); | |
| 467 #endif | |
| 468 | |
| 469 TextContainer text; | |
| 470 fReader.rewind(); | |
| 471 | |
| 472 while (!fReader.eof()) { | |
| 473 switch (fReader.readInt()) { | |
| 474 case CLIP_PATH: { | |
| 475 const SkPath& path = getPath(); | |
| 476 SkRegion::Op op = (SkRegion::Op) getInt(); | |
| 477 size_t offsetToRestore = getInt(); | |
| 478 // HACK (false) until I can handle op==kReplace | |
| 479 if (!canvas.clipPath(path, op) && false) { | |
| 480 //SkDebugf("---- skip clipPath for %d bytes\n", offsetToRest
ore - fReader.offset()); | |
| 481 fReader.setOffset(offsetToRestore); | |
| 482 } | |
| 483 } break; | |
| 484 case CLIP_REGION: { | |
| 485 const SkRegion& region = getRegion(); | |
| 486 SkRegion::Op op = (SkRegion::Op) getInt(); | |
| 487 size_t offsetToRestore = getInt(); | |
| 488 if (!canvas.clipRegion(region, op)) { | |
| 489 //SkDebugf("---- skip clipDeviceRgn for %d bytes\n", offsetT
oRestore - fReader.offset()); | |
| 490 fReader.setOffset(offsetToRestore); | |
| 491 } | |
| 492 } break; | |
| 493 case CLIP_RECT: { | |
| 494 const SkRect* rect = fReader.skipRect(); | |
| 495 SkRegion::Op op = (SkRegion::Op) getInt(); | |
| 496 size_t offsetToRestore = getInt(); | |
| 497 if (!canvas.clipRect(*rect, op)) { | |
| 498 //SkDebugf("---- skip clipRect for %d bytes\n", offsetToRest
ore - fReader.offset()); | |
| 499 fReader.setOffset(offsetToRestore); | |
| 500 } | |
| 501 } break; | |
| 502 case CONCAT: | |
| 503 canvas.concat(*getMatrix()); | |
| 504 break; | |
| 505 case DRAW_BITMAP: { | |
| 506 const SkPaint* paint = getPaint(); | |
| 507 const SkBitmap& bitmap = getBitmap(); | |
| 508 const SkPoint* loc = fReader.skipPoint(); | |
| 509 canvas.drawBitmap(bitmap, loc->fX, loc->fY, paint); | |
| 510 } break; | |
| 511 case DRAW_BITMAP_RECT: { | |
| 512 const SkPaint* paint = getPaint(); | |
| 513 const SkBitmap& bitmap = getBitmap(); | |
| 514 const SkIRect* src = this->getIRectPtr(); // may be null | |
| 515 const SkRect* dst = fReader.skipRect(); // required | |
| 516 canvas.drawBitmapRect(bitmap, src, *dst, paint); | |
| 517 } break; | |
| 518 case DRAW_BITMAP_MATRIX: { | |
| 519 const SkPaint* paint = getPaint(); | |
| 520 const SkBitmap& bitmap = getBitmap(); | |
| 521 const SkMatrix* matrix = getMatrix(); | |
| 522 canvas.drawBitmapMatrix(bitmap, *matrix, paint); | |
| 523 } break; | |
| 524 case DRAW_PAINT: | |
| 525 canvas.drawPaint(*getPaint()); | |
| 526 break; | |
| 527 case DRAW_PATH: { | |
| 528 const SkPaint& paint = *getPaint(); | |
| 529 canvas.drawPath(getPath(), paint); | |
| 530 } break; | |
| 531 case DRAW_PICTURE: | |
| 532 canvas.drawPicture(getPicture()); | |
| 533 break; | |
| 534 case DRAW_POINTS: { | |
| 535 const SkPaint& paint = *getPaint(); | |
| 536 SkCanvas::PointMode mode = (SkCanvas::PointMode)getInt(); | |
| 537 size_t count = getInt(); | |
| 538 const SkPoint* pts = (const SkPoint*)fReader.skip(sizeof(SkPoint
) * count); | |
| 539 canvas.drawPoints(mode, count, pts, paint); | |
| 540 } break; | |
| 541 case DRAW_POS_TEXT: { | |
| 542 const SkPaint& paint = *getPaint(); | |
| 543 getText(&text); | |
| 544 size_t points = getInt(); | |
| 545 const SkPoint* pos = (const SkPoint*)fReader.skip(points * sizeo
f(SkPoint)); | |
| 546 canvas.drawPosText(text.text(), text.length(), pos, paint); | |
| 547 } break; | |
| 548 case DRAW_POS_TEXT_H: { | |
| 549 const SkPaint& paint = *getPaint(); | |
| 550 getText(&text); | |
| 551 size_t xCount = getInt(); | |
| 552 const SkScalar constY = getScalar(); | |
| 553 const SkScalar* xpos = (const SkScalar*)fReader.skip(xCount * si
zeof(SkScalar)); | |
| 554 canvas.drawPosTextH(text.text(), text.length(), xpos, constY, | |
| 555 paint); | |
| 556 } break; | |
| 557 case DRAW_POS_TEXT_H_TOP_BOTTOM: { | |
| 558 const SkPaint& paint = *getPaint(); | |
| 559 getText(&text); | |
| 560 size_t xCount = getInt(); | |
| 561 const SkScalar* xpos = (const SkScalar*)fReader.skip((3 + xCount
) * sizeof(SkScalar)); | |
| 562 const SkScalar top = *xpos++; | |
| 563 const SkScalar bottom = *xpos++; | |
| 564 const SkScalar constY = *xpos++; | |
| 565 if (!canvas.quickRejectY(top, bottom, SkCanvas::kAA_EdgeType)) { | |
| 566 canvas.drawPosTextH(text.text(), text.length(), xpos, | |
| 567 constY, paint); | |
| 568 } | |
| 569 } break; | |
| 570 case DRAW_RECT: { | |
| 571 const SkPaint& paint = *getPaint(); | |
| 572 canvas.drawRect(*fReader.skipRect(), paint); | |
| 573 } break; | |
| 574 case DRAW_SPRITE: { | |
| 575 const SkPaint* paint = getPaint(); | |
| 576 const SkBitmap& bitmap = getBitmap(); | |
| 577 int left = getInt(); | |
| 578 int top = getInt(); | |
| 579 canvas.drawSprite(bitmap, left, top, paint); | |
| 580 } break; | |
| 581 case DRAW_TEXT: { | |
| 582 const SkPaint& paint = *getPaint(); | |
| 583 getText(&text); | |
| 584 SkScalar x = getScalar(); | |
| 585 SkScalar y = getScalar(); | |
| 586 canvas.drawText(text.text(), text.length(), x, y, paint); | |
| 587 } break; | |
| 588 case DRAW_TEXT_TOP_BOTTOM: { | |
| 589 const SkPaint& paint = *getPaint(); | |
| 590 getText(&text); | |
| 591 const SkScalar* ptr = (const SkScalar*)fReader.skip(4 * sizeof(S
kScalar)); | |
| 592 // ptr[0] == x | |
| 593 // ptr[1] == y | |
| 594 // ptr[2] == top | |
| 595 // ptr[3] == bottom | |
| 596 if (!canvas.quickRejectY(ptr[2], ptr[3], | |
| 597 SkCanvas::kAA_EdgeType)) { | |
| 598 canvas.drawText(text.text(), text.length(), ptr[0], ptr[1], | |
| 599 paint); | |
| 600 } | |
| 601 } break; | |
| 602 case DRAW_TEXT_ON_PATH: { | |
| 603 const SkPaint& paint = *getPaint(); | |
| 604 getText(&text); | |
| 605 const SkPath& path = getPath(); | |
| 606 const SkMatrix* matrix = getMatrix(); | |
| 607 canvas.drawTextOnPath(text.text(), text.length(), path, | |
| 608 matrix, paint); | |
| 609 } break; | |
| 610 case DRAW_VERTICES: { | |
| 611 const SkPaint& paint = *getPaint(); | |
| 612 DrawVertexFlags flags = (DrawVertexFlags)getInt(); | |
| 613 SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)getInt(); | |
| 614 int vCount = getInt(); | |
| 615 const SkPoint* verts = (const SkPoint*)fReader.skip( | |
| 616 vCount * sizeof(SkPoint)); | |
| 617 const SkPoint* texs = NULL; | |
| 618 const SkColor* colors = NULL; | |
| 619 const uint16_t* indices = NULL; | |
| 620 int iCount = 0; | |
| 621 if (flags & DRAW_VERTICES_HAS_TEXS) { | |
| 622 texs = (const SkPoint*)fReader.skip( | |
| 623 vCount * sizeof(SkPoint)); | |
| 624 } | |
| 625 if (flags & DRAW_VERTICES_HAS_COLORS) { | |
| 626 colors = (const SkColor*)fReader.skip( | |
| 627 vCount * sizeof(SkColor)); | |
| 628 } | |
| 629 if (flags & DRAW_VERTICES_HAS_INDICES) { | |
| 630 iCount = getInt(); | |
| 631 indices = (const uint16_t*)fReader.skip( | |
| 632 iCount * sizeof(uint16_t)); | |
| 633 } | |
| 634 canvas.drawVertices(vmode, vCount, verts, texs, colors, NULL, | |
| 635 indices, iCount, paint); | |
| 636 } break; | |
| 637 case RESTORE: | |
| 638 canvas.restore(); | |
| 639 break; | |
| 640 case ROTATE: | |
| 641 canvas.rotate(getScalar()); | |
| 642 break; | |
| 643 case SAVE: | |
| 644 canvas.save((SkCanvas::SaveFlags) getInt()); | |
| 645 break; | |
| 646 case SAVE_LAYER: { | |
| 647 const SkRect* boundsPtr = getRectPtr(); | |
| 648 const SkPaint* paint = getPaint(); | |
| 649 canvas.saveLayer(boundsPtr, paint, (SkCanvas::SaveFlags) getInt(
)); | |
| 650 } break; | |
| 651 case SCALE: { | |
| 652 SkScalar sx = getScalar(); | |
| 653 SkScalar sy = getScalar(); | |
| 654 canvas.scale(sx, sy); | |
| 655 } break; | |
| 656 case SKEW: { | |
| 657 SkScalar sx = getScalar(); | |
| 658 SkScalar sy = getScalar(); | |
| 659 canvas.skew(sx, sy); | |
| 660 } break; | |
| 661 case TRANSLATE: { | |
| 662 SkScalar dx = getScalar(); | |
| 663 SkScalar dy = getScalar(); | |
| 664 canvas.translate(dx, dy); | |
| 665 } break; | |
| 666 default: | |
| 667 SkASSERT(0); | |
| 668 } | |
| 669 } | |
| 670 | |
| 671 // this->dumpSize(); | |
| 672 } | |
| 673 | |
| 674 void SkPicturePlayback::abort() { | |
| 675 fReader.skip(fReader.size() - fReader.offset()); | |
| 676 } | |
| 677 | |
| 678 /////////////////////////////////////////////////////////////////////////////// | |
| 679 | |
| 680 #if 0 | |
| 681 uint32_t SkPicturePlayback::flatten(void* storage) const { | |
| 682 SkWBuffer buffer(storage); | |
| 683 buffer.write32(fBitmapCount); | |
| 684 int index; | |
| 685 for (index = 0; index < fBitmapCount; index++) { | |
| 686 const SkBitmap& bitmap = fBitmaps[index]; | |
| 687 uint32_t size = bitmap.flatten(NULL, true); | |
| 688 buffer.write32(size); | |
| 689 void* local = buffer.skip(size); | |
| 690 bitmap.flatten(local, true); | |
| 691 } | |
| 692 buffer.write32(fPaintCount); | |
| 693 for (index = 0; index < fPaintCount; index++) { | |
| 694 SkFlattenableWriteBuffer flatWrite; | |
| 695 const SkPaint& paint = fPaints[index]; | |
| 696 SkFlatPaint::Write(&flatWrite, paint); | |
| 697 uint32_t size = flatWrite.pos(); | |
| 698 buffer.write32(size); | |
| 699 void* local = buffer.skip(size); | |
| 700 flatWrite.reset(local); | |
| 701 SkFlatPaint::Write(&flatWrite, paint); | |
| 702 } | |
| 703 buffer.write32(fPathCount); | |
| 704 for (index = 0; index < fPathCount; index++) { | |
| 705 const SkPath& path = fPaths[index]; | |
| 706 uint32_t size = path.flatten(NULL); | |
| 707 buffer.write32(size); | |
| 708 void* local = buffer.skip(size); | |
| 709 path.flatten(local); | |
| 710 } | |
| 711 | |
| 712 #if 0 | |
| 713 buffer.write32(fPictureCount); | |
| 714 for (index = 0; index < fPictureCount; index++) { | |
| 715 const SkPicture& picture = fPictures[index]; | |
| 716 uint32_t size = picture.flatten(NULL); | |
| 717 buffer.write32(size); | |
| 718 void* local = buffer.skip(size); | |
| 719 picture.flatten(local); | |
| 720 } | |
| 721 #endif | |
| 722 | |
| 723 buffer.write32(fRegionCount); | |
| 724 for (index = 0; index < fRegionCount; index++) { | |
| 725 const SkRegion& region = fRegions[index]; | |
| 726 size_t size = region.computeBufferSize(); | |
| 727 buffer.write32(size); | |
| 728 void* local = buffer.skip(size); | |
| 729 region.writeToBuffer(local); | |
| 730 } | |
| 731 fReader.rewind(); | |
| 732 size_t length = fReader.size(); | |
| 733 buffer.write32(length); | |
| 734 memcpy(buffer.skip(length), fReader.base(), length); | |
| 735 return (uint32_t) buffer.pos(); | |
| 736 } | |
| 737 | |
| 738 void SkPicturePlayback::unflatten(const void* storage) { | |
| 739 SkRBuffer buffer(storage); | |
| 740 int index; | |
| 741 fBitmapCount = buffer.readU32(); | |
| 742 fBitmaps = new SkBitmap[fBitmapCount]; | |
| 743 for (index = 0; index < fBitmapCount; index++) { | |
| 744 uint32_t size = buffer.readU32(); | |
| 745 const void* local = buffer.skip(size); | |
| 746 fBitmaps[index].unflatten(local); | |
| 747 } | |
| 748 fPaintCount = buffer.readU32(); | |
| 749 fPaints = new SkPaint[fPaintCount]; | |
| 750 for (index = 0; index < fPaintCount; index++) { | |
| 751 uint32_t size = buffer.readU32(); | |
| 752 const void* local = buffer.skip(size); | |
| 753 SkFlatPaint::Read(local, &fPaints[index]); | |
| 754 } | |
| 755 fPathCount = buffer.readU32(); | |
| 756 fPaths = new SkPath[fPathCount]; | |
| 757 for (index = 0; index < fPathCount; index++) { | |
| 758 uint32_t size = buffer.readU32(); | |
| 759 const void* local = buffer.skip(size); | |
| 760 fPaths[index].unflatten(local); | |
| 761 } | |
| 762 | |
| 763 #if 0 | |
| 764 fPictureCount = buffer.readU32(); | |
| 765 fPictures = new SkPicture[fPictureCount]; | |
| 766 for (index = 0; index < fPictureCount; index++) { | |
| 767 uint32_t size = buffer.readU32(); | |
| 768 const void* local = buffer.skip(size); | |
| 769 fPictures[index].unflatten(local); | |
| 770 } | |
| 771 #endif | |
| 772 | |
| 773 fRegionCount = buffer.readU32(); | |
| 774 fRegions = new SkRegion[fRegionCount]; | |
| 775 for (index = 0; index < fRegionCount; index++) { | |
| 776 uint32_t size = buffer.readU32(); | |
| 777 const void* local = buffer.skip(size); | |
| 778 fRegions[index].readFromBuffer(local); | |
| 779 } | |
| 780 int32_t length = buffer.readS32(); | |
| 781 const void* stream = buffer.skip(length); | |
| 782 fReader.setMemory(stream, length); | |
| 783 } | |
| 784 #endif | |
| 785 | |
| 786 /////////////////////////////////////////////////////////////////////////////// | |
| 787 | |
| 788 #ifdef SK_DEBUG_SIZE | |
| 789 int SkPicturePlayback::size(size_t* sizePtr) { | |
| 790 int objects = bitmaps(sizePtr); | |
| 791 objects += paints(sizePtr); | |
| 792 objects += paths(sizePtr); | |
| 793 objects += pictures(sizePtr); | |
| 794 objects += regions(sizePtr); | |
| 795 *sizePtr = fReader.size(); | |
| 796 return objects; | |
| 797 } | |
| 798 | |
| 799 int SkPicturePlayback::bitmaps(size_t* size) { | |
| 800 size_t result = 0; | |
| 801 for (int index = 0; index < fBitmapCount; index++) { | |
| 802 // const SkBitmap& bitmap = fBitmaps[index]; | |
| 803 result += sizeof(SkBitmap); // bitmap->size(); | |
| 804 } | |
| 805 *size = result; | |
| 806 return fBitmapCount; | |
| 807 } | |
| 808 | |
| 809 int SkPicturePlayback::paints(size_t* size) { | |
| 810 size_t result = 0; | |
| 811 for (int index = 0; index < fPaintCount; index++) { | |
| 812 // const SkPaint& paint = fPaints[index]; | |
| 813 result += sizeof(SkPaint); // paint->size(); | |
| 814 } | |
| 815 *size = result; | |
| 816 return fPaintCount; | |
| 817 } | |
| 818 | |
| 819 int SkPicturePlayback::paths(size_t* size) { | |
| 820 size_t result = 0; | |
| 821 for (int index = 0; index < fPathCount; index++) { | |
| 822 const SkPath& path = fPaths[index]; | |
| 823 result += path.flatten(NULL); | |
| 824 } | |
| 825 *size = result; | |
| 826 return fPathCount; | |
| 827 } | |
| 828 | |
| 829 int SkPicturePlayback::regions(size_t* size) { | |
| 830 size_t result = 0; | |
| 831 for (int index = 0; index < fRegionCount; index++) { | |
| 832 // const SkRegion& region = fRegions[index]; | |
| 833 result += sizeof(SkRegion); // region->size(); | |
| 834 } | |
| 835 *size = result; | |
| 836 return fRegionCount; | |
| 837 } | |
| 838 #endif | |
| 839 | |
| 840 #ifdef SK_DEBUG_DUMP | |
| 841 void SkPicturePlayback::dumpBitmap(const SkBitmap& bitmap) const { | |
| 842 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 843 char* bufferPtr = pBuffer; | |
| 844 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 845 "BitmapData bitmap%p = {", &bitmap); | |
| 846 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 847 "{kWidth, %d}, ", bitmap.width()); | |
| 848 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 849 "{kHeight, %d}, ", bitmap.height()); | |
| 850 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 851 "{kRowBytes, %d}, ", bitmap.rowBytes()); | |
| 852 // start here; | |
| 853 SkDebugf("%s{0}};\n", pBuffer); | |
| 854 } | |
| 855 | |
| 856 void dumpMatrix(const SkMatrix& matrix) const { | |
| 857 SkMatrix defaultMatrix; | |
| 858 defaultMatrix.reset(); | |
| 859 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 860 char* bufferPtr = pBuffer; | |
| 861 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 862 "MatrixData matrix%p = {", &matrix); | |
| 863 SkScalar scaleX = matrix.getScaleX(); | |
| 864 if (scaleX != defaultMatrix.getScaleX()) | |
| 865 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 866 "{kScaleX, %g}, ", SkScalarToFloat(scaleX)); | |
| 867 SkScalar scaleY = matrix.getScaleY(); | |
| 868 if (scaleY != defaultMatrix.getScaleY()) | |
| 869 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 870 "{kScaleY, %g}, ", SkScalarToFloat(scaleY)); | |
| 871 SkScalar skewX = matrix.getSkewX(); | |
| 872 if (skewX != defaultMatrix.getSkewX()) | |
| 873 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 874 "{kSkewX, %g}, ", SkScalarToFloat(skewX)); | |
| 875 SkScalar skewY = matrix.getSkewY(); | |
| 876 if (skewY != defaultMatrix.getSkewY()) | |
| 877 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 878 "{kSkewY, %g}, ", SkScalarToFloat(skewY)); | |
| 879 SkScalar translateX = matrix.getTranslateX(); | |
| 880 if (translateX != defaultMatrix.getTranslateX()) | |
| 881 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 882 "{kTranslateX, %g}, ", SkScalarToFloat(translateX)); | |
| 883 SkScalar translateY = matrix.getTranslateY(); | |
| 884 if (translateY != defaultMatrix.getTranslateY()) | |
| 885 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 886 "{kTranslateY, %g}, ", SkScalarToFloat(translateY)); | |
| 887 SkScalar perspX = matrix.getPerspX(); | |
| 888 if (perspX != defaultMatrix.getPerspX()) | |
| 889 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 890 "{kPerspX, %g}, ", SkFractToFloat(perspX)); | |
| 891 SkScalar perspY = matrix.getPerspY(); | |
| 892 if (perspY != defaultMatrix.getPerspY()) | |
| 893 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 894 "{kPerspY, %g}, ", SkFractToFloat(perspY)); | |
| 895 SkDebugf("%s{0}};\n", pBuffer); | |
| 896 } | |
| 897 | |
| 898 void dumpPaint(const SkPaint& paint) const { | |
| 899 SkPaint defaultPaint; | |
| 900 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 901 char* bufferPtr = pBuffer; | |
| 902 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 903 "PaintPointers paintPtrs%p = {", &paint); | |
| 904 const SkTypeface* typeface = paint.getTypeface(); | |
| 905 if (typeface != defaultPaint.getTypeface()) | |
| 906 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 907 "{kTypeface, %p}, ", typeface); | |
| 908 const SkPathEffect* pathEffect = paint.getPathEffect(); | |
| 909 if (pathEffect != defaultPaint.getPathEffect()) | |
| 910 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 911 "{kPathEffect, %p}, ", pathEffect); | |
| 912 const SkShader* shader = paint.getShader(); | |
| 913 if (shader != defaultPaint.getShader()) | |
| 914 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 915 "{kShader, %p}, ", shader); | |
| 916 const SkXfermode* xfermode = paint.getXfermode(); | |
| 917 if (xfermode != defaultPaint.getXfermode()) | |
| 918 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 919 "{kXfermode, %p}, ", xfermode); | |
| 920 const SkMaskFilter* maskFilter = paint.getMaskFilter(); | |
| 921 if (maskFilter != defaultPaint.getMaskFilter()) | |
| 922 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 923 "{kMaskFilter, %p}, ", maskFilter); | |
| 924 const SkColorFilter* colorFilter = paint.getColorFilter(); | |
| 925 if (colorFilter != defaultPaint.getColorFilter()) | |
| 926 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 927 "{kColorFilter, %p}, ", colorFilter); | |
| 928 const SkRasterizer* rasterizer = paint.getRasterizer(); | |
| 929 if (rasterizer != defaultPaint.getRasterizer()) | |
| 930 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 931 "{kRasterizer, %p}, ", rasterizer); | |
| 932 const SkDrawLooper* drawLooper = paint.getLooper(); | |
| 933 if (drawLooper != defaultPaint.getLooper()) | |
| 934 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 935 "{kDrawLooper, %p}, ", drawLooper); | |
| 936 SkDebugf("%s{0}};\n", pBuffer); | |
| 937 bufferPtr = pBuffer; | |
| 938 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 939 "PaintScalars paintScalars%p = {", &paint); | |
| 940 SkScalar textSize = paint.getTextSize(); | |
| 941 if (textSize != defaultPaint.getTextSize()) | |
| 942 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 943 "{kTextSize, %g}, ", SkScalarToFloat(textSize)); | |
| 944 SkScalar textScaleX = paint.getTextScaleX(); | |
| 945 if (textScaleX != defaultPaint.getTextScaleX()) | |
| 946 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 947 "{kTextScaleX, %g}, ", SkScalarToFloat(textScaleX)); | |
| 948 SkScalar textSkewX = paint.getTextSkewX(); | |
| 949 if (textSkewX != defaultPaint.getTextSkewX()) | |
| 950 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 951 "{kTextSkewX, %g}, ", SkScalarToFloat(textSkewX)); | |
| 952 SkScalar strokeWidth = paint.getStrokeWidth(); | |
| 953 if (strokeWidth != defaultPaint.getStrokeWidth()) | |
| 954 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 955 "{kStrokeWidth, %g}, ", SkScalarToFloat(strokeWidth)); | |
| 956 SkScalar strokeMiter = paint.getStrokeMiter(); | |
| 957 if (strokeMiter != defaultPaint.getStrokeMiter()) | |
| 958 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 959 "{kStrokeMiter, %g}, ", SkScalarToFloat(strokeMiter)); | |
| 960 SkDebugf("%s{0}};\n", pBuffer); | |
| 961 bufferPtr = pBuffer; | |
| 962 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 963 "PaintInts = paintInts%p = {", &paint); | |
| 964 unsigned color = paint.getColor(); | |
| 965 if (color != defaultPaint.getColor()) | |
| 966 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 967 "{kColor, 0x%x}, ", color); | |
| 968 unsigned flags = paint.getFlags(); | |
| 969 if (flags != defaultPaint.getFlags()) | |
| 970 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 971 "{kFlags, 0x%x}, ", flags); | |
| 972 int align = paint.getTextAlign(); | |
| 973 if (align != defaultPaint.getTextAlign()) | |
| 974 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 975 "{kAlign, 0x%x}, ", align); | |
| 976 int strokeCap = paint.getStrokeCap(); | |
| 977 if (strokeCap != defaultPaint.getStrokeCap()) | |
| 978 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 979 "{kStrokeCap, 0x%x}, ", strokeCap); | |
| 980 int strokeJoin = paint.getStrokeJoin(); | |
| 981 if (strokeJoin != defaultPaint.getStrokeJoin()) | |
| 982 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 983 "{kAlign, 0x%x}, ", strokeJoin); | |
| 984 int style = paint.getStyle(); | |
| 985 if (style != defaultPaint.getStyle()) | |
| 986 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 987 "{kStyle, 0x%x}, ", style); | |
| 988 int textEncoding = paint.getTextEncoding(); | |
| 989 if (textEncoding != defaultPaint.getTextEncoding()) | |
| 990 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 991 "{kTextEncoding, 0x%x}, ", textEncoding); | |
| 992 SkDebugf("%s{0}};\n", pBuffer); | |
| 993 | |
| 994 SkDebugf("PaintData paint%p = {paintPtrs%p, paintScalars%p, paintInts%p};\n"
, | |
| 995 &paint, &paint, &paint, &paint); | |
| 996 } | |
| 997 | |
| 998 void SkPicturePlayback::dumpPath(const SkPath& path) const { | |
| 999 SkDebugf("path dump unimplemented\n"); | |
| 1000 } | |
| 1001 | |
| 1002 void SkPicturePlayback::dumpPicture(const SkPicture& picture) const { | |
| 1003 SkDebugf("picture dump unimplemented\n"); | |
| 1004 } | |
| 1005 | |
| 1006 void SkPicturePlayback::dumpRegion(const SkRegion& region) const { | |
| 1007 SkDebugf("region dump unimplemented\n"); | |
| 1008 } | |
| 1009 | |
| 1010 int SkPicturePlayback::dumpDrawType(char* bufferPtr, char* buffer, DrawType draw
Type) { | |
| 1011 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1012 "k%s, ", DrawTypeToString(drawType)); | |
| 1013 } | |
| 1014 | |
| 1015 int SkPicturePlayback::dumpInt(char* bufferPtr, char* buffer, char* name) { | |
| 1016 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1017 "%s:%d, ", name, getInt()); | |
| 1018 } | |
| 1019 | |
| 1020 int SkPicturePlayback::dumpRect(char* bufferPtr, char* buffer, char* name) { | |
| 1021 const SkRect* rect = fReader.skipRect(); | |
| 1022 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1023 "%s:{l:%g t:%g r:%g b:%g}, ", name, SkScalarToFloat(rect.fLeft), | |
| 1024 SkScalarToFloat(rect.fTop), | |
| 1025 SkScalarToFloat(rect.fRight), SkScalarToFloat(rect.fBottom)); | |
| 1026 } | |
| 1027 | |
| 1028 int SkPicturePlayback::dumpPoint(char* bufferPtr, char* buffer, char* name) { | |
| 1029 SkPoint pt; | |
| 1030 getPoint(&pt); | |
| 1031 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1032 "%s:{x:%g y:%g}, ", name, SkScalarToFloat(pt.fX), | |
| 1033 SkScalarToFloat(pt.fY)); | |
| 1034 } | |
| 1035 | |
| 1036 void SkPicturePlayback::dumpPointArray(char** bufferPtrPtr, char* buffer, int co
unt) { | |
| 1037 char* bufferPtr = *bufferPtrPtr; | |
| 1038 const SkPoint* pts = (const SkPoint*)fReadStream.getAtPos(); | |
| 1039 fReadStream.skip(sizeof(SkPoint) * count); | |
| 1040 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1041 "count:%d {", count); | |
| 1042 for (int index = 0; index < count; index++) | |
| 1043 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer)
, | |
| 1044 "{x:%g y:%g}, ", SkScalarToFloat(pts[index].fX), | |
| 1045 SkScalarToFloat(pts[index].fY)); | |
| 1046 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1047 "} "); | |
| 1048 *bufferPtrPtr = bufferPtr; | |
| 1049 } | |
| 1050 | |
| 1051 int SkPicturePlayback::dumpPtr(char* bufferPtr, char* buffer, char* name, void*
ptr) { | |
| 1052 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1053 "%s:%p, ", name, ptr); | |
| 1054 } | |
| 1055 | |
| 1056 int SkPicturePlayback::dumpRectPtr(char* bufferPtr, char* buffer, char* name) { | |
| 1057 char result; | |
| 1058 fReadStream.read(&result, sizeof(result)); | |
| 1059 if (result) | |
| 1060 return dumpRect(bufferPtr, buffer, name); | |
| 1061 else | |
| 1062 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1063 "%s:NULL, ", name); | |
| 1064 } | |
| 1065 | |
| 1066 int SkPicturePlayback::dumpScalar(char* bufferPtr, char* buffer, char* name) { | |
| 1067 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 1068 "%s:%d, ", name, getScalar()); | |
| 1069 } | |
| 1070 | |
| 1071 void SkPicturePlayback::dumpText(char** bufferPtrPtr, char* buffer) { | |
| 1072 char* bufferPtr = *bufferPtrPtr; | |
| 1073 int length = getInt(); | |
| 1074 bufferPtr += dumpDrawType(bufferPtr, buffer); | |
| 1075 fReadStream.skipToAlign4(); | |
| 1076 char* text = (char*) fReadStream.getAtPos(); | |
| 1077 fReadStream.skip(length); | |
| 1078 bufferPtr += dumpInt(bufferPtr, buffer, "length"); | |
| 1079 int limit = DUMP_BUFFER_SIZE - (bufferPtr - buffer) - 2; | |
| 1080 length >>= 1; | |
| 1081 if (limit > length) | |
| 1082 limit = length; | |
| 1083 if (limit > 0) { | |
| 1084 *bufferPtr++ = '"'; | |
| 1085 for (int index = 0; index < limit; index++) { | |
| 1086 *bufferPtr++ = *(unsigned short*) text; | |
| 1087 text += sizeof(unsigned short); | |
| 1088 } | |
| 1089 *bufferPtr++ = '"'; | |
| 1090 } | |
| 1091 *bufferPtrPtr = bufferPtr; | |
| 1092 } | |
| 1093 | |
| 1094 #define DUMP_DRAWTYPE(drawType) \ | |
| 1095 bufferPtr += dumpDrawType(bufferPtr, buffer, drawType) | |
| 1096 | |
| 1097 #define DUMP_INT(name) \ | |
| 1098 bufferPtr += dumpInt(bufferPtr, buffer, #name) | |
| 1099 | |
| 1100 #define DUMP_RECT_PTR(name) \ | |
| 1101 bufferPtr += dumpRectPtr(bufferPtr, buffer, #name) | |
| 1102 | |
| 1103 #define DUMP_POINT(name) \ | |
| 1104 bufferPtr += dumpRect(bufferPtr, buffer, #name) | |
| 1105 | |
| 1106 #define DUMP_RECT(name) \ | |
| 1107 bufferPtr += dumpRect(bufferPtr, buffer, #name) | |
| 1108 | |
| 1109 #define DUMP_POINT_ARRAY(count) \ | |
| 1110 dumpPointArray(&bufferPtr, buffer, count) | |
| 1111 | |
| 1112 #define DUMP_PTR(name, ptr) \ | |
| 1113 bufferPtr += dumpPtr(bufferPtr, buffer, #name, (void*) ptr) | |
| 1114 | |
| 1115 #define DUMP_SCALAR(name) \ | |
| 1116 bufferPtr += dumpScalar(bufferPtr, buffer, #name) | |
| 1117 | |
| 1118 #define DUMP_TEXT() \ | |
| 1119 dumpText(&bufferPtr, buffer) | |
| 1120 | |
| 1121 void SkPicturePlayback::dumpStream() { | |
| 1122 SkDebugf("RecordStream stream = {\n"); | |
| 1123 DrawType drawType; | |
| 1124 TextContainer text; | |
| 1125 fReadStream.rewind(); | |
| 1126 char buffer[DUMP_BUFFER_SIZE], * bufferPtr; | |
| 1127 while (fReadStream.read(&drawType, sizeof(drawType))) { | |
| 1128 bufferPtr = buffer; | |
| 1129 DUMP_DRAWTYPE(drawType); | |
| 1130 switch (drawType) { | |
| 1131 case CLIP_PATH: { | |
| 1132 DUMP_PTR(SkPath, &getPath()); | |
| 1133 DUMP_INT(SkRegion::Op); | |
| 1134 DUMP_INT(offsetToRestore); | |
| 1135 } break; | |
| 1136 case CLIP_REGION: { | |
| 1137 DUMP_PTR(SkRegion, &getRegion()); | |
| 1138 DUMP_INT(SkRegion::Op); | |
| 1139 DUMP_INT(offsetToRestore); | |
| 1140 } break; | |
| 1141 case CLIP_RECT: { | |
| 1142 DUMP_RECT(rect); | |
| 1143 DUMP_INT(SkRegion::Op); | |
| 1144 DUMP_INT(offsetToRestore); | |
| 1145 } break; | |
| 1146 case CONCAT: | |
| 1147 DUMP_PTR(SkMatrix, getMatrix()); | |
| 1148 break; | |
| 1149 case DRAW_BITMAP: { | |
| 1150 DUMP_PTR(SkPaint, getPaint()); | |
| 1151 DUMP_PTR(SkBitmap, &getBitmap()); | |
| 1152 DUMP_SCALAR(left); | |
| 1153 DUMP_SCALAR(top); | |
| 1154 } break; | |
| 1155 case DRAW_PAINT: | |
| 1156 DUMP_PTR(SkPaint, getPaint()); | |
| 1157 break; | |
| 1158 case DRAW_PATH: { | |
| 1159 DUMP_PTR(SkPaint, getPaint()); | |
| 1160 DUMP_PTR(SkPath, &getPath()); | |
| 1161 } break; | |
| 1162 case DRAW_PICTURE: { | |
| 1163 DUMP_PTR(SkPicture, &getPicture()); | |
| 1164 } break; | |
| 1165 case DRAW_POINTS: { | |
| 1166 DUMP_PTR(SkPaint, getPaint()); | |
| 1167 (void)getInt(); // PointMode | |
| 1168 size_t count = getInt(); | |
| 1169 fReadStream.skipToAlign4(); | |
| 1170 DUMP_POINT_ARRAY(count); | |
| 1171 } break; | |
| 1172 case DRAW_POS_TEXT: { | |
| 1173 DUMP_PTR(SkPaint, getPaint()); | |
| 1174 DUMP_TEXT(); | |
| 1175 size_t points = getInt(); | |
| 1176 fReadStream.skipToAlign4(); | |
| 1177 DUMP_POINT_ARRAY(points); | |
| 1178 } break; | |
| 1179 case DRAW_POS_TEXT_H: { | |
| 1180 DUMP_PTR(SkPaint, getPaint()); | |
| 1181 DUMP_TEXT(); | |
| 1182 size_t points = getInt(); | |
| 1183 fReadStream.skipToAlign4(); | |
| 1184 DUMP_SCALAR(top); | |
| 1185 DUMP_SCALAR(bottom); | |
| 1186 DUMP_SCALAR(constY); | |
| 1187 DUMP_POINT_ARRAY(points); | |
| 1188 } break; | |
| 1189 case DRAW_RECT: { | |
| 1190 DUMP_PTR(SkPaint, getPaint()); | |
| 1191 DUMP_RECT(rect); | |
| 1192 } break; | |
| 1193 case DRAW_SPRITE: { | |
| 1194 DUMP_PTR(SkPaint, getPaint()); | |
| 1195 DUMP_PTR(SkBitmap, &getBitmap()); | |
| 1196 DUMP_SCALAR(left); | |
| 1197 DUMP_SCALAR(top); | |
| 1198 } break; | |
| 1199 case DRAW_TEXT: { | |
| 1200 DUMP_PTR(SkPaint, getPaint()); | |
| 1201 DUMP_TEXT(); | |
| 1202 DUMP_SCALAR(x); | |
| 1203 DUMP_SCALAR(y); | |
| 1204 } break; | |
| 1205 case DRAW_TEXT_ON_PATH: { | |
| 1206 DUMP_PTR(SkPaint, getPaint()); | |
| 1207 DUMP_TEXT(); | |
| 1208 DUMP_PTR(SkPath, &getPath()); | |
| 1209 DUMP_PTR(SkMatrix, getMatrix()); | |
| 1210 } break; | |
| 1211 case RESTORE: | |
| 1212 break; | |
| 1213 case ROTATE: | |
| 1214 DUMP_SCALAR(rotate); | |
| 1215 break; | |
| 1216 case SAVE: | |
| 1217 DUMP_INT(SkCanvas::SaveFlags); | |
| 1218 break; | |
| 1219 case SAVE_LAYER: { | |
| 1220 DUMP_RECT_PTR(layer); | |
| 1221 DUMP_PTR(SkPaint, getPaint()); | |
| 1222 DUMP_INT(SkCanvas::SaveFlags); | |
| 1223 } break; | |
| 1224 case SCALE: { | |
| 1225 DUMP_SCALAR(sx); | |
| 1226 DUMP_SCALAR(sy); | |
| 1227 } break; | |
| 1228 case SKEW: { | |
| 1229 DUMP_SCALAR(sx); | |
| 1230 DUMP_SCALAR(sy); | |
| 1231 } break; | |
| 1232 case TRANSLATE: { | |
| 1233 DUMP_SCALAR(dx); | |
| 1234 DUMP_SCALAR(dy); | |
| 1235 } break; | |
| 1236 default: | |
| 1237 SkASSERT(0); | |
| 1238 } | |
| 1239 SkDebugf("%s\n", buffer); | |
| 1240 } | |
| 1241 } | |
| 1242 | |
| 1243 void SkPicturePlayback::dump() const { | |
| 1244 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 1245 char* bufferPtr = pBuffer; | |
| 1246 int index; | |
| 1247 if (fBitmapCount > 0) | |
| 1248 SkDebugf("// bitmaps (%d)\n", fBitmapCount); | |
| 1249 for (index = 0; index < fBitmapCount; index++) { | |
| 1250 const SkBitmap& bitmap = fBitmaps[index]; | |
| 1251 dumpBitmap(bitmap); | |
| 1252 } | |
| 1253 if (fBitmapCount > 0) | |
| 1254 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1255 "Bitmaps bitmaps = {"); | |
| 1256 for (index = 0; index < fBitmapCount; index++) | |
| 1257 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1258 "bitmap%p, ", &fBitmaps[index]); | |
| 1259 if (fBitmapCount > 0) | |
| 1260 SkDebugf("%s0};\n", pBuffer); | |
| 1261 | |
| 1262 if (fMatrixCount > 0) | |
| 1263 SkDebugf("// matrices (%d)\n", fMatrixCount); | |
| 1264 for (index = 0; index < fMatrixCount; index++) { | |
| 1265 const SkMatrix& matrix = fMatrices[index]; | |
| 1266 dumpMatrix(matrix); | |
| 1267 } | |
| 1268 bufferPtr = pBuffer; | |
| 1269 if (fMatrixCount > 0) | |
| 1270 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1271 "Matrices matrices = {"); | |
| 1272 for (index = 0; index < fMatrixCount; index++) | |
| 1273 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1274 "matrix%p, ", &fMatrices[index]); | |
| 1275 if (fMatrixCount > 0) | |
| 1276 SkDebugf("%s0};\n", pBuffer); | |
| 1277 | |
| 1278 if (fPaintCount > 0) | |
| 1279 SkDebugf("// paints (%d)\n", fPaintCount); | |
| 1280 for (index = 0; index < fPaintCount; index++) { | |
| 1281 const SkPaint& paint = fPaints[index]; | |
| 1282 dumpPaint(paint); | |
| 1283 } | |
| 1284 bufferPtr = pBuffer; | |
| 1285 if (fPaintCount > 0) | |
| 1286 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1287 "Paints paints = {"); | |
| 1288 for (index = 0; index < fPaintCount; index++) | |
| 1289 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1290 "paint%p, ", &fPaints[index]); | |
| 1291 if (fPaintCount > 0) | |
| 1292 SkDebugf("%s0};\n", pBuffer); | |
| 1293 | |
| 1294 for (index = 0; index < fPathCount; index++) { | |
| 1295 const SkPath& path = fPaths[index]; | |
| 1296 dumpPath(path); | |
| 1297 } | |
| 1298 bufferPtr = pBuffer; | |
| 1299 if (fPathCount > 0) | |
| 1300 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1301 "Paths paths = {"); | |
| 1302 for (index = 0; index < fPathCount; index++) | |
| 1303 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1304 "path%p, ", &fPaths[index]); | |
| 1305 if (fPathCount > 0) | |
| 1306 SkDebugf("%s0};\n", pBuffer); | |
| 1307 | |
| 1308 for (index = 0; index < fPictureCount; index++) { | |
| 1309 dumpPicture(*fPictureRefs[index]); | |
| 1310 } | |
| 1311 bufferPtr = pBuffer; | |
| 1312 if (fPictureCount > 0) | |
| 1313 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1314 "Pictures pictures = {"); | |
| 1315 for (index = 0; index < fPictureCount; index++) | |
| 1316 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1317 "picture%p, ", fPictureRefs[index]); | |
| 1318 if (fPictureCount > 0) | |
| 1319 SkDebugf("%s0};\n", pBuffer); | |
| 1320 | |
| 1321 for (index = 0; index < fRegionCount; index++) { | |
| 1322 const SkRegion& region = fRegions[index]; | |
| 1323 dumpRegion(region); | |
| 1324 } | |
| 1325 bufferPtr = pBuffer; | |
| 1326 if (fRegionCount > 0) | |
| 1327 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1328 "Regions regions = {"); | |
| 1329 for (index = 0; index < fRegionCount; index++) | |
| 1330 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1331 "region%p, ", &fRegions[index]); | |
| 1332 if (fRegionCount > 0) | |
| 1333 SkDebugf("%s0};\n", pBuffer); | |
| 1334 | |
| 1335 const_cast<SkPicturePlayback*>(this)->dumpStream(); | |
| 1336 } | |
| 1337 | |
| 1338 #endif | |
| OLD | NEW |