Index: src/core/SkPixmap.cpp |
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp |
index 3a0fad2a3936763cbd24f01da041d8be04bb2b55..9b7f993792dca69adf90a52fd716819198e3fea7 100644 |
--- a/src/core/SkPixmap.cpp |
+++ b/src/core/SkPixmap.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "SkConfig8888.h" |
+#include "SkMask.h" |
#include "SkPixmap.h" |
void SkAutoPixmapUnlock::reset(const SkPixmap& pm, void (*unlock)(void*), void* ctx) { |
@@ -37,6 +38,37 @@ void SkPixmap::reset(const SkImageInfo& info, const void* addr, size_t rowBytes, |
fInfo = info; |
} |
+bool SkPixmap::reset(const SkMask& src) { |
+ if (SkMask::kA8_Format == src.fFormat) { |
+ this->reset(SkImageInfo::MakeA8(src.fBounds.width(), src.fBounds.height()), |
+ src.fImage, src.fRowBytes, NULL); |
+ return true; |
+ } |
+ this->reset(); |
+ return false; |
+} |
+ |
+bool SkPixmap::extractSubset(SkPixmap* result, const SkIRect& subset) const { |
+ SkIRect srcRect, r; |
+ srcRect.set(0, 0, this->width(), this->height()); |
+ if (!r.intersect(srcRect, subset)) { |
+ return false; // r is empty (i.e. no intersection) |
+ } |
+ |
+ // If the upper left of the rectangle was outside the bounds of this SkBitmap, we should have |
+ // exited above. |
+ SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width())); |
+ SkASSERT(static_cast<unsigned>(r.fTop) < static_cast<unsigned>(this->height())); |
+ |
+ const void* pixels = NULL; |
+ if (fPixels) { |
+ const size_t bpp = fInfo.bytesPerPixel(); |
+ pixels = (const uint8_t*)fPixels + r.fTop * fRowBytes + r.fLeft * bpp; |
+ } |
+ result->reset(fInfo.makeWH(r.width(), r.height()), pixels, fRowBytes, fCTable); |
+ return true; |
+} |
+ |
bool SkPixmap::readPixels(const SkImageInfo& requestedDstInfo, void* dstPixels, size_t dstRB, |
int x, int y) const { |
if (kUnknown_SkColorType == requestedDstInfo.colorType()) { |
@@ -72,3 +104,36 @@ bool SkPixmap::readPixels(const SkImageInfo& requestedDstInfo, void* dstPixels, |
return SkPixelInfo::CopyPixels(dstInfo, dstPixels, dstRB, |
srcInfo, srcPixels, this->rowBytes(), this->ctable()); |
} |
+ |
+////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(NULL) {} |
+ |
+SkAutoPixmapStorage::~SkAutoPixmapStorage() { |
+ sk_free(fStorage); |
+} |
+ |
+bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) { |
+ if (fStorage) { |
+ sk_free(fStorage); |
+ fStorage = NULL; |
+ } |
+ |
+ size_t rb = info.minRowBytes(); |
+ size_t size = info.getSafeSize(rb); |
+ if (0 == size) { |
+ return false; |
+ } |
+ fStorage = sk_malloc_flags(size, 0); |
+ if (NULL == fStorage) { |
+ return false; |
+ } |
+ this->reset(info, fStorage, rb); |
+ return true; |
+} |
+ |
+void SkAutoPixmapStorage::alloc(const SkImageInfo& info) { |
+ if (!this->tryAlloc(info)) { |
+ sk_throw(); |
+ } |
+} |