| 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 |