OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkPictureRecord.h" | 8 #include "SkPictureRecord.h" |
9 #include "SkTSearch.h" | 9 #include "SkTSearch.h" |
10 #include "SkPixelRef.h" | 10 #include "SkPixelRef.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 0, // SAVE - no paint | 104 0, // SAVE - no paint |
105 0, // SAVE_LAYER - see below - this paint's location varies | 105 0, // SAVE_LAYER - see below - this paint's location varies |
106 0, // SCALE - no paint | 106 0, // SCALE - no paint |
107 0, // SET_MATRIX - no paint | 107 0, // SET_MATRIX - no paint |
108 0, // SKEW - no paint | 108 0, // SKEW - no paint |
109 0, // TRANSLATE - no paint | 109 0, // TRANSLATE - no paint |
110 0, // NOOP - no paint | 110 0, // NOOP - no paint |
111 0, // BEGIN_GROUP - no paint | 111 0, // BEGIN_GROUP - no paint |
112 0, // COMMENT - no paint | 112 0, // COMMENT - no paint |
113 0, // END_GROUP - no paint | 113 0, // END_GROUP - no paint |
| 114 1, // DRAWDRRECT - right after op code |
114 }; | 115 }; |
115 | 116 |
116 SkASSERT(sizeof(gPaintOffsets) == LAST_DRAWTYPE_ENUM + 1); | 117 SK_COMPILE_ASSERT(sizeof(gPaintOffsets) == LAST_DRAWTYPE_ENUM + 1, |
| 118 need_to_be_in_sync); |
117 SkASSERT((unsigned)op <= (unsigned)LAST_DRAWTYPE_ENUM); | 119 SkASSERT((unsigned)op <= (unsigned)LAST_DRAWTYPE_ENUM); |
118 | 120 |
119 int overflow = 0; | 121 int overflow = 0; |
120 if (0 != (opSize & ~MASK_24) || opSize == MASK_24) { | 122 if (0 != (opSize & ~MASK_24) || opSize == MASK_24) { |
121 // This op's size overflows so an extra uint32_t will be written | 123 // This op's size overflows so an extra uint32_t will be written |
122 // after the op code | 124 // after the op code |
123 overflow = sizeof(uint32_t); | 125 overflow = sizeof(uint32_t); |
124 } | 126 } |
125 | 127 |
126 if (SAVE_LAYER == op) { | 128 if (SAVE_LAYER == op) { |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 | 458 |
457 if (kSaveLayerWithBoundsSize == result[0].fSize) { | 459 if (kSaveLayerWithBoundsSize == result[0].fSize) { |
458 // The saveLayer's bound can offset where the dbm is drawn | 460 // The saveLayer's bound can offset where the dbm is drawn |
459 return false; | 461 return false; |
460 } | 462 } |
461 | 463 |
462 return merge_savelayer_paint_into_drawbitmp(writer, paintDict, | 464 return merge_savelayer_paint_into_drawbitmp(writer, paintDict, |
463 result[0], result[3]); | 465 result[0], result[3]); |
464 } | 466 } |
465 | 467 |
| 468 static bool is_drawing_op(DrawType op) { |
| 469 return (op > CONCAT && op < ROTATE) || DRAW_DRRECT == op; |
| 470 } |
| 471 |
466 /* | 472 /* |
467 * Restore has just been called (but not recorded), so look back at the | 473 * Restore has just been called (but not recorded), so look back at the |
468 * matching save(), and see if we can eliminate the pair of them, due to no | 474 * matching save(), and see if we can eliminate the pair of them, due to no |
469 * intervening matrix/clip calls. | 475 * intervening matrix/clip calls. |
470 * | 476 * |
471 * If so, update the writer and return true, in which case we won't even record | 477 * If so, update the writer and return true, in which case we won't even record |
472 * the restore() call. If we still need the restore(), return false. | 478 * the restore() call. If we still need the restore(), return false. |
473 */ | 479 */ |
474 static bool collapse_save_clip_restore(SkWriter32* writer, int32_t offset, | 480 static bool collapse_save_clip_restore(SkWriter32* writer, int32_t offset, |
475 SkPaintDictionary* paintDict) { | 481 SkPaintDictionary* paintDict) { |
(...skipping 28 matching lines...) Expand all Loading... |
504 return false; | 510 return false; |
505 } | 511 } |
506 | 512 |
507 // Walk forward until we get back to either a draw-verb (abort) or we hit | 513 // Walk forward until we get back to either a draw-verb (abort) or we hit |
508 // our restore (success). | 514 // our restore (success). |
509 int32_t saveOffset = offset; | 515 int32_t saveOffset = offset; |
510 | 516 |
511 offset += opSize; | 517 offset += opSize; |
512 while (offset < restoreOffset) { | 518 while (offset < restoreOffset) { |
513 op = peek_op_and_size(writer, offset, &opSize); | 519 op = peek_op_and_size(writer, offset, &opSize); |
514 if ((op > CONCAT && op < ROTATE) || (SAVE_LAYER == op)) { | 520 if (is_drawing_op(op) || (SAVE_LAYER == op)) { |
515 // drawing verb, abort | 521 // drawing verb, abort |
516 return false; | 522 return false; |
517 } | 523 } |
518 offset += opSize; | 524 offset += opSize; |
519 } | 525 } |
520 | 526 |
521 #ifdef TRACK_COLLAPSE_STATS | 527 #ifdef TRACK_COLLAPSE_STATS |
522 gCollapseCount += 1; | 528 gCollapseCount += 1; |
523 SkDebugf("Collapse [%d out of %d] %g%spn", gCollapseCount, gCollapseCalls, | 529 SkDebugf("Collapse [%d out of %d] %g%spn", gCollapseCount, gCollapseCalls, |
524 (double)gCollapseCount / gCollapseCalls, "%"); | 530 (double)gCollapseCount / gCollapseCalls, "%"); |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 uint32_t initialOffset, size; | 1067 uint32_t initialOffset, size; |
1062 size = 2 * kUInt32Size + SkRRect::kSizeInMemory; | 1068 size = 2 * kUInt32Size + SkRRect::kSizeInMemory; |
1063 initialOffset = this->addDraw(DRAW_RRECT, &size); | 1069 initialOffset = this->addDraw(DRAW_RRECT, &size); |
1064 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); | 1070 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); |
1065 this->addPaint(paint); | 1071 this->addPaint(paint); |
1066 this->addRRect(rrect); | 1072 this->addRRect(rrect); |
1067 this->validate(initialOffset, size); | 1073 this->validate(initialOffset, size); |
1068 } | 1074 } |
1069 } | 1075 } |
1070 | 1076 |
| 1077 void SkPictureRecord::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
| 1078 const SkPaint& paint) { |
| 1079 |
| 1080 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1081 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1082 #endif |
| 1083 |
| 1084 // op + paint index + rrects |
| 1085 uint32_t initialOffset, size; |
| 1086 size = 2 * kUInt32Size + SkRRect::kSizeInMemory * 2; |
| 1087 initialOffset = this->addDraw(DRAW_DRRECT, &size); |
| 1088 SkASSERT(initialOffset+getPaintOffset(DRAW_DRRECT, size) == fWriter.bytesWri
tten()); |
| 1089 this->addPaint(paint); |
| 1090 this->addRRect(outer); |
| 1091 this->addRRect(inner); |
| 1092 this->validate(initialOffset, size); |
| 1093 } |
| 1094 |
1071 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { | 1095 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { |
1072 | 1096 |
1073 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1097 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
1074 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1098 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
1075 #endif | 1099 #endif |
1076 | 1100 |
1077 // op + paint index + path index | 1101 // op + paint index + path index |
1078 uint32_t size = 3 * kUInt32Size; | 1102 uint32_t size = 3 * kUInt32Size; |
1079 size_t initialOffset = this->addDraw(DRAW_PATH, &size); | 1103 size_t initialOffset = this->addDraw(DRAW_PATH, &size); |
1080 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); | 1104 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1772 void SkPictureRecord::validateRegions() const { | 1796 void SkPictureRecord::validateRegions() const { |
1773 int count = fRegions.count(); | 1797 int count = fRegions.count(); |
1774 SkASSERT((unsigned) count < 0x1000); | 1798 SkASSERT((unsigned) count < 0x1000); |
1775 for (int index = 0; index < count; index++) { | 1799 for (int index = 0; index < count; index++) { |
1776 const SkFlatData* region = fRegions[index]; | 1800 const SkFlatData* region = fRegions[index]; |
1777 SkASSERT(region); | 1801 SkASSERT(region); |
1778 // region->validate(); | 1802 // region->validate(); |
1779 } | 1803 } |
1780 } | 1804 } |
1781 #endif | 1805 #endif |
OLD | NEW |