From 506e19a4c8395178e8da81576b3c37616593e560 Mon Sep 17 00:00:00 2001 From: msarett Date: Fri, 13 Nov 2015 06:11:09 -0800 Subject: Move SkBitmapRegionDecoder to include/android and src/android This will expose the BitmapRegionDecoder API as a public include and move the implementation to src. This makes this code more naturally exposed in Android and easier to test in DM and nanobench. BUG=skia: Review URL: https://codereview.chromium.org/1438873002 --- include/android/SkBRDAllocator.h | 29 +++++++++++ include/android/SkBitmapRegionDecoder.h | 90 +++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 include/android/SkBRDAllocator.h create mode 100644 include/android/SkBitmapRegionDecoder.h (limited to 'include/android') diff --git a/include/android/SkBRDAllocator.h b/include/android/SkBRDAllocator.h new file mode 100644 index 0000000000..3ca30c9b41 --- /dev/null +++ b/include/android/SkBRDAllocator.h @@ -0,0 +1,29 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBRDAllocator_DEFINED +#define SkBRDAllocator_DEFINED + +#include "SkBitmap.h" +#include "SkCodec.h" + +/** + * Abstract subclass of SkBitmap's allocator. + * Allows the allocator to indicate if the memory it allocates + * is zero initialized. + */ +class SkBRDAllocator : public SkBitmap::Allocator { +public: + + /** + * Indicates if the memory allocated by this allocator is + * zero initialized. + */ + virtual SkCodec::ZeroInitialized zeroInit() const = 0; +}; + +#endif // SkBRDAllocator_DEFINED diff --git a/include/android/SkBitmapRegionDecoder.h b/include/android/SkBitmapRegionDecoder.h new file mode 100644 index 0000000000..575ad9dc01 --- /dev/null +++ b/include/android/SkBitmapRegionDecoder.h @@ -0,0 +1,90 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBitmapRegionDecoder_DEFINED +#define SkBitmapRegionDecoder_DEFINED + +#include "SkBitmap.h" +#include "SkBRDAllocator.h" +#include "SkEncodedFormat.h" +#include "SkStream.h" + +/* + * This class aims to provide an interface to test multiple implementations of + * SkBitmapRegionDecoder. + */ +class SkBitmapRegionDecoder { +public: + + enum Strategy { + kCanvas_Strategy, // Draw to the canvas, uses SkCodec + kAndroidCodec_Strategy, // Uses SkAndroidCodec for scaling and subsetting + }; + + /* + * @param data Refs the data while this object exists, unrefs on destruction + * @param strategy Strategy used for scaling and subsetting + * @return Tries to create an SkBitmapRegionDecoder, returns NULL on failure + */ + static SkBitmapRegionDecoder* Create( + SkData* data, Strategy strategy); + + /* + * @param stream Takes ownership of the stream + * @param strategy Strategy used for scaling and subsetting + * @return Tries to create an SkBitmapRegionDecoder, returns NULL on failure + */ + static SkBitmapRegionDecoder* Create( + SkStreamRewindable* stream, Strategy strategy); + + /* + * Decode a scaled region of the encoded image stream + * + * @param bitmap Container for decoded pixels. It is assumed that the pixels + * are initially unallocated and will be allocated by this function. + * @param allocator Allocator for the pixels. If this is NULL, the default + * allocator (HeapAllocator) will be used. + * @param desiredSubset Subset of the original image to decode. + * @param sampleSize An integer downscaling factor for the decode. + * @param colorType Preferred output colorType. + * New implementations should return NULL if they do not support + * decoding to this color type. + * The old kOriginal_Strategy will decode to a default color type + * if this color type is unsupported. + * @param requireUnpremul If the image is not opaque, we will use this to determine the + * alpha type to use. + * + */ + virtual bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator, + const SkIRect& desiredSubset, int sampleSize, + SkColorType colorType, bool requireUnpremul) = 0; + /* + * @param Requested destination color type + * @return true if we support the requested color type and false otherwise + */ + virtual bool conversionSupported(SkColorType colorType) = 0; + + virtual SkEncodedFormat getEncodedFormat() = 0; + + int width() const { return fWidth; } + int height() const { return fHeight; } + + virtual ~SkBitmapRegionDecoder() {} + +protected: + + SkBitmapRegionDecoder(int width, int height) + : fWidth(width) + , fHeight(height) + {} + +private: + const int fWidth; + const int fHeight; +}; + +#endif -- cgit v1.2.3