| Index: include/codec/SkCodec.h
|
| diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..beb9cb97b32bdb51bed7cc4d76d24b968fe0858d
|
| --- /dev/null
|
| +++ b/include/codec/SkCodec.h
|
| @@ -0,0 +1,92 @@
|
| +/*
|
| + * 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
|
|
|