Index: skia/picture/SkPictureRecord.cpp |
=================================================================== |
--- skia/picture/SkPictureRecord.cpp (revision 16859) |
+++ skia/picture/SkPictureRecord.cpp (working copy) |
@@ -1,698 +0,0 @@ |
-#include "SkPictureRecord.h" |
-#include "SkTSearch.h" |
- |
-#define MIN_WRITER_SIZE 16384 |
-#define HEAP_BLOCK_SIZE 4096 |
- |
-SkPictureRecord::SkPictureRecord() : |
- fHeap(HEAP_BLOCK_SIZE), fWriter(MIN_WRITER_SIZE) { |
- fBitmapIndex = fMatrixIndex = fPaintIndex = fRegionIndex = 1; |
-#ifdef SK_DEBUG_SIZE |
- fPointBytes = fRectBytes = fTextBytes = 0; |
- fPointWrites = fRectWrites = fTextWrites = 0; |
-#endif |
- |
- fRestoreOffsetStack.setReserve(32); |
- fRestoreOffsetStack.push(0); |
- |
- fPathHeap = NULL; // lazy allocate |
-} |
- |
-SkPictureRecord::~SkPictureRecord() { |
- reset(); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-int SkPictureRecord::save(SaveFlags flags) { |
- addDraw(SAVE); |
- addInt(flags); |
- |
- fRestoreOffsetStack.push(0); |
- |
- validate(); |
- return this->INHERITED::save(flags); |
-} |
- |
-int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, |
- SaveFlags flags) { |
- addDraw(SAVE_LAYER); |
- addRectPtr(bounds); |
- addPaintPtr(paint); |
- addInt(flags); |
- |
- fRestoreOffsetStack.push(0); |
- |
- validate(); |
- return this->INHERITED::saveLayer(bounds, paint, flags); |
-} |
- |
-void SkPictureRecord::restore() { |
- |
- // patch up the clip offsets |
- { |
- uint32_t restoreOffset = (uint32_t)fWriter.size(); |
- uint32_t offset = fRestoreOffsetStack.top(); |
- while (offset) { |
- uint32_t* peek = fWriter.peek32(offset); |
- offset = *peek; |
- *peek = restoreOffset; |
- } |
- fRestoreOffsetStack.pop(); |
- } |
- |
- addDraw(RESTORE); |
- validate(); |
- return this->INHERITED::restore(); |
-} |
- |
-bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { |
- addDraw(TRANSLATE); |
- addScalar(dx); |
- addScalar(dy); |
- validate(); |
- return this->INHERITED::translate(dx, dy); |
-} |
- |
-bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { |
- addDraw(SCALE); |
- addScalar(sx); |
- addScalar(sy); |
- validate(); |
- return this->INHERITED::scale(sx, sy); |
-} |
- |
-bool SkPictureRecord::rotate(SkScalar degrees) { |
- addDraw(ROTATE); |
- addScalar(degrees); |
- validate(); |
- return this->INHERITED::rotate(degrees); |
-} |
- |
-bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { |
- addDraw(SKEW); |
- addScalar(sx); |
- addScalar(sy); |
- validate(); |
- return this->INHERITED::skew(sx, sy); |
-} |
- |
-bool SkPictureRecord::concat(const SkMatrix& matrix) { |
- validate(); |
- addDraw(CONCAT); |
- addMatrix(matrix); |
- validate(); |
- return this->INHERITED::concat(matrix); |
-} |
- |
-bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op) { |
- addDraw(CLIP_RECT); |
- addRect(rect); |
- addInt(op); |
- |
- size_t offset = fWriter.size(); |
- addInt(fRestoreOffsetStack.top()); |
- fRestoreOffsetStack.top() = offset; |
- |
- validate(); |
- return this->INHERITED::clipRect(rect, op); |
-} |
- |
-bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op) { |
- addDraw(CLIP_PATH); |
- addPath(path); |
- addInt(op); |
- |
- size_t offset = fWriter.size(); |
- addInt(fRestoreOffsetStack.top()); |
- fRestoreOffsetStack.top() = offset; |
- |
- validate(); |
- return this->INHERITED::clipPath(path, op); |
-} |
- |
-bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { |
- addDraw(CLIP_REGION); |
- addRegion(region); |
- addInt(op); |
- |
- size_t offset = fWriter.size(); |
- addInt(fRestoreOffsetStack.top()); |
- fRestoreOffsetStack.top() = offset; |
- |
- validate(); |
- return this->INHERITED::clipRegion(region, op); |
-} |
- |
-void SkPictureRecord::drawPaint(const SkPaint& paint) { |
- addDraw(DRAW_PAINT); |
- addPaint(paint); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts[], |
- const SkPaint& paint) { |
- addDraw(DRAW_POINTS); |
- addPaint(paint); |
- addInt(mode); |
- addInt(count); |
- fWriter.writeMul4(pts, count * sizeof(SkPoint)); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { |
- addDraw(DRAW_RECT); |
- addPaint(paint); |
- addRect(rect); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { |
- addDraw(DRAW_PATH); |
- addPaint(paint); |
- addPath(path); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, |
- const SkPaint* paint = NULL) { |
- addDraw(DRAW_BITMAP); |
- addPaintPtr(paint); |
- addBitmap(bitmap); |
- addScalar(left); |
- addScalar(top); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, |
- const SkRect& dst, const SkPaint* paint) { |
- addDraw(DRAW_BITMAP_RECT); |
- addPaintPtr(paint); |
- addBitmap(bitmap); |
- addIRectPtr(src); // may be null |
- addRect(dst); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix, |
- const SkPaint* paint) { |
- addDraw(DRAW_BITMAP_MATRIX); |
- addPaintPtr(paint); |
- addBitmap(bitmap); |
- addMatrix(matrix); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |
- const SkPaint* paint = NULL) { |
- addDraw(DRAW_SPRITE); |
- addPaintPtr(paint); |
- addBitmap(bitmap); |
- addInt(left); |
- addInt(top); |
- validate(); |
-} |
- |
-void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, |
- SkScalar baselineY) { |
- SkPaint::FontMetrics metrics; |
- paint.getFontMetrics(&metrics); |
- SkRect bounds; |
- // construct a rect so we can see any adjustments from the paint. |
- // we use 0,1 for left,right, just so the rect isn't empty |
- bounds.set(0, metrics.fTop + baselineY, |
- SK_Scalar1, metrics.fBottom + baselineY); |
- (void)paint.computeFastBounds(bounds, &bounds); |
- // now record the top and bottom |
- addScalar(bounds.fTop); |
- addScalar(bounds.fBottom); |
-} |
- |
-void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, |
- SkScalar y, const SkPaint& paint) { |
- bool fast = paint.canComputeFastBounds(); |
- |
- addDraw(fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT); |
- addPaint(paint); |
- addText(text, byteLength); |
- addScalar(x); |
- addScalar(y); |
- if (fast) { |
- addFontMetricsTopBottom(paint, y); |
- } |
- validate(); |
-} |
- |
-void SkPictureRecord::drawPosText(const void* text, size_t byteLength, |
- const SkPoint pos[], const SkPaint& paint) { |
- size_t points = paint.countText(text, byteLength); |
- if (0 == points) |
- return; |
- |
- bool canUseDrawH = true; |
- // check if the caller really should have used drawPosTextH() |
- { |
- const SkScalar firstY = pos[0].fY; |
- for (size_t index = 1; index < points; index++) { |
- if (pos[index].fY != firstY) { |
- canUseDrawH = false; |
- break; |
- } |
- } |
- } |
- |
- bool fast = canUseDrawH && paint.canComputeFastBounds(); |
- |
- if (fast) { |
- addDraw(DRAW_POS_TEXT_H_TOP_BOTTOM); |
- } else { |
- addDraw(canUseDrawH ? DRAW_POS_TEXT_H : DRAW_POS_TEXT); |
- } |
- addPaint(paint); |
- addText(text, byteLength); |
- addInt(points); |
- |
-#ifdef SK_DEBUG_SIZE |
- size_t start = fWriter.size(); |
-#endif |
- if (canUseDrawH) { |
- if (fast) { |
- addFontMetricsTopBottom(paint, pos[0].fY); |
- } |
- addScalar(pos[0].fY); |
- SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); |
- for (size_t index = 0; index < points; index++) |
- *xptr++ = pos[index].fX; |
- } |
- else { |
- fWriter.writeMul4(pos, points * sizeof(SkPoint)); |
- } |
-#ifdef SK_DEBUG_SIZE |
- fPointBytes += fWriter.size() - start; |
- fPointWrites += points; |
-#endif |
- validate(); |
-} |
- |
-void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, |
- const SkScalar xpos[], SkScalar constY, |
- const SkPaint& paint) { |
- size_t points = paint.countText(text, byteLength); |
- if (0 == points) |
- return; |
- |
- bool fast = paint.canComputeFastBounds(); |
- |
- addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRAW_POS_TEXT_H); |
- addPaint(paint); |
- addText(text, byteLength); |
- addInt(points); |
- |
-#ifdef SK_DEBUG_SIZE |
- size_t start = fWriter.size(); |
-#endif |
- if (fast) { |
- addFontMetricsTopBottom(paint, constY); |
- } |
- addScalar(constY); |
- fWriter.writeMul4(xpos, points * sizeof(SkScalar)); |
-#ifdef SK_DEBUG_SIZE |
- fPointBytes += fWriter.size() - start; |
- fPointWrites += points; |
-#endif |
- validate(); |
-} |
- |
-void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, |
- const SkPath& path, const SkMatrix* matrix, |
- const SkPaint& paint) { |
- addDraw(DRAW_TEXT_ON_PATH); |
- addPaint(paint); |
- addText(text, byteLength); |
- addPath(path); |
- addMatrixPtr(matrix); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawPicture(SkPicture& picture) { |
- addDraw(DRAW_PICTURE); |
- addPicture(picture); |
- validate(); |
-} |
- |
-void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, |
- const SkPoint vertices[], const SkPoint texs[], |
- const SkColor colors[], SkXfermode*, |
- const uint16_t indices[], int indexCount, |
- const SkPaint& paint) { |
- uint32_t flags = 0; |
- if (texs) { |
- flags |= DRAW_VERTICES_HAS_TEXS; |
- } |
- if (colors) { |
- flags |= DRAW_VERTICES_HAS_COLORS; |
- } |
- if (indexCount > 0) { |
- flags |= DRAW_VERTICES_HAS_INDICES; |
- } |
- |
- addDraw(DRAW_VERTICES); |
- addPaint(paint); |
- addInt(flags); |
- addInt(vmode); |
- addInt(vertexCount); |
- addPoints(vertices, vertexCount); |
- if (flags & DRAW_VERTICES_HAS_TEXS) { |
- addPoints(texs, vertexCount); |
- } |
- if (flags & DRAW_VERTICES_HAS_COLORS) { |
- fWriter.writeMul4(colors, vertexCount * sizeof(SkColor)); |
- } |
- if (flags & DRAW_VERTICES_HAS_INDICES) { |
- addInt(indexCount); |
- fWriter.writePad(indices, indexCount * sizeof(uint16_t)); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-void SkPictureRecord::reset() { |
- fPathHeap->safeUnref(); |
- fPathHeap = NULL; |
- |
- fBitmaps.reset(); |
- fMatrices.reset(); |
- fPaints.reset(); |
- fPictureRefs.unrefAll(); |
- fRegions.reset(); |
- fWriter.reset(); |
- fHeap.reset(); |
- |
- fRestoreOffsetStack.setCount(1); |
- fRestoreOffsetStack.top() = 0; |
- |
- fRCRecorder.reset(); |
- fTFRecorder.reset(); |
-} |
- |
-void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { |
- addInt(find(fBitmaps, bitmap)); |
-} |
- |
-void SkPictureRecord::addMatrix(const SkMatrix& matrix) { |
- addMatrixPtr(&matrix); |
-} |
- |
-void SkPictureRecord::addMatrixPtr(const SkMatrix* matrix) { |
- addInt(find(fMatrices, matrix)); |
-} |
- |
-void SkPictureRecord::addPaint(const SkPaint& paint) { |
- addPaintPtr(&paint); |
-} |
- |
-void SkPictureRecord::addPaintPtr(const SkPaint* paint) { |
- addInt(find(fPaints, paint)); |
-} |
- |
-void SkPictureRecord::addPath(const SkPath& path) { |
- if (NULL == fPathHeap) { |
- fPathHeap = SkNEW(SkPathHeap); |
- } |
- addInt(fPathHeap->append(path)); |
-} |
- |
-void SkPictureRecord::addPicture(SkPicture& picture) { |
- int index = fPictureRefs.find(&picture); |
- if (index < 0) { // not found |
- index = fPictureRefs.count(); |
- *fPictureRefs.append() = &picture; |
- picture.ref(); |
- } |
- // follow the convention of recording a 1-based index |
- addInt(index + 1); |
-} |
- |
-void SkPictureRecord::addPoint(const SkPoint& point) { |
-#ifdef SK_DEBUG_SIZE |
- size_t start = fWriter.size(); |
-#endif |
- fWriter.writePoint(point); |
-#ifdef SK_DEBUG_SIZE |
- fPointBytes += fWriter.size() - start; |
- fPointWrites++; |
-#endif |
-} |
- |
-void SkPictureRecord::addPoints(const SkPoint pts[], int count) { |
- fWriter.writeMul4(pts, count * sizeof(SkPoint)); |
-#ifdef SK_DEBUG_SIZE |
- fPointBytes += count * sizeof(SkPoint); |
- fPointWrites++; |
-#endif |
-} |
- |
-void SkPictureRecord::addRect(const SkRect& rect) { |
-#ifdef SK_DEBUG_SIZE |
- size_t start = fWriter.size(); |
-#endif |
- fWriter.writeRect(rect); |
-#ifdef SK_DEBUG_SIZE |
- fRectBytes += fWriter.size() - start; |
- fRectWrites++; |
-#endif |
-} |
- |
-void SkPictureRecord::addRectPtr(const SkRect* rect) { |
- if (fWriter.writeBool(rect != NULL)) { |
- fWriter.writeRect(*rect); |
- } |
-} |
- |
-void SkPictureRecord::addIRectPtr(const SkIRect* rect) { |
- if (fWriter.writeBool(rect != NULL)) { |
- *(SkIRect*)fWriter.reserve(sizeof(SkIRect)) = *rect; |
- } |
-} |
- |
-void SkPictureRecord::addRegion(const SkRegion& region) { |
- addInt(find(fRegions, region)); |
-} |
- |
-void SkPictureRecord::addText(const void* text, size_t byteLength) { |
-#ifdef SK_DEBUG_SIZE |
- size_t start = fWriter.size(); |
-#endif |
- addInt(byteLength); |
- fWriter.writePad(text, byteLength); |
-#ifdef SK_DEBUG_SIZE |
- fTextBytes += fWriter.size() - start; |
- fTextWrites++; |
-#endif |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-int SkPictureRecord::find(SkTDArray<const SkFlatBitmap* >& bitmaps, const SkBitmap& bitmap) { |
- SkFlatBitmap* flat = SkFlatBitmap::Flatten(&fHeap, bitmap, fBitmapIndex, |
- &fRCRecorder); |
- int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(), |
- bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); |
- if (index >= 0) { |
-// SkBitmap bitmap; |
-// flat->unflatten(&bitmap); // balance ref count |
- return bitmaps[index]->index(); |
- } |
- index = ~index; |
- *bitmaps.insert(index) = flat; |
- return fBitmapIndex++; |
-} |
- |
-int SkPictureRecord::find(SkTDArray<const SkFlatMatrix* >& matrices, const SkMatrix* matrix) { |
- if (matrix == NULL) |
- return 0; |
- SkFlatMatrix* flat = SkFlatMatrix::Flatten(&fHeap, *matrix, fMatrixIndex); |
- int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(), |
- matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); |
- if (index >= 0) |
- return matrices[index]->index(); |
- index = ~index; |
- *matrices.insert(index) = flat; |
- return fMatrixIndex++; |
-} |
- |
-int SkPictureRecord::find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint* paint) { |
- if (paint == NULL) { |
- return 0; |
- } |
- |
- SkFlatPaint* flat = SkFlatPaint::Flatten(&fHeap, *paint, fPaintIndex, |
- &fRCRecorder, &fTFRecorder); |
- int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(), |
- paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); |
- if (index >= 0) { |
- return paints[index]->index(); |
- } |
- |
- index = ~index; |
- *paints.insert(index) = flat; |
- return fPaintIndex++; |
-} |
- |
-int SkPictureRecord::find(SkTDArray<const SkFlatRegion* >& regions, const SkRegion& region) { |
- SkFlatRegion* flat = SkFlatRegion::Flatten(&fHeap, region, fRegionIndex); |
- int index = SkTSearch<SkFlatData>((const SkFlatData**) regions.begin(), |
- regions.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); |
- if (index >= 0) |
- return regions[index]->index(); |
- index = ~index; |
- *regions.insert(index) = flat; |
- return fRegionIndex++; |
-} |
- |
-#ifdef SK_DEBUG_DUMP |
-void SkPictureRecord::dumpMatrices() { |
- int count = fMatrices.count(); |
- SkMatrix defaultMatrix; |
- defaultMatrix.reset(); |
- for (int index = 0; index < count; index++) { |
- const SkFlatMatrix* flatMatrix = fMatrices[index]; |
- flatMatrix->dump(); |
- } |
-} |
- |
-void SkPictureRecord::dumpPaints() { |
- int count = fPaints.count(); |
- for (int index = 0; index < count; index++) |
- fPaints[index]->dump(); |
-} |
-#endif |
- |
-#ifdef SK_DEBUG_SIZE |
-size_t SkPictureRecord::size() const { |
- size_t result = 0; |
- size_t sizeData; |
- bitmaps(&sizeData); |
- result += sizeData; |
- matrices(&sizeData); |
- result += sizeData; |
- paints(&sizeData); |
- result += sizeData; |
- paths(&sizeData); |
- result += sizeData; |
- pictures(&sizeData); |
- result += sizeData; |
- regions(&sizeData); |
- result += sizeData; |
- result += streamlen(); |
- return result; |
-} |
- |
-int SkPictureRecord::bitmaps(size_t* size) const { |
- size_t result = 0; |
- int count = fBitmaps.count(); |
- for (int index = 0; index < count; index++) |
- result += sizeof(fBitmaps[index]) + fBitmaps[index]->size(); |
- *size = result; |
- return count; |
-} |
- |
-int SkPictureRecord::matrices(size_t* size) const { |
- int count = fMatrices.count(); |
- *size = sizeof(fMatrices[0]) * count; |
- return count; |
-} |
- |
-int SkPictureRecord::paints(size_t* size) const { |
- size_t result = 0; |
- int count = fPaints.count(); |
- for (int index = 0; index < count; index++) |
- result += sizeof(fPaints[index]) + fPaints[index]->size(); |
- *size = result; |
- return count; |
-} |
- |
-int SkPictureRecord::paths(size_t* size) const { |
- size_t result = 0; |
- int count = fPaths.count(); |
- for (int index = 0; index < count; index++) |
- result += sizeof(fPaths[index]) + fPaths[index]->size(); |
- *size = result; |
- return count; |
-} |
- |
-int SkPictureRecord::regions(size_t* size) const { |
- size_t result = 0; |
- int count = fRegions.count(); |
- for (int index = 0; index < count; index++) |
- result += sizeof(fRegions[index]) + fRegions[index]->size(); |
- *size = result; |
- return count; |
-} |
- |
-size_t SkPictureRecord::streamlen() const { |
- return fWriter.size(); |
-} |
-#endif |
- |
-#ifdef SK_DEBUG_VALIDATE |
-void SkPictureRecord::validate() const { |
- validateBitmaps(); |
- validateMatrices(); |
- validatePaints(); |
- validatePaths(); |
- validatePictures(); |
- validateRegions(); |
-} |
- |
-void SkPictureRecord::validateBitmaps() const { |
- int count = fBitmaps.count(); |
- SkASSERT((unsigned) count < 0x1000); |
- for (int index = 0; index < count; index++) { |
- const SkFlatBitmap* bitPtr = fBitmaps[index]; |
- SkASSERT(bitPtr); |
- bitPtr->validate(); |
- } |
-} |
- |
-void SkPictureRecord::validateMatrices() const { |
- int count = fMatrices.count(); |
- SkASSERT((unsigned) count < 0x1000); |
- for (int index = 0; index < count; index++) { |
- const SkFlatMatrix* matrix = fMatrices[index]; |
- SkASSERT(matrix); |
- matrix->validate(); |
- } |
-} |
- |
-void SkPictureRecord::validatePaints() const { |
- int count = fPaints.count(); |
- SkASSERT((unsigned) count < 0x1000); |
- for (int index = 0; index < count; index++) { |
- const SkFlatPaint* paint = fPaints[index]; |
- SkASSERT(paint); |
-// paint->validate(); |
- } |
-} |
- |
-void SkPictureRecord::validatePaths() const { |
- int count = fPaths.count(); |
- SkASSERT((unsigned) count < 0x1000); |
- for (int index = 0; index < count; index++) { |
- const SkFlatPath* path = fPaths[index]; |
- SkASSERT(path); |
- path->validate(); |
- } |
-} |
- |
-void SkPictureRecord::validateRegions() const { |
- int count = fRegions.count(); |
- SkASSERT((unsigned) count < 0x1000); |
- for (int index = 0; index < count; index++) { |
- const SkFlatRegion* region = fRegions[index]; |
- SkASSERT(region); |
- region->validate(); |
- } |
-} |
-#endif |
- |