blob: 1e417847d641a1ea9c256402dc9913437ca7b804 [file]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CORE_FXCODEC_JPEG_LIBJPEG_SCANLINE_DECODER_H_
#define CORE_FXCODEC_JPEG_LIBJPEG_SCANLINE_DECODER_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <optional>
#include "core/fxcodec/jpeg/jpeg_common.h"
#include "core/fxcodec/jpeg/jpegmodule.h"
#include "core/fxcodec/scanlinedecoder.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/raw_span.h"
#include "core/fxcrt/span.h"
namespace fxcodec {
class LibjpegScanlineDecoder final : public ScanlineDecoder {
public:
static std::unique_ptr<ScanlineDecoder> Create(
pdfium::span<const uint8_t> src_span,
uint32_t width,
uint32_t height,
int nComps,
bool ColorTransform,
uint32_t scale_denom);
static std::optional<JpegModule::ImageInfo> LoadInfo(
pdfium::span<const uint8_t> src_span);
LibjpegScanlineDecoder();
~LibjpegScanlineDecoder() override;
// ScanlineDecoder:
[[nodiscard]] bool Rewind() override;
pdfium::span<uint8_t> GetNextLine() override;
uint32_t GetSrcOffset() override;
private:
bool CreateImpl(pdfium::span<const uint8_t> src_span,
uint32_t width,
uint32_t height,
int nComps,
bool ColorTransform,
uint32_t scale_denom);
bool InitDecode(bool bAcceptKnownBadHeader);
void CalcPitch();
void InitDecompressSrc();
bool HasKnownBadHeaderWithInvalidHeight(size_t dimension_offset) const;
bool IsSofSegment(size_t marker_offset) const;
void PatchUpKnownBadHeaderWithInvalidHeight(size_t dimension_offset);
// Patch up the JPEG trailer, even if it is correct.
void PatchUpTrailer();
pdfium::span<uint8_t> GetWritableSrcData();
// For a given invalid height byte offset in
// |kKnownBadHeaderWithInvalidHeightByteOffsetStarts|, the SOFn marker should
// be this many bytes before that.
static constexpr size_t kSofMarkerByteOffset = 5;
JpegCommon common_ = {};
pdfium::raw_span<const uint8_t> src_span_;
DataVector<uint8_t> scanline_buf_;
bool decompress_created_ = false;
bool started_ = false;
bool jpeg_transform_ = false;
uint32_t scale_denom_ = 1;
};
} // namespace fxcodec
#endif // CORE_FXCODEC_JPEG_LIBJPEG_SCANLINE_DECODER_H_