Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cjpx_decoder.h
Go to the documentation of this file.
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/raw_span.h"
15#include "core/fxcrt/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
23namespace fxcodec {
24
25struct DecodeData;
26
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
38
39 struct JpxImageInfo {
40 uint32_t width;
41 uint32_t height;
42 uint32_t channels;
43 COLOR_SPACE colorspace;
44 };
45
47 pdfium::span<const uint8_t> src_span,
49 uint8_t resolution_levels_to_skip,
50 bool strict_mode);
51
52 static void Sycc420ToRgbForTesting(opj_image_t* img);
53
55
56 JpxImageInfo GetInfo() const;
57 bool StartDecode();
58
59 // `swap_rgb` can only be set when an image's color space type contains at
60 // least 3 color components. Note that this `component_count` is not
61 // equivalent to `JpxImageInfo::channels`. The JpxImageInfo channels can
62 // contain extra information for rendering the image besides the color
63 // component information. Therefore the `JpxImageInfo::channels` must be no
64 // less than the component count.
65 //
66 // Example: If a JPX image's color space type is OPJ_CLRSPC_SRGB, the
67 // component count for this color space is 3, and the channel count of its
68 // JpxImageInfo can be 4. This is because the extra channel might contain
69 // extra information, such as the transparency level of the image.
70 bool Decode(pdfium::span<uint8_t> dest_buf,
71 uint32_t pitch,
72 bool swap_rgb,
73 uint32_t component_count);
74
75 private:
76 struct CodecDeleter {
77 inline void operator()(opj_codec_t* ptr) const { opj_destroy_codec(ptr); }
78 };
79
80 struct ImageDeleter {
81 inline void operator()(opj_image_t* ptr) const { opj_image_destroy(ptr); }
82 };
83
84 struct StreamDeleter {
85 inline void operator()(opj_stream_t* ptr) const { opj_stream_destroy(ptr); }
86 };
87
88 // Use Create() to instantiate.
89 explicit CJPX_Decoder(ColorSpaceOption option);
90
91 // TODO(crbug.com/42270564): Remove `strict_mode` once all the bugs have been
92 // worked out in OpenJPEG.
93 bool Init(pdfium::span<const uint8_t> src_data,
94 uint8_t resolution_levels_to_skip,
95 bool strict_mode);
96
97 const ColorSpaceOption m_ColorSpaceOption;
98 pdfium::raw_span<const uint8_t> m_SrcData;
99 std::unique_ptr<DecodeData> m_DecodeData;
100 std::unique_ptr<opj_codec_t, CodecDeleter> m_Codec;
101 std::unique_ptr<opj_stream_t, StreamDeleter> m_Stream;
102 std::unique_ptr<opj_image_t, ImageDeleter> m_Image;
103 opj_dparameters_t m_Parameters = {};
104};
105
106} // namespace fxcodec
107
108using fxcodec::CJPX_Decoder;
109
110#endif // CORE_FXCODEC_JPX_CJPX_DECODER_H_
fxcodec::BasicModule BasicModule
Definition basicmodule.h:42
fxcrt::ByteString ByteString
Definition bytestring.h:180
#define DCHECK
Definition check.h:33
#define DCHECK_NE(x, y)
Definition check_op.h:18
#define CHECK_GE(x, y)
Definition check_op.h:15
#define DCHECK_EQ(x, y)
Definition check_op.h:17
void SetWidth(int width)
bool HasPalette() const
Definition cfx_dibbase.h:78
int GetBPP() const
Definition cfx_dibbase.h:72
void SetHeight(int height)
void SetFormat(FXDIB_Format format)
void SetPaletteArgb(int index, uint32_t color)
int GetHeight() const
Definition cfx_dibbase.h:66
int GetWidth() const
Definition cfx_dibbase.h:65
void SetPitch(uint32_t pitch)
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
Definition cpdf_array.h:29
Family GetFamily() const
static uint32_t ComponentsForFamily(Family family)
uint32_t ComponentCount() const
static RetainPtr< CPDF_ColorSpace > GetStockCS(Family family)
~CPDF_DIB() override
RetainPtr< CPDF_DIB > DetachMask()
Definition cpdf_dib.cpp:903
size_t GetEstimatedImageMemoryBurden() const override
uint32_t GetMatteColor() const
Definition cpdf_dib.h:53
bool SkipToScanline(int line, PauseIndicatorIface *pPause) const override
bool IsJBigImage() const
Definition cpdf_dib.cpp:907
RetainPtr< CPDF_ColorSpace > GetColorSpace() const
Definition cpdf_dib.h:52
LoadState ContinueLoadDIBBase(PauseIndicatorIface *pPause)
Definition cpdf_dib.cpp:341
bool Load()
Definition cpdf_dib.cpp:241
pdfium::span< const uint8_t > GetScanline(int line) const override
LoadState StartLoadDIBBase(bool bHasMask, const CPDF_Dictionary *pFormResources, const CPDF_Dictionary *pPageResources, bool bStdCS, CPDF_ColorSpace::Family GroupFamily, bool bLoadMask, const CFX_Size &max_size_required)
Definition cpdf_dib.cpp:295
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
static bool IsValidJpegBitsPerComponent(int32_t bpc)
static bool IsValidJpegComponent(int32_t comps)
int GetMaxIndex() const
static DataVector< uint8_t > RunLengthEncode(pdfium::span< const uint8_t > src_span)
static std::unique_ptr< ScanlineDecoder > CreateRunLengthDecoder(pdfium::span< const uint8_t > src_buf, int width, int height, int nComps, int bpc)
BasicModule & operator=(const BasicModule &)=delete
BasicModule(const BasicModule &)=delete
static DataVector< uint8_t > A85Encode(pdfium::span< const uint8_t > src_span)
static void Sycc420ToRgbForTesting(opj_image_t *img)
static constexpr uint8_t kMaxResolutionsToSkip
bool Decode(pdfium::span< uint8_t > dest_buf, uint32_t pitch, bool swap_rgb, uint32_t component_count)
JpxImageInfo GetInfo() const
static std::unique_ptr< CJPX_Decoder > Create(pdfium::span< const uint8_t > src_span, CJPX_Decoder::ColorSpaceOption option, uint8_t resolution_levels_to_skip, bool strict_mode)
static bool IsValidIccComponents(int components)
pdfium::raw_span< const uint8_t > m_pGlobalSpan
pdfium::raw_span< const uint8_t > m_pSrcSpan
std::unique_ptr< CJBig2_Context > m_pContext
pdfium::raw_span< uint8_t > m_dest_buf
static FXCODEC_STATUS StartDecode(Jbig2Context *pJbig2Context, JBig2_DocumentContext *pJbig2DocumentContext, uint32_t width, uint32_t height, pdfium::span< const uint8_t > src_span, uint64_t src_key, pdfium::span< const uint8_t > global_span, uint64_t global_key, pdfium::span< uint8_t > dest_buf, uint32_t dest_pitch, PauseIndicatorIface *pPause)
static FXCODEC_STATUS ContinueDecode(Jbig2Context *pJbig2Context, PauseIndicatorIface *pPause)
Jbig2Decoder(const Jbig2Decoder &)=delete
Jbig2Decoder & operator=(const Jbig2Decoder &)=delete
JpegModule & operator=(const JpegModule &)=delete
static std::unique_ptr< ScanlineDecoder > CreateDecoder(pdfium::span< const uint8_t > src_span, uint32_t width, uint32_t height, int nComps, bool ColorTransform)
static std::optional< ImageInfo > LoadInfo(pdfium::span< const uint8_t > src_span)
JpegModule(const JpegModule &)=delete
bool operator==(const char *ptr) const
bool operator!=(const char *ptr) const
Definition bytestring.h:65
#define UNSAFE_TODO(...)
constexpr size_t kHugeImageSize
Definition cpdf_dib.h:39
FXCODEC_STATUS
CFX_STemplate< int32_t > CFX_Size
uint32_t FX_ARGB
Definition fx_dib.h:36
#define FXARGB_B(argb)
Definition fx_dib.h:199
#define FXARGB_G(argb)
Definition fx_dib.h:198
#define FXARGB_R(argb)
Definition fx_dib.h:197
FXDIB_Format
Definition fx_dib.h:21
pdfium::CheckedNumeric< uint32_t > FX_SAFE_UINT32
fxcodec::Jbig2Decoder Jbig2Decoder
fxcodec::Jbig2Context Jbig2Context
fxcodec::JpegModule JpegModule
Definition jpegmodule.h:64
std::optional< uint32_t > CalculatePitch32(int bits_per_pixel, int width_in_pixels)
#define CONSTRUCT_VIA_MAKE_RETAIN
Definition retain_ptr.h:222
float m_DecodeStep
Definition cpdf_dib.h:29
int m_ColorKeyMin
Definition cpdf_dib.h:30
int m_ColorKeyMax
Definition cpdf_dib.h:31
float m_DecodeMin
Definition cpdf_dib.h:28