| Index: src/core/SkPictureRecord.cpp
|
| diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
|
| index 0ec9eaf74d0c812b01bea81893d39ff61fb94d80..c0f6fa59bd8a37db98b695545e69883052a982b7 100644
|
| --- a/src/core/SkPictureRecord.cpp
|
| +++ b/src/core/SkPictureRecord.cpp
|
| @@ -401,13 +401,16 @@ static bool merge_savelayer_paint_into_drawbitmp(SkWriter32* writer,
|
| SkColorGetA(saveLayerPaint->getColor()));
|
| dbmPaint->setColor(newColor);
|
|
|
| - const int paintIndex = paintDict->find(*dbmPaint);
|
| + const SkFlatData* data = paintDict->findAndReturnFlat(*dbmPaint);
|
| + if (NULL == data) {
|
| + return false;
|
| + }
|
|
|
| // kill the saveLayer and alter the DBMR2R's paint to be the modified one
|
| convert_command_to_noop(writer, saveLayerInfo.fOffset);
|
| uint32_t* ptr = writer->peek32(dbmInfo.fOffset+dbmPaintOffset);
|
| SkASSERT(dbmPaintId == *ptr);
|
| - *ptr = paintIndex;
|
| + *ptr = data->index();
|
| return true;
|
| }
|
|
|
| @@ -967,10 +970,7 @@ void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top,
|
| validate(initialOffset, size);
|
| }
|
|
|
| -// Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been
|
| -// tweaked by paint.computeFastBounds().
|
| -//
|
| -static void computeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) {
|
| +void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) {
|
| SkPaint::FontMetrics metrics;
|
| paint.getFontMetrics(&metrics);
|
| SkRect bounds;
|
| @@ -984,10 +984,7 @@ static void computeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]
|
|
|
| void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData& flat,
|
| SkScalar minY, SkScalar maxY) {
|
| - if (!flat.isTopBotWritten()) {
|
| - computeFontMetricsTopBottom(paint, flat.writableTopBot());
|
| - SkASSERT(flat.isTopBotWritten());
|
| - }
|
| + WriteTopBot(paint, flat);
|
| addScalar(flat.topBot()[0] + minY);
|
| addScalar(flat.topBot()[1] + maxY);
|
| }
|
| @@ -1103,6 +1100,14 @@ void SkPictureRecord::drawPosText(const void* text, size_t byteLength,
|
| void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength,
|
| const SkScalar xpos[], SkScalar constY,
|
| const SkPaint& paint) {
|
| +
|
| + const SkFlatData* flatPaintData = this->getFlatPaintData(paint);
|
| + drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData);
|
| +}
|
| +
|
| +void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength,
|
| + const SkScalar xpos[], SkScalar constY,
|
| + const SkPaint& paint, const SkFlatData* flatPaintData) {
|
| size_t points = paint.countText(text, byteLength);
|
| if (0 == points)
|
| return;
|
| @@ -1116,11 +1121,11 @@ void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength,
|
| }
|
| // + y + the actual points
|
| size += 1 * kUInt32Size + points * sizeof(SkScalar);
|
| -
|
| uint32_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRAW_POS_TEXT_H,
|
| &size);
|
| - const SkFlatData* flatPaintData = addPaint(paint);
|
| SkASSERT(flatPaintData);
|
| + addFlatPaint(flatPaintData);
|
| +
|
| addText(text, byteLength);
|
| addInt(points);
|
|
|
| @@ -1265,13 +1270,21 @@ void SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) {
|
| this->addInt(matrix ? fMatrices.find(*matrix) : 0);
|
| }
|
|
|
| +const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) {
|
| + return fPaints.findAndReturnFlat(paint);
|
| +}
|
| +
|
| const SkFlatData* SkPictureRecord::addPaintPtr(const SkPaint* paint) {
|
| - const SkFlatData* data = paint ? fPaints.findAndReturnFlat(*paint) : NULL;
|
| - int index = data ? data->index() : 0;
|
| - this->addInt(index);
|
| + const SkFlatData* data = paint ? getFlatPaintData(*paint) : NULL;
|
| + this->addFlatPaint(data);
|
| return data;
|
| }
|
|
|
| +void SkPictureRecord::addFlatPaint(const SkFlatData* flatPaint) {
|
| + int index = flatPaint ? flatPaint->index() : 0;
|
| + this->addInt(index);
|
| +}
|
| +
|
| void SkPictureRecord::addPath(const SkPath& path) {
|
| if (NULL == fPathHeap) {
|
| fPathHeap = SkNEW(SkPathHeap);
|
|
|