// Copyright 2017 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_FXCODEC_JPX_CJPX_DECODER_H_ #define CORE_FXCODEC_JPX_CJPX_DECODER_H_ #include #include #include "core/fxcrt/unowned_ptr.h" #include "third_party/base/span.h" #if defined(USE_SYSTEM_LIBOPENJPEG2) #include #else #include "third_party/libopenjpeg/openjpeg.h" #endif namespace fxcodec { struct DecodeData; class CJPX_Decoder { public: // Calculated as log2(2^32 / 1), where 2^32 is the largest image dimension and // 1 is the smallest required size. static constexpr uint8_t kMaxResolutionsToSkip = 32; enum ColorSpaceOption { kNoColorSpace, kNormalColorSpace, kIndexedColorSpace }; struct JpxImageInfo { uint32_t width; uint32_t height; uint32_t channels; COLOR_SPACE colorspace; }; static std::unique_ptr Create( pdfium::span src_span, CJPX_Decoder::ColorSpaceOption option, uint8_t resolution_levels_to_skip); static void Sycc420ToRgbForTesting(opj_image_t* img); ~CJPX_Decoder(); JpxImageInfo GetInfo() const; bool StartDecode(); // `swap_rgb` can only be set when an image's color space type contains at // least 3 color components. Note that this `component_count` is not // equivalent to `JpxImageInfo::channels`. The JpxImageInfo channels can // contain extra information for rendering the image besides the color // component information. Therefore the `JpxImageInfo::channels` must be no // less than the component count. // // Example: If a JPX image's color space type is OPJ_CLRSPC_SRGB, the // component count for this color space is 3, and the channel count of its // JpxImageInfo can be 4. This is because the extra channel might contain // extra information, such as the transparency level of the image. bool Decode(pdfium::span dest_buf, uint32_t pitch, bool swap_rgb, uint32_t component_count); private: // Use Create() to instantiate. explicit CJPX_Decoder(ColorSpaceOption option); bool Init(pdfium::span src_data, uint8_t resolution_levels_to_skip); const ColorSpaceOption m_ColorSpaceOption; pdfium::span m_SrcData; UnownedPtr m_Image; UnownedPtr m_Codec; std::unique_ptr m_DecodeData; UnownedPtr m_Stream; opj_dparameters_t m_Parameters = {}; }; } // namespace fxcodec using fxcodec::CJPX_Decoder; #endif // CORE_FXCODEC_JPX_CJPX_DECODER_H_