diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-11-12 22:27:30 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-11-12 22:27:30 +0000 |
commit | 4d164709739ae78809125cae9b8de0f3fff0d081 (patch) | |
tree | 9fe221539e1b44689e1958b2a66f621bf9ff0d4a | |
parent | 3f4bf51eddd9271b27e3c709939af1ff9ff1758d (diff) |
Revert "switch GatherPixelRefs to use SkBaseDevice instead of SkBitmapDevice"
This reverts commit 72958c374bdb9457419beeba7de1387da3293882.
BUG=
Review URL: https://codereview.chromium.org/58933007
git-svn-id: http://skia.googlecode.com/svn/trunk@12260 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | include/core/SkBitmapDevice.h | 7 | ||||
-rw-r--r-- | include/core/SkDevice.h | 8 | ||||
-rw-r--r-- | include/gpu/SkGpuDevice.h | 1 | ||||
-rw-r--r-- | src/core/SkBitmapDevice.cpp | 8 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 7 | ||||
-rw-r--r-- | src/utils/SkPictureUtils.cpp | 95 |
6 files changed, 54 insertions, 72 deletions
diff --git a/include/core/SkBitmapDevice.h b/include/core/SkBitmapDevice.h index b5265267e6..530b85c9f8 100644 --- a/include/core/SkBitmapDevice.h +++ b/include/core/SkBitmapDevice.h @@ -73,6 +73,13 @@ public: */ virtual int height() const SK_OVERRIDE { return fBitmap.height(); } + /** + * Return the bounds of the device in the coordinate space of the root + * canvas. The root device will have its top-left at 0,0, but other devices + * such as those associated with saveLayer may have a non-zero origin. + */ + virtual void getGlobalBounds(SkIRect* bounds) const SK_OVERRIDE; + /** Returns true if the device's bitmap's config treats every pixels as implicitly opaque. */ diff --git a/include/core/SkDevice.h b/include/core/SkDevice.h index 3b925df318..22a56d007d 100644 --- a/include/core/SkDevice.h +++ b/include/core/SkDevice.h @@ -83,12 +83,7 @@ public: * canvas. The root device will have its top-left at 0,0, but other devices * such as those associated with saveLayer may have a non-zero origin. */ - void getGlobalBounds(SkIRect* bounds) const { - SkASSERT(bounds); - const SkIPoint& origin = this->getOrigin(); - bounds->setXYWH(origin.x(), origin.y(), this->width(), this->height()); - } - + virtual void getGlobalBounds(SkIRect* bounds) const = 0; /** Returns true if the device's bitmap's config treats every pixel as implicitly opaque. @@ -388,7 +383,6 @@ private: // used to change the backend's pixels (and possibly config/rowbytes) // but cannot change the width/height, so there should be no change to // any clip information. - // TODO: move to SkBitmapDevice virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) = 0; // just called by SkCanvas when built as a layer diff --git a/include/gpu/SkGpuDevice.h b/include/gpu/SkGpuDevice.h index d37f63d7a0..29f59f28df 100644 --- a/include/gpu/SkGpuDevice.h +++ b/include/gpu/SkGpuDevice.h @@ -72,6 +72,7 @@ public: virtual int height() const SK_OVERRIDE { return NULL == fRenderTarget ? 0 : fRenderTarget->height(); } + virtual void getGlobalBounds(SkIRect* bounds) const SK_OVERRIDE; virtual bool isOpaque() const SK_OVERRIDE { return NULL == fRenderTarget ? false : kRGB_565_GrPixelConfig == fRenderTarget->config(); diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 030331ac51..637048742a 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -77,6 +77,14 @@ void SkBitmapDevice::unlockPixels() { } } +void SkBitmapDevice::getGlobalBounds(SkIRect* bounds) const { + if (NULL != bounds) { + const SkIPoint& origin = this->getOrigin(); + bounds->setXYWH(origin.x(), origin.y(), + fBitmap.width(), fBitmap.height()); + } +} + void SkBitmapDevice::clear(SkColor color) { fBitmap.eraseColor(color); } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 747688ed8b..429ee9f8e2 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -513,6 +513,13 @@ inline bool skPaint2GrPaintShader(SkGpuDevice* dev, } /////////////////////////////////////////////////////////////////////////////// +void SkGpuDevice::getGlobalBounds(SkIRect* bounds) const { + if (NULL != bounds) { + const SkIPoint& origin = this->getOrigin(); + bounds->setXYWH(origin.x(), origin.y(), + this->width(), this->height()); + } +} SkBitmap::Config SkGpuDevice::config() const { if (NULL == fRenderTarget) { diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp index fa16af07f2..ffd9aa4429 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -45,38 +45,34 @@ 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. + * behind its device-bitmap. + * FIXME: Derive from SkBaseDevice. */ -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; - } +class GatherPixelRefDevice : public SkBitmapDevice { +private: + PixelRefSet* fPRSet; - 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; - } - virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE { return NULL; } - virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE { - return true; + void addBitmap(const SkBitmap& bm) { + fPRSet->add(bm.pixelRef()); } - // TODO: allow this call to return failure, or move to SkBitmapDevice only. - virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE { - return fEmptyBitmap; + + 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 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; + +public: + GatherPixelRefDevice(const SkBitmap& bm, PixelRefSet* prset) : SkBitmapDevice(bm) { + fPRSet = prset; } virtual void clear(SkColor color) SK_OVERRIDE { @@ -160,43 +156,8 @@ 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: - 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; + typedef SkBitmapDevice INHERITED; }; class NoSaveLayerCanvas : public SkCanvas { @@ -253,7 +214,11 @@ SkData* SkPictureUtils::GatherPixelRefs(SkPicture* pict, const SkRect& area) { SkTDArray<SkPixelRef*> array; PixelRefSet prset(&array); - GatherPixelRefDevice device(pict->width(), pict->height(), &prset); + 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); NoSaveLayerCanvas canvas(&device); canvas.clipRect(area, SkRegion::kIntersect_Op, false); |