| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 | 394 |
| 395 SkAutoTDelete<SkPaint> dbmPaint(paintDict->unflatten(dbmPaintId)); | 395 SkAutoTDelete<SkPaint> dbmPaint(paintDict->unflatten(dbmPaintId)); |
| 396 if (NULL == dbmPaint.get() || dbmPaint->getColor() != layerColor) { | 396 if (NULL == dbmPaint.get() || dbmPaint->getColor() != layerColor) { |
| 397 return false; | 397 return false; |
| 398 } | 398 } |
| 399 | 399 |
| 400 SkColor newColor = SkColorSetA(dbmPaint->getColor(), | 400 SkColor newColor = SkColorSetA(dbmPaint->getColor(), |
| 401 SkColorGetA(saveLayerPaint->getColor())); | 401 SkColorGetA(saveLayerPaint->getColor())); |
| 402 dbmPaint->setColor(newColor); | 402 dbmPaint->setColor(newColor); |
| 403 | 403 |
| 404 const int paintIndex = paintDict->find(*dbmPaint); | 404 const SkFlatData* data = paintDict->findAndReturnFlat(*dbmPaint); |
| 405 if (NULL == data) { |
| 406 return false; |
| 407 } |
| 405 | 408 |
| 406 // kill the saveLayer and alter the DBMR2R's paint to be the modified one | 409 // kill the saveLayer and alter the DBMR2R's paint to be the modified one |
| 407 convert_command_to_noop(writer, saveLayerInfo.fOffset); | 410 convert_command_to_noop(writer, saveLayerInfo.fOffset); |
| 408 uint32_t* ptr = writer->peek32(dbmInfo.fOffset+dbmPaintOffset); | 411 uint32_t* ptr = writer->peek32(dbmInfo.fOffset+dbmPaintOffset); |
| 409 SkASSERT(dbmPaintId == *ptr); | 412 SkASSERT(dbmPaintId == *ptr); |
| 410 *ptr = paintIndex; | 413 *ptr = data->index(); |
| 411 return true; | 414 return true; |
| 412 } | 415 } |
| 413 | 416 |
| 414 /* | 417 /* |
| 415 * Restore has just been called (but not recorded), look back at the | 418 * Restore has just been called (but not recorded), look back at the |
| 416 * matching save* and see if we are in the configuration: | 419 * matching save* and see if we are in the configuration: |
| 417 * SAVE_LAYER (with NULL == bounds) | 420 * SAVE_LAYER (with NULL == bounds) |
| 418 * SAVE | 421 * SAVE |
| 419 * CLIP_RECT | 422 * CLIP_RECT |
| 420 * DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_R
ECT | 423 * DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_R
ECT |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 uint32_t size = 5 * kUInt32Size; | 963 uint32_t size = 5 * kUInt32Size; |
| 961 uint32_t initialOffset = this->addDraw(DRAW_SPRITE, &size); | 964 uint32_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |
| 962 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.size()); | 965 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.size()); |
| 963 addPaintPtr(paint); | 966 addPaintPtr(paint); |
| 964 addBitmap(bitmap); | 967 addBitmap(bitmap); |
| 965 addInt(left); | 968 addInt(left); |
| 966 addInt(top); | 969 addInt(top); |
| 967 validate(initialOffset, size); | 970 validate(initialOffset, size); |
| 968 } | 971 } |
| 969 | 972 |
| 970 // Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been | 973 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar
topbot[2]) { |
| 971 // tweaked by paint.computeFastBounds(). | |
| 972 // | |
| 973 static void computeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]
) { | |
| 974 SkPaint::FontMetrics metrics; | 974 SkPaint::FontMetrics metrics; |
| 975 paint.getFontMetrics(&metrics); | 975 paint.getFontMetrics(&metrics); |
| 976 SkRect bounds; | 976 SkRect bounds; |
| 977 // construct a rect so we can see any adjustments from the paint. | 977 // construct a rect so we can see any adjustments from the paint. |
| 978 // we use 0,1 for left,right, just so the rect isn't empty | 978 // we use 0,1 for left,right, just so the rect isn't empty |
| 979 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); | 979 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); |
| 980 (void)paint.computeFastBounds(bounds, &bounds); | 980 (void)paint.computeFastBounds(bounds, &bounds); |
| 981 topbot[0] = bounds.fTop; | 981 topbot[0] = bounds.fTop; |
| 982 topbot[1] = bounds.fBottom; | 982 topbot[1] = bounds.fBottom; |
| 983 } | 983 } |
| 984 | 984 |
| 985 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
Data& flat, | 985 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
Data& flat, |
| 986 SkScalar minY, SkScalar maxY) { | 986 SkScalar minY, SkScalar maxY) { |
| 987 if (!flat.isTopBotWritten()) { | 987 WriteTopBot(paint, flat); |
| 988 computeFontMetricsTopBottom(paint, flat.writableTopBot()); | |
| 989 SkASSERT(flat.isTopBotWritten()); | |
| 990 } | |
| 991 addScalar(flat.topBot()[0] + minY); | 988 addScalar(flat.topBot()[0] + minY); |
| 992 addScalar(flat.topBot()[1] + maxY); | 989 addScalar(flat.topBot()[1] + maxY); |
| 993 } | 990 } |
| 994 | 991 |
| 995 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, | 992 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, |
| 996 SkScalar y, const SkPaint& paint) { | 993 SkScalar y, const SkPaint& paint) { |
| 997 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 994 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
| 998 | 995 |
| 999 // op + paint index + length + 'length' worth of chars + x + y | 996 // op + paint index + length + 'length' worth of chars + x + y |
| 1000 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
); | 997 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1096 #ifdef SK_DEBUG_SIZE | 1093 #ifdef SK_DEBUG_SIZE |
| 1097 fPointBytes += fWriter.size() - start; | 1094 fPointBytes += fWriter.size() - start; |
| 1098 fPointWrites += points; | 1095 fPointWrites += points; |
| 1099 #endif | 1096 #endif |
| 1100 validate(initialOffset, size); | 1097 validate(initialOffset, size); |
| 1101 } | 1098 } |
| 1102 | 1099 |
| 1103 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, | 1100 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, |
| 1104 const SkScalar xpos[], SkScalar constY, | 1101 const SkScalar xpos[], SkScalar constY, |
| 1105 const SkPaint& paint) { | 1102 const SkPaint& paint) { |
| 1103 |
| 1104 const SkFlatData* flatPaintData = this->getFlatPaintData(paint); |
| 1105 drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData); |
| 1106 } |
| 1107 |
| 1108 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, |
| 1109 const SkScalar xpos[], SkScalar constY, |
| 1110 const SkPaint& paint, const SkFlatData* flatPaintData)
{ |
| 1106 size_t points = paint.countText(text, byteLength); | 1111 size_t points = paint.countText(text, byteLength); |
| 1107 if (0 == points) | 1112 if (0 == points) |
| 1108 return; | 1113 return; |
| 1109 | 1114 |
| 1110 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1115 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
| 1111 | 1116 |
| 1112 // op + paint index + length + 'length' worth of data + num points | 1117 // op + paint index + length + 'length' worth of data + num points |
| 1113 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; | 1118 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; |
| 1114 if (fast) { | 1119 if (fast) { |
| 1115 size += 2 * sizeof(SkScalar); // + top & bottom | 1120 size += 2 * sizeof(SkScalar); // + top & bottom |
| 1116 } | 1121 } |
| 1117 // + y + the actual points | 1122 // + y + the actual points |
| 1118 size += 1 * kUInt32Size + points * sizeof(SkScalar); | 1123 size += 1 * kUInt32Size + points * sizeof(SkScalar); |
| 1119 | |
| 1120 uint32_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : D
RAW_POS_TEXT_H, | 1124 uint32_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : D
RAW_POS_TEXT_H, |
| 1121 &size); | 1125 &size); |
| 1122 const SkFlatData* flatPaintData = addPaint(paint); | |
| 1123 SkASSERT(flatPaintData); | 1126 SkASSERT(flatPaintData); |
| 1127 addFlatPaint(flatPaintData); |
| 1128 |
| 1124 addText(text, byteLength); | 1129 addText(text, byteLength); |
| 1125 addInt(points); | 1130 addInt(points); |
| 1126 | 1131 |
| 1127 #ifdef SK_DEBUG_SIZE | 1132 #ifdef SK_DEBUG_SIZE |
| 1128 size_t start = fWriter.size(); | 1133 size_t start = fWriter.size(); |
| 1129 #endif | 1134 #endif |
| 1130 if (fast) { | 1135 if (fast) { |
| 1131 addFontMetricsTopBottom(paint, *flatPaintData, constY, constY); | 1136 addFontMetricsTopBottom(paint, *flatPaintData, constY, constY); |
| 1132 } | 1137 } |
| 1133 addScalar(constY); | 1138 addScalar(constY); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 } | 1263 } |
| 1259 | 1264 |
| 1260 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { | 1265 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { |
| 1261 addMatrixPtr(&matrix); | 1266 addMatrixPtr(&matrix); |
| 1262 } | 1267 } |
| 1263 | 1268 |
| 1264 void SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) { | 1269 void SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) { |
| 1265 this->addInt(matrix ? fMatrices.find(*matrix) : 0); | 1270 this->addInt(matrix ? fMatrices.find(*matrix) : 0); |
| 1266 } | 1271 } |
| 1267 | 1272 |
| 1273 const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) { |
| 1274 return fPaints.findAndReturnFlat(paint); |
| 1275 } |
| 1276 |
| 1268 const SkFlatData* SkPictureRecord::addPaintPtr(const SkPaint* paint) { | 1277 const SkFlatData* SkPictureRecord::addPaintPtr(const SkPaint* paint) { |
| 1269 const SkFlatData* data = paint ? fPaints.findAndReturnFlat(*paint) : NULL; | 1278 const SkFlatData* data = paint ? getFlatPaintData(*paint) : NULL; |
| 1270 int index = data ? data->index() : 0; | 1279 this->addFlatPaint(data); |
| 1280 return data; |
| 1281 } |
| 1282 |
| 1283 void SkPictureRecord::addFlatPaint(const SkFlatData* flatPaint) { |
| 1284 int index = flatPaint ? flatPaint->index() : 0; |
| 1271 this->addInt(index); | 1285 this->addInt(index); |
| 1272 return data; | |
| 1273 } | 1286 } |
| 1274 | 1287 |
| 1275 void SkPictureRecord::addPath(const SkPath& path) { | 1288 void SkPictureRecord::addPath(const SkPath& path) { |
| 1276 if (NULL == fPathHeap) { | 1289 if (NULL == fPathHeap) { |
| 1277 fPathHeap = SkNEW(SkPathHeap); | 1290 fPathHeap = SkNEW(SkPathHeap); |
| 1278 } | 1291 } |
| 1279 addInt(fPathHeap->append(path)); | 1292 addInt(fPathHeap->append(path)); |
| 1280 } | 1293 } |
| 1281 | 1294 |
| 1282 void SkPictureRecord::addPicture(SkPicture& picture) { | 1295 void SkPictureRecord::addPicture(SkPicture& picture) { |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1482 void SkPictureRecord::validateRegions() const { | 1495 void SkPictureRecord::validateRegions() const { |
| 1483 int count = fRegions.count(); | 1496 int count = fRegions.count(); |
| 1484 SkASSERT((unsigned) count < 0x1000); | 1497 SkASSERT((unsigned) count < 0x1000); |
| 1485 for (int index = 0; index < count; index++) { | 1498 for (int index = 0; index < count; index++) { |
| 1486 const SkFlatData* region = fRegions[index]; | 1499 const SkFlatData* region = fRegions[index]; |
| 1487 SkASSERT(region); | 1500 SkASSERT(region); |
| 1488 // region->validate(); | 1501 // region->validate(); |
| 1489 } | 1502 } |
| 1490 } | 1503 } |
| 1491 #endif | 1504 #endif |
| OLD | NEW |