diff options
Diffstat (limited to 'src/pipe/SkGPipeRead.cpp')
-rw-r--r-- | src/pipe/SkGPipeRead.cpp | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp index 137ecb7062..1f13dafa7d 100644 --- a/src/pipe/SkGPipeRead.cpp +++ b/src/pipe/SkGPipeRead.cpp @@ -67,6 +67,14 @@ public: SkGPipeState(); ~SkGPipeState(); + void setSilent(bool silent) { + fSilent = silent; + } + + bool shouldDraw() { + return !fSilent; + } + void setFlags(unsigned flags) { if (fFlags != flags) { fFlags = flags; @@ -183,6 +191,7 @@ private: SkTDArray<SkTypeface*> fTypefaces; SkTDArray<SkFlattenable::Factory> fFactoryArray; SkTDArray<SkBitmap*> fBitmaps; + bool fSilent; // Only used when sharing bitmaps with the writer. SkBitmapHeap* fSharedHeap; unsigned fFlags; @@ -308,7 +317,9 @@ static void drawClear_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, static void drawPaint_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { - canvas->drawPaint(state->paint()); + if (state->shouldDraw()) { + canvas->drawPaint(state->paint()); + } } static void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -316,19 +327,26 @@ static void drawPoints_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkCanvas::PointMode mode = (SkCanvas::PointMode)DrawOp_unpackFlags(op32); size_t count = reader->readU32(); const SkPoint* pts = skip<SkPoint>(reader, count); - canvas->drawPoints(mode, count, pts, state->paint()); + if (state->shouldDraw()) { + canvas->drawPoints(mode, count, pts, state->paint()); + } } static void drawRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { - canvas->drawRect(*skip<SkRect>(reader), state->paint()); + const SkRect* rect = skip<SkRect>(reader); + if (state->shouldDraw()) { + canvas->drawRect(*rect, state->paint()); + } } static void drawPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkPath path; reader->readPath(&path); - canvas->drawPath(path, state->paint()); + if (state->shouldDraw()) { + canvas->drawPath(path, state->paint()); + } } static void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -358,9 +376,10 @@ static void drawVertices_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, indexCount = reader->readU32(); indices = skipAlign<uint16_t>(reader, indexCount); } - - canvas->drawVertices(mode, vertexCount, verts, texs, colors, xfer, - indices, indexCount, state->paint()); + if (state->shouldDraw()) { + canvas->drawVertices(mode, vertexCount, verts, texs, colors, xfer, + indices, indexCount, state->paint()); + } } /////////////////////////////////////////////////////////////////////////////// @@ -370,7 +389,9 @@ static void drawText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, size_t len = reader->readU32(); const void* text = reader->skip(SkAlign4(len)); const SkScalar* xy = skip<SkScalar>(reader, 2); - canvas->drawText(text, len, xy[0], xy[1], state->paint()); + if (state->shouldDraw()) { + canvas->drawText(text, len, xy[0], xy[1], state->paint()); + } } static void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -379,7 +400,9 @@ static void drawPosText_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, const void* text = reader->skip(SkAlign4(len)); size_t posCount = reader->readU32(); // compute by our writer const SkPoint* pos = skip<SkPoint>(reader, posCount); - canvas->drawPosText(text, len, pos, state->paint()); + if (state->shouldDraw()) { + canvas->drawPosText(text, len, pos, state->paint()); + } } static void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -389,7 +412,9 @@ static void drawPosTextH_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, size_t posCount = reader->readU32(); // compute by our writer const SkScalar* xpos = skip<SkScalar>(reader, posCount); SkScalar constY = reader->readScalar(); - canvas->drawPosTextH(text, len, xpos, constY, state->paint()); + if (state->shouldDraw()) { + canvas->drawPosTextH(text, len, xpos, constY, state->paint()); + } } static void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -406,8 +431,9 @@ static void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op3 reader->readMatrix(&matrixStorage); matrix = &matrixStorage; } - - canvas->drawTextOnPath(text, len, path, matrix, state->paint()); + if (state->shouldDraw()) { + canvas->drawTextOnPath(text, len, path, matrix, state->paint()); + } } /////////////////////////////////////////////////////////////////////////////// @@ -461,7 +487,10 @@ static void drawBitmap_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); SkScalar left = reader->readScalar(); SkScalar top = reader->readScalar(); - canvas->drawBitmap(*holder.getBitmap(), left, top, hasPaint ? &state->paint() : NULL); + const SkBitmap* bitmap = holder.getBitmap(); + if (state->shouldDraw()) { + canvas->drawBitmap(*bitmap, left, top, hasPaint ? &state->paint() : NULL); + } } static void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -470,8 +499,11 @@ static void drawBitmapMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t o bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); SkMatrix matrix; reader->readMatrix(&matrix); - canvas->drawBitmapMatrix(*holder.getBitmap(), matrix, - hasPaint ? &state->paint() : NULL); + const SkBitmap* bitmap = holder.getBitmap(); + if (state->shouldDraw()) { + canvas->drawBitmapMatrix(*bitmap, matrix, + hasPaint ? &state->paint() : NULL); + } } static void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader, @@ -480,8 +512,11 @@ static void drawBitmapNine_rp(SkCanvas* canvas, SkReader32* reader, bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); const SkIRect* center = skip<SkIRect>(reader); const SkRect* dst = skip<SkRect>(reader); - canvas->drawBitmapNine(*holder.getBitmap(), *center, *dst, - hasPaint ? &state->paint() : NULL); + const SkBitmap* bitmap = holder.getBitmap(); + if (state->shouldDraw()) { + canvas->drawBitmapNine(*bitmap, *center, *dst, + hasPaint ? &state->paint() : NULL); + } } static void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader, @@ -497,7 +532,10 @@ static void drawBitmapRect_rp(SkCanvas* canvas, SkReader32* reader, src = NULL; } const SkRect* dst = skip<SkRect>(reader); - canvas->drawBitmapRectToRect(*holder.getBitmap(), src, *dst, hasPaint ? &state->paint() : NULL); + const SkBitmap* bitmap = holder.getBitmap(); + if (state->shouldDraw()) { + canvas->drawBitmapRectToRect(*bitmap, src, *dst, hasPaint ? &state->paint() : NULL); + } } static void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -505,7 +543,10 @@ static void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, BitmapHolder holder(reader, op32, state); bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_DrawOpFlag); const SkIPoint* point = skip<SkIPoint>(reader); - canvas->drawSprite(*holder.getBitmap(), point->fX, point->fY, hasPaint ? &state->paint() : NULL); + const SkBitmap* bitmap = holder.getBitmap(); + if (state->shouldDraw()) { + canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->paint() : NULL); + } } /////////////////////////////////////////////////////////////////////////////// @@ -518,7 +559,9 @@ static void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, size = reader->readU32(); } const void* data = reader->skip(SkAlign4(size)); - canvas->drawData(data, size); + if (state->shouldDraw()) { + canvas->drawData(data, size); + } } static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -677,6 +720,7 @@ static const ReadProc gReadTable[] = { SkGPipeState::SkGPipeState() : fReader(0) + , fSilent(false) , fSharedHeap(NULL) , fFlags(0) { @@ -714,7 +758,7 @@ SkGPipeReader::~SkGPipeReader() { } SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, - size_t* bytesRead, bool readAtom) { + uint32_t playbackFlags, size_t* bytesRead) { if (NULL == fCanvas) { return kError_Status; } @@ -723,6 +767,8 @@ SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, fState = new SkGPipeState; } + fState->setSilent(playbackFlags & kSilent_PlaybackFlag); + SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); const ReadProc* table = gReadTable; @@ -746,7 +792,7 @@ SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, break; } table[op](canvas, reader.getReader32(), op32, fState); - if (readAtom && + if ((playbackFlags & kReadAtom_PlaybackFlag) && (table[op] != paintOp_rp && table[op] != def_Typeface_rp && table[op] != def_PaintFlat_rp && |