blob: d81d992be7542339147c45d54428adc4176bad38 [file] [log] [blame]
/*
* Copyright 2021 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkJpegxlCodec_DEFINED
#define SkJpegxlCodec_DEFINED
#include "include/core/SkData.h"
#include "include/core/SkEncodedImageFormat.h"
#include "include/core/SkRefCnt.h"
#include "src/codec/SkScalingCodec.h"
#include <cstddef>
#include <memory>
class SkCodec;
class SkFrameHolder;
class SkJpegxlCodecPriv;
class SkStream;
struct SkEncodedInfo;
struct SkImageInfo;
/*
*
* This class implements the decoding for jpegxl images
*
*/
class SkJpegxlCodec : public SkScalingCodec {
public:
static bool IsJpegxl(const void*, size_t);
/*
* Assumes IsJpegxl was called and returned true
* Takes ownership of the stream
*/
static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
protected:
/* TODO(eustas): implement when downscaling is supported. */
/* SkISize onGetScaledDimensions(float desiredScale) const override; */
/* TODO(eustas): implement when up-/down-scaling is supported. */
/* bool onDimensionsSupported(const SkISize&) override; */
SkEncodedImageFormat onGetEncodedFormat() const override {
return SkEncodedImageFormat::kJPEGXL;
}
Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t rowBytes,
const Options& options, int* rowsDecodedPtr) override;
/* TODO(eustas): add support for transcoded JPEG images? */
/* bool onQueryYUVAInfo(const SkYUVAPixmapInfo::SupportedDataTypes&,
SkYUVAPixmapInfo*) const override; */
/* TODO(eustas): add support for transcoded JPEG images? */
/* Result onGetYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps) override; */
/* TODO(eustas): implement when cropped output is supported. */
/* bool onGetValidSubset(SkIRect* desiredSubset) const override; */
bool onRewind() override;
/* TODO(eustas): top-down by default; do we need something else? */
/* SkScanlineOrder onGetScanlineOrder() const override; */
/* int onOutputScanline(int inputScanline) const override; */
bool conversionSupported(const SkImageInfo&, bool, bool) override;
int onGetFrameCount() override;
bool onGetFrameInfo(int, FrameInfo*) const override;
int onGetRepetitionCount() override;
private:
const SkFrameHolder* getFrameHolder() const override;
// Result onStartScanlineDecode(
// const SkImageInfo& /*dstInfo*/, const Options& /*options*/) override;
// Result onStartIncrementalDecode(
// const SkImageInfo& /*dstInfo*/, void*, size_t, const Options&) override;
// Result onIncrementalDecode(int*) override;
// bool onSkipScanlines(int /*countLines*/) override;
// int onGetScanlines(void* /*dst*/, int /*countLines*/, size_t /*rowBytes*/) override;
// SkSampler* getSampler(bool /*createIfNecessary*/) override;
// Opaque codec implementation for lightweight header file.
std::unique_ptr<SkJpegxlCodecPriv> fCodec;
sk_sp<SkData> fData;
bool scanFrames();
static void imageOutCallback(
void* opaque, size_t x, size_t y, size_t num_pixels, const void* pixels);
SkJpegxlCodec(std::unique_ptr<SkJpegxlCodecPriv> codec,
SkEncodedInfo&& info,
std::unique_ptr<SkStream> stream,
sk_sp<SkData> data);
using INHERITED = SkScalingCodec;
};
#endif