xref: /aosp_15_r20/external/skia/src/codec/SkJpegxlCodec.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkJpegxlCodec_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkJpegxlCodec_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkEncodedImageFormat.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkScalingCodec.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
17*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker class SkCodec;
20*c8dee2aaSAndroid Build Coastguard Worker class SkFrameHolder;
21*c8dee2aaSAndroid Build Coastguard Worker class SkJpegxlCodecPriv;
22*c8dee2aaSAndroid Build Coastguard Worker class SkStream;
23*c8dee2aaSAndroid Build Coastguard Worker struct SkEncodedInfo;
24*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker /*
27*c8dee2aaSAndroid Build Coastguard Worker  *
28*c8dee2aaSAndroid Build Coastguard Worker  * This class implements the decoding for jpegxl images
29*c8dee2aaSAndroid Build Coastguard Worker  *
30*c8dee2aaSAndroid Build Coastguard Worker  */
31*c8dee2aaSAndroid Build Coastguard Worker class SkJpegxlCodec : public SkScalingCodec {
32*c8dee2aaSAndroid Build Coastguard Worker public:
33*c8dee2aaSAndroid Build Coastguard Worker     static bool IsJpegxl(const void*, size_t);
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker     /*
36*c8dee2aaSAndroid Build Coastguard Worker      * Assumes IsJpegxl was called and returned true
37*c8dee2aaSAndroid Build Coastguard Worker      * Takes ownership of the stream
38*c8dee2aaSAndroid Build Coastguard Worker      */
39*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker protected:
42*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): implement when downscaling is supported. */
43*c8dee2aaSAndroid Build Coastguard Worker     /* SkISize onGetScaledDimensions(float desiredScale) const override; */
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): implement when up-/down-scaling is supported. */
46*c8dee2aaSAndroid Build Coastguard Worker     /* bool onDimensionsSupported(const SkISize&) override; */
47*c8dee2aaSAndroid Build Coastguard Worker 
onGetEncodedFormat()48*c8dee2aaSAndroid Build Coastguard Worker     SkEncodedImageFormat onGetEncodedFormat() const override {
49*c8dee2aaSAndroid Build Coastguard Worker         return SkEncodedImageFormat::kJPEGXL;
50*c8dee2aaSAndroid Build Coastguard Worker     }
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t rowBytes,
53*c8dee2aaSAndroid Build Coastguard Worker                        const Options& options, int* rowsDecodedPtr) override;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): add support for transcoded JPEG images? */
56*c8dee2aaSAndroid Build Coastguard Worker     /* bool onQueryYUVAInfo(const SkYUVAPixmapInfo::SupportedDataTypes&,
57*c8dee2aaSAndroid Build Coastguard Worker                             SkYUVAPixmapInfo*) const override; */
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): add support for transcoded JPEG images? */
60*c8dee2aaSAndroid Build Coastguard Worker     /* Result onGetYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps) override; */
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): implement when cropped output is supported. */
63*c8dee2aaSAndroid Build Coastguard Worker     /* bool onGetValidSubset(SkIRect* desiredSubset) const override; */
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     bool onRewind() override;
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     /* TODO(eustas): top-down by default; do we need something else? */
68*c8dee2aaSAndroid Build Coastguard Worker     /* SkScanlineOrder onGetScanlineOrder() const override; */
69*c8dee2aaSAndroid Build Coastguard Worker     /* int onOutputScanline(int inputScanline) const override; */
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     bool conversionSupported(const SkImageInfo&, bool, bool) override;
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     int onGetFrameCount() override;
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     bool onGetFrameInfo(int, FrameInfo*) const override;
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     int onGetRepetitionCount() override;
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker private:
80*c8dee2aaSAndroid Build Coastguard Worker     const SkFrameHolder* getFrameHolder() const override;
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     // Result onStartScanlineDecode(
83*c8dee2aaSAndroid Build Coastguard Worker     //    const SkImageInfo& /*dstInfo*/, const Options& /*options*/) override;
84*c8dee2aaSAndroid Build Coastguard Worker     // Result onStartIncrementalDecode(
85*c8dee2aaSAndroid Build Coastguard Worker     //     const SkImageInfo& /*dstInfo*/, void*, size_t, const Options&) override;
86*c8dee2aaSAndroid Build Coastguard Worker     // Result onIncrementalDecode(int*) override;
87*c8dee2aaSAndroid Build Coastguard Worker     // bool onSkipScanlines(int /*countLines*/) override;
88*c8dee2aaSAndroid Build Coastguard Worker     // int onGetScanlines(void* /*dst*/, int /*countLines*/, size_t /*rowBytes*/) override;
89*c8dee2aaSAndroid Build Coastguard Worker     // SkSampler* getSampler(bool /*createIfNecessary*/) override;
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     // Opaque codec implementation for lightweight header file.
92*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkJpegxlCodecPriv> fCodec;
93*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkData> fData;
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     bool scanFrames();
96*c8dee2aaSAndroid Build Coastguard Worker     static void imageOutCallback(
97*c8dee2aaSAndroid Build Coastguard Worker         void* opaque, size_t x, size_t y, size_t num_pixels, const void* pixels);
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     SkJpegxlCodec(std::unique_ptr<SkJpegxlCodecPriv> codec,
100*c8dee2aaSAndroid Build Coastguard Worker                   SkEncodedInfo&& info,
101*c8dee2aaSAndroid Build Coastguard Worker                   std::unique_ptr<SkStream> stream,
102*c8dee2aaSAndroid Build Coastguard Worker                   sk_sp<SkData> data);
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkScalingCodec;
105*c8dee2aaSAndroid Build Coastguard Worker };
106*c8dee2aaSAndroid Build Coastguard Worker 
107*c8dee2aaSAndroid Build Coastguard Worker #endif
108