aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-27 13:41:44 +0000
committerGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-27 13:41:44 +0000
commitc84b8335ee4fd864c30a4703afc643cf4b5010d9 (patch)
tree8d022e7b505f7fefdcc44eb2ba8274efbb43d307 /src/core
parent7329dc9976e5a61e2382974884d2e075f4f856f1 (diff)
Reapply "Remove Bitmaps Raw Pixel Support."
This CL reapplies r4722. Now that we have addressed the issues in Chrome tests that were causing asserts to be fired. Review URL: https://codereview.appspot.com/6452050 git-svn-id: http://skia.googlecode.com/svn/trunk@4804 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 b1a4b7e374..687cf7a000 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();)
@@ -1376,8 +1358,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
};
@@ -1429,21 +1409,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);
}
@@ -1474,26 +1439,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