aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-11-12 22:27:30 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-11-12 22:27:30 +0000
commit4d164709739ae78809125cae9b8de0f3fff0d081 (patch)
tree9fe221539e1b44689e1958b2a66f621bf9ff0d4a
parent3f4bf51eddd9271b27e3c709939af1ff9ff1758d (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.h7
-rw-r--r--include/core/SkDevice.h8
-rw-r--r--include/gpu/SkGpuDevice.h1
-rw-r--r--src/core/SkBitmapDevice.cpp8
-rw-r--r--src/gpu/SkGpuDevice.cpp7
-rw-r--r--src/utils/SkPictureUtils.cpp95
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);