From 119468b71f8f4f45657ab30ead331be665de5a57 Mon Sep 17 00:00:00 2001 From: reed Date: Tue, 5 May 2015 05:42:02 -0700 Subject: [PATCH] =?UTF-8?q?Revert=20of=20Make=20drawImage=20a=20virtual=20?= =?UTF-8?q?on=20SkDevice=20(patchset=20#3=20id:40001=20of=20https://codere?= =?UTF-8?q?view.chromium.org/11188=E2=80=A6=20(patchset=20#2=20id:20001=20?= =?UTF-8?q?of=20https://codereview.chromium.org/1122813002/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reason for revert: did not update DeferredCanvas Original issue's description: > Make drawImage a virtual on SkDevice (patchset #3 id:40001 of https://codereview.chromium.org/1118823004/)" > > Fixed serialization from prev CL > > This reverts commit 973d1f1f60f2710a268a3165aa4f3460502d4be5. > > BUG=skia:3803 > TBR= > > Committed: https://skia.googlesource.com/skia/+/5392785080001fe737fac9e5801fc2127a78d4fb TBR= NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia:3803 Review URL: https://codereview.chromium.org/1123743006 --- include/core/SkDevice.h | 4 --- include/core/SkImage.h | 13 +++++++++ src/core/SkCanvas.cpp | 56 ++++-------------------------------- src/core/SkDevice.cpp | 20 ------------- src/core/SkPictureRecord.cpp | 17 ----------- src/core/SkPictureRecord.h | 3 ++ src/gpu/SkGpuDevice.cpp | 43 --------------------------- src/gpu/SkGpuDevice.h | 3 -- src/image/SkImage.cpp | 9 ++++++ src/image/SkImage_Base.h | 3 ++ src/image/SkImage_Gpu.cpp | 9 ++++++ src/image/SkImage_Gpu.h | 3 ++ src/image/SkImage_Raster.cpp | 13 +++++++++ 13 files changed, 58 insertions(+), 138 deletions(-) diff --git a/include/core/SkDevice.h b/include/core/SkDevice.h index b474687cfb..8a219d7053 100644 --- a/include/core/SkDevice.h +++ b/include/core/SkDevice.h @@ -209,10 +209,6 @@ protected: const SkPaint& paint, SkCanvas::DrawBitmapRectFlags flags) = 0; - virtual void drawImage(const SkDraw&, const SkImage*, SkScalar x, SkScalar y, const SkPaint&); - virtual void drawImageRect(const SkDraw&, const SkImage*, const SkRect* src, const SkRect& dst, - const SkPaint&); - /** * Does not handle text decoration. * Decorations (underline and stike-thru) will be handled by SkCanvas. diff --git a/include/core/SkImage.h b/include/core/SkImage.h index ebc9a29394..ec85516619 100644 --- a/include/core/SkImage.h +++ b/include/core/SkImage.h @@ -172,6 +172,19 @@ private: static uint32_t NextUniqueID(); typedef SkRefCnt INHERITED; + + friend class SkCanvas; + + void draw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const; + + /** + * Draw the image, cropped to the src rect, to the dst rect of a canvas. + * If src is larger than the bounds of the image, the rest of the image is + * filled with transparent black pixels. + * + * See SkCanvas::drawBitmapRectToRect for similar behavior. + */ + void drawRect(SkCanvas*, const SkRect* src, const SkRect& dst, const SkPaint*) const; }; #endif diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 34d6aaa0ab..3e3f714880 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1734,15 +1734,12 @@ void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { this->onDrawPath(path, paint); } -void SkCanvas::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { - this->onDrawImage(image, x, y, paint); +void SkCanvas::drawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { + this->onDrawImage(image, dx, dy, 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); } @@ -1962,58 +1959,15 @@ void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { LOOPER_END } -void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { +void SkCanvas::onDrawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); - 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 + image->draw(this, dx, dy, paint); } void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); - 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 + image->drawRect(this, src, dst, paint); } 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 9a43fd0e32..6be9178f23 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -165,26 +165,6 @@ 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/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index c92ee02dbd..53ecdd0be6 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -7,7 +7,6 @@ #include "SkPictureRecord.h" #include "SkDevice.h" -#include "SkImage_Base.h" #include "SkPatchUtils.h" #include "SkPixelRef.h" #include "SkRRect.h" @@ -564,22 +563,6 @@ void SkPictureRecord::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src this->validate(initialOffset, size); } -void SkPictureRecord::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, - const SkPaint* paint) { - SkBitmap bm; - if (as_IB(image)->getROPixels(&bm)) { - this->SkPictureRecord::onDrawBitmap(bm, x, y, paint); - } -} - -void SkPictureRecord::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, - const SkPaint* paint) { - SkBitmap bm; - if (as_IB(image)->getROPixels(&bm)) { - this->SkPictureRecord::onDrawBitmapRect(bm, src, dst, paint, DrawBitmapRectFlags(0)); - } -} - void SkPictureRecord::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint) { // op + paint index + bitmap id + center + dst rect diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h index 7a6fc813a5..5e2d5a10e4 100644 --- a/src/core/SkPictureRecord.h +++ b/src/core/SkPictureRecord.h @@ -184,9 +184,12 @@ protected: void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, DrawBitmapRectFlags flags) override; +#if 0 + // rely on conversion to bitmap (for now) void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, const SkPaint*) override; +#endif void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, const SkPaint*) override; void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override; diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 5fcc4355cd..6ff0538ee2 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1730,49 +1730,6 @@ 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 89959e1f9c..30cf68daa8 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -115,9 +115,6 @@ 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 494e21004a..f427755d47 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -25,6 +25,15 @@ 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 5daf4195e2..512c80c44b 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -36,6 +36,9 @@ 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 eec0d19760..7ccff17d9b 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -26,6 +26,15 @@ 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 7b38e60ea3..a771ddab24 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -21,6 +21,9 @@ 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 20ae62c9f7..acf805829d 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -53,6 +53,8 @@ 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; @@ -118,6 +120,17 @@ 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); }