xref: /aosp_15_r20/external/pdfium/core/fxcodec/jpx/cjpx_decoder.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2017 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_FXCODEC_JPX_CJPX_DECODER_H_
8 #define CORE_FXCODEC_JPX_CJPX_DECODER_H_
9 
10 #include <stdint.h>
11 
12 #include <memory>
13 
14 #include "core/fxcrt/unowned_ptr.h"
15 #include "third_party/base/containers/span.h"
16 
17 #if defined(USE_SYSTEM_LIBOPENJPEG2)
18 #include <openjpeg.h>
19 #else
20 #include "third_party/libopenjpeg/openjpeg.h"
21 #endif
22 
23 namespace fxcodec {
24 
25 struct DecodeData;
26 
27 class CJPX_Decoder {
28  public:
29   // Calculated as log2(2^32 / 1), where 2^32 is the largest image dimension and
30   // 1 is the smallest required size.
31   static constexpr uint8_t kMaxResolutionsToSkip = 32;
32 
33   enum ColorSpaceOption {
34     kNoColorSpace,
35     kNormalColorSpace,
36     kIndexedColorSpace
37   };
38 
39   struct JpxImageInfo {
40     uint32_t width;
41     uint32_t height;
42     uint32_t channels;
43     COLOR_SPACE colorspace;
44   };
45 
46   static std::unique_ptr<CJPX_Decoder> Create(
47       pdfium::span<const uint8_t> src_span,
48       CJPX_Decoder::ColorSpaceOption option,
49       uint8_t resolution_levels_to_skip);
50 
51   static void Sycc420ToRgbForTesting(opj_image_t* img);
52 
53   ~CJPX_Decoder();
54 
55   JpxImageInfo GetInfo() const;
56   bool StartDecode();
57 
58   // `swap_rgb` can only be set when an image's color space type contains at
59   // least 3 color components. Note that this `component_count` is not
60   // equivalent to `JpxImageInfo::channels`. The JpxImageInfo channels can
61   // contain extra information for rendering the image besides the color
62   // component information. Therefore the `JpxImageInfo::channels` must be no
63   // less than the component count.
64   //
65   // Example: If a JPX image's color space type is OPJ_CLRSPC_SRGB, the
66   // component count for this color space is 3, and the channel count of its
67   // JpxImageInfo can be 4. This is because the extra channel might contain
68   // extra information, such as the transparency level of the image.
69   bool Decode(pdfium::span<uint8_t> dest_buf,
70               uint32_t pitch,
71               bool swap_rgb,
72               uint32_t component_count);
73 
74  private:
75   // Use Create() to instantiate.
76   explicit CJPX_Decoder(ColorSpaceOption option);
77 
78   bool Init(pdfium::span<const uint8_t> src_data,
79             uint8_t resolution_levels_to_skip);
80 
81   const ColorSpaceOption m_ColorSpaceOption;
82   pdfium::span<const uint8_t> m_SrcData;
83   UnownedPtr<opj_image_t> m_Image;
84   UnownedPtr<opj_codec_t> m_Codec;
85   std::unique_ptr<DecodeData> m_DecodeData;
86   UnownedPtr<opj_stream_t> m_Stream;
87   opj_dparameters_t m_Parameters = {};
88 };
89 
90 }  // namespace fxcodec
91 
92 using fxcodec::CJPX_Decoder;
93 
94 #endif  // CORE_FXCODEC_JPX_CJPX_DECODER_H_
95