diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-11-12 22:14:08 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-11-12 22:14:08 +0000 |
commit | 3f4bf51eddd9271b27e3c709939af1ff9ff1758d (patch) | |
tree | 2d2b521611a0e3b375b9bfcc69295b0b40cbcc0b /src/utils | |
parent | 04068b13e5ec0c0aa2ab0fe82990ec8146c33243 (diff) |
switch GatherPixelRefs to use SkBaseDevice instead of SkBitmapDevice
BUG=
R=robertphillips@google.com, scroggo@google.com
Review URL: https://codereview.chromium.org/70473003
git-svn-id: http://skia.googlecode.com/svn/trunk@12259 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkPictureUtils.cpp | 95 |
1 files changed, 65 insertions, 30 deletions
diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp index ffd9aa4429..fa16af07f2 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -45,34 +45,38 @@ static void nothing_to_do() {} /** * This device will route all bitmaps (primitives and in shaders) to its PRSet. * It should never actually draw anything, so there need not be any pixels - * behind its device-bitmap. - * FIXME: Derive from SkBaseDevice. + * behind its device. */ -class GatherPixelRefDevice : public SkBitmapDevice { -private: - PixelRefSet* fPRSet; - - void addBitmap(const SkBitmap& bm) { - fPRSet->add(bm.pixelRef()); +class GatherPixelRefDevice : public SkBaseDevice { +public: + GatherPixelRefDevice(int width, int height, PixelRefSet* prset) { + fSize.set(width, height); + fEmptyBitmap.setConfig(SkBitmap::kNo_Config, width, height); + fPRSet = prset; } - void addBitmapFromPaint(const SkPaint& paint) { - SkShader* shader = paint.getShader(); - if (shader) { - SkBitmap bm; - // Check whether the shader is a gradient in order to short-circuit - // call to asABitmap to prevent generation of bitmaps from - // gradient shaders, which implement asABitmap. - if (SkShader::kNone_GradientType == shader->asAGradient(NULL) && - shader->asABitmap(&bm, NULL, NULL)) { - fPRSet->add(bm.pixelRef()); - } - } + virtual uint32_t getDeviceCapabilities() SK_OVERRIDE { return 0; } + virtual int width() const SK_OVERRIDE { return fSize.width(); } + virtual int height() const SK_OVERRIDE { return fSize.height(); } + virtual bool isOpaque() const SK_OVERRIDE { return false; } + virtual SkBitmap::Config config() const SK_OVERRIDE { + return SkBitmap::kNo_Config; } - -public: - GatherPixelRefDevice(const SkBitmap& bm, PixelRefSet* prset) : SkBitmapDevice(bm) { - fPRSet = prset; + virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE { return NULL; } + virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE { + return true; + } + // TODO: allow this call to return failure, or move to SkBitmapDevice only. + virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE { + return fEmptyBitmap; + } + virtual void lockPixels() SK_OVERRIDE { nothing_to_do(); } + virtual void unlockPixels() SK_OVERRIDE { nothing_to_do(); } + virtual bool allowImageFilter(SkImageFilter*) SK_OVERRIDE { return false; } + virtual bool canHandleImageFilter(SkImageFilter*) SK_OVERRIDE { return false; } + virtual bool filterImage(SkImageFilter*, const SkBitmap&, const SkMatrix&, + SkBitmap* result, SkIPoint* offset) SK_OVERRIDE { + return false; } virtual void clear(SkColor color) SK_OVERRIDE { @@ -156,8 +160,43 @@ protected: return false; } + virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) SK_OVERRIDE { + not_supported(); + } + virtual SkBaseDevice* onCreateCompatibleDevice(SkBitmap::Config config, + int width, int height, + bool isOpaque, + Usage usage) SK_OVERRIDE { + // we expect to only get called via savelayer, in which case it is fine. + SkASSERT(kSaveLayer_Usage == usage); + return SkNEW_ARGS(GatherPixelRefDevice, (width, height, fPRSet)); + } + virtual void flush() SK_OVERRIDE {} + private: - typedef SkBitmapDevice INHERITED; + PixelRefSet* fPRSet; + SkBitmap fEmptyBitmap; // legacy -- need to remove the need for this guy + SkISize fSize; + + void addBitmap(const SkBitmap& bm) { + fPRSet->add(bm.pixelRef()); + } + + void addBitmapFromPaint(const SkPaint& paint) { + SkShader* shader = paint.getShader(); + if (shader) { + SkBitmap bm; + // Check whether the shader is a gradient in order to short-circuit + // call to asABitmap to prevent generation of bitmaps from + // gradient shaders, which implement asABitmap. + if (SkShader::kNone_GradientType == shader->asAGradient(NULL) && + shader->asABitmap(&bm, NULL, NULL)) { + fPRSet->add(bm.pixelRef()); + } + } + } + + typedef SkBaseDevice INHERITED; }; class NoSaveLayerCanvas : public SkCanvas { @@ -214,11 +253,7 @@ SkData* SkPictureUtils::GatherPixelRefs(SkPicture* pict, const SkRect& area) { SkTDArray<SkPixelRef*> array; PixelRefSet prset(&array); - SkBitmap emptyBitmap; - emptyBitmap.setConfig(SkBitmap::kARGB_8888_Config, pict->width(), pict->height()); - // note: we do not set any pixels (shouldn't need to) - - GatherPixelRefDevice device(emptyBitmap, &prset); + GatherPixelRefDevice device(pict->width(), pict->height(), &prset); NoSaveLayerCanvas canvas(&device); canvas.clipRect(area, SkRegion::kIntersect_Op, false); |