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