BitmapHolder::BitmapHolder(SkReader32* reader, uint32_t op32, SkGPipeState* state) { const unsigned flags = state->getFlags(); const unsigned index = DrawOp_unpackData(op32); if (shouldFlattenBitmaps(flags)) { fHeapEntry = NULL; fBitmap = state->getBitmap(index); } else { SkBitmapHeapEntry* entry = state->getSharedHeap()->getEntry(index); if (SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)) { // Make a shallow copy for thread safety. Each thread will point to the same SkPixelRef, // which is thread safe. fBitmapStorage = *entry->getBitmap(); fBitmap = &fBitmapStorage; // Release the ref on the bitmap now, since we made our own copy. entry->releaseRef(); fHeapEntry = NULL; } else { SkASSERT(!shouldFlattenBitmaps(flags)); SkASSERT(!SkToBool(flags & SkGPipeWriter::kSimultaneousReaders_Flag)); fHeapEntry = entry; fBitmap = fHeapEntry->getBitmap(); } } }
static void clipRRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkRRect rrect; reader->readRRect(&rrect); bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); canvas->clipRRect(rrect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); }
static void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkPath path; reader->readPath(&path); bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32), doAA); }
static void drawData_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { // since we don't have a paint, we can use data for our (small) sizes size_t size = DrawOp_unpackData(op32); if (0 == size) { size = reader->readU32(); } const void* data = reader->skip(SkAlign4(size)); canvas->drawData(data, size); }
static void drawImage_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { unsigned slot = DrawOp_unpackData(op32); unsigned flags = DrawOp_unpackFlags(op32); bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); SkScalar x = reader->readScalar(); SkScalar y = reader->readScalar(); const SkImage* image = state->getImage(slot); if (state->shouldDraw()) { canvas->drawImage(image, x, y, hasPaint ? &state->paint() : NULL); } }
static void drawImageNine_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { unsigned slot = DrawOp_unpackData(op32); unsigned flags = DrawOp_unpackFlags(op32); bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); const SkIRect* center = skip<SkIRect>(reader); const SkRect* dst = skip<SkRect>(reader); const SkImage* image = state->getImage(slot); if (state->shouldDraw()) { canvas->drawImageNine(image, *center, *dst, hasPaint ? &state->paint() : NULL); } }
static void annotation_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkPaint* p = state->editPaint(); const size_t size = DrawOp_unpackData(op32); if (size > 0) { SkReadBuffer buffer(reader->skip(size), size); p->setAnnotation(SkAnnotation::Create(buffer))->unref(); SkASSERT(buffer.offset() == size); } else { p->setAnnotation(NULL); } }
static void saveLayer_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { unsigned flags = DrawOp_unpackFlags(op32); SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags)DrawOp_unpackData(op32); const SkRect* bounds = NULL; if (flags & kSaveLayer_HasBounds_DrawOpFlag) { bounds = skip<SkRect>(reader); } const SkPaint* paint = NULL; if (flags & kSaveLayer_HasPaint_DrawOpFlag) { paint = &state->paint(); } canvas->saveLayer(bounds, paint, saveFlags); }
static void drawImageRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { unsigned slot = DrawOp_unpackData(op32); unsigned flags = DrawOp_unpackFlags(op32); bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag); const SkRect* src = NULL; if (hasSrc) { src = skip<SkRect>(reader); } const SkRect* dst = skip<SkRect>(reader); SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstraint)reader->readInt(); const SkImage* image = state->getImage(slot); if (state->shouldDraw()) { canvas->legacy_drawImageRect(image, src, *dst, hasPaint ? &state->paint() : NULL, constraint); } }
static void save_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { canvas->save((SkCanvas::SaveFlags)DrawOp_unpackData(op32)); }
static void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { canvas->clipRect(*skip<SkRect>(reader), (SkRegion::Op)DrawOp_unpackData(op32)); }
static void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkRegion rgn; SkReadRegion(reader, &rgn); canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32)); }
static void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkPath path; path.unflatten(*reader); canvas->clipPath(path, (SkRegion::Op)DrawOp_unpackData(op32)); }
static void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { const SkRect* rect = skip<SkRect>(reader); bool doAA = SkToBool(DrawOp_unpackFlags(op32) & kClip_HasAntiAlias_DrawOpFlag); canvas->clipRect(*rect, (SkRegion::Op)DrawOp_unpackData(op32), doAA); }
static void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState* state) { PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32); unsigned index = DrawOp_unpackData(op32); state->defFlattenable(pf, index); }
static void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) { size_t bytes = DrawOp_unpackData(op32); (void)reader->skip(bytes); }
static void def_Bitmap_rp(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState* state) { unsigned index = DrawOp_unpackData(op32); state->addBitmap(index); }