diff options
author | reed <reed@google.com> | 2015-05-04 08:32:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-04 08:32:02 -0700 |
commit | f603fb3d0e5fa57c3f228d66945bef198b001135 (patch) | |
tree | 6d3013b43ae2f94277318b4c949ab1f6f1f18d10 /src | |
parent | ab622c7b8cc8c39f0a594e4392b9e31b7e1ddb26 (diff) |
make drawImage a virtual on SkDevice
default impl will turn the Image into a (raster) bitmap and call drawBitmap.
BUG=skia:3803
Review URL: https://codereview.chromium.org/1118823004
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkCanvas.cpp | 56 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 20 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 43 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 3 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 9 | ||||
-rw-r--r-- | src/image/SkImage_Base.h | 3 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 9 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.h | 3 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 13 |
9 files changed, 117 insertions, 42 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 3e3f714880..34d6aaa0ab 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1734,12 +1734,15 @@ void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { this->onDrawPath(path, paint); } -void SkCanvas::drawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { - this->onDrawImage(image, dx, dy, paint); +void SkCanvas::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { + this->onDrawImage(image, x, y, paint); } void SkCanvas::drawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint) { + if (dst.isEmpty()) { + return; + } this->onDrawImageRect(image, src, dst, paint); } @@ -1959,15 +1962,58 @@ void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { LOOPER_END } -void SkCanvas::onDrawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { +void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); - image->draw(this, dx, dy, paint); + SkRect bounds = SkRect::MakeXYWH(x, y, + SkIntToScalar(image->width()), SkIntToScalar(image->height())); + if (NULL == paint || paint->canComputeFastBounds()) { + if (paint) { + paint->computeFastBounds(bounds, &bounds); + } + if (this->quickReject(bounds)) { + return; + } + } + + SkLazyPaint lazy; + if (NULL == paint) { + paint = lazy.init(); + } + + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) + + while (iter.next()) { + iter.fDevice->drawImage(iter, image, x, y, looper.paint()); + } + + LOOPER_END } void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); - image->drawRect(this, src, dst, paint); + SkRect storage; + const SkRect* bounds = &dst; + if (NULL == paint || paint->canComputeFastBounds()) { + if (paint) { + bounds = &paint->computeFastBounds(dst, &storage); + } + if (this->quickReject(*bounds)) { + return; + } + } + SkLazyPaint lazy; + if (NULL == paint) { + paint = lazy.init(); + } + + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) + + while (iter.next()) { + iter.fDevice->drawImageRect(iter, image, src, dst, looper.paint()); + } + + LOOPER_END } void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, const SkPaint* paint) { diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 6be9178f23..9a43fd0e32 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -165,6 +165,26 @@ void SkBaseDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSc } } +#include "SkImage_Base.h" + +void SkBaseDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x, SkScalar y, + const SkPaint& paint) { + // Default impl : turns everything into raster bitmap + SkBitmap bm; + if (as_IB(image)->getROPixels(&bm)) { + this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); + } +} + +void SkBaseDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const SkRect* src, + const SkRect& dst, const SkPaint& paint) { + // Default impl : turns everything into raster bitmap + SkBitmap bm; + if (as_IB(image)->getROPixels(&bm)) { + this->drawBitmapRect(draw, bm, src, dst, paint, SkCanvas::DrawBitmapRectFlags(0)); + } +} + bool SkBaseDevice::readPixels(const SkImageInfo& info, void* dstP, size_t rowBytes, int x, int y) { #ifdef SK_DEBUG SkASSERT(info.width() > 0 && info.height() > 0); diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 13b00defe4..37f2e51e4a 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1743,6 +1743,49 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, filter, ctx, result, offset); } +#include "SkImage_Base.h" + +static SkImageInfo make_info(GrTexture* tex, int w, int h, bool isOpaque) { + const GrPixelConfig config = tex->config(); + SkColorType ct; + SkAlphaType at = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; + if (!GrPixelConfig2ColorAndProfileType(config, &ct, NULL)) { + ct = kUnknown_SkColorType; + } + return SkImageInfo::Make(w, h, ct, at); +} + +static bool wrap_as_bm(const SkImage* image, SkBitmap* bm) { + GrTexture* tex = image->getTexture(); + if (tex) { + // TODO: handle the GrTexture directly, and skip GrPixelRef + const SkImageInfo info = make_info(tex, image->width(), image->height(), image->isOpaque()); + bm->setInfo(info); + bm->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, tex)))->unref(); + } else { + if (!as_IB(image)->getROPixels(bm)) { + return false; + } + } + return true; +} + +void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x, SkScalar y, + const SkPaint& paint) { + SkBitmap bm; + if (wrap_as_bm(image, &bm)) { + this->drawBitmap(draw, bm, SkMatrix::MakeTrans(x, y), paint); + } +} + +void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const SkRect* src, + const SkRect& dst, const SkPaint& paint) { + SkBitmap bm; + if (wrap_as_bm(image, &bm)) { + this->drawBitmapRect(draw, bm, src, dst, paint, SkCanvas::DrawBitmapRectFlags(0)); + } +} + /////////////////////////////////////////////////////////////////////////////// // must be in SkCanvas::VertexMode order diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 30cf68daa8..89959e1f9c 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -115,6 +115,9 @@ public: const SkPaint&) override; virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, const SkPaint&) override; + void drawImage(const SkDraw&, const SkImage*, SkScalar x, SkScalar y, const SkPaint&) override; + void drawImageRect(const SkDraw&, const SkImage*, const SkRect* src, const SkRect& dst, + const SkPaint&) override; void flush() override; diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index f427755d47..494e21004a 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -25,15 +25,6 @@ uint32_t SkImage::NextUniqueID() { return id; } -void SkImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { - as_IB(this)->onDraw(canvas, x, y, paint); -} - -void SkImage::drawRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, - const SkPaint* paint) const { - as_IB(this)->onDrawRect(canvas, src, dst, paint); -} - const void* SkImage::peekPixels(SkImageInfo* info, size_t* rowBytes) const { SkImageInfo infoStorage; size_t rowBytesStorage; diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index 512c80c44b..5daf4195e2 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -36,9 +36,6 @@ public: const SkSurfaceProps& props() const { return fProps; } - virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const = 0; - virtual void onDrawRect(SkCanvas*, const SkRect* src, - const SkRect& dst, const SkPaint*) const = 0; virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const = 0; virtual const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const { diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 7ccff17d9b..eec0d19760 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -26,15 +26,6 @@ SkShader* SkImage_Gpu::onNewShader(SkShader::TileMode tileX, return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix); } -void SkImage_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { - canvas->drawBitmap(fBitmap, x, y, paint); -} - -void SkImage_Gpu::onDrawRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, - const SkPaint* paint) const { - canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); -} - SkSurface* SkImage_Gpu::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const { GrContext* ctx = this->getTexture()->getContext(); // TODO: Change signature of onNewSurface to take a budgeted param. diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h index a771ddab24..7b38e60ea3 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -21,9 +21,6 @@ public: SkImage_Gpu(const SkBitmap&, int sampleCountForNewSurfaces, SkSurface::Budgeted); - void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const override; - void onDrawRect(SkCanvas*, const SkRect* src, const SkRect& dst, - const SkPaint*) const override; SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const override; GrTexture* onGetTexture() const override; bool getROPixels(SkBitmap*) const override; diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index acf805829d..20ae62c9f7 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -53,8 +53,6 @@ public: SkImage_Raster(const SkImageInfo&, SkData*, size_t rb, const SkSurfaceProps*); virtual ~SkImage_Raster(); - void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) const override; - void onDrawRect(SkCanvas*, const SkRect*, const SkRect&, const SkPaint*) const override; SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const override; bool onReadPixels(const SkImageInfo&, void*, size_t, int srcX, int srcY) const override; const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const override; @@ -120,17 +118,6 @@ SkShader* SkImage_Raster::onNewShader(SkShader::TileMode tileX, SkShader::TileMo return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix); } -void SkImage_Raster::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { - SkBitmap shallowCopy(fBitmap); - canvas->drawBitmap(shallowCopy, x, y, paint); -} - -void SkImage_Raster::onDrawRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, - const SkPaint* paint) const { - SkBitmap shallowCopy(fBitmap); - canvas->drawBitmapRectToRect(shallowCopy, src, dst, paint); -} - SkSurface* SkImage_Raster::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const { return SkSurface::NewRaster(info, &props); } |