skia2/tools/SkBitmapRegionDecoderInterface.h
msarett 04965c6f11 SkBitmapRegionDecoder clean-up
Use SkCodecPrintf instead of SkDebugf.

Check if the conversion is possible rather than starting many decodes
that will certainly fail.

Small refactor to code that deals with subsets that fall outside
of the image.

BUG=skia:

Review URL: https://codereview.chromium.org/1395383002
2015-10-12 10:24:38 -07:00

83 lines
2.9 KiB
C++

/*
* 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 "SkStream.h"
/*
* This class aims to provide an interface to test multiple implementations of
* SkBitmapRegionDecoder.
*/
class SkBitmapRegionDecoderInterface {
public:
enum Strategy {
kCanvas_Strategy, // Draw to the canvas, uses SkCodec
kOriginal_Strategy, // Sampling, uses SkImageDecoder
// TODO (msarett): Add strategy for SkScaledCodec
};
/*
* @param stream Encoded image stream, takes ownership
* @param strategy Strategy used for scaling and subsetting
* @return Tries to create an SkBitmapRegionDecoder, returns NULL
* on failure
*/
static SkBitmapRegionDecoderInterface* CreateBitmapRegionDecoder(
SkStreamRewindable* stream, Strategy strategy);
/*
* Decode a scaled region of the encoded image stream
*
* @param start_x X-coordinate of upper-left corner of region.
* This coordinate is unscaled, relative to the original dimensions.
* @param start_y Y-coordinate of upper-left corner of region.
* This coordinate is unscaled, relative to the original dimensions.
* @param width Width of the region to decode.
* This distance is unscaled, relative to the original dimensions.
* @param height Height of the region to decode.
* This distance is unscaled, relative to the original dimensions.
* @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.
* @return Pointer to a bitmap of the decoded region on success, NULL on
* failure.
*/
virtual SkBitmap* decodeRegion(int start_x, int start_y, int width,
int height, int sampleSize,
SkColorType colorType) = 0;
/*
* @param Requested destination color type
* @return true if we support the requested color type and false otherwise
*/
virtual bool conversionSupported(SkColorType colorType) = 0;
int width() const { return fWidth; }
int height() const { return fHeight; }
virtual ~SkBitmapRegionDecoderInterface() {}
protected:
SkBitmapRegionDecoderInterface(int width, int height)
: fWidth(width)
, fHeight(height)
{}
private:
const int fWidth;
const int fHeight;
};
#endif