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