Index: tools/SkBitmapRegionCodec.cpp |
diff --git a/tools/SkBitmapRegionCodec.cpp b/tools/SkBitmapRegionCodec.cpp |
index 3f2cd24b78fdb44133e634ae68bc096386c00024..cac99452e0d37bcffdf762063bf9e17c7c0515c5 100644 |
--- a/tools/SkBitmapRegionCodec.cpp |
+++ b/tools/SkBitmapRegionCodec.cpp |
@@ -15,15 +15,9 @@ SkBitmapRegionCodec::SkBitmapRegionCodec(SkAndroidCodec* codec) |
, fCodec(codec) |
{} |
-/* |
- * Three differences from the Android version: |
- * Returns a skia bitmap instead of an Android bitmap. |
- * Android version attempts to reuse a recycled bitmap. |
- * Removed the options object and used parameters for color type and sample size. |
- */ |
-// FIXME: Should this function should take in SkIRect? |
-SkBitmap* SkBitmapRegionCodec::decodeRegion(int inputX, int inputY, int inputWidth, int inputHeight, |
- int sampleSize, SkColorType dstColorType) { |
+bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator, |
+ const SkIRect& desiredSubset, int sampleSize, SkColorType dstColorType, |
+ bool requireUnpremul) { |
// Fix the input sampleSize if necessary. |
if (sampleSize < 1) { |
@@ -41,23 +35,23 @@ SkBitmap* SkBitmapRegionCodec::decodeRegion(int inputX, int inputY, int inputWid |
// If outY is non-zero, subsetY must be zero. |
int outX; |
int outY; |
- SkIRect subset = SkIRect::MakeXYWH(inputX, inputY, inputWidth, inputHeight); |
+ SkIRect subset = desiredSubset; |
SubsetType type = adjust_subset_rect(fCodec->getInfo().dimensions(), &subset, &outX, &outY); |
if (SubsetType::kOutside_SubsetType == type) { |
- return nullptr; |
+ return false; |
} |
// Ask the codec for a scaled subset |
if (!fCodec->getSupportedSubset(&subset)) { |
SkCodecPrintf("Error: Could not get subset.\n"); |
- return nullptr; |
+ return false; |
} |
SkISize scaledSize = fCodec->getSampledSubsetDimensions(sampleSize, subset); |
// Create the image info for the decode |
SkAlphaType dstAlphaType = fCodec->getInfo().alphaType(); |
- if (kUnpremul_SkAlphaType == dstAlphaType) { |
- dstAlphaType = kPremul_SkAlphaType; |
+ if (kOpaque_SkAlphaType != dstAlphaType) { |
+ dstAlphaType = requireUnpremul ? kUnpremul_SkAlphaType : kPremul_SkAlphaType; |
} |
SkImageInfo decodeInfo = SkImageInfo::Make(scaledSize.width(), scaledSize.height(), |
dstColorType, dstAlphaType); |
@@ -83,7 +77,6 @@ SkBitmap* SkBitmapRegionCodec::decodeRegion(int inputX, int inputY, int inputWid |
} |
// Initialize the destination bitmap |
- SkAutoTDelete<SkBitmap> bitmap(new SkBitmap()); |
int scaledOutX = 0; |
int scaledOutY = 0; |
int scaledOutWidth = scaledSize.width(); |
@@ -92,17 +85,18 @@ SkBitmap* SkBitmapRegionCodec::decodeRegion(int inputX, int inputY, int inputWid |
scaledOutX = outX / sampleSize; |
scaledOutY = outY / sampleSize; |
// We need to be safe here because getSupportedSubset() may have modified the subset. |
- const int extraX = SkTMax(0, inputWidth - outX - subset.width()); |
- const int extraY = SkTMax(0, inputHeight - outY - subset.height()); |
+ const int extraX = SkTMax(0, desiredSubset.width() - outX - subset.width()); |
+ const int extraY = SkTMax(0, desiredSubset.height() - outY - subset.height()); |
const int scaledExtraX = extraX / sampleSize; |
const int scaledExtraY = extraY / sampleSize; |
scaledOutWidth += scaledOutX + scaledExtraX; |
scaledOutHeight += scaledOutY + scaledExtraY; |
} |
SkImageInfo outInfo = decodeInfo.makeWH(scaledOutWidth, scaledOutHeight); |
- if (!bitmap->tryAllocPixels(outInfo, nullptr, colorTable.get())) { |
+ bitmap->setInfo(outInfo, outInfo.minRowBytes()); |
+ if (!bitmap->tryAllocPixels(allocator, colorTable.get())) { |
SkCodecPrintf("Error: Could not allocate pixels.\n"); |
- return nullptr; |
+ return false; |
} |
// Zero the bitmap if the region is not completely within the image. |
@@ -129,10 +123,10 @@ SkBitmap* SkBitmapRegionCodec::decodeRegion(int inputX, int inputY, int inputWid |
SkCodec::Result result = fCodec->getAndroidPixels(decodeInfo, dst, rowBytes, &options); |
if (SkCodec::kSuccess != result && SkCodec::kIncompleteInput != result) { |
SkCodecPrintf("Error: Could not get pixels.\n"); |
- return nullptr; |
+ return false; |
} |
- return bitmap.detach(); |
+ return true; |
} |
bool SkBitmapRegionCodec::conversionSupported(SkColorType colorType) { |