| OLD | NEW |
| (Empty) |
| 1 #include "SkPictureRecord.h" | |
| 2 #include "SkTSearch.h" | |
| 3 | |
| 4 #define MIN_WRITER_SIZE 16384 | |
| 5 #define HEAP_BLOCK_SIZE 4096 | |
| 6 | |
| 7 SkPictureRecord::SkPictureRecord() : | |
| 8 fHeap(HEAP_BLOCK_SIZE), fWriter(MIN_WRITER_SIZE) { | |
| 9 fBitmapIndex = fMatrixIndex = fPaintIndex = fRegionIndex = 1; | |
| 10 #ifdef SK_DEBUG_SIZE | |
| 11 fPointBytes = fRectBytes = fTextBytes = 0; | |
| 12 fPointWrites = fRectWrites = fTextWrites = 0; | |
| 13 #endif | |
| 14 | |
| 15 fRestoreOffsetStack.setReserve(32); | |
| 16 fRestoreOffsetStack.push(0); | |
| 17 | |
| 18 fPathHeap = NULL; // lazy allocate | |
| 19 } | |
| 20 | |
| 21 SkPictureRecord::~SkPictureRecord() { | |
| 22 reset(); | |
| 23 } | |
| 24 | |
| 25 /////////////////////////////////////////////////////////////////////////////// | |
| 26 | |
| 27 int SkPictureRecord::save(SaveFlags flags) { | |
| 28 addDraw(SAVE); | |
| 29 addInt(flags); | |
| 30 | |
| 31 fRestoreOffsetStack.push(0); | |
| 32 | |
| 33 validate(); | |
| 34 return this->INHERITED::save(flags); | |
| 35 } | |
| 36 | |
| 37 int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, | |
| 38 SaveFlags flags) { | |
| 39 addDraw(SAVE_LAYER); | |
| 40 addRectPtr(bounds); | |
| 41 addPaintPtr(paint); | |
| 42 addInt(flags); | |
| 43 | |
| 44 fRestoreOffsetStack.push(0); | |
| 45 | |
| 46 validate(); | |
| 47 return this->INHERITED::saveLayer(bounds, paint, flags); | |
| 48 } | |
| 49 | |
| 50 void SkPictureRecord::restore() { | |
| 51 | |
| 52 // patch up the clip offsets | |
| 53 { | |
| 54 uint32_t restoreOffset = (uint32_t)fWriter.size(); | |
| 55 uint32_t offset = fRestoreOffsetStack.top(); | |
| 56 while (offset) { | |
| 57 uint32_t* peek = fWriter.peek32(offset); | |
| 58 offset = *peek; | |
| 59 *peek = restoreOffset; | |
| 60 } | |
| 61 fRestoreOffsetStack.pop(); | |
| 62 } | |
| 63 | |
| 64 addDraw(RESTORE); | |
| 65 validate(); | |
| 66 return this->INHERITED::restore(); | |
| 67 } | |
| 68 | |
| 69 bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { | |
| 70 addDraw(TRANSLATE); | |
| 71 addScalar(dx); | |
| 72 addScalar(dy); | |
| 73 validate(); | |
| 74 return this->INHERITED::translate(dx, dy); | |
| 75 } | |
| 76 | |
| 77 bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { | |
| 78 addDraw(SCALE); | |
| 79 addScalar(sx); | |
| 80 addScalar(sy); | |
| 81 validate(); | |
| 82 return this->INHERITED::scale(sx, sy); | |
| 83 } | |
| 84 | |
| 85 bool SkPictureRecord::rotate(SkScalar degrees) { | |
| 86 addDraw(ROTATE); | |
| 87 addScalar(degrees); | |
| 88 validate(); | |
| 89 return this->INHERITED::rotate(degrees); | |
| 90 } | |
| 91 | |
| 92 bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { | |
| 93 addDraw(SKEW); | |
| 94 addScalar(sx); | |
| 95 addScalar(sy); | |
| 96 validate(); | |
| 97 return this->INHERITED::skew(sx, sy); | |
| 98 } | |
| 99 | |
| 100 bool SkPictureRecord::concat(const SkMatrix& matrix) { | |
| 101 validate(); | |
| 102 addDraw(CONCAT); | |
| 103 addMatrix(matrix); | |
| 104 validate(); | |
| 105 return this->INHERITED::concat(matrix); | |
| 106 } | |
| 107 | |
| 108 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op) { | |
| 109 addDraw(CLIP_RECT); | |
| 110 addRect(rect); | |
| 111 addInt(op); | |
| 112 | |
| 113 size_t offset = fWriter.size(); | |
| 114 addInt(fRestoreOffsetStack.top()); | |
| 115 fRestoreOffsetStack.top() = offset; | |
| 116 | |
| 117 validate(); | |
| 118 return this->INHERITED::clipRect(rect, op); | |
| 119 } | |
| 120 | |
| 121 bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op) { | |
| 122 addDraw(CLIP_PATH); | |
| 123 addPath(path); | |
| 124 addInt(op); | |
| 125 | |
| 126 size_t offset = fWriter.size(); | |
| 127 addInt(fRestoreOffsetStack.top()); | |
| 128 fRestoreOffsetStack.top() = offset; | |
| 129 | |
| 130 validate(); | |
| 131 return this->INHERITED::clipPath(path, op); | |
| 132 } | |
| 133 | |
| 134 bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { | |
| 135 addDraw(CLIP_REGION); | |
| 136 addRegion(region); | |
| 137 addInt(op); | |
| 138 | |
| 139 size_t offset = fWriter.size(); | |
| 140 addInt(fRestoreOffsetStack.top()); | |
| 141 fRestoreOffsetStack.top() = offset; | |
| 142 | |
| 143 validate(); | |
| 144 return this->INHERITED::clipRegion(region, op); | |
| 145 } | |
| 146 | |
| 147 void SkPictureRecord::drawPaint(const SkPaint& paint) { | |
| 148 addDraw(DRAW_PAINT); | |
| 149 addPaint(paint); | |
| 150 validate(); | |
| 151 } | |
| 152 | |
| 153 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
[], | |
| 154 const SkPaint& paint) { | |
| 155 addDraw(DRAW_POINTS); | |
| 156 addPaint(paint); | |
| 157 addInt(mode); | |
| 158 addInt(count); | |
| 159 fWriter.writeMul4(pts, count * sizeof(SkPoint)); | |
| 160 validate(); | |
| 161 } | |
| 162 | |
| 163 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { | |
| 164 addDraw(DRAW_RECT); | |
| 165 addPaint(paint); | |
| 166 addRect(rect); | |
| 167 validate(); | |
| 168 } | |
| 169 | |
| 170 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { | |
| 171 addDraw(DRAW_PATH); | |
| 172 addPaint(paint); | |
| 173 addPath(path); | |
| 174 validate(); | |
| 175 } | |
| 176 | |
| 177 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
top, | |
| 178 const SkPaint* paint = NULL) { | |
| 179 addDraw(DRAW_BITMAP); | |
| 180 addPaintPtr(paint); | |
| 181 addBitmap(bitmap); | |
| 182 addScalar(left); | |
| 183 addScalar(top); | |
| 184 validate(); | |
| 185 } | |
| 186 | |
| 187 void SkPictureRecord::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, | |
| 188 const SkRect& dst, const SkPaint* paint) { | |
| 189 addDraw(DRAW_BITMAP_RECT); | |
| 190 addPaintPtr(paint); | |
| 191 addBitmap(bitmap); | |
| 192 addIRectPtr(src); // may be null | |
| 193 addRect(dst); | |
| 194 validate(); | |
| 195 } | |
| 196 | |
| 197 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
atrix, | |
| 198 const SkPaint* paint) { | |
| 199 addDraw(DRAW_BITMAP_MATRIX); | |
| 200 addPaintPtr(paint); | |
| 201 addBitmap(bitmap); | |
| 202 addMatrix(matrix); | |
| 203 validate(); | |
| 204 } | |
| 205 | |
| 206 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, | |
| 207 const SkPaint* paint = NULL) { | |
| 208 addDraw(DRAW_SPRITE); | |
| 209 addPaintPtr(paint); | |
| 210 addBitmap(bitmap); | |
| 211 addInt(left); | |
| 212 addInt(top); | |
| 213 validate(); | |
| 214 } | |
| 215 | |
| 216 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, | |
| 217 SkScalar baselineY) { | |
| 218 SkPaint::FontMetrics metrics; | |
| 219 paint.getFontMetrics(&metrics); | |
| 220 SkRect bounds; | |
| 221 // construct a rect so we can see any adjustments from the paint. | |
| 222 // we use 0,1 for left,right, just so the rect isn't empty | |
| 223 bounds.set(0, metrics.fTop + baselineY, | |
| 224 SK_Scalar1, metrics.fBottom + baselineY); | |
| 225 (void)paint.computeFastBounds(bounds, &bounds); | |
| 226 // now record the top and bottom | |
| 227 addScalar(bounds.fTop); | |
| 228 addScalar(bounds.fBottom); | |
| 229 } | |
| 230 | |
| 231 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, | |
| 232 SkScalar y, const SkPaint& paint) { | |
| 233 bool fast = paint.canComputeFastBounds(); | |
| 234 | |
| 235 addDraw(fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT); | |
| 236 addPaint(paint); | |
| 237 addText(text, byteLength); | |
| 238 addScalar(x); | |
| 239 addScalar(y); | |
| 240 if (fast) { | |
| 241 addFontMetricsTopBottom(paint, y); | |
| 242 } | |
| 243 validate(); | |
| 244 } | |
| 245 | |
| 246 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, | |
| 247 const SkPoint pos[], const SkPaint& paint) { | |
| 248 size_t points = paint.countText(text, byteLength); | |
| 249 if (0 == points) | |
| 250 return; | |
| 251 | |
| 252 bool canUseDrawH = true; | |
| 253 // check if the caller really should have used drawPosTextH() | |
| 254 { | |
| 255 const SkScalar firstY = pos[0].fY; | |
| 256 for (size_t index = 1; index < points; index++) { | |
| 257 if (pos[index].fY != firstY) { | |
| 258 canUseDrawH = false; | |
| 259 break; | |
| 260 } | |
| 261 } | |
| 262 } | |
| 263 | |
| 264 bool fast = canUseDrawH && paint.canComputeFastBounds(); | |
| 265 | |
| 266 if (fast) { | |
| 267 addDraw(DRAW_POS_TEXT_H_TOP_BOTTOM); | |
| 268 } else { | |
| 269 addDraw(canUseDrawH ? DRAW_POS_TEXT_H : DRAW_POS_TEXT); | |
| 270 } | |
| 271 addPaint(paint); | |
| 272 addText(text, byteLength); | |
| 273 addInt(points); | |
| 274 | |
| 275 #ifdef SK_DEBUG_SIZE | |
| 276 size_t start = fWriter.size(); | |
| 277 #endif | |
| 278 if (canUseDrawH) { | |
| 279 if (fast) { | |
| 280 addFontMetricsTopBottom(paint, pos[0].fY); | |
| 281 } | |
| 282 addScalar(pos[0].fY); | |
| 283 SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); | |
| 284 for (size_t index = 0; index < points; index++) | |
| 285 *xptr++ = pos[index].fX; | |
| 286 } | |
| 287 else { | |
| 288 fWriter.writeMul4(pos, points * sizeof(SkPoint)); | |
| 289 } | |
| 290 #ifdef SK_DEBUG_SIZE | |
| 291 fPointBytes += fWriter.size() - start; | |
| 292 fPointWrites += points; | |
| 293 #endif | |
| 294 validate(); | |
| 295 } | |
| 296 | |
| 297 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, | |
| 298 const SkScalar xpos[], SkScalar constY, | |
| 299 const SkPaint& paint) { | |
| 300 size_t points = paint.countText(text, byteLength); | |
| 301 if (0 == points) | |
| 302 return; | |
| 303 | |
| 304 bool fast = paint.canComputeFastBounds(); | |
| 305 | |
| 306 addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRAW_POS_TEXT_H); | |
| 307 addPaint(paint); | |
| 308 addText(text, byteLength); | |
| 309 addInt(points); | |
| 310 | |
| 311 #ifdef SK_DEBUG_SIZE | |
| 312 size_t start = fWriter.size(); | |
| 313 #endif | |
| 314 if (fast) { | |
| 315 addFontMetricsTopBottom(paint, constY); | |
| 316 } | |
| 317 addScalar(constY); | |
| 318 fWriter.writeMul4(xpos, points * sizeof(SkScalar)); | |
| 319 #ifdef SK_DEBUG_SIZE | |
| 320 fPointBytes += fWriter.size() - start; | |
| 321 fPointWrites += points; | |
| 322 #endif | |
| 323 validate(); | |
| 324 } | |
| 325 | |
| 326 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, | |
| 327 const SkPath& path, const SkMatrix* matrix, | |
| 328 const SkPaint& paint) { | |
| 329 addDraw(DRAW_TEXT_ON_PATH); | |
| 330 addPaint(paint); | |
| 331 addText(text, byteLength); | |
| 332 addPath(path); | |
| 333 addMatrixPtr(matrix); | |
| 334 validate(); | |
| 335 } | |
| 336 | |
| 337 void SkPictureRecord::drawPicture(SkPicture& picture) { | |
| 338 addDraw(DRAW_PICTURE); | |
| 339 addPicture(picture); | |
| 340 validate(); | |
| 341 } | |
| 342 | |
| 343 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, | |
| 344 const SkPoint vertices[], const SkPoint texs[], | |
| 345 const SkColor colors[], SkXfermode*, | |
| 346 const uint16_t indices[], int indexCount, | |
| 347 const SkPaint& paint) { | |
| 348 uint32_t flags = 0; | |
| 349 if (texs) { | |
| 350 flags |= DRAW_VERTICES_HAS_TEXS; | |
| 351 } | |
| 352 if (colors) { | |
| 353 flags |= DRAW_VERTICES_HAS_COLORS; | |
| 354 } | |
| 355 if (indexCount > 0) { | |
| 356 flags |= DRAW_VERTICES_HAS_INDICES; | |
| 357 } | |
| 358 | |
| 359 addDraw(DRAW_VERTICES); | |
| 360 addPaint(paint); | |
| 361 addInt(flags); | |
| 362 addInt(vmode); | |
| 363 addInt(vertexCount); | |
| 364 addPoints(vertices, vertexCount); | |
| 365 if (flags & DRAW_VERTICES_HAS_TEXS) { | |
| 366 addPoints(texs, vertexCount); | |
| 367 } | |
| 368 if (flags & DRAW_VERTICES_HAS_COLORS) { | |
| 369 fWriter.writeMul4(colors, vertexCount * sizeof(SkColor)); | |
| 370 } | |
| 371 if (flags & DRAW_VERTICES_HAS_INDICES) { | |
| 372 addInt(indexCount); | |
| 373 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); | |
| 374 } | |
| 375 } | |
| 376 | |
| 377 /////////////////////////////////////////////////////////////////////////////// | |
| 378 | |
| 379 void SkPictureRecord::reset() { | |
| 380 fPathHeap->safeUnref(); | |
| 381 fPathHeap = NULL; | |
| 382 | |
| 383 fBitmaps.reset(); | |
| 384 fMatrices.reset(); | |
| 385 fPaints.reset(); | |
| 386 fPictureRefs.unrefAll(); | |
| 387 fRegions.reset(); | |
| 388 fWriter.reset(); | |
| 389 fHeap.reset(); | |
| 390 | |
| 391 fRestoreOffsetStack.setCount(1); | |
| 392 fRestoreOffsetStack.top() = 0; | |
| 393 | |
| 394 fRCRecorder.reset(); | |
| 395 fTFRecorder.reset(); | |
| 396 } | |
| 397 | |
| 398 void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { | |
| 399 addInt(find(fBitmaps, bitmap)); | |
| 400 } | |
| 401 | |
| 402 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { | |
| 403 addMatrixPtr(&matrix); | |
| 404 } | |
| 405 | |
| 406 void SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) { | |
| 407 addInt(find(fMatrices, matrix)); | |
| 408 } | |
| 409 | |
| 410 void SkPictureRecord::addPaint(const SkPaint& paint) { | |
| 411 addPaintPtr(&paint); | |
| 412 } | |
| 413 | |
| 414 void SkPictureRecord::addPaintPtr(const SkPaint* paint) { | |
| 415 addInt(find(fPaints, paint)); | |
| 416 } | |
| 417 | |
| 418 void SkPictureRecord::addPath(const SkPath& path) { | |
| 419 if (NULL == fPathHeap) { | |
| 420 fPathHeap = SkNEW(SkPathHeap); | |
| 421 } | |
| 422 addInt(fPathHeap->append(path)); | |
| 423 } | |
| 424 | |
| 425 void SkPictureRecord::addPicture(SkPicture& picture) { | |
| 426 int index = fPictureRefs.find(&picture); | |
| 427 if (index < 0) { // not found | |
| 428 index = fPictureRefs.count(); | |
| 429 *fPictureRefs.append() = &picture; | |
| 430 picture.ref(); | |
| 431 } | |
| 432 // follow the convention of recording a 1-based index | |
| 433 addInt(index + 1); | |
| 434 } | |
| 435 | |
| 436 void SkPictureRecord::addPoint(const SkPoint& point) { | |
| 437 #ifdef SK_DEBUG_SIZE | |
| 438 size_t start = fWriter.size(); | |
| 439 #endif | |
| 440 fWriter.writePoint(point); | |
| 441 #ifdef SK_DEBUG_SIZE | |
| 442 fPointBytes += fWriter.size() - start; | |
| 443 fPointWrites++; | |
| 444 #endif | |
| 445 } | |
| 446 | |
| 447 void SkPictureRecord::addPoints(const SkPoint pts[], int count) { | |
| 448 fWriter.writeMul4(pts, count * sizeof(SkPoint)); | |
| 449 #ifdef SK_DEBUG_SIZE | |
| 450 fPointBytes += count * sizeof(SkPoint); | |
| 451 fPointWrites++; | |
| 452 #endif | |
| 453 } | |
| 454 | |
| 455 void SkPictureRecord::addRect(const SkRect& rect) { | |
| 456 #ifdef SK_DEBUG_SIZE | |
| 457 size_t start = fWriter.size(); | |
| 458 #endif | |
| 459 fWriter.writeRect(rect); | |
| 460 #ifdef SK_DEBUG_SIZE | |
| 461 fRectBytes += fWriter.size() - start; | |
| 462 fRectWrites++; | |
| 463 #endif | |
| 464 } | |
| 465 | |
| 466 void SkPictureRecord::addRectPtr(const SkRect* rect) { | |
| 467 if (fWriter.writeBool(rect != NULL)) { | |
| 468 fWriter.writeRect(*rect); | |
| 469 } | |
| 470 } | |
| 471 | |
| 472 void SkPictureRecord::addIRectPtr(const SkIRect* rect) { | |
| 473 if (fWriter.writeBool(rect != NULL)) { | |
| 474 *(SkIRect*)fWriter.reserve(sizeof(SkIRect)) = *rect; | |
| 475 } | |
| 476 } | |
| 477 | |
| 478 void SkPictureRecord::addRegion(const SkRegion& region) { | |
| 479 addInt(find(fRegions, region)); | |
| 480 } | |
| 481 | |
| 482 void SkPictureRecord::addText(const void* text, size_t byteLength) { | |
| 483 #ifdef SK_DEBUG_SIZE | |
| 484 size_t start = fWriter.size(); | |
| 485 #endif | |
| 486 addInt(byteLength); | |
| 487 fWriter.writePad(text, byteLength); | |
| 488 #ifdef SK_DEBUG_SIZE | |
| 489 fTextBytes += fWriter.size() - start; | |
| 490 fTextWrites++; | |
| 491 #endif | |
| 492 } | |
| 493 | |
| 494 /////////////////////////////////////////////////////////////////////////////// | |
| 495 | |
| 496 int SkPictureRecord::find(SkTDArray<const SkFlatBitmap* >& bitmaps, const SkBitm
ap& bitmap) { | |
| 497 SkFlatBitmap* flat = SkFlatBitmap::Flatten(&fHeap, bitmap, fBitmapIndex, | |
| 498 &fRCRecorder); | |
| 499 int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(), | |
| 500 bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare)
; | |
| 501 if (index >= 0) { | |
| 502 // SkBitmap bitmap; | |
| 503 // flat->unflatten(&bitmap); // balance ref count | |
| 504 return bitmaps[index]->index(); | |
| 505 } | |
| 506 index = ~index; | |
| 507 *bitmaps.insert(index) = flat; | |
| 508 return fBitmapIndex++; | |
| 509 } | |
| 510 | |
| 511 int SkPictureRecord::find(SkTDArray<const SkFlatMatrix* >& matrices, const SkMat
rix* matrix) { | |
| 512 if (matrix == NULL) | |
| 513 return 0; | |
| 514 SkFlatMatrix* flat = SkFlatMatrix::Flatten(&fHeap, *matrix, fMatrixIndex); | |
| 515 int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(), | |
| 516 matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare
); | |
| 517 if (index >= 0) | |
| 518 return matrices[index]->index(); | |
| 519 index = ~index; | |
| 520 *matrices.insert(index) = flat; | |
| 521 return fMatrixIndex++; | |
| 522 } | |
| 523 | |
| 524 int SkPictureRecord::find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint*
paint) { | |
| 525 if (paint == NULL) { | |
| 526 return 0; | |
| 527 } | |
| 528 | |
| 529 SkFlatPaint* flat = SkFlatPaint::Flatten(&fHeap, *paint, fPaintIndex, | |
| 530 &fRCRecorder, &fTFRecorder); | |
| 531 int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(), | |
| 532 paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); | |
| 533 if (index >= 0) { | |
| 534 return paints[index]->index(); | |
| 535 } | |
| 536 | |
| 537 index = ~index; | |
| 538 *paints.insert(index) = flat; | |
| 539 return fPaintIndex++; | |
| 540 } | |
| 541 | |
| 542 int SkPictureRecord::find(SkTDArray<const SkFlatRegion* >& regions, const SkRegi
on& region) { | |
| 543 SkFlatRegion* flat = SkFlatRegion::Flatten(&fHeap, region, fRegionIndex); | |
| 544 int index = SkTSearch<SkFlatData>((const SkFlatData**) regions.begin(), | |
| 545 regions.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare)
; | |
| 546 if (index >= 0) | |
| 547 return regions[index]->index(); | |
| 548 index = ~index; | |
| 549 *regions.insert(index) = flat; | |
| 550 return fRegionIndex++; | |
| 551 } | |
| 552 | |
| 553 #ifdef SK_DEBUG_DUMP | |
| 554 void SkPictureRecord::dumpMatrices() { | |
| 555 int count = fMatrices.count(); | |
| 556 SkMatrix defaultMatrix; | |
| 557 defaultMatrix.reset(); | |
| 558 for (int index = 0; index < count; index++) { | |
| 559 const SkFlatMatrix* flatMatrix = fMatrices[index]; | |
| 560 flatMatrix->dump(); | |
| 561 } | |
| 562 } | |
| 563 | |
| 564 void SkPictureRecord::dumpPaints() { | |
| 565 int count = fPaints.count(); | |
| 566 for (int index = 0; index < count; index++) | |
| 567 fPaints[index]->dump(); | |
| 568 } | |
| 569 #endif | |
| 570 | |
| 571 #ifdef SK_DEBUG_SIZE | |
| 572 size_t SkPictureRecord::size() const { | |
| 573 size_t result = 0; | |
| 574 size_t sizeData; | |
| 575 bitmaps(&sizeData); | |
| 576 result += sizeData; | |
| 577 matrices(&sizeData); | |
| 578 result += sizeData; | |
| 579 paints(&sizeData); | |
| 580 result += sizeData; | |
| 581 paths(&sizeData); | |
| 582 result += sizeData; | |
| 583 pictures(&sizeData); | |
| 584 result += sizeData; | |
| 585 regions(&sizeData); | |
| 586 result += sizeData; | |
| 587 result += streamlen(); | |
| 588 return result; | |
| 589 } | |
| 590 | |
| 591 int SkPictureRecord::bitmaps(size_t* size) const { | |
| 592 size_t result = 0; | |
| 593 int count = fBitmaps.count(); | |
| 594 for (int index = 0; index < count; index++) | |
| 595 result += sizeof(fBitmaps[index]) + fBitmaps[index]->size(); | |
| 596 *size = result; | |
| 597 return count; | |
| 598 } | |
| 599 | |
| 600 int SkPictureRecord::matrices(size_t* size) const { | |
| 601 int count = fMatrices.count(); | |
| 602 *size = sizeof(fMatrices[0]) * count; | |
| 603 return count; | |
| 604 } | |
| 605 | |
| 606 int SkPictureRecord::paints(size_t* size) const { | |
| 607 size_t result = 0; | |
| 608 int count = fPaints.count(); | |
| 609 for (int index = 0; index < count; index++) | |
| 610 result += sizeof(fPaints[index]) + fPaints[index]->size(); | |
| 611 *size = result; | |
| 612 return count; | |
| 613 } | |
| 614 | |
| 615 int SkPictureRecord::paths(size_t* size) const { | |
| 616 size_t result = 0; | |
| 617 int count = fPaths.count(); | |
| 618 for (int index = 0; index < count; index++) | |
| 619 result += sizeof(fPaths[index]) + fPaths[index]->size(); | |
| 620 *size = result; | |
| 621 return count; | |
| 622 } | |
| 623 | |
| 624 int SkPictureRecord::regions(size_t* size) const { | |
| 625 size_t result = 0; | |
| 626 int count = fRegions.count(); | |
| 627 for (int index = 0; index < count; index++) | |
| 628 result += sizeof(fRegions[index]) + fRegions[index]->size(); | |
| 629 *size = result; | |
| 630 return count; | |
| 631 } | |
| 632 | |
| 633 size_t SkPictureRecord::streamlen() const { | |
| 634 return fWriter.size(); | |
| 635 } | |
| 636 #endif | |
| 637 | |
| 638 #ifdef SK_DEBUG_VALIDATE | |
| 639 void SkPictureRecord::validate() const { | |
| 640 validateBitmaps(); | |
| 641 validateMatrices(); | |
| 642 validatePaints(); | |
| 643 validatePaths(); | |
| 644 validatePictures(); | |
| 645 validateRegions(); | |
| 646 } | |
| 647 | |
| 648 void SkPictureRecord::validateBitmaps() const { | |
| 649 int count = fBitmaps.count(); | |
| 650 SkASSERT((unsigned) count < 0x1000); | |
| 651 for (int index = 0; index < count; index++) { | |
| 652 const SkFlatBitmap* bitPtr = fBitmaps[index]; | |
| 653 SkASSERT(bitPtr); | |
| 654 bitPtr->validate(); | |
| 655 } | |
| 656 } | |
| 657 | |
| 658 void SkPictureRecord::validateMatrices() const { | |
| 659 int count = fMatrices.count(); | |
| 660 SkASSERT((unsigned) count < 0x1000); | |
| 661 for (int index = 0; index < count; index++) { | |
| 662 const SkFlatMatrix* matrix = fMatrices[index]; | |
| 663 SkASSERT(matrix); | |
| 664 matrix->validate(); | |
| 665 } | |
| 666 } | |
| 667 | |
| 668 void SkPictureRecord::validatePaints() const { | |
| 669 int count = fPaints.count(); | |
| 670 SkASSERT((unsigned) count < 0x1000); | |
| 671 for (int index = 0; index < count; index++) { | |
| 672 const SkFlatPaint* paint = fPaints[index]; | |
| 673 SkASSERT(paint); | |
| 674 // paint->validate(); | |
| 675 } | |
| 676 } | |
| 677 | |
| 678 void SkPictureRecord::validatePaths() const { | |
| 679 int count = fPaths.count(); | |
| 680 SkASSERT((unsigned) count < 0x1000); | |
| 681 for (int index = 0; index < count; index++) { | |
| 682 const SkFlatPath* path = fPaths[index]; | |
| 683 SkASSERT(path); | |
| 684 path->validate(); | |
| 685 } | |
| 686 } | |
| 687 | |
| 688 void SkPictureRecord::validateRegions() const { | |
| 689 int count = fRegions.count(); | |
| 690 SkASSERT((unsigned) count < 0x1000); | |
| 691 for (int index = 0; index < count; index++) { | |
| 692 const SkFlatRegion* region = fRegions[index]; | |
| 693 SkASSERT(region); | |
| 694 region->validate(); | |
| 695 } | |
| 696 } | |
| 697 #endif | |
| 698 | |
| OLD | NEW |