7#include "core/fxge/dib/cfx_scanlinecompositor.h"
11#include "core/fxcrt/check.h"
12#include "core/fxcrt/check_op.h"
13#include "core/fxcrt/compiler_specific.h"
14#include "core/fxcrt/fx_memcpy_wrappers.h"
15#include "core/fxcrt/notreached.h"
16#include "core/fxcrt/span_util.h"
17#include "core/fxcrt/stl_util.h"
18#include "core/fxcrt/zip.h"
19#include "core/fxge/dib/blend.h"
20#include "core/fxge/dib/fx_dib.h"
26uint8_t AlphaUnion(uint8_t dest, uint8_t src) {
27 return dest + src - dest * src / 255;
31 return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
36 int n =
std::min(color.red,
std::min(color.green, color.blue));
37 int x =
std::max(color.red,
std::max(color.green, color.blue));
39 color.red = l + ((color.red - l) * l / (l - n));
40 color.green = l + ((color.green - l) * l / (l - n));
41 color.blue = l + ((color.blue - l) * l / (l - n));
44 color.red = l + ((color.red - l) * (255 - l) / (x - l));
45 color.green = l + ((color.green - l) * (255 - l) / (x - l));
46 color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
52 int d = l - Lum(color);
56 return ClipColor(color);
60 return std::max(color.red,
std::max(color.green, color.blue)) -
61 std::min(color.red,
std::min(color.green, color.blue));
65 int min =
std::min(color.red,
std::min(color.green, color.blue));
66 int max =
std::max(color.red,
std::max(color.green, color.blue));
70 color.red = (color.red - min) * s / (max - min);
71 color.green = (color.green - min) * s / (max - min);
72 color.blue = (color.blue - min) * s / (max - min);
76template <
typename T,
typename U>
81 .red = src_in.red, .green = src_in.green, .blue = src_in.blue};
83 .red = back_in.red, .green = back_in.green, .blue = back_in.blue};
87 result = SetLum(SetSat(src, Sat(back)), Lum(back));
89 case BlendMode::kSaturation:
90 result = SetLum(SetSat(back, Sat(src)), Lum(back));
92 case BlendMode::kColor:
93 result = SetLum(src, Lum(back));
95 case BlendMode::kLuminosity:
96 result = SetLum(back, Lum(src));
106 const uint8_t* src_scan,
107 const uint8_t* dest_scan,
111 .blue = src_scan[0], .green = src_scan[1], .red = src_scan[2]};
113 .blue = dest_scan[0], .green = dest_scan[1], .red = dest_scan[2]};
115 results[0] = result.blue;
116 results[1] = result.green;
117 results[2] = result.red;
121int GetAlpha(uint8_t src_alpha,
const uint8_t* clip_scan,
int col) {
122 return clip_scan ?
UNSAFE_TODO(clip_scan[col]) * src_alpha / 255 : src_alpha;
125int GetAlphaWithSrc(uint8_t src_alpha,
126 pdfium::span<
const uint8_t> clip_scan,
127 pdfium::span<
const uint8_t> src_scan,
129 int result = src_alpha * src_scan[col];
130 if (col < clip_scan.size()) {
131 result *= clip_scan[col];
137template <
typename T,
typename U>
138void AlphaMergeToDest(
const T& input, U& output, uint8_t alpha) {
144#if defined(PDF_USE_SKIA)
145template <
typename T,
typename U>
146void AlphaMergeToDestPremul(
const T& input, U& output) {
147 const int in_alpha = 255 - input.alpha;
148 const int out_alpha = 255 - output.alpha;
149 output.blue = (output.blue * in_alpha + input.blue * out_alpha) / 255;
150 output.green = (output.green * in_alpha + input.green * out_alpha) / 255;
151 output.red = (output.red * in_alpha + input.red * out_alpha) / 255;
155template <
typename T,
typename U>
156void AlphaMergeToSource(
const T& input, U& output, uint8_t alpha) {
165 const uint8_t src_alpha = input.alpha * clip / 255;
170 if (src_alpha == 0) {
173 output = AlphaUnion(output, src_alpha);
176void CompositeRowBgra2Mask(pdfium::span<
const FX_BGRA_STRUCT<uint8_t>> src_span,
177 pdfium::span<
const uint8_t> clip_span,
178 pdfium::span<uint8_t> dest_span) {
179 if (clip_span.empty()) {
180 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
181 CompositePixelBgra2Mask(input, 255, output);
186 for (
auto [input, clip, output] :
187 fxcrt::Zip(src_span, clip_span, dest_span)) {
188 CompositePixelBgra2Mask(input, clip, output);
192void CompositeRow_Rgb2Mask(pdfium::span<uint8_t> dest_span,
194 pdfium::span<
const uint8_t> clip_span) {
195 uint8_t* dest_scan = dest_span.data();
196 const uint8_t* clip_scan = clip_span.data();
202 for (
int i = 0; i < width; ++i) {
203 *dest_scan = AlphaUnion(*dest_scan, *clip_scan);
210bool IsNonSeparableBlendMode(
BlendMode mode) {
223uint8_t GetGrayWithBlend(
const T& input,
224 uint8_t output_value,
226 uint8_t gray =
FXRGB2GRAY(input.red, input.green, input.blue);
227 if (IsNonSeparableBlendMode(blend_type)) {
231 return Blend(blend_type
, output_value
, gray
);
240 const uint8_t src_alpha = input.alpha * clip / 255;
241 if (src_alpha == 0) {
245 uint8_t gray = GetGrayWithBlend(input, output, blend_type);
249void CompositeRowBgra2Gray(pdfium::span<
const FX_BGRA_STRUCT<uint8_t>> src_span,
250 pdfium::span<
const uint8_t> clip_span,
251 pdfium::span<uint8_t> dest_span,
253 if (clip_span.empty()) {
254 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
255 CompositePixelBgra2Gray(input, 255, output, blend_type);
260 for (
auto [input, clip, output] :
261 fxcrt::Zip(src_span, clip_span, dest_span)) {
262 CompositePixelBgra2Gray(input, clip, output, blend_type);
266void CompositeRow_Rgb2Gray(pdfium::span<uint8_t> dest_span,
267 pdfium::span<
const uint8_t> src_span,
271 pdfium::span<
const uint8_t> clip_span) {
272 uint8_t* dest_scan = dest_span.data();
273 const uint8_t* src_scan = src_span.data();
274 const uint8_t* clip_scan = clip_span.data();
276 for (
int col = 0; col < pixel_count; ++col) {
278 .blue = src_scan[0], .green = src_scan[1], .red = src_scan[2]};
279 uint8_t gray = GetGrayWithBlend(input, *dest_scan, blend_type);
280 if (clip_scan && clip_scan[col] < 255) {
291void CompositeRow_Bgr2Bgra_Blend_NoClip(pdfium::span<uint8_t> dest_span,
292 pdfium::span<
const uint8_t> src_span,
296 uint8_t* dest_scan = dest_span.data();
297 const uint8_t* src_scan = src_span.data();
298 int blended_colors[3];
299 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
300 int src_gap = src_Bpp - 3;
302 for (
int col = 0; col < width; ++col) {
303 uint8_t* dest_alpha = &dest_scan[3];
304 uint8_t back_alpha = *dest_alpha;
305 if (back_alpha == 0) {
317 if (bNonseparableBlend) {
318 RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
320 for (
int color = 0; color < 3; ++color) {
321 int src_color = *src_scan;
322 int blended = bNonseparableBlend
323 ? blended_colors[color]
324 :
Blend(blend_type
, *dest_scan
, src_color
);
335void CompositeRow_Bgr2Bgra_Blend_Clip(pdfium::span<uint8_t> dest_span,
336 pdfium::span<
const uint8_t> src_span,
340 pdfium::span<
const uint8_t> clip_span) {
341 uint8_t* dest_scan = dest_span.data();
342 const uint8_t* src_scan = src_span.data();
343 const uint8_t* clip_scan = clip_span.data();
344 int blended_colors[3];
345 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
346 int src_gap = src_Bpp - 3;
348 for (
int col = 0; col < width; ++col) {
349 int src_alpha = *clip_scan++;
350 uint8_t back_alpha = dest_scan[3];
351 if (back_alpha == 0) {
358 if (src_alpha == 0) {
363 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
364 dest_scan[3] = dest_alpha;
365 int alpha_ratio = src_alpha * 255 / dest_alpha;
366 if (bNonseparableBlend) {
367 RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
369 for (
int color = 0; color < 3; color++) {
370 int src_color = *src_scan;
371 int blended = bNonseparableBlend
372 ? blended_colors[color]
373 :
Blend(blend_type
, *dest_scan
, src_color
);
385void CompositeRow_Bgr2Bgra_NoBlend_Clip(pdfium::span<uint8_t> dest_span,
386 pdfium::span<
const uint8_t> src_span,
389 pdfium::span<
const uint8_t> clip_span) {
390 uint8_t* dest_scan = dest_span.data();
391 const uint8_t* src_scan = src_span.data();
392 const uint8_t* clip_scan = clip_span.data();
393 int src_gap = src_Bpp - 3;
395 for (
int col = 0; col < width; col++) {
396 int src_alpha = clip_scan[col];
397 if (src_alpha == 255) {
404 if (src_alpha == 0) {
409 int back_alpha = dest_scan[3];
410 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
411 dest_scan[3] = dest_alpha;
412 int alpha_ratio = src_alpha * 255 / dest_alpha;
413 for (
int color = 0; color < 3; color++) {
424void CompositeRow_Bgr2Bgra_NoBlend_NoClip(pdfium::span<uint8_t> dest_span,
425 pdfium::span<
const uint8_t> src_span,
428 uint8_t* dest_scan = dest_span.data();
429 const uint8_t* src_scan = src_span.data();
431 for (
int col = 0; col < width; col++) {
444template <
typename DestPixelStruct>
445void CompositePixelBgra2BgrNonSeparableBlend(
448 DestPixelStruct& output,
450 const uint8_t src_alpha = input.alpha * clip / 255;
451 if (src_alpha == 0) {
455 FX_RGB_STRUCT<
int> blended_color = RgbBlend(blend_type, input, output);
456 AlphaMergeToDest(blended_color, output, src_alpha);
459template <
typename DestPixelStruct>
460void CompositePixelBgra2BgrBlend(
const FX_BGRA_STRUCT<uint8_t>& input,
462 DestPixelStruct& output,
464 const uint8_t src_alpha = input.alpha * clip / 255;
465 if (src_alpha == 0) {
470 .red = Blend(blend_type, output.red, input.red),
471 .green = Blend(blend_type, output.green, input.green),
472 .blue = Blend(blend_type, output.blue, input.blue),
474 AlphaMergeToDest(blended_color, output, src_alpha);
477template <
typename DestPixelStruct>
478void CompositePixelBgra2BgrNoBlend(
const FX_BGRA_STRUCT<uint8_t>& input,
480 DestPixelStruct& output) {
481 const uint8_t src_alpha = input.alpha * clip / 255;
482 if (src_alpha == 255) {
483 output.blue = input.blue;
484 output.green = input.green;
485 output.red = input.red;
488 if (src_alpha == 0) {
491 AlphaMergeToDest(input, output, src_alpha);
494template <
typename DestPixelStruct>
495void CompositeRowBgra2Bgr(pdfium::span<
const FX_BGRA_STRUCT<uint8_t>> src_span,
496 pdfium::span<
const uint8_t> clip_span,
497 pdfium::span<DestPixelStruct> dest_span,
499 const bool non_separable_blend = IsNonSeparableBlendMode(blend_type);
500 if (clip_span.empty()) {
501 if (non_separable_blend) {
502 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
503 CompositePixelBgra2BgrNonSeparableBlend(input, 255, output,
509 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
510 CompositePixelBgra2BgrBlend(input, 255, output, blend_type);
514 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
515 CompositePixelBgra2BgrNoBlend(input, 255, output);
520 if (non_separable_blend) {
521 for (
auto [input, clip, output] :
522 fxcrt::Zip(src_span, clip_span, dest_span)) {
523 CompositePixelBgra2BgrNonSeparableBlend(input, clip, output, blend_type);
528 for (
auto [input, clip, output] :
529 fxcrt::Zip(src_span, clip_span, dest_span)) {
530 CompositePixelBgra2BgrBlend(input, clip, output, blend_type);
534 for (
auto [input, clip, output] :
535 fxcrt::Zip(src_span, clip_span, dest_span)) {
536 CompositePixelBgra2BgrNoBlend(input, clip, output);
543template <
typename DestPixelStruct>
544uint8_t CompositePixelBgra2BgraCommon(
const FX_BGRA_STRUCT<uint8_t>& input,
546 DestPixelStruct& output) {
547 const uint8_t src_alpha = input.alpha * clip / 255;
548 if (output.alpha != 0) {
552 output.blue = input.blue;
553 output.green = input.green;
554 output.red = input.red;
555 output.alpha = src_alpha;
559template <
typename DestPixelStruct>
560void CompositePixelBgra2BgraNonSeparableBlend(
563 DestPixelStruct& output,
565 const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
566 const int alpha_ratio = src_alpha * 255 / dest_alpha;
567 FX_RGB_STRUCT<
int> blended_color = RgbBlend(blend_type, input, output);
568 AlphaMergeToSource(input, blended_color, output.alpha);
569 AlphaMergeToDest(blended_color, output, alpha_ratio);
570 output.alpha = dest_alpha;
573template <
typename DestPixelStruct>
574void CompositePixelBgra2BgraBlend(
const FX_BGRA_STRUCT<uint8_t>& input,
576 DestPixelStruct& output,
578 const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
579 const int alpha_ratio = src_alpha * 255 / dest_alpha;
581 .red = Blend(blend_type, output.red, input.red),
582 .green = Blend(blend_type, output.green, input.green),
583 .blue = Blend(blend_type, output.blue, input.blue),
585 AlphaMergeToSource(input, blended_color, output.alpha);
586 AlphaMergeToDest(blended_color, output, alpha_ratio);
587 output.alpha = dest_alpha;
590template <
typename DestPixelStruct>
591void CompositePixelBgra2BgraNoBlend(
const FX_BGRA_STRUCT<uint8_t>& input,
593 DestPixelStruct& output) {
594 const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
595 const int alpha_ratio = src_alpha * 255 / dest_alpha;
596 AlphaMergeToDest(input, output, alpha_ratio);
597 output.alpha = dest_alpha;
600template <
typename DestPixelStruct>
601void CompositeRowBgra2Bgra(pdfium::span<
const FX_BGRA_STRUCT<uint8_t>> src_span,
602 pdfium::span<
const uint8_t> clip_span,
603 pdfium::span<DestPixelStruct> dest_span,
605 const bool non_separable_blend = IsNonSeparableBlendMode(blend_type);
606 if (clip_span.empty()) {
607 if (non_separable_blend) {
608 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
609 const uint8_t src_alpha =
610 CompositePixelBgra2BgraCommon(input, 255, output);
611 if (src_alpha != 0) {
612 CompositePixelBgra2BgraNonSeparableBlend(input, src_alpha, output,
619 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
620 const uint8_t src_alpha =
621 CompositePixelBgra2BgraCommon(input, 255, output);
622 if (src_alpha != 0) {
623 CompositePixelBgra2BgraBlend(input, src_alpha, output, blend_type);
628 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
629 const uint8_t src_alpha =
630 CompositePixelBgra2BgraCommon(input, 255, output);
631 if (src_alpha != 0) {
632 CompositePixelBgra2BgraNoBlend(input, src_alpha, output);
638 if (non_separable_blend) {
639 for (
auto [input, clip, output] :
640 fxcrt::Zip(src_span, clip_span, dest_span)) {
641 const uint8_t src_alpha =
642 CompositePixelBgra2BgraCommon(input, clip, output);
643 if (src_alpha != 0) {
644 CompositePixelBgra2BgraNonSeparableBlend(input, src_alpha, output,
651 for (
auto [input, clip, output] :
652 fxcrt::Zip(src_span, clip_span, dest_span)) {
653 const uint8_t src_alpha =
654 CompositePixelBgra2BgraCommon(input, clip, output);
655 if (src_alpha != 0) {
656 CompositePixelBgra2BgraBlend(input, src_alpha, output, blend_type);
661 for (
auto [input, clip, output] :
662 fxcrt::Zip(src_span, clip_span, dest_span)) {
663 const uint8_t src_alpha =
664 CompositePixelBgra2BgraCommon(input, clip, output);
665 if (src_alpha != 0) {
666 CompositePixelBgra2BgraNoBlend(input, src_alpha, output);
671#if defined(PDF_USE_SKIA)
675template <
typename DestPixelStruct>
676uint8_t CompositePixelBgraPremul2BgraPremulCommon(
677 const FX_BGRA_STRUCT<uint8_t>& input,
678 DestPixelStruct& output) {
679 if (output.alpha != 0) {
683 output.blue = input.blue;
684 output.green = input.green;
685 output.red = input.red;
686 output.alpha = input.alpha;
690template <
typename DestPixelStruct>
691void CompositePixelBgraPremul2BgraPremulNonSeparableBlend(
692 const FX_BGRA_STRUCT<uint8_t>& input,
693 DestPixelStruct& output,
694 BlendMode blend_type) {
695 if (!CompositePixelBgraPremul2BgraPremulCommon(input, output)) {
699 FX_BGRA_STRUCT<uint8_t> input_for_blend;
700 input_for_blend.blue = input.blue * output.alpha / 255;
701 input_for_blend.green = input.green * output.alpha / 255;
702 input_for_blend.red = input.red * output.alpha / 255;
703 DestPixelStruct output_for_blend;
704 output_for_blend.blue = output.blue * input.alpha / 255;
705 output_for_blend.green = output.green * input.alpha / 255;
706 output_for_blend.red = output.red * input.alpha / 255;
707 FX_RGB_STRUCT<
int> blended_color =
708 RgbBlend(blend_type, input_for_blend, output_for_blend);
710 AlphaMergeToDestPremul(input, output);
711 output.blue += blended_color.blue;
712 output.green += blended_color.green;
713 output.red += blended_color.red;
714 output.alpha = AlphaUnion(output.alpha, input.alpha);
717template <
typename DestPixelStruct>
718void CompositePixelBgraPremul2BgraPremulBlend(
719 const FX_BGRA_STRUCT<uint8_t>& input,
720 DestPixelStruct& output,
721 BlendMode blend_type) {
722 if (!CompositePixelBgraPremul2BgraPremulCommon(input, output)) {
726 FX_BGR_STRUCT<
int> blended_color = {
727 .blue = Blend(blend_type, input.blue * output.alpha / 255,
728 output.blue * input.alpha / 255),
729 .green = Blend(blend_type, input.green * output.alpha / 255,
730 output.green * input.alpha / 255),
731 .red = Blend(blend_type, input.red * output.alpha / 255,
732 output.red * input.alpha / 255),
735 AlphaMergeToDestPremul(input, output);
736 output.blue += blended_color.blue;
737 output.green += blended_color.green;
738 output.red += blended_color.red;
739 output.alpha = AlphaUnion(output.alpha, input.alpha);
742template <
typename DestPixelStruct>
743void CompositePixelBgraPremul2BgraPremulNoBlend(
744 const FX_BGRA_STRUCT<uint8_t>& input,
745 DestPixelStruct& output) {
746 if (!CompositePixelBgraPremul2BgraPremulCommon(input, output)) {
750 const int in_alpha = 255 - input.alpha;
751 output.blue = input.blue + output.blue * in_alpha / 255;
752 output.green = input.green + output.green * in_alpha / 255;
753 output.red = input.red + output.red * in_alpha / 255;
754 output.alpha = AlphaUnion(output.alpha, input.alpha);
757template <
typename DestPixelStruct>
758void CompositeRowBgraPremul2BgraPremul(
759 pdfium::span<
const FX_BGRA_STRUCT<uint8_t>> src_span,
760 pdfium::span<DestPixelStruct> dest_span,
761 BlendMode blend_type) {
762 const bool non_separable_blend = IsNonSeparableBlendMode(blend_type);
763 if (non_separable_blend) {
764 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
765 CompositePixelBgraPremul2BgraPremulNonSeparableBlend(input, output,
770 if (blend_type != BlendMode::kNormal) {
771 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
772 CompositePixelBgraPremul2BgraPremulBlend(input, output, blend_type);
776 for (
auto [input, output] : fxcrt::Zip(src_span, dest_span)) {
777 CompositePixelBgraPremul2BgraPremulNoBlend(input, output);
782void CompositeRow_Rgb2Rgb_Blend_NoClip(pdfium::span<uint8_t> dest_span,
783 pdfium::span<
const uint8_t> src_span,
788 uint8_t* dest_scan = dest_span.data();
789 const uint8_t* src_scan = src_span.data();
790 int blended_colors[3];
791 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
792 int dest_gap = dest_Bpp - 3;
793 int src_gap = src_Bpp - 3;
795 for (
int col = 0; col < width; col++) {
796 if (bNonseparableBlend) {
797 RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
799 for (
int color = 0; color < 3; color++) {
800 int back_color = *dest_scan;
801 int src_color = *src_scan;
802 int blended = bNonseparableBlend
803 ? blended_colors[color]
804 :
Blend(blend_type
, back_color
, src_color
);
805 *dest_scan = blended;
809 dest_scan += dest_gap;
815void CompositeRow_Rgb2Rgb_Blend_Clip(pdfium::span<uint8_t> dest_span,
816 pdfium::span<
const uint8_t> src_span,
821 pdfium::span<
const uint8_t> clip_span) {
822 uint8_t* dest_scan = dest_span.data();
823 const uint8_t* src_scan = src_span.data();
824 const uint8_t* clip_scan = clip_span.data();
825 int blended_colors[3];
826 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
827 int dest_gap = dest_Bpp - 3;
828 int src_gap = src_Bpp - 3;
830 for (
int col = 0; col < width; col++) {
831 uint8_t src_alpha = *clip_scan++;
832 if (src_alpha == 0) {
833 dest_scan += dest_Bpp;
837 if (bNonseparableBlend) {
838 RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
840 for (
int color = 0; color < 3; color++) {
841 int src_color = *src_scan;
842 int back_color = *dest_scan;
843 int blended = bNonseparableBlend
844 ? blended_colors[color]
845 :
Blend(blend_type
, back_color
, src_color
);
850 dest_scan += dest_gap;
856void CompositeRow_Rgb2Rgb_NoBlend_NoClip(pdfium::span<uint8_t> dest_span,
857 pdfium::span<
const uint8_t> src_span,
861 uint8_t* dest_scan = dest_span.data();
862 const uint8_t* src_scan = src_span.data();
864 if (dest_Bpp == src_Bpp) {
868 for (
int col = 0; col < width; col++) {
870 dest_scan += dest_Bpp;
876void CompositeRow_Rgb2Rgb_NoBlend_Clip(pdfium::span<uint8_t> dest_span,
877 pdfium::span<
const uint8_t> src_span,
881 pdfium::span<
const uint8_t> clip_span) {
882 uint8_t* dest_scan = dest_span.data();
883 const uint8_t* src_scan = src_span.data();
884 const uint8_t* clip_scan = clip_span.data();
886 for (
int col = 0; col < width; col++) {
887 int src_alpha = clip_scan[col];
888 if (src_alpha == 255) {
890 }
else if (src_alpha) {
898 dest_scan += dest_Bpp - 2;
899 src_scan += src_Bpp - 2;
902 dest_scan += dest_Bpp;
908void CompositeRow_8bppPal2Gray(pdfium::span<uint8_t> dest_span,
909 pdfium::span<
const uint8_t> src_span,
910 pdfium::span<
const uint8_t> palette_span,
913 pdfium::span<
const uint8_t> clip_span) {
914 uint8_t* dest_scan = dest_span.data();
915 const uint8_t* src_scan = src_span.data();
916 const uint8_t* clip_scan = clip_span.data();
917 const uint8_t* pPalette = palette_span.data();
920 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
921 for (
int col = 0; col < pixel_count; col++) {
922 uint8_t gray = pPalette[*src_scan];
923 if (bNonseparableBlend) {
926 gray =
Blend(blend_type
, *dest_scan
, gray
);
928 if (clip_scan && clip_scan[col] < 255) {
938 for (
int col = 0; col < pixel_count; col++) {
939 uint8_t gray = pPalette[*src_scan];
940 if (clip_scan && clip_scan[col] < 255)
950void CompositeRow_1bppPal2Gray(pdfium::span<uint8_t> dest_span,
951 pdfium::span<
const uint8_t> src_span,
953 pdfium::span<
const uint8_t> src_palette,
956 pdfium::span<
const uint8_t> clip_span) {
957 uint8_t* dest_scan = dest_span.data();
958 const uint8_t* src_scan = src_span.data();
959 const uint8_t* clip_scan = clip_span.data();
960 int reset_gray = src_palette[0];
961 int set_gray = src_palette[1];
964 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
965 for (
int col = 0; col < pixel_count; col++) {
967 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
970 if (bNonseparableBlend) {
973 gray =
Blend(blend_type
, *dest_scan
, gray
);
975 if (clip_scan && clip_scan[col] < 255) {
984 for (
int col = 0; col < pixel_count; col++) {
986 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
989 if (clip_scan && clip_scan[col] < 255) {
999void CompositeRow_8bppRgb2Rgb_NoBlend(pdfium::span<uint8_t> dest_span,
1000 pdfium::span<
const uint8_t> src_span,
1001 pdfium::span<
const uint32_t> palette_span,
1004 pdfium::span<
const uint8_t> clip_span) {
1005 uint8_t* dest_scan = dest_span.data();
1006 const uint8_t* src_scan = src_span.data();
1007 const uint8_t* clip_scan = clip_span.data();
1008 const uint32_t* pPalette = palette_span.data();
1011 for (
int col = 0; col < pixel_count; col++) {
1012 argb = pPalette[*src_scan];
1016 if (clip_scan && clip_scan[col] < 255) {
1024 *dest_scan++ = src_b;
1025 *dest_scan++ = src_g;
1026 *dest_scan++ = src_r;
1036void CompositeRow_1bppRgb2Rgb_NoBlend(pdfium::span<uint8_t> dest_span,
1037 pdfium::span<
const uint8_t> src_span,
1039 pdfium::span<
const uint32_t> src_palette,
1042 pdfium::span<
const uint8_t> clip_span) {
1043 uint8_t* dest_scan = dest_span.data();
1044 const uint8_t* src_scan = src_span.data();
1045 const uint8_t* clip_scan = clip_span.data();
1046 int reset_r =
FXARGB_R(src_palette[0]);
1047 int reset_g =
FXARGB_G(src_palette[0]);
1048 int reset_b =
FXARGB_B(src_palette[0]);
1049 int set_r =
FXARGB_R(src_palette[1]);
1050 int set_g =
FXARGB_G(src_palette[1]);
1051 int set_b =
FXARGB_B(src_palette[1]);
1053 for (
int col = 0; col < pixel_count; col++) {
1057 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
1066 if (clip_scan && clip_scan[col] < 255) {
1074 *dest_scan++ = src_b;
1075 *dest_scan++ = src_g;
1076 *dest_scan++ = src_r;
1085void CompositeRow_8bppBgr2Bgra_NoBlend(
1086 pdfium::span<uint8_t> dest_span,
1087 pdfium::span<
const uint8_t> src_span,
1089 pdfium::span<
const uint32_t> palette_span,
1090 pdfium::span<
const uint8_t> clip_span) {
1091 uint8_t* dest_scan = dest_span.data();
1092 const uint8_t* src_scan = src_span.data();
1093 const uint8_t* clip_scan = clip_span.data();
1094 const uint32_t* pPalette = palette_span.data();
1096 for (
int col = 0; col < width; col++) {
1097 FX_ARGB argb = pPalette[*src_scan];
1101 if (!clip_scan || clip_scan[col] == 255) {
1102 *dest_scan++ = src_b;
1103 *dest_scan++ = src_g;
1104 *dest_scan++ = src_r;
1109 int src_alpha = clip_scan[col];
1110 if (src_alpha == 0) {
1115 int back_alpha = dest_scan[3];
1116 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1117 dest_scan[3] = dest_alpha;
1118 int alpha_ratio = src_alpha * 255 / dest_alpha;
1131void CompositeRow_1bppBgr2Bgra_NoBlend(pdfium::span<uint8_t> dest_span,
1132 pdfium::span<
const uint8_t> src_span,
1135 pdfium::span<
const uint32_t> src_palette,
1136 pdfium::span<
const uint8_t> clip_span) {
1137 uint8_t* dest_scan = dest_span.data();
1138 const uint8_t* src_scan = src_span.data();
1139 const uint8_t* clip_scan = clip_span.data();
1140 int reset_r =
FXARGB_R(src_palette[0]);
1141 int reset_g =
FXARGB_G(src_palette[0]);
1142 int reset_b =
FXARGB_B(src_palette[0]);
1143 int set_r =
FXARGB_R(src_palette[1]);
1144 int set_g =
FXARGB_G(src_palette[1]);
1145 int set_b =
FXARGB_B(src_palette[1]);
1147 for (
int col = 0; col < width; col++) {
1151 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
1160 if (!clip_scan || clip_scan[col] == 255) {
1161 *dest_scan++ = src_b;
1162 *dest_scan++ = src_g;
1163 *dest_scan++ = src_r;
1167 int src_alpha = clip_scan[col];
1168 if (src_alpha == 0) {
1172 int back_alpha = dest_scan[3];
1173 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1174 dest_scan[3] = dest_alpha;
1175 int alpha_ratio = src_alpha * 255 / dest_alpha;
1187void CompositeRow_ByteMask2Bgra(pdfium::span<uint8_t> dest_span,
1188 pdfium::span<
const uint8_t> src_span,
1195 pdfium::span<
const uint8_t> clip_span) {
1196 uint8_t* dest_scan = dest_span.data();
1198 for (
int col = 0; col < pixel_count; col++) {
1199 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
1200 uint8_t back_alpha = dest_scan[3];
1201 if (back_alpha == 0) {
1206 if (src_alpha == 0) {
1210 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1211 dest_scan[3] = dest_alpha;
1212 int alpha_ratio = src_alpha * 255 / dest_alpha;
1213 if (IsNonSeparableBlendMode(blend_type)) {
1214 int blended_colors[3];
1215 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
1216 static_cast<uint8_t>(src_g),
1217 static_cast<uint8_t>(src_r)};
1218 RGB_Blend(blend_type, scan, dest_scan, blended_colors);
1228 int blended =
Blend(blend_type
, *dest_scan
, src_b
);
1232 blended =
Blend(blend_type
, *dest_scan
, src_g
);
1236 blended =
Blend(blend_type
, *dest_scan
, src_r
);
1251void CompositeRow_ByteMask2Rgb(pdfium::span<uint8_t> dest_span,
1252 pdfium::span<
const uint8_t> src_span,
1260 pdfium::span<
const uint8_t> clip_span) {
1261 uint8_t* dest_scan = dest_span.data();
1263 for (
int col = 0; col < pixel_count; col++) {
1264 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
1265 if (src_alpha == 0) {
1269 if (IsNonSeparableBlendMode(blend_type)) {
1270 int blended_colors[3];
1271 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
1272 static_cast<uint8_t>(src_g),
1273 static_cast<uint8_t>(src_r)};
1274 RGB_Blend(blend_type, scan, dest_scan, blended_colors);
1284 int blended =
Blend(blend_type
, *dest_scan
, src_b
);
1287 blended =
Blend(blend_type
, *dest_scan
, src_g
);
1290 blended =
Blend(blend_type
, *dest_scan
, src_r
);
1299 dest_scan += Bpp - 2;
1304void CompositeRow_ByteMask2Mask(pdfium::span<uint8_t> dest_span,
1305 pdfium::span<
const uint8_t> src_span,
1308 pdfium::span<
const uint8_t> clip_span) {
1309 uint8_t* dest_scan = dest_span.data();
1310 for (
int col = 0; col < pixel_count; col++) {
1311 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
1312 uint8_t back_alpha = *dest_scan;
1314 *dest_scan = src_alpha;
1315 }
else if (src_alpha) {
1316 *dest_scan = AlphaUnion(back_alpha, src_alpha);
1322void CompositeRow_ByteMask2Gray(pdfium::span<uint8_t> dest_span,
1323 pdfium::span<
const uint8_t> src_span,
1327 pdfium::span<
const uint8_t> clip_span) {
1328 uint8_t* dest_scan = dest_span.data();
1329 for (
int col = 0; col < pixel_count; col++) {
1330 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
1338void CompositeRow_BitMask2Bgra(pdfium::span<uint8_t> dest_span,
1339 pdfium::span<
const uint8_t> src_span,
1347 pdfium::span<
const uint8_t> clip_span) {
1348 uint8_t* dest_scan = dest_span.data();
1349 const uint8_t* src_scan = src_span.data();
1350 const uint8_t* clip_scan = clip_span.data();
1354 for (
int col = 0; col < pixel_count; col++) {
1355 if (src_scan[(src_left + col) / 8] &
1356 (1 << (7 - (src_left + col) % 8))) {
1363 for (
int col = 0; col < pixel_count; col++) {
1364 if (!(src_scan[(src_left + col) / 8] &
1365 (1 << (7 - (src_left + col) % 8)))) {
1369 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
1370 uint8_t back_alpha = dest_scan[3];
1371 if (back_alpha == 0) {
1376 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1377 dest_scan[3] = dest_alpha;
1378 int alpha_ratio = src_alpha * 255 / dest_alpha;
1379 if (IsNonSeparableBlendMode(blend_type)) {
1380 int blended_colors[3];
1381 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
1382 static_cast<uint8_t>(src_g),
1383 static_cast<uint8_t>(src_r)};
1384 RGB_Blend(blend_type, scan, dest_scan, blended_colors);
1394 int blended =
Blend(blend_type
, *dest_scan
, src_b
);
1398 blended =
Blend(blend_type
, *dest_scan
, src_g
);
1402 blended =
Blend(blend_type
, *dest_scan
, src_r
);
1417void CompositeRow_BitMask2Rgb(pdfium::span<uint8_t> dest_span,
1418 pdfium::span<
const uint8_t> src_span,
1427 pdfium::span<
const uint8_t> clip_span) {
1428 uint8_t* dest_scan = dest_span.data();
1429 const uint8_t* src_scan = src_span.data();
1430 const uint8_t* clip_scan = clip_span.data();
1433 for (
int col = 0; col < pixel_count; col++) {
1434 if (src_scan[(src_left + col) / 8] &
1435 (1 << (7 - (src_left + col) % 8))) {
1436 dest_scan[2] = src_r;
1437 dest_scan[1] = src_g;
1438 dest_scan[0] = src_b;
1444 for (
int col = 0; col < pixel_count; col++) {
1445 if (!(src_scan[(src_left + col) / 8] &
1446 (1 << (7 - (src_left + col) % 8)))) {
1450 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
1451 if (src_alpha == 0) {
1455 if (IsNonSeparableBlendMode(blend_type)) {
1456 int blended_colors[3];
1457 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
1458 static_cast<uint8_t>(src_g),
1459 static_cast<uint8_t>(src_r)};
1460 RGB_Blend(blend_type, scan, dest_scan, blended_colors);
1470 int blended =
Blend(blend_type
, *dest_scan
, src_b
);
1473 blended =
Blend(blend_type
, *dest_scan
, src_g
);
1476 blended =
Blend(blend_type
, *dest_scan
, src_r
);
1485 dest_scan += Bpp - 2;
1490void CompositeRow_BitMask2Mask(pdfium::span<uint8_t> dest_span,
1491 pdfium::span<
const uint8_t> src_span,
1495 pdfium::span<
const uint8_t> clip_span) {
1496 uint8_t* dest_scan = dest_span.data();
1497 const uint8_t* src_scan = src_span.data();
1498 const uint8_t* clip_scan = clip_span.data();
1500 for (
int col = 0; col < pixel_count; col++) {
1501 if (!(src_scan[(src_left + col) / 8] &
1502 (1 << (7 - (src_left + col) % 8)))) {
1506 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
1507 uint8_t back_alpha = *dest_scan;
1509 *dest_scan = src_alpha;
1510 }
else if (src_alpha) {
1511 *dest_scan = AlphaUnion(back_alpha, src_alpha);
1518void CompositeRow_BitMask2Gray(pdfium::span<uint8_t> dest_span,
1519 pdfium::span<
const uint8_t> src_span,
1524 pdfium::span<
const uint8_t> clip_span) {
1525 uint8_t* dest_scan = dest_span.data();
1526 const uint8_t* src_scan = src_span.data();
1527 const uint8_t* clip_scan = clip_span.data();
1529 for (
int col = 0; col < pixel_count; col++) {
1530 if (!(src_scan[(src_left + col) / 8] &
1531 (1 << (7 - (src_left + col) % 8)))) {
1535 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
1544void CompositeRow_Bgr2Bgra_Blend_NoClip_RgbByteOrder(
1545 pdfium::span<uint8_t> dest_span,
1546 pdfium::span<
const uint8_t> src_span,
1550 uint8_t* dest_scan = dest_span.data();
1551 const uint8_t* src_scan = src_span.data();
1552 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
1553 int src_gap = src_Bpp - 3;
1554 int blended_colors[3];
1556 for (
int col = 0; col < width; col++) {
1557 uint8_t back_alpha = dest_scan[3];
1558 if (back_alpha == 0) {
1568 src_scan += src_Bpp;
1571 dest_scan[3] = 0xff;
1572 if (bNonseparableBlend) {
1573 uint8_t dest_scan_o[3];
1575 RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
1577 for (
int color = 0; color < 3; color++) {
1578 int index = 2 - color;
1579 int src_color = *src_scan;
1580 int blended = bNonseparableBlend
1581 ? blended_colors[color]
1582 :
Blend(blend_type
, dest_scan[index]
, src_color
);
1587 src_scan += src_gap;
1592void CompositeRow_Bgr2Bgra_NoBlend_NoClip_RgbByteOrder(
1593 pdfium::span<uint8_t> dest_span,
1594 pdfium::span<
const uint8_t> src_span,
1597 uint8_t* dest_scan = dest_span.data();
1598 const uint8_t* src_scan = src_span.data();
1600 for (
int col = 0; col < width; col++) {
1608 src_scan += src_Bpp;
1613void CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(
1614 pdfium::span<uint8_t> dest_span,
1615 pdfium::span<
const uint8_t> src_span,
1620 int blended_colors[3];
1621 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
1622 uint8_t* dest_scan = dest_span.data();
1623 const uint8_t* src_scan = src_span.data();
1624 int src_gap = src_Bpp - 3;
1626 for (
int col = 0; col < width; col++) {
1627 if (bNonseparableBlend) {
1628 uint8_t dest_scan_o[3];
1630 RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
1632 for (
int color = 0; color < 3; color++) {
1633 int index = 2 - color;
1634 int back_color = dest_scan[index];
1635 int src_color = *src_scan;
1636 int blended = bNonseparableBlend
1637 ? blended_colors[color]
1638 :
Blend(blend_type
, back_color
, src_color
);
1639 dest_scan[index] = blended;
1642 dest_scan += dest_Bpp;
1643 src_scan += src_gap;
1648void CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(
1649 pdfium::span<uint8_t> dest_span,
1650 pdfium::span<
const uint8_t> src_span,
1654 uint8_t* dest_scan = dest_span.data();
1655 const uint8_t* src_scan = src_span.data();
1657 for (
int col = 0; col < width; col++) {
1659 dest_scan += dest_Bpp;
1660 src_scan += src_Bpp;
1665void CompositeRow_Bgr2Bgra_Blend_Clip_RgbByteOrder(
1666 pdfium::span<uint8_t> dest_span,
1667 pdfium::span<
const uint8_t> src_span,
1671 pdfium::span<
const uint8_t> clip_span) {
1672 uint8_t* dest_scan = dest_span.data();
1673 const uint8_t* src_scan = src_span.data();
1674 const uint8_t* clip_scan = clip_span.data();
1675 int blended_colors[3];
1676 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
1677 int src_gap = src_Bpp - 3;
1679 for (
int col = 0; col < width; col++) {
1680 int src_alpha = *clip_scan++;
1681 uint8_t back_alpha = dest_scan[3];
1682 if (back_alpha == 0) {
1684 src_scan += src_Bpp;
1688 if (src_alpha == 0) {
1690 src_scan += src_Bpp;
1693 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1694 dest_scan[3] = dest_alpha;
1695 int alpha_ratio = src_alpha * 255 / dest_alpha;
1696 if (bNonseparableBlend) {
1697 uint8_t dest_scan_o[3];
1699 RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
1701 for (
int color = 0; color < 3; color++) {
1702 int index = 2 - color;
1703 int src_color = *src_scan;
1704 int blended = bNonseparableBlend
1705 ? blended_colors[color]
1706 :
Blend(blend_type
, dest_scan[index]
, src_color
);
1713 src_scan += src_gap;
1718void CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(
1719 pdfium::span<uint8_t> dest_span,
1720 pdfium::span<
const uint8_t> src_span,
1725 pdfium::span<
const uint8_t> clip_span) {
1726 uint8_t* dest_scan = dest_span.data();
1727 const uint8_t* src_scan = src_span.data();
1728 const uint8_t* clip_scan = clip_span.data();
1729 int blended_colors[3];
1730 bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
1731 int src_gap = src_Bpp - 3;
1733 for (
int col = 0; col < width; col++) {
1734 uint8_t src_alpha = *clip_scan++;
1735 if (src_alpha == 0) {
1736 dest_scan += dest_Bpp;
1737 src_scan += src_Bpp;
1740 if (bNonseparableBlend) {
1741 uint8_t dest_scan_o[3];
1743 RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
1745 for (
int color = 0; color < 3; color++) {
1746 int index = 2 - color;
1747 int src_color = *src_scan;
1748 int back_color = dest_scan[index];
1749 int blended = bNonseparableBlend
1750 ? blended_colors[color]
1751 :
Blend(blend_type
, back_color
, src_color
);
1755 dest_scan += dest_Bpp;
1756 src_scan += src_gap;
1761void CompositeRow_Bgr2Bgra_NoBlend_Clip_RgbByteOrder(
1762 pdfium::span<uint8_t> dest_span,
1763 pdfium::span<
const uint8_t> src_span,
1766 pdfium::span<
const uint8_t> clip_span) {
1767 uint8_t* dest_scan = dest_span.data();
1768 const uint8_t* src_scan = src_span.data();
1769 const uint8_t* clip_scan = clip_span.data();
1770 int src_gap = src_Bpp - 3;
1772 for (
int col = 0; col < width; col++) {
1773 int src_alpha = clip_scan[col];
1774 if (src_alpha == 255) {
1778 src_scan += src_Bpp;
1781 if (src_alpha == 0) {
1783 src_scan += src_Bpp;
1786 int back_alpha = dest_scan[3];
1787 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1788 dest_scan[3] = dest_alpha;
1789 int alpha_ratio = src_alpha * 255 / dest_alpha;
1790 for (
int color = 0; color < 3; color++) {
1791 int index = 2 - color;
1797 src_scan += src_gap;
1802void CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(
1803 pdfium::span<uint8_t> dest_span,
1804 pdfium::span<
const uint8_t> src_span,
1808 pdfium::span<
const uint8_t> clip_span) {
1809 uint8_t* dest_scan = dest_span.data();
1810 const uint8_t* src_scan = src_span.data();
1811 const uint8_t* clip_scan = clip_span.data();
1813 for (
int col = 0; col < width; col++) {
1814 int src_alpha = clip_scan[col];
1815 if (src_alpha == 255) {
1817 }
else if (src_alpha) {
1823 dest_scan += dest_Bpp;
1824 src_scan += src_Bpp - 2;
1827 dest_scan += dest_Bpp;
1828 src_scan += src_Bpp;
1833void CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(
1834 pdfium::span<uint8_t> dest_span,
1835 pdfium::span<
const uint8_t> src_span,
1839 pdfium::span<
const uint8_t> clip_span) {
1840 uint8_t* dest_scan = dest_span.data();
1841 const uint8_t* src_scan = src_span.data();
1842 const uint8_t* clip_scan = clip_span.data();
1844 for (
int col = 0; col < pixel_count; col++) {
1845 FX_ARGB argb = pPalette ? pPalette[*src_scan]
1850 if (clip_scan && clip_scan[col] < 255) {
1855 dest_scan[2] = src_b;
1856 dest_scan[1] = src_g;
1857 dest_scan[0] = src_r;
1859 dest_scan += DestBpp;
1865void CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(
1866 pdfium::span<uint8_t> dest_span,
1867 pdfium::span<
const uint8_t> src_span,
1869 pdfium::span<
const FX_ARGB> src_palette,
1872 pdfium::span<
const uint8_t> clip_span) {
1873 uint8_t* dest_scan = dest_span.data();
1874 const uint8_t* src_scan = src_span.data();
1875 const uint8_t* clip_scan = clip_span.data();
1882 if (!src_palette.empty()) {
1883 reset_r =
FXARGB_R(src_palette[0]);
1884 reset_g =
FXARGB_G(src_palette[0]);
1885 reset_b =
FXARGB_B(src_palette[0]);
1890 reset_r = reset_g = reset_b = 0;
1891 set_r = set_g = set_b = 255;
1894 for (
int col = 0; col < pixel_count; col++) {
1898 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
1907 if (clip_scan && clip_scan[col] < 255) {
1912 dest_scan[2] = src_b;
1913 dest_scan[1] = src_g;
1914 dest_scan[0] = src_r;
1916 dest_scan += DestBpp;
1921void CompositeRow_8bppBgr2Bgra_NoBlend_RgbByteOrder(
1922 pdfium::span<uint8_t> dest_span,
1923 pdfium::span<
const uint8_t> src_span,
1926 pdfium::span<
const uint8_t> clip_span) {
1927 uint8_t* dest_scan = dest_span.data();
1928 const uint8_t* src_scan = src_span.data();
1929 const uint8_t* clip_scan = clip_span.data();
1931 for (
int col = 0; col < width; col++) {
1936 FX_ARGB argb = pPalette[*src_scan];
1941 src_r = src_g = src_b = *src_scan;
1943 if (!clip_scan || clip_scan[col] == 255) {
1944 dest_scan[2] = src_b;
1945 dest_scan[1] = src_g;
1946 dest_scan[0] = src_r;
1952 int src_alpha = clip_scan[col];
1953 if (src_alpha == 0) {
1958 int back_alpha = dest_scan[3];
1959 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
1960 dest_scan[3] = dest_alpha;
1961 int alpha_ratio = src_alpha * 255 / dest_alpha;
1971void CompositeRow_1bppBgr2Bgra_NoBlend_RgbByteOrder(
1972 pdfium::span<uint8_t> dest_span,
1973 pdfium::span<
const uint8_t> src_span,
1976 pdfium::span<
const FX_ARGB> src_palette,
1977 pdfium::span<
const uint8_t> clip_span) {
1978 uint8_t* dest_scan = dest_span.data();
1979 const uint8_t* src_scan = src_span.data();
1980 const uint8_t* clip_scan = clip_span.data();
1987 if (!src_palette.empty()) {
1988 reset_r =
FXARGB_R(src_palette[0]);
1989 reset_g =
FXARGB_G(src_palette[0]);
1990 reset_b =
FXARGB_B(src_palette[0]);
1995 reset_r = reset_g = reset_b = 0;
1996 set_r = set_g = set_b = 255;
1999 for (
int col = 0; col < width; col++) {
2003 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
2012 if (!clip_scan || clip_scan[col] == 255) {
2013 dest_scan[2] = src_b;
2014 dest_scan[1] = src_g;
2015 dest_scan[0] = src_r;
2020 int src_alpha = clip_scan[col];
2021 if (src_alpha == 0) {
2025 int back_alpha = dest_scan[3];
2026 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
2027 dest_scan[3] = dest_alpha;
2028 int alpha_ratio = src_alpha * 255 / dest_alpha;
2037void CompositeRow_ByteMask2Bgra_RgbByteOrder(
2038 pdfium::span<uint8_t> dest_span,
2039 pdfium::span<
const uint8_t> src_span,
2046 pdfium::span<
const uint8_t> clip_span) {
2047 uint8_t* dest_scan = dest_span.data();
2049 for (
int col = 0; col < pixel_count; col++) {
2050 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
2051 uint8_t back_alpha = dest_scan[3];
2052 if (back_alpha == 0) {
2058 if (src_alpha == 0) {
2062 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
2063 dest_scan[3] = dest_alpha;
2064 int alpha_ratio = src_alpha * 255 / dest_alpha;
2065 if (IsNonSeparableBlendMode(blend_type)) {
2066 int blended_colors[3];
2067 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
2068 static_cast<uint8_t>(src_g),
2069 static_cast<uint8_t>(src_r)};
2070 uint8_t dest_scan_o[3];
2072 RGB_Blend(blend_type, scan, dest_scan_o, blended_colors);
2080 int blended =
Blend(blend_type
, dest_scan[2]
, src_b
);
2083 blended =
Blend(blend_type
, dest_scan[1]
, src_g
);
2086 blended =
Blend(blend_type
, dest_scan[0]
, src_r
);
2099void CompositeRow_ByteMask2Rgb_RgbByteOrder(
2100 pdfium::span<uint8_t> dest_span,
2101 pdfium::span<
const uint8_t> src_span,
2109 pdfium::span<
const uint8_t> clip_span) {
2110 uint8_t* dest_scan = dest_span.data();
2112 for (
int col = 0; col < pixel_count; col++) {
2113 int src_alpha = GetAlphaWithSrc(mask_alpha, clip_span, src_span, col);
2114 if (src_alpha == 0) {
2118 if (IsNonSeparableBlendMode(blend_type)) {
2119 int blended_colors[3];
2120 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
2121 static_cast<uint8_t>(src_g),
2122 static_cast<uint8_t>(src_r)};
2123 uint8_t dest_scan_o[3];
2125 RGB_Blend(blend_type, scan, dest_scan_o, blended_colors);
2133 int blended =
Blend(blend_type
, dest_scan[2]
, src_b
);
2135 blended =
Blend(blend_type
, dest_scan[1]
, src_g
);
2137 blended =
Blend(blend_type
, dest_scan[0]
, src_r
);
2149void CompositeRow_BitMask2Bgra_RgbByteOrder(
2150 pdfium::span<uint8_t> dest_span,
2151 pdfium::span<
const uint8_t> src_span,
2159 pdfium::span<
const uint8_t> clip_span) {
2160 uint8_t* dest_scan = dest_span.data();
2161 const uint8_t* src_scan = src_span.data();
2162 const uint8_t* clip_scan = clip_span.data();
2166 for (
int col = 0; col < pixel_count; col++) {
2167 if (src_scan[(src_left + col) / 8] &
2168 (1 << (7 - (src_left + col) % 8))) {
2175 for (
int col = 0; col < pixel_count; col++) {
2176 if (!(src_scan[(src_left + col) / 8] &
2177 (1 << (7 - (src_left + col) % 8)))) {
2181 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
2182 uint8_t back_alpha = dest_scan[3];
2183 if (back_alpha == 0) {
2189 uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
2190 dest_scan[3] = dest_alpha;
2191 int alpha_ratio = src_alpha * 255 / dest_alpha;
2192 if (IsNonSeparableBlendMode(blend_type)) {
2193 int blended_colors[3];
2194 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
2195 static_cast<uint8_t>(src_g),
2196 static_cast<uint8_t>(src_r)};
2197 uint8_t dest_scan_o[3];
2199 RGB_Blend(blend_type, scan, dest_scan_o, blended_colors);
2207 int blended =
Blend(blend_type
, dest_scan[2]
, src_b
);
2210 blended =
Blend(blend_type
, dest_scan[1]
, src_g
);
2213 blended =
Blend(blend_type
, dest_scan[0]
, src_r
);
2226void CompositeRow_BitMask2Rgb_RgbByteOrder(
2227 pdfium::span<uint8_t> dest_span,
2228 pdfium::span<
const uint8_t> src_span,
2237 pdfium::span<
const uint8_t> clip_span) {
2238 uint8_t* dest_scan = dest_span.data();
2239 const uint8_t* src_scan = src_span.data();
2240 const uint8_t* clip_scan = clip_span.data();
2243 for (
int col = 0; col < pixel_count; col++) {
2244 if (src_scan[(src_left + col) / 8] &
2245 (1 << (7 - (src_left + col) % 8))) {
2246 dest_scan[2] = src_b;
2247 dest_scan[1] = src_g;
2248 dest_scan[0] = src_r;
2254 for (
int col = 0; col < pixel_count; col++) {
2255 if (!(src_scan[(src_left + col) / 8] &
2256 (1 << (7 - (src_left + col) % 8)))) {
2260 int src_alpha = GetAlpha(mask_alpha, clip_scan, col);
2261 if (src_alpha == 0) {
2265 if (IsNonSeparableBlendMode(blend_type)) {
2266 int blended_colors[3];
2267 uint8_t scan[3] = {
static_cast<uint8_t>(src_b),
2268 static_cast<uint8_t>(src_g),
2269 static_cast<uint8_t>(src_r)};
2270 uint8_t dest_scan_o[3];
2272 RGB_Blend(blend_type, scan, dest_scan_o, blended_colors);
2280 int back_color = dest_scan[2];
2281 int blended =
Blend(blend_type
, back_color
, src_b
);
2283 back_color = dest_scan[1];
2284 blended =
Blend(blend_type
, back_color
, src_g
);
2286 back_color = dest_scan[0];
2287 blended =
Blend(blend_type
, back_color
, src_r
);
2307 pdfium::span<
const uint32_t> src_palette,
2308 uint32_t mask_color,
2310 bool bRgbByteOrder) {
2311 m_SrcFormat = src_format;
2312 m_DestFormat = dest_format;
2313 m_BlendType = blend_type;
2314 m_bRgbByteOrder = bRgbByteOrder;
2328 InitSourceMask(mask_color);
2334 InitSourcePalette(src_palette);
2340 m_MaskAlpha =
FXARGB_A(mask_color);
2342 m_MaskGreen =
FXARGB_G(mask_color);
2348 m_MaskRed =
FXRGB2GRAY(m_MaskRed, m_MaskGreen, m_MaskBlue);
2352 pdfium::span<
const uint32_t> src_palette) {
2355 m_SrcPalette.Reset();
2357 const size_t pal_count =
static_cast<size_t>(1)
2360 if (!src_palette.empty()) {
2362 pdfium::span<uint8_t> gray_pal = m_SrcPalette.Make8BitPalette(pal_count);
2363 for (size_t i = 0; i < pal_count; ++i) {
2364 FX_ARGB argb = src_palette[i];
2370 pdfium::span<uint32_t> pPalette = m_SrcPalette.Make32BitPalette(pal_count);
2371 fxcrt::Copy(src_palette.first(pal_count), pPalette);
2375 pdfium::span<uint8_t> gray_pal = m_SrcPalette.Make8BitPalette(pal_count);
2376 if (pal_count == 2) {
2380 for (size_t i = 0; i < pal_count; ++i)
2385 pdfium::span<uint32_t> pPalette = m_SrcPalette.Make32BitPalette(pal_count);
2386 if (pal_count == 2) {
2387 pPalette[0] = 0xff000000;
2388 pPalette[1] = 0xffffffff;
2390 for (size_t i = 0; i < pal_count; ++i) {
2391 uint32_t v =
static_cast<uint32_t>(i);
2398 pdfium::span<uint8_t> dest_scan,
2399 pdfium::span<
const uint8_t> src_scan,
2401 pdfium::span<
const uint8_t> clip_scan)
const {
2403 CompositeRgbBitmapLineSrcBgrx(dest_scan, src_scan, width, clip_scan);
2406#if defined(PDF_USE_SKIA)
2407 if (m_SrcFormat == FXDIB_Format::kBgraPremul) {
2408 CHECK(clip_scan.empty());
2409 CompositeRgbBitmapLineSrcBgraPremul(dest_scan, src_scan, width);
2413 CompositeRgbBitmapLineSrcBgra(dest_scan, src_scan, width, clip_scan);
2417 pdfium::span<uint8_t> dest_scan,
2418 pdfium::span<
const uint8_t> src_scan,
2420 pdfium::span<
const uint8_t> clip_scan)
const {
2425 switch (m_DestFormat) {
2432 CHECK(!m_bRgbByteOrder);
2433 CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType,
2438 CHECK(!m_bRgbByteOrder);
2439 CompositeRow_Rgb2Mask(dest_scan, width, clip_scan);
2445 if (m_bRgbByteOrder) {
2447 if (!clip_scan.empty()) {
2448 CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(
2449 dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
2452 CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(
2453 dest_scan, src_scan, width, dest_Bpp, src_Bpp);
2456 if (!clip_scan.empty()) {
2457 CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(
2458 dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
2462 CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(
2463 dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
2468 if (!clip_scan.empty()) {
2469 CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width,
2470 dest_Bpp, src_Bpp, clip_scan);
2473 CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width,
2477 if (!clip_scan.empty()) {
2478 CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType,
2479 dest_Bpp, src_Bpp, clip_scan);
2482 CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType,
2487 if (m_bRgbByteOrder) {
2489 if (!clip_scan.empty()) {
2490 CompositeRow_Bgr2Bgra_NoBlend_Clip_RgbByteOrder(
2491 dest_scan, src_scan, width, src_Bpp, clip_scan);
2494 CompositeRow_Bgr2Bgra_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan,
2498 if (!clip_scan.empty()) {
2499 CompositeRow_Bgr2Bgra_Blend_Clip_RgbByteOrder(
2500 dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
2503 CompositeRow_Bgr2Bgra_Blend_NoClip_RgbByteOrder(
2504 dest_scan, src_scan, width, m_BlendType, src_Bpp);
2509 if (!clip_scan.empty()) {
2510 CompositeRow_Bgr2Bgra_NoBlend_Clip(dest_scan, src_scan, width,
2511 src_Bpp, clip_scan);
2514 CompositeRow_Bgr2Bgra_NoBlend_NoClip(dest_scan, src_scan, width,
2518 if (!clip_scan.empty()) {
2519 CompositeRow_Bgr2Bgra_Blend_Clip(dest_scan, src_scan, width,
2520 m_BlendType, src_Bpp, clip_scan);
2523 CompositeRow_Bgr2Bgra_Blend_NoClip(dest_scan, src_scan, width,
2524 m_BlendType, src_Bpp);
2527#if defined(PDF_USE_SKIA)
2528 case FXDIB_Format::kBgraPremul: {
2531 NOTREACHED_NORETURN();
2538 pdfium::span<uint8_t> dest_scan,
2539 pdfium::span<
const uint8_t> src_scan,
2541 pdfium::span<
const uint8_t> clip_scan)
const {
2548 switch (m_DestFormat) {
2555 CHECK(!m_bRgbByteOrder);
2556 CompositeRowBgra2Gray(src_span, clip_scan, dest_scan, m_BlendType);
2560 CHECK(!m_bRgbByteOrder);
2561 CompositeRowBgra2Mask(src_span, clip_scan, dest_scan);
2565 if (m_bRgbByteOrder) {
2568 CompositeRowBgra2Bgr(src_span, clip_scan, dest_span, m_BlendType);
2574 CompositeRowBgra2Bgr(src_span, clip_scan, dest_span, m_BlendType);
2578 if (m_bRgbByteOrder) {
2581 CompositeRowBgra2Bgr(src_span, clip_scan, dest_span, m_BlendType);
2587 CompositeRowBgra2Bgr(src_span, clip_scan, dest_span, m_BlendType);
2591 if (m_bRgbByteOrder) {
2594 CompositeRowBgra2Bgra(src_span, clip_scan, dest_span, m_BlendType);
2599 CompositeRowBgra2Bgra(src_span, clip_scan, dest_span, m_BlendType);
2602#if defined(PDF_USE_SKIA)
2603 case FXDIB_Format::kBgraPremul: {
2606 NOTREACHED_NORETURN();
2612#if defined(PDF_USE_SKIA)
2613void CFX_ScanlineCompositor::CompositeRgbBitmapLineSrcBgraPremul(
2614 pdfium::span<uint8_t> dest_scan,
2615 pdfium::span<
const uint8_t> src_scan,
2617 CHECK_EQ(m_SrcFormat, FXDIB_Format::kBgraPremul);
2620 fxcrt::reinterpret_span<
const FX_BGRA_STRUCT<uint8_t>>(src_scan).first(
2623 switch (m_DestFormat) {
2624 case FXDIB_Format::kInvalid:
2625 case FXDIB_Format::k1bppRgb:
2626 case FXDIB_Format::k1bppMask: {
2627 NOTREACHED_NORETURN();
2629 case FXDIB_Format::k8bppRgb: {
2630 CHECK(!m_bRgbByteOrder);
2632 NOTREACHED_NORETURN();
2634 case FXDIB_Format::k8bppMask: {
2635 CHECK(!m_bRgbByteOrder);
2637 NOTREACHED_NORETURN();
2639 case FXDIB_Format::kBgr:
2640 case FXDIB_Format::kBgrx:
2641 case FXDIB_Format::kBgra: {
2643 NOTREACHED_NORETURN();
2645 case FXDIB_Format::kBgraPremul: {
2646 if (m_bRgbByteOrder) {
2648 fxcrt::reinterpret_span<FX_RGBA_STRUCT<uint8_t>>(dest_scan);
2649 CompositeRowBgraPremul2BgraPremul(src_span, dest_span, m_BlendType);
2653 fxcrt::reinterpret_span<FX_BGRA_STRUCT<uint8_t>>(dest_scan);
2654 CompositeRowBgraPremul2BgraPremul(src_span, dest_span, m_BlendType);
2662 pdfium::span<uint8_t> dest_scan,
2663 pdfium::span<
const uint8_t> src_scan,
2666 pdfium::span<
const uint8_t> clip_scan)
const {
2668 CompositePalBitmapLineSrcBpp1(dest_scan, src_scan, src_left, width,
2672 CompositePalBitmapLineSrcBpp8(dest_scan, src_scan, src_left, width,
2677 pdfium::span<uint8_t> dest_scan,
2678 pdfium::span<
const uint8_t> src_scan,
2681 pdfium::span<
const uint8_t> clip_scan)
const {
2684 switch (m_DestFormat) {
2691 CHECK(!m_bRgbByteOrder);
2692 CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left,
2693 m_SrcPalette.Get8BitPalette(), width,
2694 m_BlendType, clip_scan);
2698 CHECK(!m_bRgbByteOrder);
2699 CompositeRow_Rgb2Mask(dest_scan, width, clip_scan);
2704 if (m_bRgbByteOrder) {
2705 CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(
2706 dest_scan, src_scan, src_left, m_SrcPalette.Get32BitPalette(),
2707 width, GetCompsFromFormat(m_DestFormat), clip_scan);
2710 CompositeRow_1bppRgb2Rgb_NoBlend(
2711 dest_scan, src_scan, src_left, m_SrcPalette.Get32BitPalette(), width,
2712 GetCompsFromFormat(m_DestFormat), clip_scan);
2716 if (m_bRgbByteOrder) {
2717 CompositeRow_1bppBgr2Bgra_NoBlend_RgbByteOrder(
2718 dest_scan, src_scan, src_left, width,
2719 m_SrcPalette.Get32BitPalette(), clip_scan);
2722 CompositeRow_1bppBgr2Bgra_NoBlend(dest_scan, src_scan, src_left, width,
2723 m_SrcPalette.Get32BitPalette(),
2727#if defined(PDF_USE_SKIA)
2728 case FXDIB_Format::kBgraPremul: {
2731 NOTREACHED_NORETURN();
2738 pdfium::span<uint8_t> dest_scan,
2739 pdfium::span<
const uint8_t> src_scan,
2742 pdfium::span<
const uint8_t> clip_scan)
const {
2745 switch (m_DestFormat) {
2752 CHECK(!m_bRgbByteOrder);
2753 CompositeRow_8bppPal2Gray(dest_scan, src_scan,
2754 m_SrcPalette.Get8BitPalette(), width,
2755 m_BlendType, clip_scan);
2759 CHECK(!m_bRgbByteOrder);
2760 CompositeRow_Rgb2Mask(dest_scan, width, clip_scan);
2765 if (m_bRgbByteOrder) {
2766 CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(
2767 dest_scan, src_scan, m_SrcPalette.Get32BitPalette().data(), width,
2768 GetCompsFromFormat(m_DestFormat), clip_scan);
2771 CompositeRow_8bppRgb2Rgb_NoBlend(
2772 dest_scan, src_scan, m_SrcPalette.Get32BitPalette(), width,
2773 GetCompsFromFormat(m_DestFormat), clip_scan);
2777 if (m_bRgbByteOrder) {
2778 CompositeRow_8bppBgr2Bgra_NoBlend_RgbByteOrder(
2779 dest_scan, src_scan, width, m_SrcPalette.Get32BitPalette().data(),
2783 CompositeRow_8bppBgr2Bgra_NoBlend(dest_scan, src_scan, width,
2784 m_SrcPalette.Get32BitPalette(),
2788#if defined(PDF_USE_SKIA)
2789 case FXDIB_Format::kBgraPremul: {
2792 NOTREACHED_NORETURN();
2799 pdfium::span<uint8_t> dest_scan,
2800 pdfium::span<
const uint8_t> src_scan,
2802 pdfium::span<
const uint8_t> clip_scan)
const {
2805 switch (m_DestFormat) {
2812 CHECK(!m_bRgbByteOrder);
2813 CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2818 CHECK(!m_bRgbByteOrder);
2819 CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width,
2825 if (m_bRgbByteOrder) {
2826 CompositeRow_ByteMask2Rgb_RgbByteOrder(
2827 dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen,
2832 CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2833 m_MaskGreen, m_MaskBlue, width, m_BlendType,
2838 if (m_bRgbByteOrder) {
2839 CompositeRow_ByteMask2Bgra_RgbByteOrder(
2840 dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen,
2841 m_MaskBlue, width, m_BlendType, clip_scan);
2844 CompositeRow_ByteMask2Bgra(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2845 m_MaskGreen, m_MaskBlue, width, m_BlendType,
2849#if defined(PDF_USE_SKIA)
2850 case FXDIB_Format::kBgraPremul: {
2853 NOTREACHED_NORETURN();
2860 pdfium::span<uint8_t> dest_scan,
2861 pdfium::span<
const uint8_t> src_scan,
2864 pdfium::span<
const uint8_t> clip_scan)
const {
2867 switch (m_DestFormat) {
2874 CHECK(!m_bRgbByteOrder);
2875 CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2876 src_left, width, clip_scan);
2880 CHECK(!m_bRgbByteOrder);
2881 CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left,
2887 if (m_bRgbByteOrder) {
2888 CompositeRow_BitMask2Rgb_RgbByteOrder(
2889 dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen,
2890 m_MaskBlue, src_left, width, m_BlendType,
2894 CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2895 m_MaskGreen, m_MaskBlue, src_left, width,
2901 if (m_bRgbByteOrder) {
2902 CompositeRow_BitMask2Bgra_RgbByteOrder(
2903 dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen,
2904 m_MaskBlue, src_left, width, m_BlendType, clip_scan);
2907 CompositeRow_BitMask2Bgra(dest_scan, src_scan, m_MaskAlpha, m_MaskRed,
2908 m_MaskGreen, m_MaskBlue, src_left, width,
2909 m_BlendType, clip_scan);
2912#if defined(PDF_USE_SKIA)
2913 case FXDIB_Format::kBgraPremul: {
2916 NOTREACHED_NORETURN();
2934 m_Width =
sizeof(uint8_t);
2935 m_nElements = nElements;
2936 m_pData.reset(
reinterpret_cast<uint32_t*>(FX_Alloc(uint8_t, m_nElements)));
2939 reinterpret_cast<uint8_t*>(m_pData.get()), m_nElements));
2944 m_Width =
sizeof(uint32_t);
2945 m_nElements = nElements;
2946 m_pData.reset(FX_Alloc(uint32_t, m_nElements));
2948 return UNSAFE_BUFFERS(pdfium::make_span(m_pData.get(), m_nElements));
2953 CHECK(!m_pData || m_Width ==
sizeof(uint8_t));
2957 reinterpret_cast<
const uint8_t*>(m_pData.get()), m_nElements));
2962 CHECK(!m_pData || m_Width ==
sizeof(uint32_t));
2965 return UNSAFE_BUFFERS(pdfium::make_span(m_pData.get(), m_nElements));
void CompositeByteMaskLine(pdfium::span< uint8_t > dest_scan, pdfium::span< const uint8_t > src_scan, int width, pdfium::span< const uint8_t > clip_scan) const
void CompositePalBitmapLine(pdfium::span< uint8_t > dest_scan, pdfium::span< const uint8_t > src_scan, int src_left, int width, pdfium::span< const uint8_t > clip_scan) const
void CompositeRgbBitmapLine(pdfium::span< uint8_t > dest_scan, pdfium::span< const uint8_t > src_scan, int width, pdfium::span< const uint8_t > clip_scan) const
bool Init(FXDIB_Format dest_format, FXDIB_Format src_format, pdfium::span< const uint32_t > src_palette, uint32_t mask_color, BlendMode blend_type, bool bRgbByteOrder)
~CFX_ScanlineCompositor()
void CompositeBitMaskLine(pdfium::span< uint8_t > dest_scan, pdfium::span< const uint8_t > src_scan, int src_left, int width, pdfium::span< const uint8_t > clip_scan) const
#define UNSAFE_BUFFERS(...)
UNSAFE_BUFFER_USAGE void FXARGB_SetDIB(uint8_t *p, uint32_t argb)
UNSAFE_BUFFER_USAGE FX_ARGB FXARGB_GetDIB(const uint8_t *p)
UNSAFE_BUFFER_USAGE void ReverseCopy3Bytes(uint8_t *dest, const uint8_t *src)
#define FXRGB2GRAY(r, g, b)
UNSAFE_BUFFER_USAGE void FXARGB_SetRGBOrderDIB(uint8_t *p, uint32_t argb)
constexpr FX_ARGB ArgbEncode(uint32_t a, uint32_t r, uint32_t g, uint32_t b)
int GetBppFromFormat(FXDIB_Format format)
int GetCompsFromFormat(FXDIB_Format format)
#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha)
UNSAFE_BUFFER_USAGE void * FXSYS_memset(void *ptr1, int val, size_t len)
UNSAFE_BUFFER_USAGE void * FXSYS_memcpy(void *ptr1, const void *ptr2, size_t len)
int Blend(BlendMode blend_mode, int back_color, int src_color)
#define NOTREACHED_NORETURN()