7#include "core/fpdfapi/page/cpdf_transferfuncdib.h"
11#include "build/build_config.h"
12#include "core/fpdfapi/page/cpdf_transferfunc.h"
13#include "core/fxcrt/check.h"
14#include "core/fxcrt/zip.h"
15#include "core/fxge/calculate_pitch.h"
17#if defined(PDF_USE_SKIA)
18#include "core/fxcrt/notreached.h"
36CPDF_TransferFuncDIB::CPDF_TransferFuncDIB(
38 RetainPtr<CPDF_TransferFunc> transfer_func)
39 : src_(std::move(src)),
40 transfer_func_(std::move(transfer_func)),
41 r_samples_(transfer_func_->GetSamplesR()),
42 g_samples_(transfer_func_->GetSamplesG()),
43 b_samples_(transfer_func_->GetSamplesB()) {
44 SetWidth(src_->GetWidth());
45 SetHeight(src_->GetHeight());
48 scanline_.resize(GetPitch());
54FXDIB_Format CPDF_TransferFuncDIB::GetDestFormat()
const {
55 if (src_->IsMaskFormat()) {
59 if (src_->IsAlphaFormat()) {
68void CPDF_TransferFuncDIB::TranslateScanline(
69 pdfium::span<
const uint8_t> src_span)
const {
70 auto scanline_span = pdfium::make_span(scanline_);
71 switch (src_->GetFormat()) {
72 case FXDIB_Format::kInvalid: {
75 case FXDIB_Format::k1bppRgb: {
77 MakePlatformRGBStruct(r_samples_[0], g_samples_[0], b_samples_[0]);
78 const auto color1 = MakePlatformRGBStruct(
79 r_samples_[255], g_samples_[255], b_samples_[255]);
81 for (
int i = 0; i <
GetWidth(); i++) {
82 const bool is_on = (src_span[i / 8] & (1 << (7 - i % 8)));
83 dest[i] = is_on ? color1 : color0;
87 case FXDIB_Format::k1bppMask: {
88 const int m0 = r_samples_[0];
89 const int m1 = r_samples_[255];
90 for (
int i = 0; i <
GetWidth(); i++) {
91 const bool is_on = (src_span[i / 8] & (1 << (7 - i % 8)));
92 scanline_[i] = is_on ? m1 : m0;
96 case FXDIB_Format::k8bppRgb: {
97 pdfium::span<
const uint32_t> src_palette = src_->GetPaletteSpan();
100 if (src_->HasPalette()) {
101 for (
auto [input, output] : zip) {
102 const FX_ARGB src_argb = src_palette[input];
103 output = MakePlatformRGBStruct(r_samples_[
FXARGB_B(src_argb)],
108 for (
auto [input, output] : zip) {
109 output = MakePlatformRGBStruct(r_samples_[input], g_samples_[input],
115 case FXDIB_Format::k8bppMask: {
116 for (
auto [input, output] :
117 fxcrt::Zip(src_span.first(GetWidth()), scanline_span)) {
118 output = r_samples_[input];
122 case FXDIB_Format::kBgr: {
126 for (
auto [input, output] : fxcrt::Zip(src.first(GetWidth()), dest)) {
127 output = MakePlatformRGBStruct(r_samples_[input.red],
128 g_samples_[input.green],
129 b_samples_[input.blue]);
133 case FXDIB_Format::kBgrx: {
137 for (
auto [input, output] : fxcrt::Zip(src.first(GetWidth()), dest)) {
138 output = MakePlatformRGBStruct(r_samples_[input.red],
139 g_samples_[input.green],
140 b_samples_[input.blue]);
144 case FXDIB_Format::kBgra: {
149 for (
auto [input, output] : fxcrt::Zip(src.first(GetWidth()), dest)) {
151 .blue = b_samples_[input.blue],
152 .green = g_samples_[input.green],
153 .red = r_samples_[input.red],
154 .alpha = input.alpha,
159#if defined(PDF_USE_SKIA)
160 case FXDIB_Format::kBgraPremul: {
163 NOTREACHED_NORETURN();
170 TranslateScanline(src_->GetScanline(line));
FX_BGR_STRUCT< uint8_t > kPlatformRGBStruct
static constexpr FXDIB_Format kPlatformRGBFormat
void SetFormat(FXDIB_Format format)
void SetPitch(uint32_t pitch)
pdfium::span< const uint8_t > GetScanline(int line) const override
~CPDF_TransferFuncDIB() override
uint32_t CalculatePitch32OrDie(int bits_per_pixel, int width_in_pixels)