aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-23 16:54:30 +0000
committerGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-23 16:54:30 +0000
commitc1d1f414a08de25d8cbf4ba08fc64d701ffca32e (patch)
tree5eff292ff1b6e4ff29ea60ee71c1c4b470eb8de9 /src/core
parent7d1941a72ecef29ba63d0059b5ebf5f189ac26b6 (diff)
Remove Bitmaps Raw Pixel Support.
bitmap.setPixels(...) now creates a mutable pixelRef instead of just setting fPixels. Review URL: https://codereview.appspot.com/6419044 git-svn-id: http://skia.googlecode.com/svn/trunk@4722 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkBitmap.cpp71
-rw-r--r--src/core/SkMallocPixelRef.cpp9
-rw-r--r--src/core/SkPixelRef.cpp1
3 files changed, 15 insertions, 66 deletions
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 9b616c6a66..2df5e56e5a 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -22,8 +22,6 @@
SK_DEFINE_INST_COUNT(SkBitmap::Allocator)
-extern int32_t SkNextPixelRefGenerationID();
-
static bool isPos32Bits(const Sk64& value) {
return !value.isNeg() && value.is32();
}
@@ -139,7 +137,6 @@ void SkBitmap::swap(SkBitmap& other) {
SkTSwap(fPixelLockCount, other.fPixelLockCount);
SkTSwap(fMipMap, other.fMipMap);
SkTSwap(fPixels, other.fPixels);
- SkTSwap(fRawPixelGenerationID, other.fRawPixelGenerationID);
SkTSwap(fRowBytes, other.fRowBytes);
SkTSwap(fWidth, other.fWidth);
SkTSwap(fHeight, other.fHeight);
@@ -359,18 +356,16 @@ void SkBitmap::unlockPixels() const {
}
bool SkBitmap::lockPixelsAreWritable() const {
- if (fPixelRef) {
- return fPixelRef->lockPixelsAreWritable();
- } else {
- return fPixels != NULL;
- }
+ return (fPixelRef) ? fPixelRef->lockPixelsAreWritable() : false;
}
void SkBitmap::setPixels(void* p, SkColorTable* ctable) {
- this->freePixels();
- fPixels = p;
- SkRefCnt_SafeAssign(fColorTable, ctable);
+ Sk64 size = this->getSize64();
+ SkASSERT(!size.isNeg() && size.is32());
+ this->setPixelRef(new SkMallocPixelRef(p, size.get32(), ctable, false))->unref();
+ // since we're already allocated, we lockPixels right away
+ this->lockPixels();
SkDEBUGCODE(this->validate();)
}
@@ -412,23 +407,13 @@ void SkBitmap::freeMipMap() {
}
uint32_t SkBitmap::getGenerationID() const {
- if (fPixelRef) {
- return fPixelRef->getGenerationID();
- } else {
- SkASSERT(fPixels || !fRawPixelGenerationID);
- if (fPixels && !fRawPixelGenerationID) {
- fRawPixelGenerationID = SkNextPixelRefGenerationID();
- }
- return fRawPixelGenerationID;
- }
+ return (fPixelRef) ? fPixelRef->getGenerationID() : 0;
}
void SkBitmap::notifyPixelsChanged() const {
SkASSERT(!this->isImmutable());
if (fPixelRef) {
fPixelRef->notifyPixelsChanged();
- } else {
- fRawPixelGenerationID = 0; // will grab next ID in getGenerationID
}
}
@@ -791,7 +776,7 @@ static size_t getSubOffset(const SkBitmap& bm, int x, int y) {
bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const {
SkDEBUGCODE(this->validate();)
- if (NULL == result || (NULL == fPixelRef && NULL == fPixels)) {
+ if (NULL == result || NULL == fPixelRef) {
return false; // no src pixels
}
@@ -841,9 +826,6 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const {
if (fPixelRef) {
// share the pixelref with a custom offset
dst.setPixelRef(fPixelRef, fPixelRefOffset + offset);
- } else {
- // share the pixels (owned by the caller)
- dst.setPixels((char*)fPixels + offset, this->getColorTable());
}
SkDEBUGCODE(dst.validate();)
@@ -1374,8 +1356,6 @@ bool SkBitmap::extractAlpha(SkBitmap* dst, const SkPaint* paint,
enum {
SERIALIZE_PIXELTYPE_NONE,
- SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE,
- SERIALIZE_PIXELTYPE_RAW_NO_CTABLE,
SERIALIZE_PIXELTYPE_REF_DATA,
SERIALIZE_PIXELTYPE_REF_PTR
};
@@ -1427,21 +1407,6 @@ void SkBitmap::flatten(SkFlattenableWriteBuffer& buffer) const {
}
// if we get here, we can't record the pixels
buffer.write8(SERIALIZE_PIXELTYPE_NONE);
- } else if (fPixels) {
- if (fColorTable) {
- buffer.write8(SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE);
- buffer.writeFlattenable(fColorTable);
- } else {
- buffer.write8(SERIALIZE_PIXELTYPE_RAW_NO_CTABLE);
- }
- buffer.writePad(fPixels, this->getSafeSize());
- // There is no writeZeroPad() fcn, so write individual bytes.
- if (this->getSize() > this->getSafeSize()) {
- size_t deltaSize = this->getSize() - this->getSafeSize();
- // Need aligned pointer to write into due to internal implementa-
- // tion of SkWriter32.
- memset(buffer.reserve(SkAlign4(deltaSize)), 0, deltaSize);
- }
} else {
buffer.write8(SERIALIZE_PIXELTYPE_NONE);
}
@@ -1472,26 +1437,6 @@ void SkBitmap::unflatten(SkFlattenableReadBuffer& buffer) {
SkSafeUnref(this->setPixelRef(pr, offset));
break;
}
- case SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE:
- case SERIALIZE_PIXELTYPE_RAW_NO_CTABLE: {
- SkColorTable* ctable = NULL;
- if (SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE == reftype) {
- ctable = static_cast<SkColorTable*>(buffer.readFlattenable());
- }
- size_t size = this->getSize();
- if (this->allocPixels(ctable)) {
- this->lockPixels();
- // Just read what we need.
- buffer.read(this->getPixels(), this->getSafeSize());
- // Keep aligned for subsequent reads.
- buffer.skip(size - this->getSafeSize());
- this->unlockPixels();
- } else {
- buffer.skip(size); // Still skip the full-sized buffer though.
- }
- SkSafeUnref(ctable);
- break;
- }
case SERIALIZE_PIXELTYPE_NONE:
break;
default:
diff --git a/src/core/SkMallocPixelRef.cpp b/src/core/SkMallocPixelRef.cpp
index 4bcf1bd16d..f0bc0578d6 100644
--- a/src/core/SkMallocPixelRef.cpp
+++ b/src/core/SkMallocPixelRef.cpp
@@ -10,21 +10,25 @@
#include "SkFlattenable.h"
SkMallocPixelRef::SkMallocPixelRef(void* storage, size_t size,
- SkColorTable* ctable) {
+ SkColorTable* ctable, bool ownPixels) {
if (NULL == storage) {
+ SkASSERT(ownPixels);
storage = sk_malloc_throw(size);
}
fStorage = storage;
fSize = size;
fCTable = ctable;
SkSafeRef(ctable);
+ fOwnPixels = ownPixels;
this->setPreLocked(fStorage, fCTable);
}
SkMallocPixelRef::~SkMallocPixelRef() {
SkSafeUnref(fCTable);
- sk_free(fStorage);
+ if (fOwnPixels) {
+ sk_free(fStorage);
+ }
}
void* SkMallocPixelRef::onLockPixels(SkColorTable** ct) {
@@ -59,6 +63,7 @@ SkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer)
} else {
fCTable = NULL;
}
+ fOwnPixels = true;
this->setPreLocked(fStorage, fCTable);
}
diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp
index 96c991c0a7..a5ae6df1bd 100644
--- a/src/core/SkPixelRef.cpp
+++ b/src/core/SkPixelRef.cpp
@@ -34,7 +34,6 @@ static SkBaseMutex* get_default_mutex() {
///////////////////////////////////////////////////////////////////////////////
-extern int32_t SkNextPixelRefGenerationID();
int32_t SkNextPixelRefGenerationID() {
static int32_t gPixelRefGenerationID;
// do a loop in case our global wraps around, as we never want to