bool SkImage_Base::onReadPixels(SkBitmap* bitmap, const SkIRect& subset) const { SkImageInfo info; if (bitmap->pixelRef()) { if (!bitmap->asImageInfo(&info)) { return false; } if (!raster_canvas_supports(info)) { return false; } } else { SkImageInfo info = SkImageInfo::MakeN32Premul(subset.width(), subset.height()); SkBitmap tmp; if (!tmp.allocPixels(info)) { return false; } *bitmap = tmp; } SkRect srcR, dstR; srcR.set(subset); dstR = srcR; dstR.offset(-dstR.left(), -dstR.top()); SkCanvas canvas(*bitmap); SkPaint paint; paint.setXfermodeMode(SkXfermode::kClear_Mode); canvas.drawRect(dstR, paint); const_cast<SkImage_Base*>(this)->onDrawRectToRect(&canvas, &srcR, dstR, NULL); return true; }
bool SkImage_Base::onReadPixels(SkBitmap* bitmap, const SkIRect& subset) const { if (bitmap->pixelRef()) { const SkImageInfo info = bitmap->info(); if (kUnknown_SkColorType == info.colorType()) { return false; } if (!raster_canvas_supports(info)) { return false; } } else { SkBitmap tmp; if (!tmp.tryAllocN32Pixels(subset.width(), subset.height())) { return false; } *bitmap = tmp; } SkRect srcR, dstR; srcR.set(subset); dstR = srcR; dstR.offset(-dstR.left(), -dstR.top()); SkCanvas canvas(*bitmap); SkPaint paint; paint.setXfermodeMode(SkXfermode::kClear_Mode); canvas.drawRect(dstR, paint); canvas.drawImageRect(this, &srcR, dstR); return true; }
bool SkImage_Base::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY) const { if (!raster_canvas_supports(dstInfo)) { return false; } SkBitmap bm; bm.installPixels(dstInfo, dstPixels, dstRowBytes); SkCanvas canvas(bm); SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); canvas.drawImage(this, -SkIntToScalar(srcX), -SkIntToScalar(srcY), &paint); return true; }