Revert of Revert of Revert of Make drawImage a virtual on SkDevice (patchset #1 id:1 of https://codereview.chromium.org/1126273002/)
Reason for revert:
still breaking webglconformance
Original issue's description:
> Revert of Revert of Make drawImage a virtual on SkDevice (patchset #1 id:1 of https://codereview.chromium.org/1124003002/)
>
> Reason for revert:
> retry now that some fixes (onDrawImage overrides) have landed in chrome/blink
>
> Original issue's description:
> > Revert of Make drawImage a virtual on SkDevice (patchset #4 id:60001 of https://codereview.chromium.org/1122643005/)
> >
> > Reason for revert:
> > speculative to see if it unblocks DEPS roll
> >
> > Original issue's description:
> > > Make drawImage a virtual on SkDevice
> > >
> > > Now with patch for SkDeferredCanvas
> > >
> > > This reverts commit 119468b71f
.
> > >
> > > BUG=skia:
> > >
> > > Committed: https://skia.googlesource.com/skia/+/14fe8fd3e53b5e988aac189a8bc3ed28904d85c8
> >
> > TBR=robertphillips@google.com,mtklein@google.com,reed@google.com
> > NOPRESUBMIT=true
> > NOTREECHECKS=true
> > NOTRY=true
> > BUG=skia:
> >
> > Committed: https://skia.googlesource.com/skia/+/3538e3bfe2e00bc1b5b48d977fa7adff64d8c96b
>
> TBR=robertphillips@google.com,mtklein@google.com,reed@chromium.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/620ba3afe09d4173c87537040fe50c1c1895fb1a
TBR=robertphillips@google.com,mtklein@google.com,reed@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1127993004
This commit is contained in:
parent
d9b6be197f
commit
06dad4b92f
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user