aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-13 15:11:11 +0000
committerGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-13 15:11:11 +0000
commitb2d93a91222dac2edb3c19128fd58fa2e74272aa (patch)
tree542e5234ce9408bb85fe36ae131746376eb3ae53 /src/core
parentdeee496cd30070e52556dcb538c2e5eb39b66b81 (diff)
add peekPixels to SkCanvas and SkSurface
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkBitmapDevice.cpp14
-rw-r--r--src/core/SkCanvas.cpp49
-rw-r--r--src/core/SkDevice.cpp8
-rw-r--r--src/core/SkPictureRecord.h3
4 files changed, 74 insertions, 0 deletions
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp
index 9dde6e172e..374bef98c1 100644
--- a/src/core/SkBitmapDevice.cpp
+++ b/src/core/SkBitmapDevice.cpp
@@ -54,6 +54,10 @@ SkBitmapDevice::SkBitmapDevice(SkBitmap::Config config, int width, int height, b
SkBitmapDevice::~SkBitmapDevice() {
}
+SkImageInfo SkBitmapDevice::imageInfo() const {
+ return fBitmap.info();
+}
+
void SkBitmapDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) {
SkASSERT(bm.width() == fBitmap.width());
SkASSERT(bm.height() == fBitmap.height());
@@ -386,6 +390,16 @@ SkSurface* SkBitmapDevice::newSurface(const SkImageInfo& info) {
return SkSurface::NewRaster(info);
}
+const void* SkBitmapDevice::peekPixels(SkImageInfo* info, size_t* rowBytes) {
+ if (fBitmap.getPixels() && fBitmap.asImageInfo(info)) {
+ if (rowBytes) {
+ *rowBytes = fBitmap.rowBytes();
+ }
+ return fBitmap.getPixels();
+ }
+ return NULL;
+}
+
///////////////////////////////////////////////////////////////////////////////
bool SkBitmapDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) {
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index ed8274dc5d..f5e91ffc43 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -992,6 +992,55 @@ SkSurface* SkCanvas::onNewSurface(const SkImageInfo& info) {
return dev ? dev->newSurface(info) : NULL;
}
+SkImageInfo SkCanvas::imageInfo() const {
+ SkBaseDevice* dev = this->getDevice();
+ if (dev) {
+ return dev->imageInfo();
+ } else {
+ // TODO: need a real unknown for alphatype it seems.
+ SkAlphaType unknownAlphaType = kIgnore_SkAlphaType;
+ return SkImageInfo::Make(0, 0, kUnknown_SkColorType, unknownAlphaType);
+ }
+}
+
+const void* SkCanvas::peekPixels(SkImageInfo* info, size_t* rowBytes) {
+ return this->onPeekPixels(info, rowBytes);
+}
+
+const void* SkCanvas::onPeekPixels(SkImageInfo* info, size_t* rowBytes) {
+ SkBaseDevice* dev = this->getDevice();
+ return dev ? dev->peekPixels(info, rowBytes) : NULL;
+}
+
+SkAutoROCanvasPixels::SkAutoROCanvasPixels(SkCanvas* canvas) {
+ fAddr = canvas->peekPixels(&fInfo, &fRowBytes);
+ if (NULL == fAddr) {
+ fInfo = canvas->imageInfo();
+ if (kUnknown_SkColorType == fInfo.colorType() ||
+ !fBitmap.allocPixels(fInfo))
+ {
+ return; // failure, fAddr is NULL
+ }
+ fBitmap.lockPixels();
+ if (!canvas->readPixels(&fBitmap, 0, 0)) {
+ return; // failure, fAddr is NULL
+ }
+ fAddr = fBitmap.getPixels();
+ fRowBytes = fBitmap.rowBytes();
+ }
+ SkASSERT(fAddr); // success
+}
+
+bool SkAutoROCanvasPixels::asROBitmap(SkBitmap* bitmap) const {
+ if (fAddr) {
+ return bitmap->installPixels(fInfo, const_cast<void*>(fAddr), fRowBytes,
+ NULL, NULL);
+ } else {
+ bitmap->reset();
+ return false;
+ }
+}
+
/////////////////////////////////////////////////////////////////////////////
void SkCanvas::internalDrawBitmap(const SkBitmap& bitmap,
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 9ce8b6b5df..364b106dd8 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -65,6 +65,12 @@ SkMetaData& SkBaseDevice::getMetaData() {
return *fMetaData;
}
+// TODO: should make this guy pure-virtual.
+SkImageInfo SkBaseDevice::imageInfo() const {
+ return SkImageInfo::Make(this->width(), this->height(),
+ kUnknown_SkColorType, kIgnore_SkAlphaType);
+}
+
const SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) {
const SkBitmap& bitmap = this->onAccessBitmap();
if (changePixels) {
@@ -117,3 +123,5 @@ bool SkBaseDevice::readPixels(SkBitmap* bitmap, int x, int y,
}
SkSurface* SkBaseDevice::newSurface(const SkImageInfo&) { return NULL; }
+
+const void* SkBaseDevice::peekPixels(SkImageInfo*, size_t*) { return NULL; }
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index 0df120b31a..eaa5e73008 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -221,6 +221,9 @@ public:
protected:
virtual SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE;
+ const void* onPeekPixels(SkImageInfo*, size_t*) SK_OVERRIDE {
+ return NULL;
+ }
// Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been
// tweaked by paint.computeFastBounds().