Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: src/images/SkImageDecoder.cpp

Issue 14567011: Test region decoding in skimage, plus fixes. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Small comment fix. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/images/SkImageDecoder.h ('k') | src/images/SkImageDecoder_libjpeg.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/images/SkImageDecoder.cpp
diff --git a/src/images/SkImageDecoder.cpp b/src/images/SkImageDecoder.cpp
index de0bc14c90e40cd54b49a1985fe535a5c86b0a7b..9ffae5f0e7f9bdac29d642641cc823ef2d806dcf 100644
--- a/src/images/SkImageDecoder.cpp
+++ b/src/images/SkImageDecoder.cpp
@@ -33,9 +33,14 @@ void SkImageDecoder::SetDeviceConfig(SkBitmap::Config config)
///////////////////////////////////////////////////////////////////////////////
SkImageDecoder::SkImageDecoder()
- : fPeeker(NULL), fChooser(NULL), fAllocator(NULL), fSampleSize(1),
- fDefaultPref(SkBitmap::kNo_Config), fDitherImage(true),
- fUsePrefTable(false),fPreferQualityOverSpeed(false) {
+ : fPeeker(NULL)
+ , fChooser(NULL)
+ , fAllocator(NULL)
+ , fSampleSize(1)
+ , fDefaultPref(SkBitmap::kNo_Config)
+ , fDitherImage(true)
+ , fUsePrefTable(false)
+ , fPreferQualityOverSpeed(false) {
}
SkImageDecoder::~SkImageDecoder() {
@@ -177,14 +182,14 @@ bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm,
return true;
}
-bool SkImageDecoder::decodeRegion(SkBitmap* bm, const SkIRect& rect,
+bool SkImageDecoder::decodeSubset(SkBitmap* bm, const SkIRect& rect,
SkBitmap::Config pref) {
- // we reset this to false before calling onDecodeRegion
+ // we reset this to false before calling onDecodeSubset
fShouldCancelDecode = false;
// assign this, for use by getPrefConfig(), in case fUsePrefTable is false
fDefaultPref = pref;
- return this->onDecodeRegion(bm, rect);
+ return this->onDecodeSubset(bm, rect);
}
bool SkImageDecoder::buildTileIndex(SkStream* stream,
@@ -195,11 +200,25 @@ bool SkImageDecoder::buildTileIndex(SkStream* stream,
return this->onBuildTileIndex(stream, width, height);
}
-void SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
- int dstX, int dstY, int width, int height,
- int srcX, int srcY) {
+bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
+ int dstX, int dstY, int width, int height,
+ int srcX, int srcY) {
int w = width / sampleSize;
int h = height / sampleSize;
+ if (src->getConfig() == SkBitmap::kIndex8_Config) {
+ // kIndex8 does not allow drawing via an SkCanvas, as is done below.
+ // Instead, use extractSubset. Note that this shares the SkPixelRef and
+ // SkColorTable.
+ // FIXME: Since src is discarded in practice, this holds on to more
+ // pixels than is strictly necessary. Switch to a copy if memory
+ // savings are more important than speed here. This also means
+ // that the pixels in dst can not be reused (though there is no
+ // allocation, which was already done on src).
+ int x = (dstX - srcX) / sampleSize;
+ int y = (dstY - srcY) / sampleSize;
+ SkIRect subset = SkIRect::MakeXYWH(x, y, w, h);
+ return src->extractSubset(dst, subset);
+ }
// if the destination has no pixels then we must allocate them.
if (dst->isNull()) {
dst->setConfig(src->getConfig(), w, h);
@@ -207,13 +226,15 @@ void SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
if (!this->allocPixelRef(dst, NULL)) {
SkDEBUGF(("failed to allocate pixels needed to crop the bitmap"));
- return;
+ return false;
}
}
// check to see if the destination is large enough to decode the desired
// region. If this assert fails we will just draw as much of the source
// into the destination that we can.
- SkASSERT(dst->width() >= w && dst->height() >= h);
+ if (dst->width() < w || dst->height() < h) {
+ SkDEBUGF(("SkImageDecoder::cropBitmap does not have a large enough bitmap.\n"));
+ }
// Set the Src_Mode for the paint to prevent transparency issue in the
// dest in the event that the dest was being re-used.
@@ -224,6 +245,7 @@ void SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
canvas.drawSprite(*src, (srcX - dstX) / sampleSize,
(srcY - dstY) / sampleSize,
&paint);
+ return true;
}
///////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « include/images/SkImageDecoder.h ('k') | src/images/SkImageDecoder_libjpeg.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698