aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-05-04 08:32:02 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-04 08:32:02 -0700
commitf603fb3d0e5fa57c3f228d66945bef198b001135 (patch)
tree6d3013b43ae2f94277318b4c949ab1f6f1f18d10 /src
parentab622c7b8cc8c39f0a594e4392b9e31b7e1ddb26 (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.cpp56
-rw-r--r--src/core/SkDevice.cpp20
-rw-r--r--src/gpu/SkGpuDevice.cpp43
-rw-r--r--src/gpu/SkGpuDevice.h3
-rw-r--r--src/image/SkImage.cpp9
-rw-r--r--src/image/SkImage_Base.h3
-rw-r--r--src/image/SkImage_Gpu.cpp9
-rw-r--r--src/image/SkImage_Gpu.h3
-rw-r--r--src/image/SkImage_Raster.cpp13
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);
}