aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2015-11-11 13:30:43 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-11 13:30:43 -0800
commitcb8d719d7a991ceb93ccc7dd1542bb0cd82437d6 (patch)
treec9890e4e7581645c77343c4087ddb426c39580c6 /tools
parentcaef3450488f98aa0bc429c4e2d8e29d6a7fece4 (diff)
Make BRD take advantage of zero initialized memory
This is the third step in a three part change: (1) Skia: Add SkBRDAllocator. (2) Android: Make JavaPixelAllocator and RecyclingClippingPixelAllocator implement SkBRDAllocator. (3) Skia: Change SkBitmapRegionDecoder to use SkBRDAllocator and take advantage of zero allocated memory when possible. BUG=skia: Review URL: https://codereview.chromium.org/1420053010
Diffstat (limited to 'tools')
-rw-r--r--tools/android/SkBitmapRegionCanvas.cpp11
-rw-r--r--tools/android/SkBitmapRegionCanvas.h2
-rw-r--r--tools/android/SkBitmapRegionCodec.cpp11
-rw-r--r--tools/android/SkBitmapRegionCodec.h2
-rw-r--r--tools/android/SkBitmapRegionDecoder.h3
5 files changed, 16 insertions, 13 deletions
diff --git a/tools/android/SkBitmapRegionCanvas.cpp b/tools/android/SkBitmapRegionCanvas.cpp
index ffcab9596a..bac5dc1ffc 100644
--- a/tools/android/SkBitmapRegionCanvas.cpp
+++ b/tools/android/SkBitmapRegionCanvas.cpp
@@ -15,7 +15,7 @@ SkBitmapRegionCanvas::SkBitmapRegionCanvas(SkCodec* decoder)
, fDecoder(decoder)
{}
-bool SkBitmapRegionCanvas::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator,
+bool SkBitmapRegionCanvas::decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
const SkIRect& desiredSubset, int sampleSize, SkColorType dstColorType,
bool requireUnpremul) {
// Reject color types not supported by this method
@@ -102,11 +102,12 @@ bool SkBitmapRegionCanvas::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* a
// TODO (msarett): Can we make this faster by implementing it to only
// zero parts of the image that we won't overwrite with
// pixels?
- // TODO (msarett): This could be skipped if memory is zero initialized.
- // This would matter if this code is moved to Android and
- // uses Android bitmaps.
if (SubsetType::kPartiallyInside_SubsetType == type) {
- bitmap->eraseColor(0);
+ SkCodec::ZeroInitialized zeroInit = allocator ? allocator->zeroInit() :
+ SkCodec::kNo_ZeroInitialized;
+ if (SkCodec::kNo_ZeroInitialized == zeroInit) {
+ bitmap->eraseColor(0);
+ }
}
// Use a canvas to crop and scale to the destination bitmap
diff --git a/tools/android/SkBitmapRegionCanvas.h b/tools/android/SkBitmapRegionCanvas.h
index f41d5b9484..2edbf1ff3b 100644
--- a/tools/android/SkBitmapRegionCanvas.h
+++ b/tools/android/SkBitmapRegionCanvas.h
@@ -24,7 +24,7 @@ public:
*/
SkBitmapRegionCanvas(SkCodec* decoder);
- bool decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator,
+ bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
const SkIRect& desiredSubset, int sampleSize,
SkColorType colorType, bool requireUnpremul) override;
diff --git a/tools/android/SkBitmapRegionCodec.cpp b/tools/android/SkBitmapRegionCodec.cpp
index 93ece4a59f..7c3c2471b0 100644
--- a/tools/android/SkBitmapRegionCodec.cpp
+++ b/tools/android/SkBitmapRegionCodec.cpp
@@ -16,7 +16,7 @@ SkBitmapRegionCodec::SkBitmapRegionCodec(SkAndroidCodec* codec)
, fCodec(codec)
{}
-bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator,
+bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
const SkIRect& desiredSubset, int sampleSize, SkColorType dstColorType,
bool requireUnpremul) {
@@ -104,10 +104,10 @@ bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* al
// TODO (msarett): Can we make this faster by implementing it to only
// zero parts of the image that we won't overwrite with
// pixels?
- // TODO (msarett): This could be skipped if memory is zero initialized.
- // This would matter if this code is moved to Android and
- // uses Android bitmaps.
- if (SubsetType::kPartiallyInside_SubsetType == type) {
+ SkCodec::ZeroInitialized zeroInit = allocator ? allocator->zeroInit() :
+ SkCodec::kNo_ZeroInitialized;
+ if (SubsetType::kPartiallyInside_SubsetType == type &&
+ SkCodec::kNo_ZeroInitialized == zeroInit) {
void* pixels = bitmap->getPixels();
size_t bytes = outInfo.getSafeSize(bitmap->rowBytes());
memset(pixels, 0, bytes);
@@ -119,6 +119,7 @@ bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* al
options.fSubset = &subset;
options.fColorPtr = colorPtr;
options.fColorCount = colorCountPtr;
+ options.fZeroInitialized = zeroInit;
void* dst = bitmap->getAddr(scaledOutX, scaledOutY);
// FIXME: skbug.com/4538
diff --git a/tools/android/SkBitmapRegionCodec.h b/tools/android/SkBitmapRegionCodec.h
index 1739a04378..79774173b0 100644
--- a/tools/android/SkBitmapRegionCodec.h
+++ b/tools/android/SkBitmapRegionCodec.h
@@ -20,7 +20,7 @@ public:
*/
SkBitmapRegionCodec(SkAndroidCodec* codec);
- bool decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator,
+ bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
const SkIRect& desiredSubset, int sampleSize,
SkColorType colorType, bool requireUnpremul) override;
diff --git a/tools/android/SkBitmapRegionDecoder.h b/tools/android/SkBitmapRegionDecoder.h
index 294adc3df1..575ad9dc01 100644
--- a/tools/android/SkBitmapRegionDecoder.h
+++ b/tools/android/SkBitmapRegionDecoder.h
@@ -9,6 +9,7 @@
#define SkBitmapRegionDecoder_DEFINED
#include "SkBitmap.h"
+#include "SkBRDAllocator.h"
#include "SkEncodedFormat.h"
#include "SkStream.h"
@@ -58,7 +59,7 @@ public:
* alpha type to use.
*
*/
- virtual bool decodeRegion(SkBitmap* bitmap, SkBitmap::Allocator* allocator,
+ virtual bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
const SkIRect& desiredSubset, int sampleSize,
SkColorType colorType, bool requireUnpremul) = 0;
/*