SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, uint32_t playbackFlags, size_t* bytesRead) { if (NULL == fCanvas) { return kError_Status; } if (NULL == fState) { fState = new SkGPipeState; } fState->setSilent(playbackFlags & kSilent_PlaybackFlag); SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); const ReadProc* table = gReadTable; SkReadBuffer reader(data, length); reader.setBitmapDecoder(fProc); SkCanvas* canvas = fCanvas; Status status = kEOF_Status; fState->setReader(&reader); while (!reader.eof()) { uint32_t op32 = reader.readUInt(); unsigned op = DrawOp_unpackOp(op32); // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) if (op >= SK_ARRAY_COUNT(gReadTable)) { SkDebugf("---- bad op during GPipeState::playback\n"); status = kError_Status; break; } if (kDone_DrawOp == op) { status = kDone_Status; break; } table[op](canvas, reader.getReader32(), op32, fState); if ((playbackFlags & kReadAtom_PlaybackFlag) && (table[op] != paintOp_rp && table[op] != def_Typeface_rp && table[op] != def_PaintFlat_rp && table[op] != def_Bitmap_rp )) { status = kReadAtom_Status; break; } } if (bytesRead) { *bytesRead = reader.offset(); } return status; }
SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, size_t* bytesRead, bool readAtom) { if (NULL == fCanvas) { return kError_Status; } if (NULL == fState) { fState = new SkGPipeState; } SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); const ReadProc* table = gReadTable; SkFlattenableReadBuffer reader(data, length); SkCanvas* canvas = fCanvas; Status status = kEOF_Status; fState->setReader(&reader); while (!reader.eof()) { uint32_t op32 = reader.readU32(); unsigned op = DrawOp_unpackOp(op32); SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) if (op >= SK_ARRAY_COUNT(gReadTable)) { SkDebugf("---- bad op during GPipeState::playback\n"); status = kError_Status; break; } if (kDone_DrawOp == op) { status = kDone_Status; break; } table[op](canvas, &reader, op32, fState); if (readAtom && (table[op] != paintOp_rp && table[op] != def_Typeface_rp && table[op] != def_PaintFlat_rp )) { status = kReadAtom_Status; break; } }