f24f2247c2
DM: Add a flag to use SkCodec instead of SkImageDecoder. SkCodec: Base class for codecs, allowing creation from an SkStream or an SkData. An SkCodec, on creation, knows properties of the data like its width and height. Further calls can be used to generate the image. TODO: Add scanline iterator SkPngCodec: New decoder for png. Wraps libpng. The code has been repurposed from SkImageDecoder_libpng. TODO: Handle other destination colortypes TODO: Substitute the transpose color TODO: Allow silencing warnings TODO: Use RGB instead of filler? TODO: sRGB SkSwizzler: Simplified version of SkScaledSampler. Unlike the sampler, this object does no sampling. TODO: Implement other swizzles. Requires a gclient sync to pull down libpng. BUG=skia:3257 Committed: https://skia.googlesource.com/skia/+/ca358852b4fed656d11107b2aaf28318a4518b49 (and then reverted) Review URL: https://codereview.chromium.org/930283002
93 lines
2.7 KiB
C++
93 lines
2.7 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 SkCodec_DEFINED
|
|
#define SkCodec_DEFINED
|
|
|
|
#include "SkImageGenerator.h"
|
|
#include "SkImageInfo.h"
|
|
#include "SkSize.h"
|
|
#include "SkTemplates.h"
|
|
#include "SkTypes.h"
|
|
|
|
class SkData;
|
|
class SkStream;
|
|
|
|
/**
|
|
* Abstraction layer directly on top of an image codec.
|
|
*/
|
|
class SkCodec : public SkImageGenerator {
|
|
public:
|
|
/**
|
|
* If this stream represents an encoded image that we know how to decode,
|
|
* return an SkCodec that can decode it. Otherwise return NULL.
|
|
*
|
|
* If NULL is returned, the stream is deleted immediately. Otherwise, the
|
|
* SkCodec takes ownership of it, and will delete it when done with it.
|
|
*/
|
|
static SkCodec* NewFromStream(SkStream*);
|
|
|
|
/**
|
|
* If this data represents an encoded image that we know how to decode,
|
|
* return an SkCodec that can decode it. Otherwise return NULL.
|
|
*
|
|
* Will take a ref if it returns a codec, else will not affect the data.
|
|
*/
|
|
static SkCodec* NewFromData(SkData*);
|
|
|
|
/**
|
|
* Return a size that approximately supports the desired scale factor.
|
|
* The codec may not be able to scale efficiently to the exact scale
|
|
* factor requested, so return a size that approximates that scale.
|
|
*
|
|
* FIXME: Move to SkImageGenerator?
|
|
*/
|
|
SkISize getScaledDimensions(float desiredScale) const;
|
|
|
|
protected:
|
|
SkCodec(const SkImageInfo&, SkStream*);
|
|
|
|
/**
|
|
* The SkAlphaType is a conservative answer. i.e. it is possible that it
|
|
* initially returns a non-opaque answer, but completing the decode
|
|
* reveals that the image is actually opaque.
|
|
*/
|
|
bool onGetInfo(SkImageInfo* info) SK_OVERRIDE {
|
|
*info = fInfo;
|
|
return true;
|
|
}
|
|
|
|
// Helper for subclasses.
|
|
const SkImageInfo& getOriginalInfo() { return fInfo; }
|
|
|
|
virtual SkISize onGetScaledDimensions(float /* desiredScale */) const {
|
|
// By default, scaling is not supported.
|
|
return fInfo.dimensions();
|
|
}
|
|
|
|
/**
|
|
* If the stream was previously read, attempt to rewind.
|
|
* @returns:
|
|
* true
|
|
* - if the stream needed to be rewound, and the rewind
|
|
* succeeded.
|
|
* - if the stream did not need to be rewound.
|
|
* false
|
|
* - if the stream needed to be rewound, and rewind failed.
|
|
* Subclasses MUST call this function before reading the stream (e.g. in
|
|
* onGetPixels). If it returns false, onGetPixels should return
|
|
* kCouldNotRewind.
|
|
*/
|
|
bool SK_WARN_UNUSED_RESULT rewindIfNeeded();
|
|
|
|
private:
|
|
const SkImageInfo fInfo;
|
|
SkAutoTDelete<SkStream> fStream;
|
|
bool fNeedsRewind;
|
|
};
|
|
#endif // SkCodec_DEFINED
|