add rowbytes option to allocPixels

TBR=

Author: reed@google.com

Review URL: https://codereview.chromium.org/345263005
This commit is contained in:
reed 2014-06-28 14:26:35 -07:00 коммит произвёл Commit bot
Родитель ce41ad1b33
Коммит bae704b050
5 изменённых файлов: 47 добавлений и 9 удалений

Просмотреть файл

@ -107,12 +107,10 @@ protected:
SkBitmap bm; SkBitmap bm;
if (kIndex_8_SkColorType == fColorType) { if (kIndex_8_SkColorType == fColorType) {
bm.setInfo(SkImageInfo::MakeN32(W, H, fAlphaType)); bm.allocPixels(SkImageInfo::MakeN32(W, H, fAlphaType));
} else { } else {
bm.setInfo(SkImageInfo::Make(W, H, fColorType, fAlphaType)); bm.allocPixels(SkImageInfo::Make(W, H, fColorType, fAlphaType));
} }
bm.allocPixels();
bm.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorBLACK : 0); bm.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorBLACK : 0);
onDrawIntoBitmap(bm); onDrawIntoBitmap(bm);

Просмотреть файл

@ -290,13 +290,23 @@ public:
#endif #endif
/** /**
* Allocate a pixelref to match the specified image info. If the Factory * Allocate the bitmap's pixels to match the requested image info. If the Factory
* is non-null, call it to allcoate the pixelref. If the ImageInfo requires * is non-null, call it to allcoate the pixelref. If the ImageInfo requires
* a colortable, then ColorTable must be non-null, and will be ref'd. * a colortable, then ColorTable must be non-null, and will be ref'd.
* On failure, the bitmap will be set to empty and return false. * On failure, the bitmap will be set to empty and return false.
*/ */
bool allocPixels(const SkImageInfo&, SkPixelRefFactory*, SkColorTable*); bool allocPixels(const SkImageInfo&, SkPixelRefFactory*, SkColorTable*);
/**
* Allocate the bitmap's pixels to match the requested image info and
* rowBytes. If the request cannot be met (e.g. the info is invalid or
* the requested rowBytes are not compatible with the info
* (e.g. rowBytes < info.minRowBytes() or rowBytes is not aligned with
* the pixel size specified by info.colorType()) then false is returned
* and the bitmap is set to empty.
*/
bool allocPixels(const SkImageInfo& info, size_t rowBytes);
/** /**
* Allocate a pixelref to match the specified image info, using the default * Allocate a pixelref to match the specified image info, using the default
* allocator. * allocator.
@ -304,7 +314,7 @@ public:
* On failure, the bitmap will be set to empty and return false. * On failure, the bitmap will be set to empty and return false.
*/ */
bool allocPixels(const SkImageInfo& info) { bool allocPixels(const SkImageInfo& info) {
return this->allocPixels(info, NULL, NULL); return this->allocPixels(info, info.minRowBytes());
} }
bool allocN32Pixels(int width, int height, bool isOpaque = false) { bool allocN32Pixels(int width, int height, bool isOpaque = false) {

Просмотреть файл

@ -89,8 +89,8 @@ void SkDrawBitmap::onEndElement(SkAnimateMaker&) {
SkASSERT(height != -1); SkASSERT(height != -1);
SkASSERT(rowBytes >= 0); SkASSERT(rowBytes >= 0);
SkColorType colorType = SkColorType(format); SkColorType colorType = SkColorType(format);
fBitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType), rowBytes); fBitmap.allocPixels(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType),
fBitmap.allocPixels(); rowBytes);
if (fColorSet) if (fColorSet)
fBitmap.eraseColor(fColor); fBitmap.eraseColor(fColor);
} }

Просмотреть файл

@ -366,6 +366,36 @@ bool SkBitmap::allocPixels(Allocator* allocator, SkColorTable* ctable) {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
bool SkBitmap::allocPixels(const SkImageInfo& requestedInfo, size_t rowBytes) {
if (kIndex_8_SkColorType == requestedInfo.colorType()) {
return reset_return_false(this);
}
if (!this->setInfo(requestedInfo)) {
return reset_return_false(this);
}
// setInfo may have corrected info (e.g. 565 is always opaque).
const SkImageInfo& correctedInfo = this->info();
if (!correctedInfo.validRowBytes(rowBytes)) {
return reset_return_false(this);
}
SkMallocPixelRef::PRFactory defaultFactory;
SkPixelRef* pr = defaultFactory.create(correctedInfo, NULL);
if (NULL == pr) {
return reset_return_false(this);
}
this->setPixelRef(pr)->unref();
// TODO: lockPixels could/should return bool or void*/NULL
this->lockPixels();
if (NULL == this->getPixels()) {
return reset_return_false(this);
}
return true;
}
bool SkBitmap::allocPixels(const SkImageInfo& requestedInfo, SkPixelRefFactory* factory, bool SkBitmap::allocPixels(const SkImageInfo& requestedInfo, SkPixelRefFactory* factory,
SkColorTable* ctable) { SkColorTable* ctable) {
if (kIndex_8_SkColorType == requestedInfo.fColorType && NULL == ctable) { if (kIndex_8_SkColorType == requestedInfo.fColorType && NULL == ctable) {

Просмотреть файл

@ -54,7 +54,7 @@ bool SkCachingPixelRef::onNewLockPixels(LockRec* rec) {
&bitmap); &bitmap);
if (NULL == fScaledCacheId) { if (NULL == fScaledCacheId) {
// Cache has been purged, must re-decode. // Cache has been purged, must re-decode.
if ((!bitmap.setInfo(info, fRowBytes)) || !bitmap.allocPixels()) { if (!bitmap.allocPixels(info, fRowBytes)) {
fErrorInDecoding = true; fErrorInDecoding = true;
return false; return false;
} }