зеркало из https://github.com/mozilla/moz-skia.git
add rowbytes option to allocPixels
TBR= Author: reed@google.com Review URL: https://codereview.chromium.org/345263005
This commit is contained in:
Родитель
ce41ad1b33
Коммит
bae704b050
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче