add rowbytes option to allocPixels
TBR= Author: reed@google.com Review URL: https://codereview.chromium.org/345263005
This commit is contained in:
parent
ce41ad1b33
commit
bae704b050
@ -107,12 +107,10 @@ protected:
|
||||
SkBitmap bm;
|
||||
|
||||
if (kIndex_8_SkColorType == fColorType) {
|
||||
bm.setInfo(SkImageInfo::MakeN32(W, H, fAlphaType));
|
||||
bm.allocPixels(SkImageInfo::MakeN32(W, H, fAlphaType));
|
||||
} 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);
|
||||
|
||||
onDrawIntoBitmap(bm);
|
||||
|
@ -290,13 +290,23 @@ public:
|
||||
#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
|
||||
* 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.
|
||||
*/
|
||||
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
|
||||
* allocator.
|
||||
@ -304,7 +314,7 @@ public:
|
||||
* On failure, the bitmap will be set to empty and return false.
|
||||
*/
|
||||
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) {
|
||||
|
@ -89,8 +89,8 @@ void SkDrawBitmap::onEndElement(SkAnimateMaker&) {
|
||||
SkASSERT(height != -1);
|
||||
SkASSERT(rowBytes >= 0);
|
||||
SkColorType colorType = SkColorType(format);
|
||||
fBitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType), rowBytes);
|
||||
fBitmap.allocPixels();
|
||||
fBitmap.allocPixels(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType),
|
||||
rowBytes);
|
||||
if (fColorSet)
|
||||
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,
|
||||
SkColorTable* ctable) {
|
||||
if (kIndex_8_SkColorType == requestedInfo.fColorType && NULL == ctable) {
|
||||
|
@ -54,7 +54,7 @@ bool SkCachingPixelRef::onNewLockPixels(LockRec* rec) {
|
||||
&bitmap);
|
||||
if (NULL == fScaledCacheId) {
|
||||
// Cache has been purged, must re-decode.
|
||||
if ((!bitmap.setInfo(info, fRowBytes)) || !bitmap.allocPixels()) {
|
||||
if (!bitmap.allocPixels(info, fRowBytes)) {
|
||||
fErrorInDecoding = true;
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user