diff options
-rw-r--r-- | include/core/SkDevice.h | 4 | ||||
-rw-r--r-- | include/core/SkImage.h | 13 | ||||
-rw-r--r-- | include/utils/SkDeferredCanvas.h | 3 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 56 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 19 | ||||
-rw-r--r-- | src/core/SkPaintPriv.cpp | 6 | ||||
-rw-r--r-- | src/core/SkPaintPriv.h | 10 | ||||
-rw-r--r-- | src/core/SkPictureRecord.cpp | 17 | ||||
-rw-r--r-- | src/core/SkPictureRecord.h | 3 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 42 | ||||
-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 | ||||
-rw-r--r-- | src/pipe/SkGPipePriv.h | 20 | ||||
-rw-r--r-- | src/pipe/SkGPipeRead.cpp | 47 | ||||
-rw-r--r-- | src/pipe/SkGPipeWrite.cpp | 94 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 59 |
20 files changed, 78 insertions, 355 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/include/utils/SkDeferredCanvas.h b/include/utils/SkDeferredCanvas.h index a8330493a7..ac8556f539 100644 --- a/include/utils/SkDeferredCanvas.h +++ b/include/utils/SkDeferredCanvas.h @@ -177,9 +177,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/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 37fafd8dfb..6be9178f23 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -9,7 +9,6 @@ #include "SkDeviceProperties.h" #include "SkDraw.h" #include "SkDrawFilter.h" -#include "SkImage_Base.h" #include "SkMetaData.h" #include "SkPatchUtils.h" #include "SkPathMeasure.h" @@ -166,24 +165,6 @@ void SkBaseDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSc } } -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::kNone_DrawBitmapRectFlag); - } -} - 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/SkPaintPriv.cpp b/src/core/SkPaintPriv.cpp index 3ced573929..c6957cd1ca 100644 --- a/src/core/SkPaintPriv.cpp +++ b/src/core/SkPaintPriv.cpp @@ -9,7 +9,6 @@ #include "SkBitmap.h" #include "SkColorFilter.h" -#include "SkImage.h" #include "SkPaint.h" #include "SkShader.h" @@ -50,8 +49,3 @@ bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { return isPaintOpaque(paint, contentType); } - -bool isPaintOpaque(const SkPaint* paint, const SkImage* image) { - return isPaintOpaque(paint, image->isOpaque() ? - kOpaque_SkPaintBitmapOpacity : kUnknown_SkPaintBitmapOpacity); -} diff --git a/src/core/SkPaintPriv.h b/src/core/SkPaintPriv.h index be441b8f72..88fc4fc349 100644 --- a/src/core/SkPaintPriv.h +++ b/src/core/SkPaintPriv.h @@ -8,12 +8,11 @@ #ifndef SkPaintPriv_DEFINED #define SkPaintPriv_DEFINED -#include "SkTypes.h" - class SkBitmap; -class SkImage; class SkPaint; +#include "SkTypes.h" + enum SkPaintBitmapOpacity { // No content replaces the paint's color kNoBitmap_SkPaintBitmapOpacity = 0, @@ -41,7 +40,6 @@ bool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType); shader. @return true if paint is opaque */ -bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader = NULL); -bool isPaintOpaque(const SkPaint* paint, const SkImage* image); - +bool isPaintOpaque(const SkPaint* paint, + const SkBitmap* bmpReplacesShader = NULL); #endif diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 07811fb128..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, kNone_DrawBitmapRectFlag); - } -} - 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 9518600e99..6ff0538ee2 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -21,7 +21,6 @@ #include "SkErrorInternals.h" #include "SkGlyphCache.h" #include "SkGrTexturePixelRef.h" -#include "SkImage_Base.h" #include "SkImageFilter.h" #include "SkLayerInfo.h" #include "SkMaskFilter.h" @@ -1731,47 +1730,6 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, filter, ctx, result, offset); } -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::kNone_DrawBitmapRectFlag); - } -} - /////////////////////////////////////////////////////////////////////////////// // 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); } diff --git a/src/pipe/SkGPipePriv.h b/src/pipe/SkGPipePriv.h index c3919f635b..736930b652 100644 --- a/src/pipe/SkGPipePriv.h +++ b/src/pipe/SkGPipePriv.h @@ -43,8 +43,6 @@ enum DrawOps { kDrawBitmapNine_DrawOp, kDrawBitmapRectToRect_DrawOp, kDrawDRRect_DrawOp, - kDrawImage_DrawOp, - kDrawImageRect_DrawOp, kDrawOval_DrawOp, kDrawPaint_DrawOp, kDrawPatch_DrawOp, @@ -81,7 +79,6 @@ enum DrawOps { // these are signals to playback, not drawing verbs kReportFlags_DrawOp, kShareBitmapHeap_DrawOp, - kShareImageHeap_DrawOp, kDone_DrawOp, }; @@ -144,7 +141,6 @@ enum { kDrawVertices_HasIndices_DrawOpFlag = 1 << 2, kDrawVertices_HasXfermode_DrawOpFlag = 1 << 3, }; -// These are shared between drawbitmap and drawimage enum { kDrawBitmap_HasPaint_DrawOpFlag = 1 << 0, // Specific to drawBitmapRect, but needs to be different from HasPaint, @@ -217,22 +213,6 @@ static inline bool shouldFlattenBitmaps(uint32_t flags) { && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag)); } -class SkImageHeap : public SkRefCnt { -public: - SkImageHeap(); - virtual ~SkImageHeap(); - - // slot must be "valid" -- 0 is never valid - const SkImage* get(int32_t slot) const; - // returns 0 if not found, else returns slot - int32_t find(const SkImage*) const; - // returns non-zero value for where the image was stored - int32_t insert(const SkImage*); - -private: - SkTDArray<const SkImage*> fArray; -}; - /////////////////////////////////////////////////////////////////////////////// enum PaintOps { diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp index 917bb50976..f8411f5aea 100644 --- a/src/pipe/SkGPipeRead.cpp +++ b/src/pipe/SkGPipeRead.cpp @@ -178,10 +178,6 @@ public: this->updateReader(); } - void setImageHeap(SkImageHeap* heap) { - fImageHeap.reset(SkRef(heap)); - } - /** * Access the shared heap. Only used in the case when bitmaps are not * flattened. @@ -202,10 +198,6 @@ public: return id ? fTypefaces[id - 1] : NULL; } - const SkImage* getImage(int32_t slot) const { - return fImageHeap->get(slot); - } - private: void updateReader() { if (NULL == fReader) { @@ -235,7 +227,6 @@ private: bool fSilent; // Only used when sharing bitmaps with the writer. SkBitmapHeap* fSharedHeap; - SkAutoTUnref<SkImageHeap> fImageHeap; unsigned fFlags; }; @@ -638,35 +629,6 @@ static void drawSprite_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, } } -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 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); - const SkImage* image = state->getImage(slot); - if (state->shouldDraw()) { - canvas->drawImageRect(image, src, *dst, hasPaint ? &state->paint() : NULL); - } -} - /////////////////////////////////////////////////////////////////////////////// static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, @@ -812,14 +774,10 @@ static void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32, } static void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, - SkGPipeState* state) { + SkGPipeState* state) { state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr())); } -static void shareImageHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, SkGPipeState* state) { - state->setImageHeap(static_cast<SkImageHeap*>(reader->readPtr())); -} - static void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {} typedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*); @@ -835,8 +793,6 @@ static const ReadProc gReadTable[] = { drawBitmapNine_rp, drawBitmapRect_rp, drawDRRect_rp, - drawImage_rp, - drawImageRect_rp, drawOval_rp, drawPaint_rp, drawPatch_rp, @@ -872,7 +828,6 @@ static const ReadProc gReadTable[] = { reportFlags_rp, shareBitmapHeap_rp, - shareImageHeap_rp, done_rp }; diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp index 2e73be83f1..83e5c57d27 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -272,9 +272,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 decomposition into 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; @@ -297,7 +300,6 @@ private: SkNamedFactorySet* fFactorySet; SkBitmapHeap* fBitmapHeap; - SkImageHeap* fImageHeap; SkGPipeController* fController; SkWriter32& fWriter; size_t fBlockSize; // amount allocated for writer @@ -346,8 +348,8 @@ private: // Common code used by drawBitmap*. Behaves differently depending on the // type of SkBitmapHeap being used, which is determined by the flags used. - bool commonDrawBitmap(const SkBitmap&, DrawOps, unsigned flags, size_t bytes, const SkPaint*); - bool commonDrawImage(const SkImage*, DrawOps, unsigned flags, size_t bytes, const SkPaint*); + bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, + size_t opBytesNeeded, const SkPaint* paint); SkPaint fPaint; void writePaint(const SkPaint&); @@ -460,13 +462,6 @@ SkGPipeCanvas::SkGPipeCanvas(SkGPipeController* controller, } } fFlattenableHeap.setBitmapStorage(fBitmapHeap); - - fImageHeap = SkNEW(SkImageHeap); - if (this->needOpBytes(sizeof(void*))) { - this->writeOp(kShareImageHeap_DrawOp); - fWriter.writePtr(static_cast<void*>(fImageHeap)); - } - this->doNotify(); } @@ -474,7 +469,6 @@ SkGPipeCanvas::~SkGPipeCanvas() { this->finish(true); SkSafeUnref(fFactorySet); SkSafeUnref(fBitmapHeap); - SkSafeUnref(fImageHeap); } bool SkGPipeCanvas::needOpBytes(size_t needed) { @@ -829,53 +823,6 @@ void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk } } -bool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned flags, - size_t opBytesNeeded, const SkPaint* paint) { - if (fDone) { - return false; - } - - if (paint != NULL) { - flags |= kDrawBitmap_HasPaint_DrawOpFlag; - this->writePaint(*paint); - } - // This needs to run first so its calls to needOpBytes() and its writes - // don't interlace with the needOpBytes() and write below. - int32_t slot = fImageHeap->insert(image); - SkASSERT(slot != 0); - if (this->needOpBytes(opBytesNeeded)) { - this->writeOp(op, flags, slot); - return true; - } - return false; -} - -void SkGPipeCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, - const SkPaint* paint) { - NOTIFY_SETUP(this); - if (this->commonDrawImage(image, kDrawImage_DrawOp, 0, sizeof(SkScalar) * 2, paint)) { - fWriter.writeScalar(x); - fWriter.writeScalar(y); - } -} - -void SkGPipeCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, - const SkPaint* paint) { - NOTIFY_SETUP(this); - unsigned flags = 0; - size_t opBytesNeeded = sizeof(SkRect); // dst - if (src) { - flags |= kDrawBitmap_HasSrcRect_DrawOpFlag; - opBytesNeeded += sizeof(SkRect); // src - } - if (this->commonDrawImage(image, kDrawImageRect_DrawOp, flags, opBytesNeeded, paint)) { - if (src) { - fWriter.writeRect(*src); - } - fWriter.writeRect(dst); - } -} - void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { if (byteLength) { @@ -1390,34 +1337,3 @@ void BitmapShuttle::removeCanvas() { fCanvas->unref(); fCanvas = NULL; } - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -SkImageHeap::SkImageHeap() {} - -SkImageHeap::~SkImageHeap() { - fArray.unrefAll(); -} - -const SkImage* SkImageHeap::get(int32_t slot) const { - SkASSERT(slot > 0); - return fArray[slot - 1]; -} - -int32_t SkImageHeap::find(const SkImage* img) const { - int index = fArray.find(img); - if (index >= 0) { - return index + 1; // found - } - return 0; // not found -} - -int32_t SkImageHeap::insert(const SkImage* img) { - int32_t slot = this->find(img); - if (slot) { - return slot; - } - *fArray.append() = SkRef(img); - return fArray.count(); // slot is always index+1 -} - diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 7e4539a5a7..d5cf97bd04 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -32,17 +32,10 @@ enum PlaybackMode { kSilent_PlaybackMode, }; -static uint64_t image_area(const SkImage* image) { - return sk_64_mul(image->width(), image->height()); -} - -static bool should_draw_immediately(const SkBitmap* bitmap, const SkImage* image, - const SkPaint* paint, size_t bitmapSizeThreshold) { +static bool should_draw_immediately(const SkBitmap* bitmap, const SkPaint* paint, + size_t bitmapSizeThreshold) { if (bitmap && ((bitmap->getTexture() && !bitmap->isImmutable()) || - (bitmap->getSize() > bitmapSizeThreshold))) { - return true; - } - if (image && (image_area(image) > bitmapSizeThreshold)) { + (bitmap->getSize() > bitmapSizeThreshold))) { return true; } if (paint) { @@ -209,11 +202,6 @@ protected: void drawSprite(const SkDraw&, const SkBitmap& bitmap, int x, int y, const SkPaint& paint) override {SkASSERT(0);} - void drawImage(const SkDraw&, const SkImage*, SkScalar, SkScalar, const SkPaint&) override - {SkASSERT(0);} - void drawImageRect(const SkDraw&, const SkImage*, const SkRect*, const SkRect&, - const SkPaint&) override - {SkASSERT(0);} void drawText(const SkDraw&, const void* text, size_t len, SkScalar x, SkScalar y, const SkPaint& paint) override {SkASSERT(0);} @@ -493,15 +481,11 @@ class AutoImmediateDrawIfNeeded { public: AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint) { - this->init(canvas, bitmap, NULL, paint); - } - AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkImage* image, - const SkPaint* paint) { - this->init(canvas, NULL, image, paint); + this->init(canvas, bitmap, paint); } AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkPaint* paint) { - this->init(canvas, NULL, NULL, paint); + this->init(canvas, NULL, paint); } ~AutoImmediateDrawIfNeeded() { @@ -510,10 +494,9 @@ public: } } private: - void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkImage* image, - const SkPaint* paint) { + void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint) { if (canvas.isDeferredDrawing() && - should_draw_immediately(bitmap, image, paint, canvas.getBitmapSizeThreshold())) { + should_draw_immediately(bitmap, paint, canvas.getBitmapSizeThreshold())) { canvas.setDeferredDrawing(false); fCanvas = &canvas; } else { @@ -853,34 +836,6 @@ void SkDeferredCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* sr this->recordedDrawCommand(); } - -void SkDeferredCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, - const SkPaint* paint) { - SkRect bounds = SkRect::MakeXYWH(x, y, - SkIntToScalar(image->width()), SkIntToScalar(image->height())); - if (fDeferredDrawing && - this->isFullFrame(&bounds, paint) && - isPaintOpaque(paint, image)) { - this->getDeferredDevice()->skipPendingCommands(); - } - - AutoImmediateDrawIfNeeded autoDraw(*this, image, paint); - this->drawingCanvas()->drawImage(image, x, y, paint); - this->recordedDrawCommand(); -} -void SkDeferredCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, - const SkPaint* paint) { - if (fDeferredDrawing && - this->isFullFrame(&dst, paint) && - isPaintOpaque(paint, image)) { - this->getDeferredDevice()->skipPendingCommands(); - } - - AutoImmediateDrawIfNeeded autoDraw(*this, image, paint); - this->drawingCanvas()->drawImageRect(image, src, dst, paint); - this->recordedDrawCommand(); -} - void SkDeferredCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint) { |