Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(433)

Side by Side Diff: core/src/fxge/dib/fx_dib_composite.cpp

Issue 453133004: clang-format all code (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../../include/fxge/fx_ge.h" 7 #include "../../../include/fxge/fx_ge.h"
8 #include "../../../include/fxcodec/fx_codec.h" 8 #include "../../../include/fxcodec/fx_codec.h"
9 #include "dib_int.h" 9 #include "dib_int.h"
10 const FX_BYTE g_GammaRamp[256] = { 10 const FX_BYTE g_GammaRamp[256] = {
11 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 11 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
12 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 , 12 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
13 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7 , 13 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6,
14 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13 , 14 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11,
15 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 2 0, 15 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17,
16 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 2 9, 16 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25,
17 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 4 1, 17 26, 27, 27, 28, 29, 29, 30, 30, 31, 32, 32, 33, 34, 35, 35,
18 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 5 4, 18 36, 37, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 45, 46, 47,
19 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 7 0, 19 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
20 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 8 8, 20 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77,
21 90, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 10 9, 21 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 95,
22 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 1 33, 22 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 114, 115,
23 134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 1 59, 23 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133, 134, 136, 138,
24 161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 1 88, 24 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159, 161, 163,
25 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 2 20, 25 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188, 190,
26 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 2 55, 26 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
27 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253,
28 255,
27 }; 29 };
28 const FX_BYTE g_GammaInverse[256] = { 30 const FX_BYTE g_GammaInverse[256] = {
29 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66, 69 , 31 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66,
30 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95, 96, 9 8, 32 69, 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95,
31 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 11 9, 33 96, 98, 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115,
32 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 1 36, 34 117, 118, 119, 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132,
33 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 1 51, 35 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
34 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 1 64, 36 148, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159,
35 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 1 76, 37 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171,
36 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 1 87, 38 172, 173, 173, 174, 175, 175, 176, 177, 178, 178, 179, 180, 180, 181, 182,
37 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 1 97, 39 182, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 190, 191, 192,
38 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 2 07, 40 192, 193, 194, 194, 195, 196, 196, 197, 197, 198, 199, 199, 200, 200, 201,
39 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 2 16, 41 202, 202, 203, 203, 204, 205, 205, 206, 206, 207, 208, 208, 209, 209, 210,
40 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 2 24, 42 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 218, 218,
41 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 2 33, 43 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 226, 226,
42 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 2 40, 44 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234,
43 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 2 48, 45 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241,
44 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 2 55, 46 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
47 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255,
48 255,
45 }; 49 };
46 const FX_BYTE _color_sqrt[256] = { 50 const FX_BYTE _color_sqrt[256] = {
47 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29 , 0x2C, 0x2F, 0x32, 51 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29,
48 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50 , 0x52, 0x54, 0x56, 52 0x2C, 0x2F, 0x32, 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A,
49 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69 , 0x6B, 0x6C, 0x6D, 53 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56, 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61,
50 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B , 0x7C, 0x7D, 0x7E, 54 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72,
51 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B , 0x8C, 0x8D, 0x8E, 55 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x80,
52 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99 , 0x9A, 0x9B, 0x9C, 56 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C,
53 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6 , 0xA7, 0xA7, 0xA8, 57 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97,
54 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2 , 0xB3, 0xB3, 0xB4, 58 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2,
55 0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD , 0xBE, 0xBE, 0xBF, 59 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8, 0xA9, 0xAA, 0xAA, 0xAB, 0xAC,
56 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7 , 0xC8, 0xC9, 0xC9, 60 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4, 0xB5, 0xB5,
57 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1 , 0xD2, 0xD3, 0xD3, 61 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE,
58 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB , 0xDC, 0xDC, 0xDD, 62 0xBF, 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7,
59 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4 , 0xE5, 0xE5, 0xE6, 63 0xC7, 0xC8, 0xC9, 0xC9, 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF,
60 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED , 0xED, 0xEE, 0xEE, 64 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3, 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7,
61 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5 , 0xF6, 0xF6, 0xF7, 65 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD, 0xDD, 0xDE, 0xDE,
62 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD , 0xFE, 0xFE, 0xFF 66 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
67 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED,
68 0xED, 0xEE, 0xEE, 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4,
69 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7, 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA,
70 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
63 }; 71 };
64 int _BLEND(int blend_mode, int back_color, int src_color) 72 int _BLEND(int blend_mode, int back_color, int src_color) {
65 { 73 switch (blend_mode) {
66 switch (blend_mode) { 74 case FXDIB_BLEND_NORMAL:
67 case FXDIB_BLEND_NORMAL: 75 return src_color;
68 return src_color; 76 case FXDIB_BLEND_MULTIPLY:
69 case FXDIB_BLEND_MULTIPLY: 77 return src_color * back_color / 255;
70 return src_color * back_color / 255; 78 case FXDIB_BLEND_SCREEN:
71 case FXDIB_BLEND_SCREEN: 79 return src_color + back_color - src_color * back_color / 255;
72 return src_color + back_color - src_color * back_color / 255; 80 case FXDIB_BLEND_OVERLAY:
73 case FXDIB_BLEND_OVERLAY: 81 return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
74 return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color); 82 case FXDIB_BLEND_DARKEN:
75 case FXDIB_BLEND_DARKEN: 83 return src_color < back_color ? src_color : back_color;
76 return src_color < back_color ? src_color : back_color; 84 case FXDIB_BLEND_LIGHTEN:
77 case FXDIB_BLEND_LIGHTEN: 85 return src_color > back_color ? src_color : back_color;
78 return src_color > back_color ? src_color : back_color; 86 case FXDIB_BLEND_COLORDODGE: {
79 case FXDIB_BLEND_COLORDODGE: { 87 if (src_color == 255) {
80 if (src_color == 255) { 88 return src_color;
81 return src_color; 89 }
82 } 90 int result = back_color * 255 / (255 - src_color);
83 int result = back_color * 255 / (255 - src_color); 91 if (result > 255) {
84 if (result > 255) { 92 return 255;
85 return 255; 93 }
86 } 94 return result;
87 return result; 95 }
96 case FXDIB_BLEND_COLORBURN: {
97 if (src_color == 0) {
98 return src_color;
99 }
100 int result = (255 - back_color) * 255 / src_color;
101 if (result > 255) {
102 result = 255;
103 }
104 return 255 - result;
105 }
106 case FXDIB_BLEND_HARDLIGHT:
107 if (src_color < 128) {
108 return (src_color * back_color * 2) / 255;
109 }
110 return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
111 case FXDIB_BLEND_SOFTLIGHT: {
112 if (src_color < 128) {
113 return back_color -
114 (255 - 2 * src_color) * back_color * (255 - back_color) / 255 /
115 255;
116 }
117 return back_color +
118 (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) /
119 255;
120 }
121 case FXDIB_BLEND_DIFFERENCE:
122 return back_color < src_color ? src_color - back_color
123 : back_color - src_color;
124 case FXDIB_BLEND_EXCLUSION:
125 return back_color + src_color - 2 * back_color * src_color / 255;
126 }
127 return src_color;
128 }
129 struct _RGB {
130 int red;
131 int green;
132 int blue;
133 };
134 static inline int _Lum(_RGB color) {
135 return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
136 }
137 static _RGB _ClipColor(_RGB color) {
138 int l = _Lum(color);
139 int n = color.red;
140 if (color.green < n) {
141 n = color.green;
142 }
143 if (color.blue < n) {
144 n = color.blue;
145 }
146 int x = color.red;
147 if (color.green > x) {
148 x = color.green;
149 }
150 if (color.blue > x) {
151 x = color.blue;
152 }
153 if (n < 0) {
154 color.red = l + ((color.red - l) * l / (l - n));
155 color.green = l + ((color.green - l) * l / (l - n));
156 color.blue = l + ((color.blue - l) * l / (l - n));
157 }
158 if (x > 255) {
159 color.red = l + ((color.red - l) * (255 - l) / (x - l));
160 color.green = l + ((color.green - l) * (255 - l) / (x - l));
161 color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
162 }
163 return color;
164 }
165 static _RGB _SetLum(_RGB color, int l) {
166 int d = l - _Lum(color);
167 color.red += d;
168 color.green += d;
169 color.blue += d;
170 return _ClipColor(color);
171 }
172 static int _Sat(_RGB color) {
173 int n = color.red;
174 if (color.green < n) {
175 n = color.green;
176 }
177 if (color.blue < n) {
178 n = color.blue;
179 }
180 int x = color.red;
181 if (color.green > x) {
182 x = color.green;
183 }
184 if (color.blue > x) {
185 x = color.blue;
186 }
187 return x - n;
188 }
189 static _RGB _SetSat(_RGB color, int s) {
190 int* max = &color.red;
191 int* mid = &color.red;
192 int* min = &color.red;
193 if (color.green > *max) {
194 max = &color.green;
195 }
196 if (color.blue > *max) {
197 max = &color.blue;
198 }
199 if (color.green < *min) {
200 min = &color.green;
201 }
202 if (color.blue < *min) {
203 min = &color.blue;
204 }
205 if (*max == *min) {
206 color.red = 0;
207 color.green = 0;
208 color.blue = 0;
209 return color;
210 }
211 if (max == &color.red) {
212 if (min == &color.green) {
213 mid = &color.blue;
214 } else {
215 mid = &color.green;
216 }
217 } else if (max == &color.green) {
218 if (min == &color.red) {
219 mid = &color.blue;
220 } else {
221 mid = &color.red;
222 }
223 } else {
224 if (min == &color.green) {
225 mid = &color.red;
226 } else {
227 mid = &color.green;
228 }
229 }
230 if (*max > *min) {
231 *mid = (*mid - *min) * s / (*max - *min);
232 *max = s;
233 *min = 0;
234 }
235 return color;
236 }
237 void _RGB_Blend(int blend_mode,
238 FX_LPCBYTE src_scan,
239 FX_BYTE* dest_scan,
240 int results[3]) {
241 _RGB src, back, result;
242 src.red = src_scan[2];
243 src.green = src_scan[1];
244 src.blue = src_scan[0];
245 back.red = dest_scan[2];
246 back.green = dest_scan[1];
247 back.blue = dest_scan[0];
248 switch (blend_mode) {
249 case FXDIB_BLEND_HUE:
250 result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
251 break;
252 case FXDIB_BLEND_SATURATION:
253 result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
254 break;
255 case FXDIB_BLEND_COLOR:
256 result = _SetLum(src, _Lum(back));
257 break;
258 case FXDIB_BLEND_LUMINOSITY:
259 result = _SetLum(back, _Lum(src));
260 break;
261 }
262 results[0] = result.blue;
263 results[1] = result.green;
264 results[2] = result.red;
265 }
266 inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan,
267 FX_LPCBYTE src_scan,
268 int pixel_count,
269 FX_LPCBYTE clip_scan) {
270 src_scan += 3;
271 for (int col = 0; col < pixel_count; col++) {
272 int src_alpha = *src_scan;
273 if (clip_scan) {
274 src_alpha = clip_scan[col] * src_alpha / 255;
275 }
276 FX_BYTE back_alpha = *dest_scan;
277 if (!back_alpha) {
278 *dest_scan = src_alpha;
279 } else if (src_alpha) {
280 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
281 }
282 dest_scan++;
283 src_scan += 4;
284 }
285 }
286 void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan,
287 FX_LPCBYTE src_alpha_scan,
288 int pixel_count,
289 FX_LPCBYTE clip_scan) {
290 for (int col = 0; col < pixel_count; col++) {
291 int src_alpha = *src_alpha_scan++;
292 if (clip_scan) {
293 src_alpha = clip_scan[col] * src_alpha / 255;
294 }
295 FX_BYTE back_alpha = *dest_scan;
296 if (!back_alpha) {
297 *dest_scan = src_alpha;
298 } else if (src_alpha) {
299 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
300 }
301 dest_scan++;
302 }
303 }
304 void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan,
305 FX_LPCBYTE src_scan,
306 int width,
307 FX_LPCBYTE clip_scan) {
308 if (clip_scan) {
309 for (int i = 0; i < width; i++) {
310 *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
311 dest_scan++;
312 clip_scan++;
313 }
314 } else {
315 FXSYS_memset8(dest_scan, 0xff, width);
316 }
317 }
318 void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan,
319 FX_LPCBYTE src_scan,
320 int pixel_count,
321 int blend_type,
322 FX_LPCBYTE clip_scan,
323 FX_LPCBYTE src_alpha_scan,
324 FX_LPBYTE dst_alpha_scan,
325 void* pIccTransform) {
326 ICodec_IccModule* pIccModule = NULL;
327 if (pIccTransform) {
328 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
329 }
330 if (blend_type) {
331 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
332 int blended_color;
333 if (src_alpha_scan) {
334 for (int col = 0; col < pixel_count; col++) {
335 FX_BYTE back_alpha = *dst_alpha_scan;
336 if (back_alpha == 0) {
337 int src_alpha = *src_alpha_scan++;
338 if (clip_scan) {
339 src_alpha = clip_scan[col] * src_alpha / 255;
340 }
341 if (src_alpha) {
342 if (pIccTransform) {
343 pIccModule->TranslateScanline(
344 pIccTransform, dest_scan, src_scan, 1);
345 } else {
346 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
88 } 347 }
89 case FXDIB_BLEND_COLORBURN: { 348 *dst_alpha_scan = src_alpha;
90 if (src_color == 0) { 349 }
91 return src_color; 350 dest_scan++;
92 } 351 dst_alpha_scan++;
93 int result = (255 - back_color) * 255 / src_color; 352 src_scan += 3;
94 if (result > 255) { 353 continue;
95 result = 255; 354 }
96 } 355 FX_BYTE src_alpha = *src_alpha_scan++;
97 return 255 - result; 356 if (clip_scan) {
357 src_alpha = clip_scan[col] * src_alpha / 255;
358 }
359 if (src_alpha == 0) {
360 dest_scan++;
361 dst_alpha_scan++;
362 src_scan += 3;
363 continue;
364 }
365 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
366 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
367 FX_BYTE gray;
368 if (pIccTransform) {
369 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
370 } else {
371 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
372 }
373 if (bNonseparableBlend) {
374 blended_color =
375 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
376 }
377 gray = bNonseparableBlend ? blended_color
378 : _BLEND(blend_type, *dest_scan, gray);
379 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
380 dest_scan++;
381 dst_alpha_scan++;
382 src_scan += 3;
383 }
384 } else
385 for (int col = 0; col < pixel_count; col++) {
386 FX_BYTE back_alpha = *dst_alpha_scan;
387 if (back_alpha == 0) {
388 int src_alpha = src_scan[3];
389 if (clip_scan) {
390 src_alpha = clip_scan[col] * src_alpha / 255;
391 }
392 if (src_alpha) {
393 if (pIccTransform) {
394 pIccModule->TranslateScanline(
395 pIccTransform, dest_scan, src_scan, 1);
396 } else {
397 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
98 } 398 }
99 case FXDIB_BLEND_HARDLIGHT: 399 *dst_alpha_scan = src_alpha;
100 if (src_color < 128) { 400 }
101 return (src_color * back_color * 2) / 255; 401 dest_scan++;
102 } 402 dst_alpha_scan++;
103 return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255); 403 src_scan += 4;
104 case FXDIB_BLEND_SOFTLIGHT: { 404 continue;
105 if (src_color < 128) { 405 }
106 return back_color - (255 - 2 * src_color) * back_color * (25 5 - back_color) / 255 / 255; 406 FX_BYTE src_alpha = src_scan[3];
107 } 407 if (clip_scan) {
108 return back_color + (2 * src_color - 255) * (_color_sqrt[back_co lor] - back_color) / 255; 408 src_alpha = clip_scan[col] * src_alpha / 255;
109 } 409 }
110 case FXDIB_BLEND_DIFFERENCE: 410 if (src_alpha == 0) {
111 return back_color < src_color ? src_color - back_color : back_color - src_color; 411 dest_scan++;
112 case FXDIB_BLEND_EXCLUSION: 412 dst_alpha_scan++;
113 return back_color + src_color - 2 * back_color * src_color / 255; 413 src_scan += 4;
114 } 414 continue;
115 return src_color; 415 }
116 } 416 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
117 struct _RGB { 417 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
118 int red; 418 FX_BYTE gray;
119 int green; 419 if (pIccTransform) {
120 int blue; 420 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
121 };
122 static inline int _Lum(_RGB color)
123 {
124 return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
125 }
126 static _RGB _ClipColor(_RGB color)
127 {
128 int l = _Lum(color);
129 int n = color.red;
130 if (color.green < n) {
131 n = color.green;
132 }
133 if (color.blue < n) {
134 n = color.blue;
135 }
136 int x = color.red;
137 if (color.green > x) {
138 x = color.green;
139 }
140 if (color.blue > x) {
141 x = color.blue;
142 }
143 if (n < 0) {
144 color.red = l + ((color.red - l) * l / (l - n));
145 color.green = l + ((color.green - l) * l / (l - n));
146 color.blue = l + ((color.blue - l) * l / (l - n));
147 }
148 if (x > 255) {
149 color.red = l + ((color.red - l) * (255 - l) / (x - l));
150 color.green = l + ((color.green - l) * (255 - l) / (x - l));
151 color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
152 }
153 return color;
154 }
155 static _RGB _SetLum(_RGB color, int l)
156 {
157 int d = l - _Lum(color);
158 color.red += d;
159 color.green += d;
160 color.blue += d;
161 return _ClipColor(color);
162 }
163 static int _Sat(_RGB color)
164 {
165 int n = color.red;
166 if (color.green < n) {
167 n = color.green;
168 }
169 if (color.blue < n) {
170 n = color.blue;
171 }
172 int x = color.red;
173 if (color.green > x) {
174 x = color.green;
175 }
176 if (color.blue > x) {
177 x = color.blue;
178 }
179 return x - n;
180 }
181 static _RGB _SetSat(_RGB color, int s)
182 {
183 int* max = &color.red;
184 int* mid = &color.red;
185 int* min = &color.red;
186 if (color.green > *max) {
187 max = &color.green;
188 }
189 if (color.blue > *max) {
190 max = &color.blue;
191 }
192 if (color.green < *min) {
193 min = &color.green;
194 }
195 if (color.blue < *min) {
196 min = &color.blue;
197 }
198 if (*max == *min) {
199 color.red = 0;
200 color.green = 0;
201 color.blue = 0;
202 return color;
203 }
204 if (max == &color.red) {
205 if (min == &color.green) {
206 mid = &color.blue;
207 } else { 421 } else {
208 mid = &color.green; 422 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
209 } 423 }
210 } else if (max == &color.green) { 424 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
211 if (min == &color.red) { 425 dest_scan++;
212 mid = &color.blue; 426 dst_alpha_scan++;
213 } else {
214 mid = &color.red;
215 }
216 } else {
217 if (min == &color.green) {
218 mid = &color.red;
219 } else {
220 mid = &color.green;
221 }
222 }
223 if (*max > *min) {
224 *mid = (*mid - *min) * s / (*max - *min);
225 *max = s;
226 *min = 0;
227 }
228 return color;
229 }
230 void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int res ults[3])
231 {
232 _RGB src, back, result;
233 src.red = src_scan[2];
234 src.green = src_scan[1];
235 src.blue = src_scan[0];
236 back.red = dest_scan[2];
237 back.green = dest_scan[1];
238 back.blue = dest_scan[0];
239 switch (blend_mode) {
240 case FXDIB_BLEND_HUE:
241 result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
242 break;
243 case FXDIB_BLEND_SATURATION:
244 result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
245 break;
246 case FXDIB_BLEND_COLOR:
247 result = _SetLum(src, _Lum(back));
248 break;
249 case FXDIB_BLEND_LUMINOSITY:
250 result = _SetLum(back, _Lum(src));
251 break;
252 }
253 results[0] = result.blue;
254 results[1] = result.green;
255 results[2] = result.red;
256 }
257 inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, in t pixel_count, FX_LPCBYTE clip_scan)
258 {
259 src_scan += 3;
260 for (int col = 0; col < pixel_count; col ++) {
261 int src_alpha = *src_scan;
262 if (clip_scan) {
263 src_alpha = clip_scan[col] * src_alpha / 255;
264 }
265 FX_BYTE back_alpha = *dest_scan;
266 if (!back_alpha) {
267 *dest_scan = src_alpha;
268 } else if (src_alpha) {
269 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
270 }
271 dest_scan ++;
272 src_scan += 4; 427 src_scan += 4;
273 } 428 }
274 } 429 return;
275 void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan) 430 }
276 { 431 if (src_alpha_scan) {
277 for (int col = 0; col < pixel_count; col ++) { 432 for (int col = 0; col < pixel_count; col++) {
433 FX_BYTE back_alpha = *dst_alpha_scan;
434 if (back_alpha == 0) {
278 int src_alpha = *src_alpha_scan++; 435 int src_alpha = *src_alpha_scan++;
279 if (clip_scan) { 436 if (clip_scan) {
280 src_alpha = clip_scan[col] * src_alpha / 255; 437 src_alpha = clip_scan[col] * src_alpha / 255;
281 } 438 }
282 FX_BYTE back_alpha = *dest_scan; 439 if (src_alpha) {
283 if (!back_alpha) { 440 if (pIccTransform) {
284 *dest_scan = src_alpha; 441 pIccModule->TranslateScanline(
285 } else if (src_alpha) { 442 pIccTransform, dest_scan, src_scan, 1);
286 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; 443 } else {
287 } 444 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
288 dest_scan ++; 445 }
289 } 446 *dst_alpha_scan = src_alpha;
290 } 447 }
291 void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan) 448 dest_scan++;
292 { 449 dst_alpha_scan++;
450 src_scan += 3;
451 continue;
452 }
453 FX_BYTE src_alpha = *src_alpha_scan++;
454 if (clip_scan) {
455 src_alpha = clip_scan[col] * src_alpha / 255;
456 }
457 if (src_alpha == 0) {
458 dest_scan++;
459 dst_alpha_scan++;
460 src_scan += 3;
461 continue;
462 }
463 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
464 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
465 FX_BYTE gray;
466 if (pIccTransform) {
467 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
468 } else {
469 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
470 }
471 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
472 dest_scan++;
473 dst_alpha_scan++;
474 src_scan += 3;
475 }
476 } else
477 for (int col = 0; col < pixel_count; col++) {
478 FX_BYTE back_alpha = *dst_alpha_scan;
479 if (back_alpha == 0) {
480 int src_alpha = src_scan[3];
481 if (clip_scan) {
482 src_alpha = clip_scan[col] * src_alpha / 255;
483 }
484 if (src_alpha) {
485 if (pIccTransform) {
486 pIccModule->TranslateScanline(
487 pIccTransform, dest_scan, src_scan, 1);
488 } else {
489 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
490 }
491 *dst_alpha_scan = src_alpha;
492 }
493 dest_scan++;
494 dst_alpha_scan++;
495 src_scan += 4;
496 continue;
497 }
498 FX_BYTE src_alpha = src_scan[3];
499 if (clip_scan) {
500 src_alpha = clip_scan[col] * src_alpha / 255;
501 }
502 if (src_alpha == 0) {
503 dest_scan++;
504 dst_alpha_scan++;
505 src_scan += 4;
506 continue;
507 }
508 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
509 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
510 FX_BYTE gray;
511 if (pIccTransform) {
512 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
513 } else {
514 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
515 }
516 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
517 dest_scan++;
518 dst_alpha_scan++;
519 src_scan += 4;
520 }
521 }
522 inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan,
523 FX_LPCBYTE src_scan,
524 int pixel_count,
525 int blend_type,
526 FX_LPCBYTE clip_scan,
527 FX_LPCBYTE src_alpha_scan,
528 void* pIccTransform) {
529 ICodec_IccModule* pIccModule = NULL;
530 FX_BYTE gray;
531 if (pIccTransform) {
532 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
533 }
534 if (blend_type) {
535 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
536 int blended_color;
537 if (src_alpha_scan) {
538 for (int col = 0; col < pixel_count; col++) {
539 int src_alpha = *src_alpha_scan++;
540 if (clip_scan) {
541 src_alpha = clip_scan[col] * src_alpha / 255;
542 }
543 if (src_alpha) {
544 if (pIccTransform) {
545 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
546 } else {
547 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
548 }
549 if (bNonseparableBlend) {
550 blended_color =
551 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
552 }
553 gray = bNonseparableBlend ? blended_color
554 : _BLEND(blend_type, *dest_scan, gray);
555 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
556 }
557 dest_scan++;
558 src_scan += 3;
559 }
560 } else
561 for (int col = 0; col < pixel_count; col++) {
562 int src_alpha = src_scan[3];
563 if (clip_scan) {
564 src_alpha = clip_scan[col] * src_alpha / 255;
565 }
566 if (src_alpha) {
567 if (pIccTransform) {
568 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
569 } else {
570 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
571 }
572 if (bNonseparableBlend) {
573 blended_color =
574 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
575 }
576 gray = bNonseparableBlend ? blended_color
577 : _BLEND(blend_type, *dest_scan, gray);
578 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
579 }
580 dest_scan++;
581 src_scan += 4;
582 }
583 return;
584 }
585 if (src_alpha_scan) {
586 for (int col = 0; col < pixel_count; col++) {
587 int src_alpha = *src_alpha_scan++;
588 if (clip_scan) {
589 src_alpha = clip_scan[col] * src_alpha / 255;
590 }
591 if (src_alpha) {
592 if (pIccTransform) {
593 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
594 } else {
595 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
596 }
597 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
598 }
599 dest_scan++;
600 src_scan += 3;
601 }
602 } else
603 for (int col = 0; col < pixel_count; col++) {
604 int src_alpha = src_scan[3];
605 if (clip_scan) {
606 src_alpha = clip_scan[col] * src_alpha / 255;
607 }
608 if (src_alpha) {
609 if (pIccTransform) {
610 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
611 } else {
612 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
613 }
614 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
615 }
616 dest_scan++;
617 src_scan += 4;
618 }
619 }
620 inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan,
621 FX_LPCBYTE src_scan,
622 int src_Bpp,
623 int pixel_count,
624 int blend_type,
625 FX_LPCBYTE clip_scan,
626 void* pIccTransform) {
627 ICodec_IccModule* pIccModule = NULL;
628 FX_BYTE gray;
629 if (pIccTransform) {
630 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
631 }
632 if (blend_type) {
633 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
634 int blended_color;
635 for (int col = 0; col < pixel_count; col++) {
636 if (pIccTransform) {
637 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
638 } else {
639 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
640 }
641 if (bNonseparableBlend) {
642 blended_color =
643 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
644 }
645 gray = bNonseparableBlend ? blended_color
646 : _BLEND(blend_type, *dest_scan, gray);
647 if (clip_scan && clip_scan[col] < 255) {
648 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
649 } else {
650 *dest_scan = gray;
651 }
652 dest_scan++;
653 src_scan += src_Bpp;
654 }
655 return;
656 }
657 for (int col = 0; col < pixel_count; col++) {
658 if (pIccTransform) {
659 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
660 } else {
661 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
662 }
663 if (clip_scan && clip_scan[col] < 255) {
664 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
665 } else {
666 *dest_scan = gray;
667 }
668 dest_scan++;
669 src_scan += src_Bpp;
670 }
671 }
672 void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan,
673 FX_LPCBYTE src_scan,
674 int src_Bpp,
675 int pixel_count,
676 int blend_type,
677 FX_LPCBYTE clip_scan,
678 FX_LPBYTE dest_alpha_scan,
679 void* pIccTransform) {
680 ICodec_IccModule* pIccModule = NULL;
681 if (pIccTransform) {
682 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
683 }
684 if (blend_type) {
685 int blended_color;
686 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
687 for (int col = 0; col < pixel_count; col++) {
688 int back_alpha = *dest_alpha_scan;
689 if (back_alpha == 0) {
690 if (pIccTransform) {
691 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
692 } else {
693 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
694 }
695 dest_scan++;
696 dest_alpha_scan++;
697 src_scan += src_Bpp;
698 continue;
699 }
700 int src_alpha = 255;
701 if (clip_scan) {
702 src_alpha = clip_scan[col];
703 }
704 if (src_alpha == 0) {
705 dest_scan++;
706 dest_alpha_scan++;
707 src_scan += src_Bpp;
708 continue;
709 }
710 FX_BYTE dest_alpha =
711 back_alpha + src_alpha - back_alpha * src_alpha / 255;
712 *dest_alpha_scan++ = dest_alpha;
713 int alpha_ratio = src_alpha * 255 / dest_alpha;
714 FX_BYTE gray;
715 if (pIccTransform) {
716 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
717 } else {
718 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
719 }
720 if (bNonseparableBlend) {
721 blended_color =
722 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
723 }
724 gray = bNonseparableBlend ? blended_color
725 : _BLEND(blend_type, *dest_scan, gray);
726 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
727 dest_scan++;
728 src_scan += src_Bpp;
729 }
730 return;
731 }
732 for (int col = 0; col < pixel_count; col++) {
733 int src_alpha = 255;
293 if (clip_scan) { 734 if (clip_scan) {
294 for (int i = 0; i < width; i ++) { 735 src_alpha = clip_scan[col];
295 *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan); 736 }
296 dest_scan ++; 737 if (src_alpha == 255) {
297 clip_scan ++; 738 if (pIccTransform) {
298 } 739 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
299 } else { 740 } else {
300 FXSYS_memset8(dest_scan, 0xff, width); 741 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
301 } 742 }
302 } 743 dest_scan++;
303 void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixe l_count, int blend_type, FX_LPCBYTE clip_scan, 744 *dest_alpha_scan++ = 255;
304 FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_sca n, void* pIccTransform) 745 src_scan += src_Bpp;
305 { 746 continue;
306 ICodec_IccModule* pIccModule = NULL; 747 }
307 if (pIccTransform) { 748 if (src_alpha == 0) {
308 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); 749 dest_scan++;
309 } 750 dest_alpha_scan++;
310 if (blend_type) { 751 src_scan += src_Bpp;
311 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 752 continue;
312 int blended_color; 753 }
313 if (src_alpha_scan) { 754 int back_alpha = *dest_alpha_scan;
314 for (int col = 0; col < pixel_count; col ++) { 755 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
315 FX_BYTE back_alpha = *dst_alpha_scan; 756 *dest_alpha_scan++ = dest_alpha;
316 if (back_alpha == 0) { 757 int alpha_ratio = src_alpha * 255 / dest_alpha;
317 int src_alpha = *src_alpha_scan++;
318 if (clip_scan) {
319 src_alpha = clip_scan[col] * src_alpha / 255;
320 }
321 if (src_alpha) {
322 if (pIccTransform) {
323 pIccModule->TranslateScanline(pIccTransform, dest_sc an, src_scan, 1);
324 } else {
325 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], * src_scan);
326 }
327 *dst_alpha_scan = src_alpha;
328 }
329 dest_scan ++;
330 dst_alpha_scan ++;
331 src_scan += 3;
332 continue;
333 }
334 FX_BYTE src_alpha = *src_alpha_scan++;
335 if (clip_scan) {
336 src_alpha = clip_scan[col] * src_alpha / 255;
337 }
338 if (src_alpha == 0) {
339 dest_scan ++;
340 dst_alpha_scan ++;
341 src_scan += 3;
342 continue;
343 }
344 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
345 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
346 FX_BYTE gray;
347 if (pIccTransform) {
348 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan , 1);
349 } else {
350 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
351 }
352 if (bNonseparableBlend) {
353 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
354 }
355 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, * dest_scan, gray);
356 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
357 dest_scan ++;
358 dst_alpha_scan++;
359 src_scan += 3;
360 }
361 } else
362 for (int col = 0; col < pixel_count; col ++) {
363 FX_BYTE back_alpha = *dst_alpha_scan;
364 if (back_alpha == 0) {
365 int src_alpha = src_scan[3];
366 if (clip_scan) {
367 src_alpha = clip_scan[col] * src_alpha / 255;
368 }
369 if (src_alpha) {
370 if (pIccTransform) {
371 pIccModule->TranslateScanline(pIccTransform, dest_sc an, src_scan, 1);
372 } else {
373 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], * src_scan);
374 }
375 *dst_alpha_scan = src_alpha;
376 }
377 dest_scan ++;
378 dst_alpha_scan ++;
379 src_scan += 4;
380 continue;
381 }
382 FX_BYTE src_alpha = src_scan[3];
383 if (clip_scan) {
384 src_alpha = clip_scan[col] * src_alpha / 255;
385 }
386 if (src_alpha == 0) {
387 dest_scan ++;
388 dst_alpha_scan ++;
389 src_scan += 4;
390 continue;
391 }
392 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
393 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
394 FX_BYTE gray;
395 if (pIccTransform) {
396 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan , 1);
397 } else {
398 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
399 }
400 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
401 dest_scan ++;
402 dst_alpha_scan++;
403 src_scan += 4;
404 }
405 return;
406 }
407 if (src_alpha_scan) {
408 for (int col = 0; col < pixel_count; col ++) {
409 FX_BYTE back_alpha = *dst_alpha_scan;
410 if (back_alpha == 0) {
411 int src_alpha = *src_alpha_scan++;
412 if (clip_scan) {
413 src_alpha = clip_scan[col] * src_alpha / 255;
414 }
415 if (src_alpha) {
416 if (pIccTransform) {
417 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
418 } else {
419 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_ scan);
420 }
421 *dst_alpha_scan = src_alpha;
422 }
423 dest_scan ++;
424 dst_alpha_scan ++;
425 src_scan += 3;
426 continue;
427 }
428 FX_BYTE src_alpha = *src_alpha_scan++;
429 if (clip_scan) {
430 src_alpha = clip_scan[col] * src_alpha / 255;
431 }
432 if (src_alpha == 0) {
433 dest_scan ++;
434 dst_alpha_scan ++;
435 src_scan += 3;
436 continue;
437 }
438 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
439 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
440 FX_BYTE gray;
441 if (pIccTransform) {
442 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1) ;
443 } else {
444 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
445 }
446 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
447 dest_scan ++;
448 dst_alpha_scan++;
449 src_scan += 3;
450 }
451 } else
452 for (int col = 0; col < pixel_count; col ++) {
453 FX_BYTE back_alpha = *dst_alpha_scan;
454 if (back_alpha == 0) {
455 int src_alpha = src_scan[3];
456 if (clip_scan) {
457 src_alpha = clip_scan[col] * src_alpha / 255;
458 }
459 if (src_alpha) {
460 if (pIccTransform) {
461 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
462 } else {
463 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_ scan);
464 }
465 *dst_alpha_scan = src_alpha;
466 }
467 dest_scan ++;
468 dst_alpha_scan ++;
469 src_scan += 4;
470 continue;
471 }
472 FX_BYTE src_alpha = src_scan[3];
473 if (clip_scan) {
474 src_alpha = clip_scan[col] * src_alpha / 255;
475 }
476 if (src_alpha == 0) {
477 dest_scan ++;
478 dst_alpha_scan ++;
479 src_scan += 4;
480 continue;
481 }
482 *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
483 int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
484 FX_BYTE gray;
485 if (pIccTransform) {
486 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1) ;
487 } else {
488 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
489 }
490 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
491 dest_scan ++;
492 dst_alpha_scan++;
493 src_scan += 4;
494 }
495 }
496 inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, in t pixel_count,
497 int blend_type, FX_LPCBYTE clip_scan,
498 FX_LPCBYTE src_alpha_scan, void* pIccTransfo rm)
499 {
500 ICodec_IccModule* pIccModule = NULL;
501 FX_BYTE gray; 758 FX_BYTE gray;
502 if (pIccTransform) { 759 if (pIccTransform) {
503 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); 760 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
504 } 761 } else {
505 if (blend_type) { 762 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
506 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 763 }
507 int blended_color; 764 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
508 if (src_alpha_scan) { 765 dest_scan++;
509 for (int col = 0; col < pixel_count; col ++) { 766 src_scan += src_Bpp;
510 int src_alpha = *src_alpha_scan++; 767 }
511 if (clip_scan) { 768 }
512 src_alpha = clip_scan[col] * src_alpha / 255; 769 void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan,
513 } 770 FX_LPCBYTE src_scan,
514 if (src_alpha) { 771 int pixel_count,
515 if (pIccTransform) { 772 int blend_type,
516 pIccModule->TranslateScanline(pIccTransform, &gray, src_ scan, 1); 773 FX_LPCBYTE clip_scan,
517 } else { 774 FX_LPBYTE dest_alpha_scan,
518 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); 775 FX_LPCBYTE src_alpha_scan) {
519 } 776 int blended_colors[3];
520 if (bNonseparableBlend) { 777 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
521 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? g ray : *dest_scan; 778 if (dest_alpha_scan == NULL) {
522 } 779 if (src_alpha_scan == NULL) {
523 gray = bNonseparableBlend ? blended_color : _BLEND(blend_typ e, *dest_scan, gray); 780 FX_BYTE back_alpha = 0;
524 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); 781 for (int col = 0; col < pixel_count; col++) {
525 } 782 back_alpha = dest_scan[3];
526 dest_scan ++; 783 if (back_alpha == 0) {
527 src_scan += 3; 784 if (clip_scan) {
528 } 785 int src_alpha = clip_scan[col] * src_scan[3] / 255;
529 } else 786 FXARGB_SETDIB(
530 for (int col = 0; col < pixel_count; col ++) { 787 dest_scan,
531 int src_alpha = src_scan[3]; 788 (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
532 if (clip_scan) { 789 } else {
533 src_alpha = clip_scan[col] * src_alpha / 255; 790 FXARGB_COPY(dest_scan, src_scan);
534 } 791 }
535 if (src_alpha) { 792 dest_scan += 4;
536 if (pIccTransform) { 793 src_scan += 4;
537 pIccModule->TranslateScanline(pIccTransform, &gray, src_ scan, 1); 794 continue;
538 } else { 795 }
539 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); 796 FX_BYTE src_alpha;
540 } 797 if (clip_scan == NULL) {
541 if (bNonseparableBlend) { 798 src_alpha = src_scan[3];
542 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? g ray : *dest_scan; 799 } else {
543 } 800 src_alpha = clip_scan[col] * src_scan[3] / 255;
544 gray = bNonseparableBlend ? blended_color : _BLEND(blend_typ e, *dest_scan, gray); 801 }
545 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); 802 if (src_alpha == 0) {
546 } 803 dest_scan += 4;
547 dest_scan ++; 804 src_scan += 4;
548 src_scan += 4; 805 continue;
549 } 806 }
550 return; 807 FX_BYTE dest_alpha =
551 } 808 back_alpha + src_alpha - back_alpha * src_alpha / 255;
809 dest_scan[3] = dest_alpha;
810 int alpha_ratio = src_alpha * 255 / dest_alpha;
811 if (bNonseparableBlend) {
812 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
813 }
814 for (int color = 0; color < 3; color++) {
815 if (blend_type) {
816 int blended = bNonseparableBlend
817 ? blended_colors[color]
818 : _BLEND(blend_type, *dest_scan, *src_scan);
819 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
820 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
821 } else {
822 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
823 }
824 dest_scan++;
825 src_scan++;
826 }
827 dest_scan++;
828 src_scan++;
829 }
830 } else {
831 for (int col = 0; col < pixel_count; col++) {
832 FX_BYTE back_alpha = dest_scan[3];
833 if (back_alpha == 0) {
834 if (clip_scan) {
835 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
836 FXARGB_SETDIB(
837 dest_scan,
838 FXARGB_MAKE(
839 (src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
840 } else {
841 FXARGB_SETDIB(dest_scan,
842 FXARGB_MAKE((*src_alpha_scan << 24),
843 src_scan[2],
844 src_scan[1],
845 *src_scan));
846 }
847 dest_scan += 4;
848 src_scan += 3;
849 src_alpha_scan++;
850 continue;
851 }
852 FX_BYTE src_alpha;
853 if (clip_scan == NULL) {
854 src_alpha = *src_alpha_scan++;
855 } else {
856 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
857 }
858 if (src_alpha == 0) {
859 dest_scan += 4;
860 src_scan += 3;
861 continue;
862 }
863 FX_BYTE dest_alpha =
864 back_alpha + src_alpha - back_alpha * src_alpha / 255;
865 dest_scan[3] = dest_alpha;
866 int alpha_ratio = src_alpha * 255 / dest_alpha;
867 if (bNonseparableBlend) {
868 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
869 }
870 for (int color = 0; color < 3; color++) {
871 if (blend_type) {
872 int blended = bNonseparableBlend
873 ? blended_colors[color]
874 : _BLEND(blend_type, *dest_scan, *src_scan);
875 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
876 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
877 } else {
878 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
879 }
880 dest_scan++;
881 src_scan++;
882 }
883 dest_scan++;
884 }
885 }
886 } else {
552 if (src_alpha_scan) { 887 if (src_alpha_scan) {
553 for (int col = 0; col < pixel_count; col ++) { 888 for (int col = 0; col < pixel_count; col++) {
554 int src_alpha = *src_alpha_scan++; 889 FX_BYTE back_alpha = *dest_alpha_scan;
555 if (clip_scan) { 890 if (back_alpha == 0) {
556 src_alpha = clip_scan[col] * src_alpha / 255; 891 if (clip_scan) {
557 } 892 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
558 if (src_alpha) { 893 *dest_alpha_scan = src_alpha;
559 if (pIccTransform) {
560 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan , 1);
561 } else {
562 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
563 }
564 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
565 }
566 dest_scan ++;
567 src_scan += 3;
568 }
569 } else
570 for (int col = 0; col < pixel_count; col ++) {
571 int src_alpha = src_scan[3];
572 if (clip_scan) {
573 src_alpha = clip_scan[col] * src_alpha / 255;
574 }
575 if (src_alpha) {
576 if (pIccTransform) {
577 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan , 1);
578 } else {
579 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
580 }
581 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
582 }
583 dest_scan ++;
584 src_scan += 4;
585 }
586 }
587 inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
588 int blend_type, FX_LPCBYTE clip_scan,
589 void* pIccTransform)
590 {
591 ICodec_IccModule* pIccModule = NULL;
592 FX_BYTE gray;
593 if (pIccTransform) {
594 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
595 }
596 if (blend_type) {
597 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
598 int blended_color;
599 for (int col = 0; col < pixel_count; col ++) {
600 if (pIccTransform) {
601 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1) ;
602 } else {
603 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
604 }
605 if (bNonseparableBlend) {
606 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *d est_scan;
607 }
608 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest _scan, gray);
609 if (clip_scan && clip_scan[col] < 255) {
610 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]) ;
611 } else {
612 *dest_scan = gray;
613 }
614 dest_scan ++;
615 src_scan += src_Bpp;
616 }
617 return;
618 }
619 for (int col = 0; col < pixel_count; col ++) {
620 if (pIccTransform) {
621 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
622 } else {
623 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
624 }
625 if (clip_scan && clip_scan[col] < 255) {
626 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
627 } else {
628 *dest_scan = gray;
629 }
630 dest_scan ++;
631 src_scan += src_Bpp;
632 }
633 }
634 void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_B pp, int pixel_count,
635 int blend_type, FX_LPCBYTE clip_scan,
636 FX_LPBYTE dest_alpha_scan, void* pIccTransform)
637 {
638 ICodec_IccModule* pIccModule = NULL;
639 if (pIccTransform) {
640 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
641 }
642 if (blend_type) {
643 int blended_color;
644 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
645 for (int col = 0; col < pixel_count; col ++) {
646 int back_alpha = *dest_alpha_scan;
647 if (back_alpha == 0) {
648 if (pIccTransform) {
649 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_ scan, 1);
650 } else {
651 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan) ;
652 }
653 dest_scan ++;
654 dest_alpha_scan++;
655 src_scan += src_Bpp;
656 continue;
657 }
658 int src_alpha = 255;
659 if (clip_scan) {
660 src_alpha = clip_scan[col];
661 }
662 if (src_alpha == 0) {
663 dest_scan ++;
664 dest_alpha_scan ++;
665 src_scan += src_Bpp;
666 continue;
667 }
668 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
669 *dest_alpha_scan++ = dest_alpha;
670 int alpha_ratio = src_alpha * 255 / dest_alpha;
671 FX_BYTE gray;
672 if (pIccTransform) {
673 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1) ;
674 } else {
675 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
676 }
677 if (bNonseparableBlend) {
678 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *d est_scan;
679 }
680 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest _scan, gray);
681 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
682 dest_scan ++;
683 src_scan += src_Bpp;
684 }
685 return;
686 }
687 for (int col = 0; col < pixel_count; col ++) {
688 int src_alpha = 255;
689 if (clip_scan) {
690 src_alpha = clip_scan[col];
691 }
692 if (src_alpha == 255) {
693 if (pIccTransform) {
694 pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan , 1);
695 } else {
696 *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
697 }
698 dest_scan ++;
699 *dest_alpha_scan++ = 255;
700 src_scan += src_Bpp;
701 continue;
702 }
703 if (src_alpha == 0) {
704 dest_scan ++;
705 dest_alpha_scan ++;
706 src_scan += src_Bpp;
707 continue;
708 }
709 int back_alpha = *dest_alpha_scan;
710 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
711 *dest_alpha_scan++ = dest_alpha;
712 int alpha_ratio = src_alpha * 255 / dest_alpha;
713 FX_BYTE gray;
714 if (pIccTransform) {
715 pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
716 } else {
717 gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
718 }
719 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
720 dest_scan ++;
721 src_scan += src_Bpp;
722 }
723 }
724 void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel _count, int blend_type, FX_LPCBYTE clip_scan,
725 FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_sca n)
726 {
727 int blended_colors[3];
728 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
729 if (dest_alpha_scan == NULL) {
730 if (src_alpha_scan == NULL) {
731 FX_BYTE back_alpha = 0;
732 for (int col = 0; col < pixel_count; col ++) {
733 back_alpha = dest_scan[3];
734 if (back_alpha == 0) {
735 if (clip_scan) {
736 int src_alpha = clip_scan[col] * src_scan[3] / 255;
737 FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xff ffff) | (src_alpha << 24));
738 } else {
739 FXARGB_COPY(dest_scan, src_scan);
740 }
741 dest_scan += 4;
742 src_scan += 4;
743 continue;
744 }
745 FX_BYTE src_alpha;
746 if (clip_scan == NULL) {
747 src_alpha = src_scan[3];
748 } else {
749 src_alpha = clip_scan[col] * src_scan[3] / 255;
750 }
751 if (src_alpha == 0) {
752 dest_scan += 4;
753 src_scan += 4;
754 continue;
755 }
756 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
757 dest_scan[3] = dest_alpha;
758 int alpha_ratio = src_alpha * 255 / dest_alpha;
759 if (bNonseparableBlend) {
760 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
761 }
762 for (int color = 0; color < 3; color ++) {
763 if (blend_type) {
764 int blended = bNonseparableBlend ? blended_colors[color] :
765 _BLEND(blend_type, *dest_scan, *src_scan);
766 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alp ha);
767 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alph a_ratio);
768 } else {
769 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, al pha_ratio);
770 }
771 dest_scan ++;
772 src_scan ++;
773 }
774 dest_scan ++;
775 src_scan ++;
776 }
777 } else {
778 for (int col = 0; col < pixel_count; col ++) {
779 FX_BYTE back_alpha = dest_scan[3];
780 if (back_alpha == 0) {
781 if (clip_scan) {
782 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255 ;
783 FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
784 } else {
785 FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
786 }
787 dest_scan += 4;
788 src_scan += 3;
789 src_alpha_scan ++;
790 continue;
791 }
792 FX_BYTE src_alpha;
793 if (clip_scan == NULL) {
794 src_alpha = *src_alpha_scan ++;
795 } else {
796 src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
797 }
798 if (src_alpha == 0) {
799 dest_scan += 4;
800 src_scan += 3;
801 continue;
802 }
803 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
804 dest_scan[3] = dest_alpha;
805 int alpha_ratio = src_alpha * 255 / dest_alpha;
806 if (bNonseparableBlend) {
807 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
808 }
809 for (int color = 0; color < 3; color ++) {
810 if (blend_type) {
811 int blended = bNonseparableBlend ? blended_colors[color] :
812 _BLEND(blend_type, *dest_scan, *src_scan);
813 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alp ha);
814 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alph a_ratio);
815 } else {
816 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, al pha_ratio);
817 }
818 dest_scan ++;
819 src_scan ++;
820 }
821 dest_scan ++;
822 }
823 }
824 } else {
825 if (src_alpha_scan) {
826 for (int col = 0; col < pixel_count; col ++) {
827 FX_BYTE back_alpha = *dest_alpha_scan;
828 if (back_alpha == 0) {
829 if (clip_scan) {
830 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255 ;
831 *dest_alpha_scan = src_alpha;
832 *dest_scan++ = *src_scan++;
833 *dest_scan++ = *src_scan++;
834 *dest_scan++ = *src_scan++;
835 } else {
836 *dest_alpha_scan = *src_alpha_scan;
837 *dest_scan++ = *src_scan++;
838 *dest_scan++ = *src_scan++;
839 *dest_scan++ = *src_scan++;
840 }
841 dest_alpha_scan ++;
842 src_alpha_scan ++;
843 continue;
844 }
845 FX_BYTE src_alpha;
846 if (clip_scan == NULL) {
847 src_alpha = *src_alpha_scan ++;
848 } else {
849 src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
850 }
851 if (src_alpha == 0) {
852 dest_scan += 3;
853 src_scan += 3;
854 dest_alpha_scan ++;
855 continue;
856 }
857 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
858 *dest_alpha_scan ++ = dest_alpha;
859 int alpha_ratio = src_alpha * 255 / dest_alpha;
860 if (bNonseparableBlend) {
861 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
862 }
863 for (int color = 0; color < 3; color ++) {
864 if (blend_type) {
865 int blended = bNonseparableBlend ? blended_colors[color] :
866 _BLEND(blend_type, *dest_scan, *src_scan);
867 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alp ha);
868 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alph a_ratio);
869 } else {
870 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, al pha_ratio);
871 }
872 dest_scan ++;
873 src_scan ++;
874 }
875 }
876 } else {
877 for (int col = 0; col < pixel_count; col ++) {
878 FX_BYTE back_alpha = *dest_alpha_scan;
879 if (back_alpha == 0) {
880 if (clip_scan) {
881 int src_alpha = clip_scan[col] * src_scan[3] / 255;
882 *dest_alpha_scan = src_alpha;
883 *dest_scan++ = *src_scan++;
884 *dest_scan++ = *src_scan++;
885 *dest_scan++ = *src_scan++;
886 } else {
887 *dest_alpha_scan = src_scan[3];
888 *dest_scan++ = *src_scan++;
889 *dest_scan++ = *src_scan++;
890 *dest_scan++ = *src_scan++;
891 }
892 dest_alpha_scan ++;
893 src_scan ++;
894 continue;
895 }
896 FX_BYTE src_alpha;
897 if (clip_scan == NULL) {
898 src_alpha = src_scan[3];
899 } else {
900 src_alpha = clip_scan[col] * src_scan[3] / 255;
901 }
902 if (src_alpha == 0) {
903 dest_scan += 3;
904 src_scan += 4;
905 dest_alpha_scan ++;
906 continue;
907 }
908 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
909 *dest_alpha_scan++ = dest_alpha;
910 int alpha_ratio = src_alpha * 255 / dest_alpha;
911 if (bNonseparableBlend) {
912 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
913 }
914 for (int color = 0; color < 3; color ++) {
915 if (blend_type) {
916 int blended = bNonseparableBlend ? blended_colors[color] :
917 _BLEND(blend_type, *dest_scan, *src_scan);
918 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alp ha);
919 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alph a_ratio);
920 } else {
921 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, al pha_ratio);
922 }
923 dest_scan ++;
924 src_scan ++;
925 }
926 src_scan ++;
927 }
928 }
929 }
930 }
931 void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_sca n, int width, int blend_type, int src_Bpp,
932 FX_LPBYTE dest_alpha_scan)
933 {
934 int blended_colors[3];
935 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
936 int src_gap = src_Bpp - 3;
937 if (dest_alpha_scan == NULL) {
938 for (int col = 0; col < width; col ++) {
939 FX_BYTE back_alpha = dest_scan[3];
940 if (back_alpha == 0) {
941 if (src_Bpp == 4) {
942 FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan ));
943 } else {
944 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_ scan[1], src_scan[0]));
945 }
946 dest_scan += 4;
947 src_scan += src_Bpp;
948 continue;
949 }
950 dest_scan[3] = 0xff;
951 if (bNonseparableBlend) {
952 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
953 }
954 for (int color = 0; color < 3; color ++) {
955 int src_color = *src_scan;
956 int blended = bNonseparableBlend ? blended_colors[color] :
957 _BLEND(blend_type, *dest_scan, src_color);
958 *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
959 dest_scan ++;
960 src_scan ++;
961 }
962 dest_scan ++;
963 src_scan += src_gap;
964 }
965 } else {
966 for (int col = 0; col < width; col ++) {
967 FX_BYTE back_alpha = *dest_alpha_scan;
968 if (back_alpha == 0) {
969 *dest_scan++ = *src_scan++;
970 *dest_scan++ = *src_scan++;
971 *dest_scan++ = *src_scan++;
972 *dest_alpha_scan++ = 0xff;
973 src_scan += src_gap;
974 continue;
975 }
976 *dest_alpha_scan++ = 0xff;
977 if (bNonseparableBlend) {
978 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
979 }
980 for (int color = 0; color < 3; color ++) {
981 int src_color = *src_scan;
982 int blended = bNonseparableBlend ? blended_colors[color] :
983 _BLEND(blend_type, *dest_scan, src_color);
984 *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
985 dest_scan ++;
986 src_scan ++;
987 }
988 src_scan += src_gap;
989 }
990 }
991 }
992 inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE sr c_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
993 FX_LPBYTE dest_alpha_scan)
994 {
995 int blended_colors[3];
996 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
997 int src_gap = src_Bpp - 3;
998 if (dest_alpha_scan == NULL) {
999 for (int col = 0; col < width; col ++) {
1000 int src_alpha = *clip_scan ++;
1001 FX_BYTE back_alpha = dest_scan[3];
1002 if (back_alpha == 0) {
1003 *dest_scan++ = *src_scan++;
1004 *dest_scan++ = *src_scan++;
1005 *dest_scan++ = *src_scan++;
1006 src_scan += src_gap;
1007 dest_scan ++;
1008 continue;
1009 }
1010 if (src_alpha == 0) {
1011 dest_scan += 4;
1012 src_scan += src_Bpp;
1013 continue;
1014 }
1015 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1016 dest_scan[3] = dest_alpha;
1017 int alpha_ratio = src_alpha * 255 / dest_alpha;
1018 if (bNonseparableBlend) {
1019 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1020 }
1021 for (int color = 0; color < 3; color ++) {
1022 int src_color = *src_scan;
1023 int blended = bNonseparableBlend ? blended_colors[color] :
1024 _BLEND(blend_type, *dest_scan, src_color);
1025 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1026 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio) ;
1027 dest_scan ++;
1028 src_scan ++;
1029 }
1030 dest_scan ++;
1031 src_scan += src_gap;
1032 }
1033 } else {
1034 for (int col = 0; col < width; col ++) {
1035 int src_alpha = *clip_scan ++;
1036 FX_BYTE back_alpha = *dest_alpha_scan;
1037 if (back_alpha == 0) {
1038 *dest_scan++ = *src_scan++;
1039 *dest_scan++ = *src_scan++;
1040 *dest_scan++ = *src_scan++;
1041 src_scan += src_gap;
1042 dest_alpha_scan++;
1043 continue;
1044 }
1045 if (src_alpha == 0) {
1046 dest_scan += 3;
1047 dest_alpha_scan++;
1048 src_scan += src_Bpp;
1049 continue;
1050 }
1051 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1052 *dest_alpha_scan++ = dest_alpha;
1053 int alpha_ratio = src_alpha * 255 / dest_alpha;
1054 if (bNonseparableBlend) {
1055 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1056 }
1057 for (int color = 0; color < 3; color ++) {
1058 int src_color = *src_scan;
1059 int blended = bNonseparableBlend ? blended_colors[color] :
1060 _BLEND(blend_type, *dest_scan, src_color);
1061 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1062 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio) ;
1063 dest_scan ++;
1064 src_scan ++;
1065 }
1066 src_scan += src_gap;
1067 }
1068 }
1069 }
1070 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
1071 FX_LPBYTE dest_alpha_scan)
1072 {
1073 int src_gap = src_Bpp - 3;
1074 if (dest_alpha_scan == NULL) {
1075 for (int col = 0; col < width; col ++) {
1076 int src_alpha = clip_scan[col];
1077 if (src_alpha == 255) {
1078 *dest_scan++ = *src_scan++;
1079 *dest_scan++ = *src_scan++;
1080 *dest_scan++ = *src_scan++;
1081 *dest_scan++ = 255;
1082 src_scan += src_gap;
1083 continue;
1084 }
1085 if (src_alpha == 0) {
1086 dest_scan += 4;
1087 src_scan += src_Bpp;
1088 continue;
1089 }
1090 int back_alpha = dest_scan[3];
1091 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1092 dest_scan[3] = dest_alpha;
1093 int alpha_ratio = src_alpha * 255 / dest_alpha;
1094 for (int color = 0; color < 3; color ++) {
1095 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_rati o);
1096 dest_scan ++;
1097 src_scan ++;
1098 }
1099 dest_scan ++;
1100 src_scan += src_gap;
1101 }
1102 } else {
1103 for (int col = 0; col < width; col ++) {
1104 int src_alpha = clip_scan[col];
1105 if (src_alpha == 255) {
1106 *dest_scan++ = *src_scan++;
1107 *dest_scan++ = *src_scan++;
1108 *dest_scan++ = *src_scan++;
1109 *dest_alpha_scan++ = 255;
1110 src_scan += src_gap;
1111 continue;
1112 }
1113 if (src_alpha == 0) {
1114 dest_scan += 3;
1115 dest_alpha_scan ++;
1116 src_scan += src_Bpp;
1117 continue;
1118 }
1119 int back_alpha = *dest_alpha_scan;
1120 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1121 *dest_alpha_scan ++ = dest_alpha;
1122 int alpha_ratio = src_alpha * 255 / dest_alpha;
1123 for (int color = 0; color < 3; color ++) {
1124 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_rati o);
1125 dest_scan ++;
1126 src_scan ++;
1127 }
1128 src_scan += src_gap;
1129 }
1130 }
1131 }
1132 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYT E src_scan, int width, int src_Bpp,
1133 FX_LPBYTE dest_alpha_scan)
1134 {
1135 if (dest_alpha_scan == NULL) {
1136 for (int col = 0; col < width; col ++) {
1137 if (src_Bpp == 4) {
1138 FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
1139 } else {
1140 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan [1], src_scan[0]));
1141 }
1142 dest_scan += 4;
1143 src_scan += src_Bpp;
1144 }
1145 } else {
1146 int src_gap = src_Bpp - 3;
1147 for (int col = 0; col < width; col ++) {
1148 *dest_scan++ = *src_scan++; 894 *dest_scan++ = *src_scan++;
1149 *dest_scan++ = *src_scan++; 895 *dest_scan++ = *src_scan++;
1150 *dest_scan++ = *src_scan++; 896 *dest_scan++ = *src_scan++;
1151 *dest_alpha_scan++ = 0xff; 897 } else {
1152 src_scan += src_gap; 898 *dest_alpha_scan = *src_alpha_scan;
1153 } 899 *dest_scan++ = *src_scan++;
1154 } 900 *dest_scan++ = *src_scan++;
1155 } 901 *dest_scan++ = *src_scan++;
1156 inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_sca n, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan, 902 }
1157 FX_LPCBYTE src_alpha_scan) 903 dest_alpha_scan++;
1158 { 904 src_alpha_scan++;
905 continue;
906 }
907 FX_BYTE src_alpha;
908 if (clip_scan == NULL) {
909 src_alpha = *src_alpha_scan++;
910 } else {
911 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
912 }
913 if (src_alpha == 0) {
914 dest_scan += 3;
915 src_scan += 3;
916 dest_alpha_scan++;
917 continue;
918 }
919 FX_BYTE dest_alpha =
920 back_alpha + src_alpha - back_alpha * src_alpha / 255;
921 *dest_alpha_scan++ = dest_alpha;
922 int alpha_ratio = src_alpha * 255 / dest_alpha;
923 if (bNonseparableBlend) {
924 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
925 }
926 for (int color = 0; color < 3; color++) {
927 if (blend_type) {
928 int blended = bNonseparableBlend
929 ? blended_colors[color]
930 : _BLEND(blend_type, *dest_scan, *src_scan);
931 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
932 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
933 } else {
934 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
935 }
936 dest_scan++;
937 src_scan++;
938 }
939 }
940 } else {
941 for (int col = 0; col < pixel_count; col++) {
942 FX_BYTE back_alpha = *dest_alpha_scan;
943 if (back_alpha == 0) {
944 if (clip_scan) {
945 int src_alpha = clip_scan[col] * src_scan[3] / 255;
946 *dest_alpha_scan = src_alpha;
947 *dest_scan++ = *src_scan++;
948 *dest_scan++ = *src_scan++;
949 *dest_scan++ = *src_scan++;
950 } else {
951 *dest_alpha_scan = src_scan[3];
952 *dest_scan++ = *src_scan++;
953 *dest_scan++ = *src_scan++;
954 *dest_scan++ = *src_scan++;
955 }
956 dest_alpha_scan++;
957 src_scan++;
958 continue;
959 }
960 FX_BYTE src_alpha;
961 if (clip_scan == NULL) {
962 src_alpha = src_scan[3];
963 } else {
964 src_alpha = clip_scan[col] * src_scan[3] / 255;
965 }
966 if (src_alpha == 0) {
967 dest_scan += 3;
968 src_scan += 4;
969 dest_alpha_scan++;
970 continue;
971 }
972 FX_BYTE dest_alpha =
973 back_alpha + src_alpha - back_alpha * src_alpha / 255;
974 *dest_alpha_scan++ = dest_alpha;
975 int alpha_ratio = src_alpha * 255 / dest_alpha;
976 if (bNonseparableBlend) {
977 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
978 }
979 for (int color = 0; color < 3; color++) {
980 if (blend_type) {
981 int blended = bNonseparableBlend
982 ? blended_colors[color]
983 : _BLEND(blend_type, *dest_scan, *src_scan);
984 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
985 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
986 } else {
987 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
988 }
989 dest_scan++;
990 src_scan++;
991 }
992 src_scan++;
993 }
994 }
995 }
996 }
997 void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan,
998 FX_LPCBYTE src_scan,
999 int width,
1000 int blend_type,
1001 int src_Bpp,
1002 FX_LPBYTE dest_alpha_scan) {
1003 int blended_colors[3];
1004 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1005 int src_gap = src_Bpp - 3;
1006 if (dest_alpha_scan == NULL) {
1007 for (int col = 0; col < width; col++) {
1008 FX_BYTE back_alpha = dest_scan[3];
1009 if (back_alpha == 0) {
1010 if (src_Bpp == 4) {
1011 FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
1012 } else {
1013 FXARGB_SETDIB(
1014 dest_scan,
1015 FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
1016 }
1017 dest_scan += 4;
1018 src_scan += src_Bpp;
1019 continue;
1020 }
1021 dest_scan[3] = 0xff;
1022 if (bNonseparableBlend) {
1023 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1024 }
1025 for (int color = 0; color < 3; color++) {
1026 int src_color = *src_scan;
1027 int blended = bNonseparableBlend
1028 ? blended_colors[color]
1029 : _BLEND(blend_type, *dest_scan, src_color);
1030 *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1031 dest_scan++;
1032 src_scan++;
1033 }
1034 dest_scan++;
1035 src_scan += src_gap;
1036 }
1037 } else {
1038 for (int col = 0; col < width; col++) {
1039 FX_BYTE back_alpha = *dest_alpha_scan;
1040 if (back_alpha == 0) {
1041 *dest_scan++ = *src_scan++;
1042 *dest_scan++ = *src_scan++;
1043 *dest_scan++ = *src_scan++;
1044 *dest_alpha_scan++ = 0xff;
1045 src_scan += src_gap;
1046 continue;
1047 }
1048 *dest_alpha_scan++ = 0xff;
1049 if (bNonseparableBlend) {
1050 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1051 }
1052 for (int color = 0; color < 3; color++) {
1053 int src_color = *src_scan;
1054 int blended = bNonseparableBlend
1055 ? blended_colors[color]
1056 : _BLEND(blend_type, *dest_scan, src_color);
1057 *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1058 dest_scan++;
1059 src_scan++;
1060 }
1061 src_scan += src_gap;
1062 }
1063 }
1064 }
1065 inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan,
1066 FX_LPCBYTE src_scan,
1067 int width,
1068 int blend_type,
1069 int src_Bpp,
1070 FX_LPCBYTE clip_scan,
1071 FX_LPBYTE dest_alpha_scan) {
1072 int blended_colors[3];
1073 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1074 int src_gap = src_Bpp - 3;
1075 if (dest_alpha_scan == NULL) {
1076 for (int col = 0; col < width; col++) {
1077 int src_alpha = *clip_scan++;
1078 FX_BYTE back_alpha = dest_scan[3];
1079 if (back_alpha == 0) {
1080 *dest_scan++ = *src_scan++;
1081 *dest_scan++ = *src_scan++;
1082 *dest_scan++ = *src_scan++;
1083 src_scan += src_gap;
1084 dest_scan++;
1085 continue;
1086 }
1087 if (src_alpha == 0) {
1088 dest_scan += 4;
1089 src_scan += src_Bpp;
1090 continue;
1091 }
1092 FX_BYTE dest_alpha =
1093 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1094 dest_scan[3] = dest_alpha;
1095 int alpha_ratio = src_alpha * 255 / dest_alpha;
1096 if (bNonseparableBlend) {
1097 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1098 }
1099 for (int color = 0; color < 3; color++) {
1100 int src_color = *src_scan;
1101 int blended = bNonseparableBlend
1102 ? blended_colors[color]
1103 : _BLEND(blend_type, *dest_scan, src_color);
1104 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1105 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
1106 dest_scan++;
1107 src_scan++;
1108 }
1109 dest_scan++;
1110 src_scan += src_gap;
1111 }
1112 } else {
1113 for (int col = 0; col < width; col++) {
1114 int src_alpha = *clip_scan++;
1115 FX_BYTE back_alpha = *dest_alpha_scan;
1116 if (back_alpha == 0) {
1117 *dest_scan++ = *src_scan++;
1118 *dest_scan++ = *src_scan++;
1119 *dest_scan++ = *src_scan++;
1120 src_scan += src_gap;
1121 dest_alpha_scan++;
1122 continue;
1123 }
1124 if (src_alpha == 0) {
1125 dest_scan += 3;
1126 dest_alpha_scan++;
1127 src_scan += src_Bpp;
1128 continue;
1129 }
1130 FX_BYTE dest_alpha =
1131 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1132 *dest_alpha_scan++ = dest_alpha;
1133 int alpha_ratio = src_alpha * 255 / dest_alpha;
1134 if (bNonseparableBlend) {
1135 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1136 }
1137 for (int color = 0; color < 3; color++) {
1138 int src_color = *src_scan;
1139 int blended = bNonseparableBlend
1140 ? blended_colors[color]
1141 : _BLEND(blend_type, *dest_scan, src_color);
1142 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
1143 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
1144 dest_scan++;
1145 src_scan++;
1146 }
1147 src_scan += src_gap;
1148 }
1149 }
1150 }
1151 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan,
1152 FX_LPCBYTE src_scan,
1153 int width,
1154 int src_Bpp,
1155 FX_LPCBYTE clip_scan,
1156 FX_LPBYTE dest_alpha_scan) {
1157 int src_gap = src_Bpp - 3;
1158 if (dest_alpha_scan == NULL) {
1159 for (int col = 0; col < width; col++) {
1160 int src_alpha = clip_scan[col];
1161 if (src_alpha == 255) {
1162 *dest_scan++ = *src_scan++;
1163 *dest_scan++ = *src_scan++;
1164 *dest_scan++ = *src_scan++;
1165 *dest_scan++ = 255;
1166 src_scan += src_gap;
1167 continue;
1168 }
1169 if (src_alpha == 0) {
1170 dest_scan += 4;
1171 src_scan += src_Bpp;
1172 continue;
1173 }
1174 int back_alpha = dest_scan[3];
1175 FX_BYTE dest_alpha =
1176 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1177 dest_scan[3] = dest_alpha;
1178 int alpha_ratio = src_alpha * 255 / dest_alpha;
1179 for (int color = 0; color < 3; color++) {
1180 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
1181 dest_scan++;
1182 src_scan++;
1183 }
1184 dest_scan++;
1185 src_scan += src_gap;
1186 }
1187 } else {
1188 for (int col = 0; col < width; col++) {
1189 int src_alpha = clip_scan[col];
1190 if (src_alpha == 255) {
1191 *dest_scan++ = *src_scan++;
1192 *dest_scan++ = *src_scan++;
1193 *dest_scan++ = *src_scan++;
1194 *dest_alpha_scan++ = 255;
1195 src_scan += src_gap;
1196 continue;
1197 }
1198 if (src_alpha == 0) {
1199 dest_scan += 3;
1200 dest_alpha_scan++;
1201 src_scan += src_Bpp;
1202 continue;
1203 }
1204 int back_alpha = *dest_alpha_scan;
1205 FX_BYTE dest_alpha =
1206 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1207 *dest_alpha_scan++ = dest_alpha;
1208 int alpha_ratio = src_alpha * 255 / dest_alpha;
1209 for (int color = 0; color < 3; color++) {
1210 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
1211 dest_scan++;
1212 src_scan++;
1213 }
1214 src_scan += src_gap;
1215 }
1216 }
1217 }
1218 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan,
1219 FX_LPCBYTE src_scan,
1220 int width,
1221 int src_Bpp,
1222 FX_LPBYTE dest_alpha_scan) {
1223 if (dest_alpha_scan == NULL) {
1224 for (int col = 0; col < width; col++) {
1225 if (src_Bpp == 4) {
1226 FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
1227 } else {
1228 FXARGB_SETDIB(dest_scan,
1229 FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
1230 }
1231 dest_scan += 4;
1232 src_scan += src_Bpp;
1233 }
1234 } else {
1235 int src_gap = src_Bpp - 3;
1236 for (int col = 0; col < width; col++) {
1237 *dest_scan++ = *src_scan++;
1238 *dest_scan++ = *src_scan++;
1239 *dest_scan++ = *src_scan++;
1240 *dest_alpha_scan++ = 0xff;
1241 src_scan += src_gap;
1242 }
1243 }
1244 }
1245 inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan,
1246 FX_LPCBYTE src_scan,
1247 int width,
1248 int blend_type,
1249 int dest_Bpp,
1250 FX_LPCBYTE clip_scan,
1251 FX_LPCBYTE src_alpha_scan) {
1252 int blended_colors[3];
1253 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1254 int dest_gap = dest_Bpp - 3;
1255 if (src_alpha_scan == NULL) {
1256 for (int col = 0; col < width; col++) {
1257 FX_BYTE src_alpha;
1258 if (clip_scan) {
1259 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1260 } else {
1261 src_alpha = src_scan[3];
1262 }
1263 if (src_alpha == 0) {
1264 dest_scan += dest_Bpp;
1265 src_scan += 4;
1266 continue;
1267 }
1268 if (bNonseparableBlend) {
1269 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1270 }
1271 for (int color = 0; color < 3; color++) {
1272 int back_color = *dest_scan;
1273 int blended = bNonseparableBlend
1274 ? blended_colors[color]
1275 : _BLEND(blend_type, back_color, *src_scan);
1276 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
1277 dest_scan++;
1278 src_scan++;
1279 }
1280 dest_scan += dest_gap;
1281 src_scan++;
1282 }
1283 } else {
1284 for (int col = 0; col < width; col++) {
1285 FX_BYTE src_alpha;
1286 if (clip_scan) {
1287 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
1288 } else {
1289 src_alpha = *src_alpha_scan++;
1290 }
1291 if (src_alpha == 0) {
1292 dest_scan += dest_Bpp;
1293 src_scan += 3;
1294 continue;
1295 }
1296 if (bNonseparableBlend) {
1297 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1298 }
1299 for (int color = 0; color < 3; color++) {
1300 int back_color = *dest_scan;
1301 int blended = bNonseparableBlend
1302 ? blended_colors[color]
1303 : _BLEND(blend_type, back_color, *src_scan);
1304 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
1305 dest_scan++;
1306 src_scan++;
1307 }
1308 dest_scan += dest_gap;
1309 }
1310 }
1311 }
1312 inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan,
1313 FX_LPCBYTE src_scan,
1314 int width,
1315 int dest_Bpp,
1316 FX_LPCBYTE clip_scan,
1317 FX_LPCBYTE src_alpha_scan) {
1318 int dest_gap = dest_Bpp - 3;
1319 if (src_alpha_scan == NULL) {
1320 for (int col = 0; col < width; col++) {
1321 FX_BYTE src_alpha;
1322 if (clip_scan) {
1323 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1324 } else {
1325 src_alpha = src_scan[3];
1326 }
1327 if (src_alpha == 255) {
1328 *dest_scan++ = *src_scan++;
1329 *dest_scan++ = *src_scan++;
1330 *dest_scan++ = *src_scan++;
1331 dest_scan += dest_gap;
1332 src_scan++;
1333 continue;
1334 }
1335 if (src_alpha == 0) {
1336 dest_scan += dest_Bpp;
1337 src_scan += 4;
1338 continue;
1339 }
1340 for (int color = 0; color < 3; color++) {
1341 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1342 dest_scan++;
1343 src_scan++;
1344 }
1345 dest_scan += dest_gap;
1346 src_scan++;
1347 }
1348 } else {
1349 for (int col = 0; col < width; col++) {
1350 FX_BYTE src_alpha;
1351 if (clip_scan) {
1352 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
1353 } else {
1354 src_alpha = *src_alpha_scan++;
1355 }
1356 if (src_alpha == 255) {
1357 *dest_scan++ = *src_scan++;
1358 *dest_scan++ = *src_scan++;
1359 *dest_scan++ = *src_scan++;
1360 dest_scan += dest_gap;
1361 continue;
1362 }
1363 if (src_alpha == 0) {
1364 dest_scan += dest_Bpp;
1365 src_scan += 3;
1366 continue;
1367 }
1368 for (int color = 0; color < 3; color++) {
1369 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1370 dest_scan++;
1371 src_scan++;
1372 }
1373 dest_scan += dest_gap;
1374 }
1375 }
1376 }
1377 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan,
1378 FX_LPCBYTE src_scan,
1379 int width,
1380 int blend_type,
1381 int dest_Bpp,
1382 int src_Bpp) {
1383 int blended_colors[3];
1384 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1385 int dest_gap = dest_Bpp - 3;
1386 int src_gap = src_Bpp - 3;
1387 for (int col = 0; col < width; col++) {
1388 if (bNonseparableBlend) {
1389 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1390 }
1391 for (int color = 0; color < 3; color++) {
1392 int back_color = *dest_scan;
1393 int src_color = *src_scan;
1394 int blended = bNonseparableBlend
1395 ? blended_colors[color]
1396 : _BLEND(blend_type, back_color, src_color);
1397 *dest_scan = blended;
1398 dest_scan++;
1399 src_scan++;
1400 }
1401 dest_scan += dest_gap;
1402 src_scan += src_gap;
1403 }
1404 }
1405 inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan,
1406 FX_LPCBYTE src_scan,
1407 int width,
1408 int blend_type,
1409 int dest_Bpp,
1410 int src_Bpp,
1411 FX_LPCBYTE clip_scan) {
1412 int blended_colors[3];
1413 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1414 int dest_gap = dest_Bpp - 3;
1415 int src_gap = src_Bpp - 3;
1416 for (int col = 0; col < width; col++) {
1417 FX_BYTE src_alpha = *clip_scan++;
1418 if (src_alpha == 0) {
1419 dest_scan += dest_Bpp;
1420 src_scan += src_Bpp;
1421 continue;
1422 }
1423 if (bNonseparableBlend) {
1424 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
1425 }
1426 for (int color = 0; color < 3; color++) {
1427 int src_color = *src_scan;
1428 int back_color = *dest_scan;
1429 int blended = bNonseparableBlend
1430 ? blended_colors[color]
1431 : _BLEND(blend_type, back_color, src_color);
1432 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
1433 dest_scan++;
1434 src_scan++;
1435 }
1436 dest_scan += dest_gap;
1437 src_scan += src_gap;
1438 }
1439 }
1440 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan,
1441 FX_LPCBYTE src_scan,
1442 int width,
1443 int dest_Bpp,
1444 int src_Bpp) {
1445 if (dest_Bpp == src_Bpp) {
1446 FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
1447 return;
1448 }
1449 for (int col = 0; col < width; col++) {
1450 dest_scan[0] = src_scan[0];
1451 dest_scan[1] = src_scan[1];
1452 dest_scan[2] = src_scan[2];
1453 dest_scan += dest_Bpp;
1454 src_scan += src_Bpp;
1455 }
1456 }
1457 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan,
1458 FX_LPCBYTE src_scan,
1459 int width,
1460 int dest_Bpp,
1461 int src_Bpp,
1462 FX_LPCBYTE clip_scan) {
1463 for (int col = 0; col < width; col++) {
1464 int src_alpha = clip_scan[col];
1465 if (src_alpha == 255) {
1466 dest_scan[0] = src_scan[0];
1467 dest_scan[1] = src_scan[1];
1468 dest_scan[2] = src_scan[2];
1469 } else if (src_alpha) {
1470 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1471 dest_scan++;
1472 src_scan++;
1473 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1474 dest_scan++;
1475 src_scan++;
1476 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1477 dest_scan += dest_Bpp - 2;
1478 src_scan += src_Bpp - 2;
1479 continue;
1480 }
1481 dest_scan += dest_Bpp;
1482 src_scan += src_Bpp;
1483 }
1484 }
1485 void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan,
1486 FX_LPCBYTE src_scan,
1487 int pixel_count,
1488 int blend_type,
1489 FX_LPCBYTE clip_scan,
1490 FX_LPBYTE dest_alpha_scan,
1491 FX_LPCBYTE src_alpha_scan,
1492 FX_LPBYTE src_cache_scan,
1493 void* pIccTransform) {
1494 FX_LPBYTE dp = src_cache_scan;
1495 ICodec_IccModule* pIccModule =
1496 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1497 if (src_alpha_scan) {
1498 if (dest_alpha_scan == NULL) {
1499 for (int col = 0; col < pixel_count; col++) {
1500 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1501 dp[3] = *src_alpha_scan++;
1502 src_scan += 3;
1503 dp += 4;
1504 }
1505 src_alpha_scan = NULL;
1506 } else {
1507 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
1508 }
1509 } else {
1510 if (dest_alpha_scan == NULL) {
1511 for (int col = 0; col < pixel_count; col++) {
1512 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1513 dp[3] = src_scan[3];
1514 src_scan += 4;
1515 dp += 4;
1516 }
1517 } else {
1518 int blended_colors[3];
1519 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1520 for (int col = 0; col < pixel_count; col++) {
1521 pIccModule->TranslateScanline(
1522 pIccTransform, src_cache_scan, src_scan, 1);
1523 FX_BYTE back_alpha = *dest_alpha_scan;
1524 if (back_alpha == 0) {
1525 if (clip_scan) {
1526 int src_alpha = clip_scan[col] * src_scan[3] / 255;
1527 *dest_alpha_scan = src_alpha;
1528 *dest_scan++ = *src_cache_scan++;
1529 *dest_scan++ = *src_cache_scan++;
1530 *dest_scan++ = *src_cache_scan++;
1531 } else {
1532 *dest_alpha_scan = src_scan[3];
1533 *dest_scan++ = *src_cache_scan++;
1534 *dest_scan++ = *src_cache_scan++;
1535 *dest_scan++ = *src_cache_scan++;
1536 }
1537 dest_alpha_scan++;
1538 src_scan += 4;
1539 continue;
1540 }
1541 FX_BYTE src_alpha;
1542 if (clip_scan == NULL) {
1543 src_alpha = src_scan[3];
1544 } else {
1545 src_alpha = clip_scan[col] * src_scan[3] / 255;
1546 }
1547 src_scan += 4;
1548 if (src_alpha == 0) {
1549 dest_scan += 3;
1550 src_cache_scan += 3;
1551 dest_alpha_scan++;
1552 continue;
1553 }
1554 FX_BYTE dest_alpha =
1555 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1556 *dest_alpha_scan++ = dest_alpha;
1557 int alpha_ratio = src_alpha * 255 / dest_alpha;
1558 if (bNonseparableBlend) {
1559 _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
1560 }
1561 for (int color = 0; color < 3; color++) {
1562 if (blend_type) {
1563 int blended = bNonseparableBlend
1564 ? blended_colors[color]
1565 : _BLEND(blend_type, *dest_scan, *src_cache_scan);
1566 blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
1567 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
1568 } else {
1569 *dest_scan =
1570 FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
1571 }
1572 dest_scan++;
1573 src_cache_scan++;
1574 }
1575 }
1576 return;
1577 }
1578 }
1579 _CompositeRow_Argb2Argb(dest_scan,
1580 src_cache_scan,
1581 pixel_count,
1582 blend_type,
1583 clip_scan,
1584 dest_alpha_scan,
1585 src_alpha_scan);
1586 }
1587 void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan,
1588 FX_LPCBYTE src_scan,
1589 int width,
1590 int blend_type,
1591 int src_Bpp,
1592 FX_LPBYTE dest_alpha_scan,
1593 FX_LPBYTE src_cache_scan,
1594 void* pIccTransform) {
1595 ICodec_IccModule* pIccModule =
1596 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1597 if (src_Bpp == 3) {
1598 pIccModule->TranslateScanline(
1599 pIccTransform, src_cache_scan, src_scan, width);
1600 } else {
1601 FX_LPBYTE dp = src_cache_scan;
1602 for (int col = 0; col < width; col++) {
1603 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1604 src_scan += 4;
1605 dp += 3;
1606 }
1607 }
1608 _CompositeRow_Rgb2Argb_Blend_NoClip(
1609 dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
1610 }
1611 inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(
1612 FX_LPBYTE dest_scan,
1613 FX_LPCBYTE src_scan,
1614 int width,
1615 int blend_type,
1616 int src_Bpp,
1617 FX_LPCBYTE clip_scan,
1618 FX_LPBYTE dest_alpha_scan,
1619 FX_LPBYTE src_cache_scan,
1620 void* pIccTransform) {
1621 ICodec_IccModule* pIccModule =
1622 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1623 if (src_Bpp == 3) {
1624 pIccModule->TranslateScanline(
1625 pIccTransform, src_cache_scan, src_scan, width);
1626 } else {
1627 FX_LPBYTE dp = src_cache_scan;
1628 for (int col = 0; col < width; col++) {
1629 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1630 src_scan += 4;
1631 dp += 3;
1632 }
1633 }
1634 _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan,
1635 src_cache_scan,
1636 width,
1637 blend_type,
1638 3,
1639 clip_scan,
1640 dest_alpha_scan);
1641 }
1642 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(
1643 FX_LPBYTE dest_scan,
1644 FX_LPCBYTE src_scan,
1645 int width,
1646 int src_Bpp,
1647 FX_LPCBYTE clip_scan,
1648 FX_LPBYTE dest_alpha_scan,
1649 FX_LPBYTE src_cache_scan,
1650 void* pIccTransform) {
1651 ICodec_IccModule* pIccModule =
1652 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1653 if (src_Bpp == 3) {
1654 pIccModule->TranslateScanline(
1655 pIccTransform, src_cache_scan, src_scan, width);
1656 } else {
1657 FX_LPBYTE dp = src_cache_scan;
1658 for (int col = 0; col < width; col++) {
1659 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1660 src_scan += 4;
1661 dp += 3;
1662 }
1663 }
1664 _CompositeRow_Rgb2Argb_NoBlend_Clip(
1665 dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
1666 }
1667 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(
1668 FX_LPBYTE dest_scan,
1669 FX_LPCBYTE src_scan,
1670 int width,
1671 int src_Bpp,
1672 FX_LPBYTE dest_alpha_scan,
1673 FX_LPBYTE src_cache_scan,
1674 void* pIccTransform) {
1675 ICodec_IccModule* pIccModule =
1676 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1677 if (src_Bpp == 3) {
1678 pIccModule->TranslateScanline(
1679 pIccTransform, src_cache_scan, src_scan, width);
1680 } else {
1681 FX_LPBYTE dp = src_cache_scan;
1682 for (int col = 0; col < width; col++) {
1683 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1684 src_scan += 4;
1685 dp += 3;
1686 }
1687 }
1688 _CompositeRow_Rgb2Argb_NoBlend_NoClip(
1689 dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
1690 }
1691 inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan,
1692 FX_LPCBYTE src_scan,
1693 int width,
1694 int blend_type,
1695 int dest_Bpp,
1696 FX_LPCBYTE clip_scan,
1697 FX_LPCBYTE src_alpha_scan,
1698 FX_LPBYTE src_cache_scan,
1699 void* pIccTransform) {
1700 ICodec_IccModule* pIccModule =
1701 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1702 if (src_alpha_scan) {
1703 pIccModule->TranslateScanline(
1704 pIccTransform, src_cache_scan, src_scan, width);
1705 } else {
1159 int blended_colors[3]; 1706 int blended_colors[3];
1160 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 1707 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1161 int dest_gap = dest_Bpp - 3; 1708 int dest_gap = dest_Bpp - 3;
1162 if (src_alpha_scan == NULL) { 1709 for (int col = 0; col < width; col++) {
1163 for (int col = 0; col < width; col ++) { 1710 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
1164 FX_BYTE src_alpha; 1711 FX_BYTE src_alpha;
1165 if (clip_scan) { 1712 if (clip_scan) {
1166 src_alpha = src_scan[3] * (*clip_scan++) / 255; 1713 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1167 } else { 1714 } else {
1168 src_alpha = src_scan[3]; 1715 src_alpha = src_scan[3];
1169 } 1716 }
1170 if (src_alpha == 0) { 1717 src_scan += 4;
1171 dest_scan += dest_Bpp; 1718 if (src_alpha == 0) {
1172 src_scan += 4; 1719 dest_scan += dest_Bpp;
1173 continue; 1720 src_cache_scan += 3;
1174 } 1721 continue;
1175 if (bNonseparableBlend) { 1722 }
1176 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); 1723 if (bNonseparableBlend) {
1177 } 1724 _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
1178 for (int color = 0; color < 3; color ++) { 1725 }
1179 int back_color = *dest_scan; 1726 for (int color = 0; color < 3; color++) {
1180 int blended = bNonseparableBlend ? blended_colors[color] : 1727 int back_color = *dest_scan;
1181 _BLEND(blend_type, back_color, *src_scan); 1728 int blended = bNonseparableBlend
1182 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); 1729 ? blended_colors[color]
1183 dest_scan ++; 1730 : _BLEND(blend_type, back_color, *src_cache_scan);
1184 src_scan ++; 1731 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
1185 } 1732 dest_scan++;
1186 dest_scan += dest_gap; 1733 src_cache_scan++;
1187 src_scan ++; 1734 }
1188 } 1735 dest_scan += dest_gap;
1189 } else { 1736 }
1190 for (int col = 0; col < width; col ++) { 1737 return;
1191 FX_BYTE src_alpha; 1738 }
1192 if (clip_scan) { 1739 _CompositeRow_Argb2Rgb_Blend(dest_scan,
1193 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; 1740 src_cache_scan,
1194 } else { 1741 width,
1195 src_alpha = *src_alpha_scan++; 1742 blend_type,
1196 } 1743 dest_Bpp,
1197 if (src_alpha == 0) { 1744 clip_scan,
1198 dest_scan += dest_Bpp; 1745 src_alpha_scan);
1199 src_scan += 3; 1746 }
1200 continue; 1747 inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan,
1201 } 1748 FX_LPCBYTE src_scan,
1202 if (bNonseparableBlend) { 1749 int width,
1203 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); 1750 int dest_Bpp,
1204 } 1751 FX_LPCBYTE clip_scan,
1205 for (int color = 0; color < 3; color ++) { 1752 FX_LPCBYTE src_alpha_scan,
1206 int back_color = *dest_scan; 1753 FX_LPBYTE src_cache_scan,
1207 int blended = bNonseparableBlend ? blended_colors[color] : 1754 void* pIccTransform) {
1208 _BLEND(blend_type, back_color, *src_scan); 1755 ICodec_IccModule* pIccModule =
1209 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); 1756 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1210 dest_scan ++; 1757 if (src_alpha_scan) {
1211 src_scan ++; 1758 pIccModule->TranslateScanline(
1212 } 1759 pIccTransform, src_cache_scan, src_scan, width);
1213 dest_scan += dest_gap; 1760 } else {
1214 }
1215 }
1216 }
1217 inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_s can, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
1218 FX_LPCBYTE src_alpha_scan)
1219 {
1220 int dest_gap = dest_Bpp - 3; 1761 int dest_gap = dest_Bpp - 3;
1221 if (src_alpha_scan == NULL) { 1762 for (int col = 0; col < width; col++) {
1222 for (int col = 0; col < width; col ++) { 1763 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
1223 FX_BYTE src_alpha; 1764 FX_BYTE src_alpha;
1224 if (clip_scan) { 1765 if (clip_scan) {
1225 src_alpha = src_scan[3] * (*clip_scan++) / 255; 1766 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1226 } else { 1767 } else {
1227 src_alpha = src_scan[3]; 1768 src_alpha = src_scan[3];
1228 } 1769 }
1229 if (src_alpha == 255) { 1770 src_scan += 4;
1230 *dest_scan++ = *src_scan++; 1771 if (src_alpha == 255) {
1231 *dest_scan++ = *src_scan++; 1772 *dest_scan++ = *src_cache_scan++;
1232 *dest_scan++ = *src_scan++; 1773 *dest_scan++ = *src_cache_scan++;
1233 dest_scan += dest_gap; 1774 *dest_scan++ = *src_cache_scan++;
1234 src_scan ++; 1775 dest_scan += dest_gap;
1235 continue; 1776 continue;
1236 } 1777 }
1237 if (src_alpha == 0) { 1778 if (src_alpha == 0) {
1238 dest_scan += dest_Bpp; 1779 dest_scan += dest_Bpp;
1239 src_scan += 4; 1780 src_cache_scan += 3;
1240 continue; 1781 continue;
1241 } 1782 }
1242 for (int color = 0; color < 3; color ++) { 1783 for (int color = 0; color < 3; color++) {
1243 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha) ; 1784 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
1244 dest_scan ++; 1785 dest_scan++;
1245 src_scan ++; 1786 src_cache_scan++;
1246 } 1787 }
1247 dest_scan += dest_gap; 1788 dest_scan += dest_gap;
1248 src_scan ++; 1789 }
1249 } 1790 return;
1250 } else { 1791 }
1251 for (int col = 0; col < width; col ++) { 1792 _CompositeRow_Argb2Rgb_NoBlend(
1252 FX_BYTE src_alpha; 1793 dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
1253 if (clip_scan) { 1794 }
1254 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; 1795 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(
1255 } else { 1796 FX_LPBYTE dest_scan,
1256 src_alpha = *src_alpha_scan++; 1797 FX_LPCBYTE src_scan,
1257 } 1798 int width,
1258 if (src_alpha == 255) { 1799 int blend_type,
1259 *dest_scan++ = *src_scan++; 1800 int dest_Bpp,
1260 *dest_scan++ = *src_scan++; 1801 int src_Bpp,
1261 *dest_scan++ = *src_scan++; 1802 FX_LPBYTE src_cache_scan,
1262 dest_scan += dest_gap; 1803 void* pIccTransform) {
1263 continue; 1804 ICodec_IccModule* pIccModule =
1264 } 1805 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1265 if (src_alpha == 0) { 1806 if (src_Bpp == 3) {
1266 dest_scan += dest_Bpp; 1807 pIccModule->TranslateScanline(
1267 src_scan += 3; 1808 pIccTransform, src_cache_scan, src_scan, width);
1268 continue; 1809 } else {
1269 } 1810 FX_LPBYTE dp = src_cache_scan;
1270 for (int color = 0; color < 3; color ++) { 1811 for (int col = 0; col < width; col++) {
1271 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha) ; 1812 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1272 dest_scan ++; 1813 src_scan += 4;
1273 src_scan ++; 1814 dp += 3;
1274 } 1815 }
1275 dest_scan += dest_gap; 1816 }
1276 } 1817 _CompositeRow_Rgb2Rgb_Blend_NoClip(
1277 } 1818 dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
1278 } 1819 }
1279 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE s rc_scan, int width, int blend_type, int dest_Bpp, int src_Bpp) 1820 inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan,
1280 { 1821 FX_LPCBYTE src_scan,
1281 int blended_colors[3]; 1822 int width,
1282 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 1823 int blend_type,
1283 int dest_gap = dest_Bpp - 3; 1824 int dest_Bpp,
1284 int src_gap = src_Bpp - 3; 1825 int src_Bpp,
1285 for (int col = 0; col < width; col ++) { 1826 FX_LPCBYTE clip_scan,
1827 FX_LPBYTE src_cache_scan,
1828 void* pIccTransform) {
1829 ICodec_IccModule* pIccModule =
1830 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1831 if (src_Bpp == 3) {
1832 pIccModule->TranslateScanline(
1833 pIccTransform, src_cache_scan, src_scan, width);
1834 } else {
1835 FX_LPBYTE dp = src_cache_scan;
1836 for (int col = 0; col < width; col++) {
1837 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1838 src_scan += 4;
1839 dp += 3;
1840 }
1841 }
1842 _CompositeRow_Rgb2Rgb_Blend_Clip(
1843 dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
1844 }
1845 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(
1846 FX_LPBYTE dest_scan,
1847 FX_LPCBYTE src_scan,
1848 int width,
1849 int dest_Bpp,
1850 int src_Bpp,
1851 FX_LPBYTE src_cache_scan,
1852 void* pIccTransform) {
1853 ICodec_IccModule* pIccModule =
1854 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1855 if (src_Bpp == 3) {
1856 pIccModule->TranslateScanline(
1857 pIccTransform, src_cache_scan, src_scan, width);
1858 } else {
1859 FX_LPBYTE dp = src_cache_scan;
1860 for (int col = 0; col < width; col++) {
1861 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1862 src_scan += 4;
1863 dp += 3;
1864 }
1865 }
1866 _CompositeRow_Rgb2Rgb_NoBlend_NoClip(
1867 dest_scan, src_cache_scan, width, dest_Bpp, 3);
1868 }
1869 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(
1870 FX_LPBYTE dest_scan,
1871 FX_LPCBYTE src_scan,
1872 int width,
1873 int dest_Bpp,
1874 int src_Bpp,
1875 FX_LPCBYTE clip_scan,
1876 FX_LPBYTE src_cache_scan,
1877 void* pIccTransform) {
1878 ICodec_IccModule* pIccModule =
1879 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
1880 if (src_Bpp == 3) {
1881 pIccModule->TranslateScanline(
1882 pIccTransform, src_cache_scan, src_scan, width);
1883 } else {
1884 FX_LPBYTE dp = src_cache_scan;
1885 for (int col = 0; col < width; col++) {
1886 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1887 src_scan += 4;
1888 dp += 3;
1889 }
1890 }
1891 _CompositeRow_Rgb2Rgb_NoBlend_Clip(
1892 dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
1893 }
1894 inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan,
1895 FX_LPCBYTE src_scan,
1896 FX_LPCBYTE pPalette,
1897 int pixel_count,
1898 int blend_type,
1899 FX_LPCBYTE clip_scan,
1900 FX_LPCBYTE src_alpha_scan) {
1901 if (src_alpha_scan) {
1902 if (blend_type) {
1903 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1904 int blended_color;
1905 for (int col = 0; col < pixel_count; col++) {
1906 FX_BYTE gray = pPalette[*src_scan];
1907 int src_alpha = *src_alpha_scan++;
1908 if (clip_scan) {
1909 src_alpha = clip_scan[col] * src_alpha / 255;
1910 }
1286 if (bNonseparableBlend) { 1911 if (bNonseparableBlend) {
1287 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); 1912 blended_color =
1288 } 1913 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1289 for (int color = 0; color < 3; color ++) { 1914 }
1290 int back_color = *dest_scan; 1915 gray = bNonseparableBlend ? blended_color
1291 int src_color = *src_scan; 1916 : _BLEND(blend_type, *dest_scan, gray);
1292 int blended = bNonseparableBlend ? blended_colors[color] : 1917 if (src_alpha) {
1293 _BLEND(blend_type, back_color, src_color); 1918 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
1294 *dest_scan = blended; 1919 } else {
1295 dest_scan ++; 1920 *dest_scan = gray;
1296 src_scan ++; 1921 }
1297 } 1922 dest_scan++;
1298 dest_scan += dest_gap; 1923 src_scan++;
1299 src_scan += src_gap; 1924 }
1300 } 1925 return;
1301 } 1926 }
1302 inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src _scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_sca n) 1927 for (int col = 0; col < pixel_count; col++) {
1303 { 1928 FX_BYTE gray = pPalette[*src_scan];
1304 int blended_colors[3]; 1929 int src_alpha = *src_alpha_scan++;
1305 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 1930 if (clip_scan) {
1306 int dest_gap = dest_Bpp - 3; 1931 src_alpha = clip_scan[col] * src_alpha / 255;
1307 int src_gap = src_Bpp - 3; 1932 }
1308 for (int col = 0; col < width; col ++) { 1933 if (src_alpha) {
1309 FX_BYTE src_alpha = *clip_scan ++; 1934 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
1935 } else {
1936 *dest_scan = gray;
1937 }
1938 dest_scan++;
1939 src_scan++;
1940 }
1941 } else {
1942 if (blend_type) {
1943 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1944 int blended_color;
1945 for (int col = 0; col < pixel_count; col++) {
1946 FX_BYTE gray = pPalette[*src_scan];
1947 if (bNonseparableBlend) {
1948 blended_color =
1949 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1950 }
1951 gray = bNonseparableBlend ? blended_color
1952 : _BLEND(blend_type, *dest_scan, gray);
1953 if (clip_scan && clip_scan[col] < 255) {
1954 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
1955 } else {
1956 *dest_scan = gray;
1957 }
1958 dest_scan++;
1959 src_scan++;
1960 }
1961 return;
1962 }
1963 for (int col = 0; col < pixel_count; col++) {
1964 FX_BYTE gray = pPalette[*src_scan];
1965 if (clip_scan && clip_scan[col] < 255) {
1966 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
1967 } else {
1968 *dest_scan = gray;
1969 }
1970 dest_scan++;
1971 src_scan++;
1972 }
1973 }
1974 }
1975 inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan,
1976 FX_LPCBYTE src_scan,
1977 FX_LPCBYTE pPalette,
1978 int pixel_count,
1979 int blend_type,
1980 FX_LPCBYTE clip_scan,
1981 FX_LPBYTE dest_alpha_scan,
1982 FX_LPCBYTE src_alpha_scan) {
1983 if (src_alpha_scan) {
1984 if (blend_type) {
1985 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1986 int blended_color;
1987 for (int col = 0; col < pixel_count; col++) {
1988 FX_BYTE gray = pPalette[*src_scan];
1989 src_scan++;
1990 FX_BYTE back_alpha = *dest_alpha_scan;
1991 if (back_alpha == 0) {
1992 int src_alpha = *src_alpha_scan++;
1993 if (clip_scan) {
1994 src_alpha = clip_scan[col] * src_alpha / 255;
1995 }
1996 if (src_alpha) {
1997 *dest_scan = gray;
1998 *dest_alpha_scan = src_alpha;
1999 }
2000 dest_scan++;
2001 dest_alpha_scan++;
2002 continue;
2003 }
2004 FX_BYTE src_alpha = *src_alpha_scan++;
2005 if (clip_scan) {
2006 src_alpha = clip_scan[col] * src_alpha / 255;
2007 }
1310 if (src_alpha == 0) { 2008 if (src_alpha == 0) {
1311 dest_scan += dest_Bpp; 2009 dest_scan++;
1312 src_scan += src_Bpp; 2010 dest_alpha_scan++;
1313 continue; 2011 continue;
1314 } 2012 }
2013 *dest_alpha_scan =
2014 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2015 int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
1315 if (bNonseparableBlend) { 2016 if (bNonseparableBlend) {
1316 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); 2017 blended_color =
1317 } 2018 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1318 for (int color = 0; color < 3; color ++) { 2019 }
1319 int src_color = *src_scan; 2020 gray = bNonseparableBlend ? blended_color
1320 int back_color = *dest_scan; 2021 : _BLEND(blend_type, *dest_scan, gray);
1321 int blended = bNonseparableBlend ? blended_colors[color] : 2022 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1322 _BLEND(blend_type, back_color, src_color); 2023 dest_alpha_scan++;
1323 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); 2024 dest_scan++;
1324 dest_scan ++; 2025 }
1325 src_scan ++; 2026 return;
1326 } 2027 }
1327 dest_scan += dest_gap; 2028 for (int col = 0; col < pixel_count; col++) {
1328 src_scan += src_gap; 2029 FX_BYTE gray = pPalette[*src_scan];
1329 } 2030 src_scan++;
1330 } 2031 FX_BYTE back_alpha = *dest_alpha_scan;
1331 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp) 2032 if (back_alpha == 0) {
1332 { 2033 int src_alpha = *src_alpha_scan++;
1333 if (dest_Bpp == src_Bpp) { 2034 if (clip_scan) {
1334 FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp); 2035 src_alpha = clip_scan[col] * src_alpha / 255;
1335 return; 2036 }
1336 } 2037 if (src_alpha) {
1337 for (int col = 0; col < width; col ++) { 2038 *dest_scan = gray;
1338 dest_scan[0] = src_scan[0]; 2039 *dest_alpha_scan = src_alpha;
1339 dest_scan[1] = src_scan[1]; 2040 }
1340 dest_scan[2] = src_scan[2]; 2041 dest_scan++;
1341 dest_scan += dest_Bpp; 2042 dest_alpha_scan++;
1342 src_scan += src_Bpp; 2043 continue;
1343 } 2044 }
1344 } 2045 FX_BYTE src_alpha = *src_alpha_scan++;
1345 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE s rc_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan) 2046 if (clip_scan) {
1346 { 2047 src_alpha = clip_scan[col] * src_alpha / 255;
1347 for (int col = 0; col < width; col ++) { 2048 }
1348 int src_alpha = clip_scan[col]; 2049 if (src_alpha == 0) {
1349 if (src_alpha == 255) { 2050 dest_scan++;
1350 dest_scan[0] = src_scan[0]; 2051 dest_alpha_scan++;
1351 dest_scan[1] = src_scan[1]; 2052 continue;
1352 dest_scan[2] = src_scan[2]; 2053 }
1353 } else if (src_alpha) { 2054 *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1354 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); 2055 int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
1355 dest_scan ++; 2056 dest_alpha_scan++;
1356 src_scan ++; 2057 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1357 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); 2058 dest_scan++;
1358 dest_scan ++; 2059 }
1359 src_scan ++; 2060 } else {
1360 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
1361 dest_scan += dest_Bpp - 2;
1362 src_scan += src_Bpp - 2;
1363 continue;
1364 }
1365 dest_scan += dest_Bpp;
1366 src_scan += src_Bpp;
1367 }
1368 }
1369 void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
1370 FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src _alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
1371 {
1372 FX_LPBYTE dp = src_cache_scan;
1373 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1374 if (src_alpha_scan) {
1375 if (dest_alpha_scan == NULL) {
1376 for (int col = 0; col < pixel_count; col ++) {
1377 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1378 dp[3] = *src_alpha_scan++;
1379 src_scan += 3;
1380 dp += 4;
1381 }
1382 src_alpha_scan = NULL;
1383 } else {
1384 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_cou nt);
1385 }
1386 } else {
1387 if (dest_alpha_scan == NULL) {
1388 for (int col = 0; col < pixel_count; col ++) {
1389 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1390 dp[3] = src_scan[3];
1391 src_scan += 4;
1392 dp += 4;
1393 }
1394 } else {
1395 int blended_colors[3];
1396 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1397 for (int col = 0; col < pixel_count; col ++) {
1398 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src _scan, 1);
1399 FX_BYTE back_alpha = *dest_alpha_scan;
1400 if (back_alpha == 0) {
1401 if (clip_scan) {
1402 int src_alpha = clip_scan[col] * src_scan[3] / 255;
1403 *dest_alpha_scan = src_alpha;
1404 *dest_scan++ = *src_cache_scan++;
1405 *dest_scan++ = *src_cache_scan++;
1406 *dest_scan++ = *src_cache_scan++;
1407 } else {
1408 *dest_alpha_scan = src_scan[3];
1409 *dest_scan++ = *src_cache_scan++;
1410 *dest_scan++ = *src_cache_scan++;
1411 *dest_scan++ = *src_cache_scan++;
1412 }
1413 dest_alpha_scan ++;
1414 src_scan += 4;
1415 continue;
1416 }
1417 FX_BYTE src_alpha;
1418 if (clip_scan == NULL) {
1419 src_alpha = src_scan[3];
1420 } else {
1421 src_alpha = clip_scan[col] * src_scan[3] / 255;
1422 }
1423 src_scan += 4;
1424 if (src_alpha == 0) {
1425 dest_scan += 3;
1426 src_cache_scan += 3;
1427 dest_alpha_scan ++;
1428 continue;
1429 }
1430 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
1431 *dest_alpha_scan ++ = dest_alpha;
1432 int alpha_ratio = src_alpha * 255 / dest_alpha;
1433 if (bNonseparableBlend) {
1434 _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_co lors);
1435 }
1436 for (int color = 0; color < 3; color ++) {
1437 if (blend_type) {
1438 int blended = bNonseparableBlend ? blended_colors[color] :
1439 _BLEND(blend_type, *dest_scan, *src_cache_ scan);
1440 blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, ba ck_alpha);
1441 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alph a_ratio);
1442 } else {
1443 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_sc an, alpha_ratio);
1444 }
1445 dest_scan ++;
1446 src_cache_scan ++;
1447 }
1448 }
1449 return;
1450 }
1451 }
1452 _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
1453 }
1454 void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBY TE src_scan, int width, int blend_type, int src_Bpp,
1455 FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1456 {
1457 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1458 if (src_Bpp == 3) {
1459 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1460 } else {
1461 FX_LPBYTE dp = src_cache_scan;
1462 for (int col = 0; col < width; col ++) {
1463 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1464 src_scan += 4;
1465 dp += 3;
1466 }
1467 }
1468 _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_ type, 3, dest_alpha_scan);
1469 }
1470 inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_ LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
1471 FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1472 {
1473 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1474 if (src_Bpp == 3) {
1475 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1476 } else {
1477 FX_LPBYTE dp = src_cache_scan;
1478 for (int col = 0; col < width; col ++) {
1479 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1480 src_scan += 4;
1481 dp += 3;
1482 }
1483 }
1484 _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_ty pe, 3, clip_scan, dest_alpha_scan);
1485 }
1486 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, F X_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
1487 FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1488 {
1489 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1490 if (src_Bpp == 3) {
1491 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1492 } else {
1493 FX_LPBYTE dp = src_cache_scan;
1494 for (int col = 0; col < width; col ++) {
1495 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1496 src_scan += 4;
1497 dp += 3;
1498 }
1499 }
1500 _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, cli p_scan, dest_alpha_scan);
1501 }
1502 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
1503 FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1504 {
1505 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1506 if (src_Bpp == 3) {
1507 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1508 } else {
1509 FX_LPBYTE dp = src_cache_scan;
1510 for (int col = 0; col < width; col ++) {
1511 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1512 src_scan += 4;
1513 dp += 3;
1514 }
1515 }
1516 _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, d est_alpha_scan);
1517 }
1518 inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBY TE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
1519 FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1520 {
1521 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1522 if (src_alpha_scan) {
1523 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1524 } else {
1525 int blended_colors[3];
1526 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1527 int dest_gap = dest_Bpp - 3;
1528 for (int col = 0; col < width; col ++) {
1529 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_sca n, 1);
1530 FX_BYTE src_alpha;
1531 if (clip_scan) {
1532 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1533 } else {
1534 src_alpha = src_scan[3];
1535 }
1536 src_scan += 4;
1537 if (src_alpha == 0) {
1538 dest_scan += dest_Bpp;
1539 src_cache_scan += 3;
1540 continue;
1541 }
1542 if (bNonseparableBlend) {
1543 _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors );
1544 }
1545 for (int color = 0; color < 3; color ++) {
1546 int back_color = *dest_scan;
1547 int blended = bNonseparableBlend ? blended_colors[color] :
1548 _BLEND(blend_type, back_color, *src_cache_scan);
1549 *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
1550 dest_scan ++;
1551 src_cache_scan ++;
1552 }
1553 dest_scan += dest_gap;
1554 }
1555 return;
1556 }
1557 _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, d est_Bpp, clip_scan, src_alpha_scan);
1558 }
1559 inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPC BYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
1560 FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform )
1561 {
1562 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1563 if (src_alpha_scan) {
1564 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1565 } else {
1566 int dest_gap = dest_Bpp - 3;
1567 for (int col = 0; col < width; col ++) {
1568 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_sca n, 1);
1569 FX_BYTE src_alpha;
1570 if (clip_scan) {
1571 src_alpha = src_scan[3] * (*clip_scan++) / 255;
1572 } else {
1573 src_alpha = src_scan[3];
1574 }
1575 src_scan += 4;
1576 if (src_alpha == 255) {
1577 *dest_scan++ = *src_cache_scan++;
1578 *dest_scan++ = *src_cache_scan++;
1579 *dest_scan++ = *src_cache_scan++;
1580 dest_scan += dest_gap;
1581 continue;
1582 }
1583 if (src_alpha == 0) {
1584 dest_scan += dest_Bpp;
1585 src_cache_scan += 3;
1586 continue;
1587 }
1588 for (int color = 0; color < 3; color ++) {
1589 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_ alpha);
1590 dest_scan ++;
1591 src_cache_scan ++;
1592 }
1593 dest_scan += dest_gap;
1594 }
1595 return;
1596 }
1597 _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, c lip_scan, src_alpha_scan);
1598 }
1599 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX _LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
1600 FX_LPBYTE src_cache_scan, void* pIccTransform)
1601 {
1602 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1603 if (src_Bpp == 3) {
1604 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1605 } else {
1606 FX_LPBYTE dp = src_cache_scan;
1607 for (int col = 0; col < width; col ++) {
1608 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1609 src_scan += 4;
1610 dp += 3;
1611 }
1612 }
1613 _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_t ype, dest_Bpp, 3);
1614 }
1615 inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_L PCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYT E clip_scan,
1616 FX_LPBYTE src_cache_scan, void* pIccTransform)
1617 {
1618 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1619 if (src_Bpp == 3) {
1620 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1621 } else {
1622 FX_LPBYTE dp = src_cache_scan;
1623 for (int col = 0; col < width; col ++) {
1624 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1625 src_scan += 4;
1626 dp += 3;
1627 }
1628 }
1629 _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_typ e, dest_Bpp, 3, clip_scan);
1630 }
1631 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
1632 FX_LPBYTE src_cache_scan, void* pIccTransform)
1633 {
1634 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1635 if (src_Bpp == 3) {
1636 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1637 } else {
1638 FX_LPBYTE dp = src_cache_scan;
1639 for (int col = 0; col < width; col ++) {
1640 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1641 src_scan += 4;
1642 dp += 3;
1643 }
1644 }
1645 _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_ Bpp, 3);
1646 }
1647 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX _LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
1648 FX_LPBYTE src_cache_scan, void* pIccTransform)
1649 {
1650 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIcc Module();
1651 if (src_Bpp == 3) {
1652 pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, w idth);
1653 } else {
1654 FX_LPBYTE dp = src_cache_scan;
1655 for (int col = 0; col < width; col ++) {
1656 pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
1657 src_scan += 4;
1658 dp += 3;
1659 }
1660 }
1661 _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bp p, 3, clip_scan);
1662 }
1663 inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
1664 int blend_type, FX_LPCBYTE clip_scan,
1665 FX_LPCBYTE src_alpha_scan)
1666 {
1667 if (src_alpha_scan) {
1668 if (blend_type) {
1669 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1670 int blended_color;
1671 for (int col = 0; col < pixel_count; col ++) {
1672 FX_BYTE gray = pPalette[*src_scan];
1673 int src_alpha = *src_alpha_scan++;
1674 if (clip_scan) {
1675 src_alpha = clip_scan[col] * src_alpha / 255;
1676 }
1677 if (bNonseparableBlend) {
1678 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1679 }
1680 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, * dest_scan, gray);
1681 if (src_alpha) {
1682 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
1683 } else {
1684 *dest_scan = gray;
1685 }
1686 dest_scan ++;
1687 src_scan ++;
1688 }
1689 return;
1690 }
1691 for (int col = 0; col < pixel_count; col ++) {
1692 FX_BYTE gray = pPalette[*src_scan];
1693 int src_alpha = *src_alpha_scan++;
1694 if (clip_scan) {
1695 src_alpha = clip_scan[col] * src_alpha / 255;
1696 }
1697 if (src_alpha) {
1698 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
1699 } else {
1700 *dest_scan = gray;
1701 }
1702 dest_scan ++;
1703 src_scan ++;
1704 }
1705 } else {
1706 if (blend_type) {
1707 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1708 int blended_color;
1709 for (int col = 0; col < pixel_count; col ++) {
1710 FX_BYTE gray = pPalette[*src_scan];
1711 if (bNonseparableBlend) {
1712 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1713 }
1714 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, * dest_scan, gray);
1715 if (clip_scan && clip_scan[col] < 255) {
1716 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[c ol]);
1717 } else {
1718 *dest_scan = gray;
1719 }
1720 dest_scan ++;
1721 src_scan ++;
1722 }
1723 return;
1724 }
1725 for (int col = 0; col < pixel_count; col ++) {
1726 FX_BYTE gray = pPalette[*src_scan];
1727 if (clip_scan && clip_scan[col] < 255) {
1728 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]) ;
1729 } else {
1730 *dest_scan = gray;
1731 }
1732 dest_scan ++;
1733 src_scan ++;
1734 }
1735 }
1736 }
1737 inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan , FX_LPCBYTE pPalette, int pixel_count,
1738 int blend_type, FX_LPCBYTE clip_scan,
1739 FX_LPBYTE dest_alpha_scan, FX_LPCBYTE sr c_alpha_scan)
1740 {
1741 if (src_alpha_scan) {
1742 if (blend_type) {
1743 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1744 int blended_color;
1745 for (int col = 0; col < pixel_count; col ++) {
1746 FX_BYTE gray = pPalette[*src_scan];
1747 src_scan ++;
1748 FX_BYTE back_alpha = *dest_alpha_scan;
1749 if (back_alpha == 0) {
1750 int src_alpha = *src_alpha_scan ++;
1751 if (clip_scan) {
1752 src_alpha = clip_scan[col] * src_alpha / 255;
1753 }
1754 if (src_alpha) {
1755 *dest_scan = gray;
1756 *dest_alpha_scan = src_alpha;
1757 }
1758 dest_scan ++;
1759 dest_alpha_scan ++;
1760 continue;
1761 }
1762 FX_BYTE src_alpha = *src_alpha_scan++;
1763 if (clip_scan) {
1764 src_alpha = clip_scan[col] * src_alpha / 255;
1765 }
1766 if (src_alpha == 0) {
1767 dest_scan ++;
1768 dest_alpha_scan ++;
1769 continue;
1770 }
1771 *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alp ha / 255;
1772 int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
1773 if (bNonseparableBlend) {
1774 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1775 }
1776 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, * dest_scan, gray);
1777 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1778 dest_alpha_scan ++;
1779 dest_scan ++;
1780 }
1781 return;
1782 }
1783 for (int col = 0; col < pixel_count; col ++) {
1784 FX_BYTE gray = pPalette[*src_scan];
1785 src_scan ++;
1786 FX_BYTE back_alpha = *dest_alpha_scan;
1787 if (back_alpha == 0) {
1788 int src_alpha = *src_alpha_scan ++;
1789 if (clip_scan) {
1790 src_alpha = clip_scan[col] * src_alpha / 255;
1791 }
1792 if (src_alpha) {
1793 *dest_scan = gray;
1794 *dest_alpha_scan = src_alpha;
1795 }
1796 dest_scan ++;
1797 dest_alpha_scan ++;
1798 continue;
1799 }
1800 FX_BYTE src_alpha = *src_alpha_scan++;
1801 if (clip_scan) {
1802 src_alpha = clip_scan[col] * src_alpha / 255;
1803 }
1804 if (src_alpha == 0) {
1805 dest_scan ++;
1806 dest_alpha_scan ++;
1807 continue;
1808 }
1809 *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1810 int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
1811 dest_alpha_scan ++;
1812 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1813 dest_scan ++;
1814 }
1815 } else {
1816 if (blend_type) {
1817 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1818 int blended_color;
1819 for (int col = 0; col < pixel_count; col ++) {
1820 FX_BYTE gray = pPalette[*src_scan];
1821 src_scan ++;
1822 if (clip_scan == NULL || clip_scan[col] == 255) {
1823 *dest_scan++ = gray;
1824 *dest_alpha_scan++ = 255;
1825 continue;
1826 }
1827 int src_alpha = clip_scan[col];
1828 if (src_alpha == 0) {
1829 dest_scan ++;
1830 dest_alpha_scan ++;
1831 continue;
1832 }
1833 int back_alpha = *dest_alpha_scan;
1834 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_a lpha / 255;
1835 *dest_alpha_scan ++ = dest_alpha;
1836 int alpha_ratio = src_alpha * 255 / dest_alpha;
1837 if (bNonseparableBlend) {
1838 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
1839 }
1840 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, * dest_scan, gray);
1841 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1842 dest_scan ++;
1843 }
1844 return;
1845 }
1846 for (int col = 0; col < pixel_count; col ++) {
1847 FX_BYTE gray = pPalette[*src_scan];
1848 src_scan ++;
1849 if (clip_scan == NULL || clip_scan[col] == 255) {
1850 *dest_scan++ = gray;
1851 *dest_alpha_scan++ = 255;
1852 continue;
1853 }
1854 int src_alpha = clip_scan[col];
1855 if (src_alpha == 0) {
1856 dest_scan ++;
1857 dest_alpha_scan ++;
1858 continue;
1859 }
1860 int back_alpha = *dest_alpha_scan;
1861 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1862 *dest_alpha_scan ++ = dest_alpha;
1863 int alpha_ratio = src_alpha * 255 / dest_alpha;
1864 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1865 dest_scan ++;
1866 }
1867 }
1868 }
1869 inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
1870 FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
1871 {
1872 int reset_gray = pPalette[0];
1873 int set_gray = pPalette[1];
1874 if (blend_type) { 2061 if (blend_type) {
1875 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; 2062 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1876 int blended_color; 2063 int blended_color;
1877 for (int col = 0; col < pixel_count; col ++) { 2064 for (int col = 0; col < pixel_count; col++) {
1878 FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + s rc_left) % 8))) ? set_gray : reset_gray; 2065 FX_BYTE gray = pPalette[*src_scan];
1879 if (bNonseparableBlend) { 2066 src_scan++;
1880 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *d est_scan;
1881 }
1882 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest _scan, gray);
1883 if (clip_scan && clip_scan[col] < 255) {
1884 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]) ;
1885 } else {
1886 *dest_scan = gray;
1887 }
1888 dest_scan ++;
1889 }
1890 return;
1891 }
1892 for (int col = 0; col < pixel_count; col ++) {
1893 FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_l eft) % 8))) ? set_gray : reset_gray;
1894 if (clip_scan && clip_scan[col] < 255) {
1895 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
1896 } else {
1897 *dest_scan = gray;
1898 }
1899 dest_scan ++;
1900 }
1901 }
1902 inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan , int src_left,
1903 FX_LPCBYTE pPalette, int pixel_count, in t blend_type, FX_LPCBYTE clip_scan,
1904 FX_LPBYTE dest_alpha_scan)
1905 {
1906 int reset_gray = pPalette[0];
1907 int set_gray = pPalette[1];
1908 if (blend_type) {
1909 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1910 int blended_color;
1911 for (int col = 0; col < pixel_count; col ++) {
1912 FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + s rc_left) % 8))) ? set_gray : reset_gray;
1913 if (clip_scan == NULL || clip_scan[col] == 255) {
1914 *dest_scan++ = gray;
1915 *dest_alpha_scan ++ = 255;
1916 continue;
1917 }
1918 int src_alpha = clip_scan[col];
1919 if (src_alpha == 0) {
1920 dest_scan ++;
1921 dest_alpha_scan ++;
1922 continue;
1923 }
1924 int back_alpha = *dest_alpha_scan;
1925 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
1926 *dest_alpha_scan ++ = dest_alpha;
1927 int alpha_ratio = src_alpha * 255 / dest_alpha;
1928 if (bNonseparableBlend) {
1929 blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *d est_scan;
1930 }
1931 gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest _scan, gray);
1932 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1933 dest_scan ++;
1934 }
1935 return;
1936 }
1937 for (int col = 0; col < pixel_count; col ++) {
1938 FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_l eft) % 8))) ? set_gray : reset_gray;
1939 if (clip_scan == NULL || clip_scan[col] == 255) { 2067 if (clip_scan == NULL || clip_scan[col] == 255) {
1940 *dest_scan++ = gray; 2068 *dest_scan++ = gray;
1941 *dest_alpha_scan ++ = 255; 2069 *dest_alpha_scan++ = 255;
1942 continue; 2070 continue;
1943 } 2071 }
1944 int src_alpha = clip_scan[col]; 2072 int src_alpha = clip_scan[col];
1945 if (src_alpha == 0) { 2073 if (src_alpha == 0) {
1946 dest_scan ++; 2074 dest_scan++;
1947 dest_alpha_scan ++; 2075 dest_alpha_scan++;
1948 continue; 2076 continue;
1949 } 2077 }
1950 int back_alpha = *dest_alpha_scan; 2078 int back_alpha = *dest_alpha_scan;
1951 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55; 2079 FX_BYTE dest_alpha =
1952 *dest_alpha_scan ++ = dest_alpha; 2080 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2081 *dest_alpha_scan++ = dest_alpha;
1953 int alpha_ratio = src_alpha * 255 / dest_alpha; 2082 int alpha_ratio = src_alpha * 255 / dest_alpha;
2083 if (bNonseparableBlend) {
2084 blended_color =
2085 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
2086 }
2087 gray = bNonseparableBlend ? blended_color
2088 : _BLEND(blend_type, *dest_scan, gray);
1954 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); 2089 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1955 dest_scan ++; 2090 dest_scan++;
1956 } 2091 }
1957 } 2092 return;
1958 inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE sr c_scan, FX_DWORD* pPalette, int pixel_count, 2093 }
1959 int DestBpp, FX_LPCBYTE clip_scan, 2094 for (int col = 0; col < pixel_count; col++) {
1960 FX_LPCBYTE src_alpha_scan) 2095 FX_BYTE gray = pPalette[*src_scan];
1961 { 2096 src_scan++;
1962 if (src_alpha_scan) { 2097 if (clip_scan == NULL || clip_scan[col] == 255) {
1963 int dest_gap = DestBpp - 3; 2098 *dest_scan++ = gray;
1964 FX_ARGB argb = 0; 2099 *dest_alpha_scan++ = 255;
1965 for (int col = 0; col < pixel_count; col ++) { 2100 continue;
1966 argb = pPalette[*src_scan]; 2101 }
1967 int src_r = FXARGB_R(argb); 2102 int src_alpha = clip_scan[col];
1968 int src_g = FXARGB_G(argb); 2103 if (src_alpha == 0) {
1969 int src_b = FXARGB_B(argb); 2104 dest_scan++;
1970 src_scan ++; 2105 dest_alpha_scan++;
1971 FX_BYTE src_alpha = 0; 2106 continue;
1972 if (clip_scan) { 2107 }
1973 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; 2108 int back_alpha = *dest_alpha_scan;
1974 } else { 2109 FX_BYTE dest_alpha =
1975 src_alpha = *src_alpha_scan++; 2110 back_alpha + src_alpha - back_alpha * src_alpha / 255;
1976 } 2111 *dest_alpha_scan++ = dest_alpha;
1977 if (src_alpha == 255) { 2112 int alpha_ratio = src_alpha * 255 / dest_alpha;
1978 *dest_scan++ = src_b; 2113 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
1979 *dest_scan++ = src_g; 2114 dest_scan++;
1980 *dest_scan++ = src_r; 2115 }
1981 dest_scan += dest_gap; 2116 }
1982 continue; 2117 }
1983 } 2118 inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan,
1984 if (src_alpha == 0) { 2119 FX_LPCBYTE src_scan,
1985 dest_scan += DestBpp; 2120 int src_left,
1986 continue; 2121 FX_LPCBYTE pPalette,
1987 } 2122 int pixel_count,
1988 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); 2123 int blend_type,
1989 dest_scan ++; 2124 FX_LPCBYTE clip_scan) {
1990 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); 2125 int reset_gray = pPalette[0];
1991 dest_scan ++; 2126 int set_gray = pPalette[1];
1992 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); 2127 if (blend_type) {
1993 dest_scan ++; 2128 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
1994 dest_scan += dest_gap; 2129 int blended_color;
1995 } 2130 for (int col = 0; col < pixel_count; col++) {
1996 } else { 2131 FX_BYTE gray =
1997 FX_ARGB argb = 0; 2132 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
1998 for (int col = 0; col < pixel_count; col ++) { 2133 ? set_gray
1999 argb = pPalette[*src_scan]; 2134 : reset_gray;
2000 int src_r = FXARGB_R(argb); 2135 if (bNonseparableBlend) {
2001 int src_g = FXARGB_G(argb); 2136 blended_color =
2002 int src_b = FXARGB_B(argb); 2137 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
2003 if (clip_scan && clip_scan[col] < 255) { 2138 }
2004 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col] ); 2139 gray = bNonseparableBlend ? blended_color
2005 dest_scan ++; 2140 : _BLEND(blend_type, *dest_scan, gray);
2006 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col] ); 2141 if (clip_scan && clip_scan[col] < 255) {
2007 dest_scan ++; 2142 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
2008 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col] ); 2143 } else {
2009 dest_scan ++; 2144 *dest_scan = gray;
2010 } else { 2145 }
2011 *dest_scan++ = src_b; 2146 dest_scan++;
2012 *dest_scan++ = src_g; 2147 }
2013 *dest_scan++ = src_r; 2148 return;
2014 } 2149 }
2015 if (DestBpp == 4) { 2150 for (int col = 0; col < pixel_count; col++) {
2016 dest_scan++; 2151 FX_BYTE gray =
2017 } 2152 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
2018 src_scan ++; 2153 ? set_gray
2019 } 2154 : reset_gray;
2020 } 2155 if (clip_scan && clip_scan[col] < 255) {
2021 } 2156 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
2022 inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE sr c_scan, int src_left, 2157 } else {
2023 FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan) 2158 *dest_scan = gray;
2024 { 2159 }
2025 int reset_r, reset_g, reset_b; 2160 dest_scan++;
2026 int set_r, set_g, set_b; 2161 }
2162 }
2163 inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan,
2164 FX_LPCBYTE src_scan,
2165 int src_left,
2166 FX_LPCBYTE pPalette,
2167 int pixel_count,
2168 int blend_type,
2169 FX_LPCBYTE clip_scan,
2170 FX_LPBYTE dest_alpha_scan) {
2171 int reset_gray = pPalette[0];
2172 int set_gray = pPalette[1];
2173 if (blend_type) {
2174 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
2175 int blended_color;
2176 for (int col = 0; col < pixel_count; col++) {
2177 FX_BYTE gray =
2178 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
2179 ? set_gray
2180 : reset_gray;
2181 if (clip_scan == NULL || clip_scan[col] == 255) {
2182 *dest_scan++ = gray;
2183 *dest_alpha_scan++ = 255;
2184 continue;
2185 }
2186 int src_alpha = clip_scan[col];
2187 if (src_alpha == 0) {
2188 dest_scan++;
2189 dest_alpha_scan++;
2190 continue;
2191 }
2192 int back_alpha = *dest_alpha_scan;
2193 FX_BYTE dest_alpha =
2194 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2195 *dest_alpha_scan++ = dest_alpha;
2196 int alpha_ratio = src_alpha * 255 / dest_alpha;
2197 if (bNonseparableBlend) {
2198 blended_color =
2199 blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
2200 }
2201 gray = bNonseparableBlend ? blended_color
2202 : _BLEND(blend_type, *dest_scan, gray);
2203 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
2204 dest_scan++;
2205 }
2206 return;
2207 }
2208 for (int col = 0; col < pixel_count; col++) {
2209 FX_BYTE gray =
2210 (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
2211 ? set_gray
2212 : reset_gray;
2213 if (clip_scan == NULL || clip_scan[col] == 255) {
2214 *dest_scan++ = gray;
2215 *dest_alpha_scan++ = 255;
2216 continue;
2217 }
2218 int src_alpha = clip_scan[col];
2219 if (src_alpha == 0) {
2220 dest_scan++;
2221 dest_alpha_scan++;
2222 continue;
2223 }
2224 int back_alpha = *dest_alpha_scan;
2225 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2226 *dest_alpha_scan++ = dest_alpha;
2227 int alpha_ratio = src_alpha * 255 / dest_alpha;
2228 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
2229 dest_scan++;
2230 }
2231 }
2232 inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan,
2233 FX_LPCBYTE src_scan,
2234 FX_DWORD* pPalette,
2235 int pixel_count,
2236 int DestBpp,
2237 FX_LPCBYTE clip_scan,
2238 FX_LPCBYTE src_alpha_scan) {
2239 if (src_alpha_scan) {
2240 int dest_gap = DestBpp - 3;
2241 FX_ARGB argb = 0;
2242 for (int col = 0; col < pixel_count; col++) {
2243 argb = pPalette[*src_scan];
2244 int src_r = FXARGB_R(argb);
2245 int src_g = FXARGB_G(argb);
2246 int src_b = FXARGB_B(argb);
2247 src_scan++;
2248 FX_BYTE src_alpha = 0;
2249 if (clip_scan) {
2250 src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
2251 } else {
2252 src_alpha = *src_alpha_scan++;
2253 }
2254 if (src_alpha == 255) {
2255 *dest_scan++ = src_b;
2256 *dest_scan++ = src_g;
2257 *dest_scan++ = src_r;
2258 dest_scan += dest_gap;
2259 continue;
2260 }
2261 if (src_alpha == 0) {
2262 dest_scan += DestBpp;
2263 continue;
2264 }
2265 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
2266 dest_scan++;
2267 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
2268 dest_scan++;
2269 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
2270 dest_scan++;
2271 dest_scan += dest_gap;
2272 }
2273 } else {
2274 FX_ARGB argb = 0;
2275 for (int col = 0; col < pixel_count; col++) {
2276 argb = pPalette[*src_scan];
2277 int src_r = FXARGB_R(argb);
2278 int src_g = FXARGB_G(argb);
2279 int src_b = FXARGB_B(argb);
2280 if (clip_scan && clip_scan[col] < 255) {
2281 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
2282 dest_scan++;
2283 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
2284 dest_scan++;
2285 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
2286 dest_scan++;
2287 } else {
2288 *dest_scan++ = src_b;
2289 *dest_scan++ = src_g;
2290 *dest_scan++ = src_r;
2291 }
2292 if (DestBpp == 4) {
2293 dest_scan++;
2294 }
2295 src_scan++;
2296 }
2297 }
2298 }
2299 inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan,
2300 FX_LPCBYTE src_scan,
2301 int src_left,
2302 FX_DWORD* pPalette,
2303 int pixel_count,
2304 int DestBpp,
2305 FX_LPCBYTE clip_scan) {
2306 int reset_r, reset_g, reset_b;
2307 int set_r, set_g, set_b;
2308 reset_r = FXARGB_R(pPalette[0]);
2309 reset_g = FXARGB_G(pPalette[0]);
2310 reset_b = FXARGB_B(pPalette[0]);
2311 set_r = FXARGB_R(pPalette[1]);
2312 set_g = FXARGB_G(pPalette[1]);
2313 set_b = FXARGB_B(pPalette[1]);
2314 for (int col = 0; col < pixel_count; col++) {
2315 int src_r, src_g, src_b;
2316 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
2317 src_r = set_r;
2318 src_g = set_g;
2319 src_b = set_b;
2320 } else {
2321 src_r = reset_r;
2322 src_g = reset_g;
2323 src_b = reset_b;
2324 }
2325 if (clip_scan && clip_scan[col] < 255) {
2326 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
2327 dest_scan++;
2328 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
2329 dest_scan++;
2330 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
2331 dest_scan++;
2332 } else {
2333 *dest_scan++ = src_b;
2334 *dest_scan++ = src_g;
2335 *dest_scan++ = src_r;
2336 }
2337 if (DestBpp == 4) {
2338 dest_scan++;
2339 }
2340 }
2341 }
2342 inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan,
2343 FX_LPCBYTE src_scan,
2344 int width,
2345 FX_DWORD* pPalette,
2346 FX_LPCBYTE clip_scan,
2347 FX_LPCBYTE src_alpha_scan) {
2348 if (src_alpha_scan) {
2349 for (int col = 0; col < width; col++) {
2350 FX_ARGB argb = pPalette[*src_scan];
2351 src_scan++;
2352 int src_r = FXARGB_R(argb);
2353 int src_g = FXARGB_G(argb);
2354 int src_b = FXARGB_B(argb);
2355 FX_BYTE back_alpha = dest_scan[3];
2356 if (back_alpha == 0) {
2357 if (clip_scan) {
2358 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
2359 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
2360 } else {
2361 FXARGB_SETDIB(dest_scan,
2362 FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
2363 }
2364 dest_scan += 4;
2365 src_alpha_scan++;
2366 continue;
2367 }
2368 FX_BYTE src_alpha;
2369 if (clip_scan == NULL) {
2370 src_alpha = *src_alpha_scan++;
2371 } else {
2372 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
2373 }
2374 if (src_alpha == 0) {
2375 dest_scan += 4;
2376 continue;
2377 }
2378 FX_BYTE dest_alpha =
2379 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2380 dest_scan[3] = dest_alpha;
2381 int alpha_ratio = src_alpha * 255 / dest_alpha;
2382 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2383 dest_scan++;
2384 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2385 dest_scan++;
2386 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2387 dest_scan++;
2388 dest_scan++;
2389 }
2390 } else
2391 for (int col = 0; col < width; col++) {
2392 FX_ARGB argb = pPalette[*src_scan];
2393 int src_r = FXARGB_R(argb);
2394 int src_g = FXARGB_G(argb);
2395 int src_b = FXARGB_B(argb);
2396 if (clip_scan == NULL || clip_scan[col] == 255) {
2397 *dest_scan++ = src_b;
2398 *dest_scan++ = src_g;
2399 *dest_scan++ = src_r;
2400 *dest_scan++ = 255;
2401 src_scan++;
2402 continue;
2403 }
2404 int src_alpha = clip_scan[col];
2405 if (src_alpha == 0) {
2406 dest_scan += 4;
2407 src_scan++;
2408 continue;
2409 }
2410 int back_alpha = dest_scan[3];
2411 FX_BYTE dest_alpha =
2412 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2413 dest_scan[3] = dest_alpha;
2414 int alpha_ratio = src_alpha * 255 / dest_alpha;
2415 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2416 dest_scan++;
2417 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2418 dest_scan++;
2419 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2420 dest_scan++;
2421 dest_scan++;
2422 src_scan++;
2423 }
2424 }
2425 void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan,
2426 FX_LPCBYTE src_scan,
2427 int width,
2428 FX_DWORD* pPalette,
2429 FX_LPCBYTE clip_scan,
2430 FX_LPBYTE dest_alpha_scan,
2431 FX_LPCBYTE src_alpha_scan) {
2432 if (src_alpha_scan) {
2433 for (int col = 0; col < width; col++) {
2434 FX_ARGB argb = pPalette[*src_scan];
2435 src_scan++;
2436 int src_r = FXARGB_R(argb);
2437 int src_g = FXARGB_G(argb);
2438 int src_b = FXARGB_B(argb);
2439 FX_BYTE back_alpha = *dest_alpha_scan;
2440 if (back_alpha == 0) {
2441 if (clip_scan) {
2442 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
2443 *dest_alpha_scan++ = src_alpha;
2444 } else {
2445 *dest_alpha_scan++ = *src_alpha_scan;
2446 }
2447 *dest_scan++ = src_b;
2448 *dest_scan++ = src_g;
2449 *dest_scan++ = src_r;
2450 src_alpha_scan++;
2451 continue;
2452 }
2453 FX_BYTE src_alpha;
2454 if (clip_scan == NULL) {
2455 src_alpha = *src_alpha_scan++;
2456 } else {
2457 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
2458 }
2459 if (src_alpha == 0) {
2460 dest_scan += 3;
2461 dest_alpha_scan++;
2462 continue;
2463 }
2464 FX_BYTE dest_alpha =
2465 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2466 *dest_alpha_scan++ = dest_alpha;
2467 int alpha_ratio = src_alpha * 255 / dest_alpha;
2468 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2469 dest_scan++;
2470 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2471 dest_scan++;
2472 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2473 dest_scan++;
2474 }
2475 } else
2476 for (int col = 0; col < width; col++) {
2477 FX_ARGB argb = pPalette[*src_scan];
2478 int src_r = FXARGB_R(argb);
2479 int src_g = FXARGB_G(argb);
2480 int src_b = FXARGB_B(argb);
2481 if (clip_scan == NULL || clip_scan[col] == 255) {
2482 *dest_scan++ = src_b;
2483 *dest_scan++ = src_g;
2484 *dest_scan++ = src_r;
2485 *dest_alpha_scan++ = 255;
2486 src_scan++;
2487 continue;
2488 }
2489 int src_alpha = clip_scan[col];
2490 if (src_alpha == 0) {
2491 dest_scan += 3;
2492 dest_alpha_scan++;
2493 src_scan++;
2494 continue;
2495 }
2496 int back_alpha = *dest_alpha_scan;
2497 FX_BYTE dest_alpha =
2498 back_alpha + src_alpha - back_alpha * src_alpha / 255;
2499 *dest_alpha_scan++ = dest_alpha;
2500 int alpha_ratio = src_alpha * 255 / dest_alpha;
2501 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2502 dest_scan++;
2503 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2504 dest_scan++;
2505 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2506 dest_scan++;
2507 src_scan++;
2508 }
2509 }
2510 inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan,
2511 FX_LPCBYTE src_scan,
2512 int src_left,
2513 int width,
2514 FX_DWORD* pPalette,
2515 FX_LPCBYTE clip_scan) {
2516 int reset_r, reset_g, reset_b;
2517 int set_r, set_g, set_b;
2518 reset_r = FXARGB_R(pPalette[0]);
2519 reset_g = FXARGB_G(pPalette[0]);
2520 reset_b = FXARGB_B(pPalette[0]);
2521 set_r = FXARGB_R(pPalette[1]);
2522 set_g = FXARGB_G(pPalette[1]);
2523 set_b = FXARGB_B(pPalette[1]);
2524 for (int col = 0; col < width; col++) {
2525 int src_r, src_g, src_b;
2526 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
2527 src_r = set_r;
2528 src_g = set_g;
2529 src_b = set_b;
2530 } else {
2531 src_r = reset_r;
2532 src_g = reset_g;
2533 src_b = reset_b;
2534 }
2535 if (clip_scan == NULL || clip_scan[col] == 255) {
2536 *dest_scan++ = src_b;
2537 *dest_scan++ = src_g;
2538 *dest_scan++ = src_r;
2539 *dest_scan++ = 255;
2540 continue;
2541 }
2542 int src_alpha = clip_scan[col];
2543 if (src_alpha == 0) {
2544 dest_scan += 4;
2545 continue;
2546 }
2547 int back_alpha = dest_scan[3];
2548 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2549 dest_scan[3] = dest_alpha;
2550 int alpha_ratio = src_alpha * 255 / dest_alpha;
2551 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2552 dest_scan++;
2553 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2554 dest_scan++;
2555 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2556 dest_scan++;
2557 dest_scan++;
2558 }
2559 }
2560 void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan,
2561 FX_LPCBYTE src_scan,
2562 int src_left,
2563 int width,
2564 FX_DWORD* pPalette,
2565 FX_LPCBYTE clip_scan,
2566 FX_LPBYTE dest_alpha_scan) {
2567 int reset_r, reset_g, reset_b;
2568 int set_r, set_g, set_b;
2569 reset_r = FXARGB_R(pPalette[0]);
2570 reset_g = FXARGB_G(pPalette[0]);
2571 reset_b = FXARGB_B(pPalette[0]);
2572 set_r = FXARGB_R(pPalette[1]);
2573 set_g = FXARGB_G(pPalette[1]);
2574 set_b = FXARGB_B(pPalette[1]);
2575 for (int col = 0; col < width; col++) {
2576 int src_r, src_g, src_b;
2577 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
2578 src_r = set_r;
2579 src_g = set_g;
2580 src_b = set_b;
2581 } else {
2582 src_r = reset_r;
2583 src_g = reset_g;
2584 src_b = reset_b;
2585 }
2586 if (clip_scan == NULL || clip_scan[col] == 255) {
2587 *dest_scan++ = src_b;
2588 *dest_scan++ = src_g;
2589 *dest_scan++ = src_r;
2590 *dest_alpha_scan++ = 255;
2591 continue;
2592 }
2593 int src_alpha = clip_scan[col];
2594 if (src_alpha == 0) {
2595 dest_scan += 3;
2596 dest_alpha_scan++;
2597 continue;
2598 }
2599 int back_alpha = *dest_alpha_scan;
2600 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2601 *dest_alpha_scan++ = dest_alpha;
2602 int alpha_ratio = src_alpha * 255 / dest_alpha;
2603 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2604 dest_scan++;
2605 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2606 dest_scan++;
2607 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2608 dest_scan++;
2609 }
2610 }
2611 void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan,
2612 FX_LPCBYTE src_scan,
2613 int mask_alpha,
2614 int src_r,
2615 int src_g,
2616 int src_b,
2617 int pixel_count,
2618 int blend_type,
2619 FX_LPCBYTE clip_scan) {
2620 for (int col = 0; col < pixel_count; col++) {
2621 int src_alpha;
2622 if (clip_scan) {
2623 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2624 } else {
2625 src_alpha = mask_alpha * src_scan[col] / 255;
2626 }
2627 FX_BYTE back_alpha = dest_scan[3];
2628 if (back_alpha == 0) {
2629 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
2630 dest_scan += 4;
2631 continue;
2632 }
2633 if (src_alpha == 0) {
2634 dest_scan += 4;
2635 continue;
2636 }
2637 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2638 dest_scan[3] = dest_alpha;
2639 int alpha_ratio = src_alpha * 255 / dest_alpha;
2640 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2641 int blended_colors[3];
2642 FX_BYTE src_scan[3];
2643 src_scan[0] = src_b;
2644 src_scan[1] = src_g;
2645 src_scan[2] = src_r;
2646 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2647 *dest_scan =
2648 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
2649 dest_scan++;
2650 *dest_scan =
2651 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
2652 dest_scan++;
2653 *dest_scan =
2654 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
2655 } else if (blend_type) {
2656 int blended = _BLEND(blend_type, *dest_scan, src_b);
2657 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2658 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2659 dest_scan++;
2660 blended = _BLEND(blend_type, *dest_scan, src_g);
2661 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2662 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2663 dest_scan++;
2664 blended = _BLEND(blend_type, *dest_scan, src_r);
2665 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2666 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2667 } else {
2668 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2669 dest_scan++;
2670 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2671 dest_scan++;
2672 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2673 }
2674 dest_scan += 2;
2675 }
2676 }
2677 void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan,
2678 FX_LPCBYTE src_scan,
2679 int mask_alpha,
2680 int src_r,
2681 int src_g,
2682 int src_b,
2683 int pixel_count,
2684 int blend_type,
2685 FX_LPCBYTE clip_scan,
2686 FX_LPBYTE dest_alpha_scan) {
2687 for (int col = 0; col < pixel_count; col++) {
2688 int src_alpha;
2689 if (clip_scan) {
2690 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2691 } else {
2692 src_alpha = mask_alpha * src_scan[col] / 255;
2693 }
2694 FX_BYTE back_alpha = *dest_alpha_scan;
2695 if (back_alpha == 0) {
2696 *dest_scan++ = src_b;
2697 *dest_scan++ = src_g;
2698 *dest_scan++ = src_r;
2699 *dest_alpha_scan++ = src_alpha;
2700 continue;
2701 }
2702 if (src_alpha == 0) {
2703 dest_scan += 3;
2704 dest_alpha_scan++;
2705 continue;
2706 }
2707 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2708 *dest_alpha_scan++ = dest_alpha;
2709 int alpha_ratio = src_alpha * 255 / dest_alpha;
2710 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2711 int blended_colors[3];
2712 FX_BYTE src_scan[3];
2713 src_scan[0] = src_b;
2714 src_scan[1] = src_g;
2715 src_scan[2] = src_r;
2716 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2717 *dest_scan =
2718 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
2719 dest_scan++;
2720 *dest_scan =
2721 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
2722 dest_scan++;
2723 *dest_scan =
2724 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
2725 dest_scan++;
2726 } else if (blend_type) {
2727 int blended = _BLEND(blend_type, *dest_scan, src_b);
2728 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2729 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2730 dest_scan++;
2731 blended = _BLEND(blend_type, *dest_scan, src_g);
2732 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2733 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2734 dest_scan++;
2735 blended = _BLEND(blend_type, *dest_scan, src_r);
2736 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2737 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2738 dest_scan++;
2739 } else {
2740 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2741 dest_scan++;
2742 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2743 dest_scan++;
2744 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2745 dest_scan++;
2746 }
2747 }
2748 }
2749 void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan,
2750 FX_LPCBYTE src_scan,
2751 int mask_alpha,
2752 int src_r,
2753 int src_g,
2754 int src_b,
2755 int pixel_count,
2756 int blend_type,
2757 int Bpp,
2758 FX_LPCBYTE clip_scan) {
2759 for (int col = 0; col < pixel_count; col++) {
2760 int src_alpha;
2761 if (clip_scan) {
2762 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2763 } else {
2764 src_alpha = mask_alpha * src_scan[col] / 255;
2765 }
2766 if (src_alpha == 0) {
2767 dest_scan += Bpp;
2768 continue;
2769 }
2770 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2771 int blended_colors[3];
2772 FX_BYTE src_scan[3];
2773 src_scan[0] = src_b;
2774 src_scan[1] = src_g;
2775 src_scan[2] = src_r;
2776 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2777 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
2778 dest_scan++;
2779 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
2780 dest_scan++;
2781 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
2782 } else if (blend_type) {
2783 int blended = _BLEND(blend_type, *dest_scan, src_b);
2784 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2785 dest_scan++;
2786 blended = _BLEND(blend_type, *dest_scan, src_g);
2787 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2788 dest_scan++;
2789 blended = _BLEND(blend_type, *dest_scan, src_r);
2790 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2791 } else {
2792 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
2793 dest_scan++;
2794 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
2795 dest_scan++;
2796 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
2797 }
2798 dest_scan += Bpp - 2;
2799 }
2800 }
2801 void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan,
2802 FX_LPCBYTE src_scan,
2803 int mask_alpha,
2804 int pixel_count,
2805 FX_LPCBYTE clip_scan) {
2806 for (int col = 0; col < pixel_count; col++) {
2807 int src_alpha;
2808 if (clip_scan) {
2809 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2810 } else {
2811 src_alpha = mask_alpha * src_scan[col] / 255;
2812 }
2813 FX_BYTE back_alpha = *dest_scan;
2814 if (!back_alpha) {
2815 *dest_scan = src_alpha;
2816 } else if (src_alpha) {
2817 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2818 }
2819 dest_scan++;
2820 }
2821 }
2822 void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan,
2823 FX_LPCBYTE src_scan,
2824 int mask_alpha,
2825 int src_gray,
2826 int pixel_count,
2827 FX_LPCBYTE clip_scan) {
2828 for (int col = 0; col < pixel_count; col++) {
2829 int src_alpha;
2830 if (clip_scan) {
2831 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2832 } else {
2833 src_alpha = mask_alpha * src_scan[col] / 255;
2834 }
2835 if (src_alpha) {
2836 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
2837 }
2838 dest_scan++;
2839 }
2840 }
2841 void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan,
2842 FX_LPCBYTE src_scan,
2843 int mask_alpha,
2844 int src_gray,
2845 int pixel_count,
2846 FX_LPCBYTE clip_scan,
2847 FX_LPBYTE dest_alpha_scan) {
2848 for (int col = 0; col < pixel_count; col++) {
2849 int src_alpha;
2850 if (clip_scan) {
2851 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2852 } else {
2853 src_alpha = mask_alpha * src_scan[col] / 255;
2854 }
2855 FX_BYTE back_alpha = *dest_alpha_scan;
2856 if (back_alpha == 0) {
2857 *dest_scan++ = src_gray;
2858 *dest_alpha_scan++ = src_alpha;
2859 continue;
2860 }
2861 if (src_alpha == 0) {
2862 dest_scan++;
2863 dest_alpha_scan++;
2864 continue;
2865 }
2866 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2867 *dest_alpha_scan++ = dest_alpha;
2868 int alpha_ratio = src_alpha * 255 / dest_alpha;
2869 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
2870 dest_scan++;
2871 }
2872 }
2873 void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan,
2874 FX_LPCBYTE src_scan,
2875 int mask_alpha,
2876 int src_r,
2877 int src_g,
2878 int src_b,
2879 int src_left,
2880 int pixel_count,
2881 int blend_type,
2882 FX_LPCBYTE clip_scan) {
2883 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
2884 mask_alpha == 255) {
2885 FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
2886 for (int col = 0; col < pixel_count; col++) {
2887 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
2888 FXARGB_SETDIB(dest_scan, argb);
2889 }
2890 dest_scan += 4;
2891 }
2892 return;
2893 }
2894 for (int col = 0; col < pixel_count; col++) {
2895 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
2896 dest_scan += 4;
2897 continue;
2898 }
2899 int src_alpha;
2900 if (clip_scan) {
2901 src_alpha = mask_alpha * clip_scan[col] / 255;
2902 } else {
2903 src_alpha = mask_alpha;
2904 }
2905 FX_BYTE back_alpha = dest_scan[3];
2906 if (back_alpha == 0) {
2907 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
2908 dest_scan += 4;
2909 continue;
2910 }
2911 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2912 dest_scan[3] = dest_alpha;
2913 int alpha_ratio = src_alpha * 255 / dest_alpha;
2914 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2915 int blended_colors[3];
2916 FX_BYTE src_scan[3];
2917 src_scan[0] = src_b;
2918 src_scan[1] = src_g;
2919 src_scan[2] = src_r;
2920 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2921 *dest_scan =
2922 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
2923 dest_scan++;
2924 *dest_scan =
2925 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
2926 dest_scan++;
2927 *dest_scan =
2928 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
2929 } else if (blend_type) {
2930 int blended = _BLEND(blend_type, *dest_scan, src_b);
2931 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2932 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2933 dest_scan++;
2934 blended = _BLEND(blend_type, *dest_scan, src_g);
2935 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2936 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2937 dest_scan++;
2938 blended = _BLEND(blend_type, *dest_scan, src_r);
2939 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2940 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2941 } else {
2942 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2943 dest_scan++;
2944 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2945 dest_scan++;
2946 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2947 }
2948 dest_scan += 2;
2949 }
2950 }
2951 void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan,
2952 FX_LPCBYTE src_scan,
2953 int mask_alpha,
2954 int src_r,
2955 int src_g,
2956 int src_b,
2957 int src_left,
2958 int pixel_count,
2959 int blend_type,
2960 FX_LPCBYTE clip_scan,
2961 FX_LPBYTE dest_alpha_scan) {
2962 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
2963 mask_alpha == 255) {
2964 for (int col = 0; col < pixel_count; col++) {
2965 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
2966 dest_scan[0] = src_b;
2967 dest_scan[1] = src_g;
2968 dest_scan[2] = src_r;
2969 *dest_alpha_scan = mask_alpha;
2970 }
2971 dest_scan += 3;
2972 dest_alpha_scan++;
2973 }
2974 return;
2975 }
2976 for (int col = 0; col < pixel_count; col++) {
2977 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
2978 dest_scan += 3;
2979 dest_alpha_scan++;
2980 continue;
2981 }
2982 int src_alpha;
2983 if (clip_scan) {
2984 src_alpha = mask_alpha * clip_scan[col] / 255;
2985 } else {
2986 src_alpha = mask_alpha;
2987 }
2988 FX_BYTE back_alpha = dest_scan[3];
2989 if (back_alpha == 0) {
2990 *dest_scan++ = src_b;
2991 *dest_scan++ = src_g;
2992 *dest_scan++ = src_r;
2993 *dest_alpha_scan++ = mask_alpha;
2994 continue;
2995 }
2996 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2997 *dest_alpha_scan++ = dest_alpha;
2998 int alpha_ratio = src_alpha * 255 / dest_alpha;
2999 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3000 int blended_colors[3];
3001 FX_BYTE src_scan[3];
3002 src_scan[0] = src_b;
3003 src_scan[1] = src_g;
3004 src_scan[2] = src_r;
3005 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
3006 *dest_scan =
3007 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
3008 dest_scan++;
3009 *dest_scan =
3010 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
3011 dest_scan++;
3012 *dest_scan =
3013 FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
3014 dest_scan++;
3015 } else if (blend_type) {
3016 int blended = _BLEND(blend_type, *dest_scan, src_b);
3017 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
3018 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
3019 dest_scan++;
3020 blended = _BLEND(blend_type, *dest_scan, src_g);
3021 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
3022 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
3023 dest_scan++;
3024 blended = _BLEND(blend_type, *dest_scan, src_r);
3025 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
3026 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
3027 dest_scan++;
3028 } else {
3029 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
3030 dest_scan++;
3031 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
3032 dest_scan++;
3033 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
3034 dest_scan++;
3035 }
3036 }
3037 }
3038 void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan,
3039 FX_LPCBYTE src_scan,
3040 int mask_alpha,
3041 int src_r,
3042 int src_g,
3043 int src_b,
3044 int src_left,
3045 int pixel_count,
3046 int blend_type,
3047 int Bpp,
3048 FX_LPCBYTE clip_scan) {
3049 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
3050 mask_alpha == 255) {
3051 for (int col = 0; col < pixel_count; col++) {
3052 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
3053 dest_scan[2] = src_r;
3054 dest_scan[1] = src_g;
3055 dest_scan[0] = src_b;
3056 }
3057 dest_scan += Bpp;
3058 }
3059 return;
3060 }
3061 for (int col = 0; col < pixel_count; col++) {
3062 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3063 dest_scan += Bpp;
3064 continue;
3065 }
3066 int src_alpha;
3067 if (clip_scan) {
3068 src_alpha = mask_alpha * clip_scan[col] / 255;
3069 } else {
3070 src_alpha = mask_alpha;
3071 }
3072 if (src_alpha == 0) {
3073 dest_scan += Bpp;
3074 continue;
3075 }
3076 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3077 int blended_colors[3];
3078 FX_BYTE src_scan[3];
3079 src_scan[0] = src_b;
3080 src_scan[1] = src_g;
3081 src_scan[2] = src_r;
3082 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
3083 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
3084 dest_scan++;
3085 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
3086 dest_scan++;
3087 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
3088 } else if (blend_type) {
3089 int blended = _BLEND(blend_type, *dest_scan, src_b);
3090 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
3091 dest_scan++;
3092 blended = _BLEND(blend_type, *dest_scan, src_g);
3093 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
3094 dest_scan++;
3095 blended = _BLEND(blend_type, *dest_scan, src_r);
3096 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
3097 } else {
3098 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
3099 dest_scan++;
3100 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
3101 dest_scan++;
3102 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
3103 }
3104 dest_scan += Bpp - 2;
3105 }
3106 }
3107 void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan,
3108 FX_LPCBYTE src_scan,
3109 int mask_alpha,
3110 int src_left,
3111 int pixel_count,
3112 FX_LPCBYTE clip_scan) {
3113 for (int col = 0; col < pixel_count; col++) {
3114 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3115 dest_scan++;
3116 continue;
3117 }
3118 int src_alpha;
3119 if (clip_scan) {
3120 src_alpha = mask_alpha * clip_scan[col] / 255;
3121 } else {
3122 src_alpha = mask_alpha;
3123 }
3124 FX_BYTE back_alpha = *dest_scan;
3125 if (!back_alpha) {
3126 *dest_scan = src_alpha;
3127 } else if (src_alpha) {
3128 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3129 }
3130 dest_scan++;
3131 }
3132 }
3133 void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan,
3134 FX_LPCBYTE src_scan,
3135 int mask_alpha,
3136 int src_gray,
3137 int src_left,
3138 int pixel_count,
3139 FX_LPCBYTE clip_scan) {
3140 for (int col = 0; col < pixel_count; col++) {
3141 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3142 dest_scan++;
3143 continue;
3144 }
3145 int src_alpha;
3146 if (clip_scan) {
3147 src_alpha = mask_alpha * clip_scan[col] / 255;
3148 } else {
3149 src_alpha = mask_alpha;
3150 }
3151 if (src_alpha) {
3152 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
3153 }
3154 dest_scan++;
3155 }
3156 }
3157 void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan,
3158 FX_LPCBYTE src_scan,
3159 int mask_alpha,
3160 int src_gray,
3161 int src_left,
3162 int pixel_count,
3163 FX_LPCBYTE clip_scan,
3164 FX_LPBYTE dest_alpha_scan) {
3165 for (int col = 0; col < pixel_count; col++) {
3166 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3167 dest_scan++;
3168 dest_alpha_scan++;
3169 continue;
3170 }
3171 int src_alpha;
3172 if (clip_scan) {
3173 src_alpha = mask_alpha * clip_scan[col] / 255;
3174 } else {
3175 src_alpha = mask_alpha;
3176 }
3177 FX_BYTE back_alpha = *dest_alpha_scan;
3178 if (back_alpha == 0) {
3179 *dest_scan++ = src_gray;
3180 *dest_alpha_scan++ = src_alpha;
3181 continue;
3182 }
3183 if (src_alpha == 0) {
3184 dest_scan++;
3185 dest_alpha_scan++;
3186 continue;
3187 }
3188 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3189 *dest_alpha_scan++ = dest_alpha;
3190 int alpha_ratio = src_alpha * 255 / dest_alpha;
3191 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
3192 dest_scan++;
3193 }
3194 }
3195 void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan,
3196 FX_LPCBYTE src_scan,
3197 int pixel_count,
3198 int blend_type,
3199 FX_LPCBYTE clip_scan) {
3200 int blended_colors[3];
3201 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3202 for (int col = 0; col < pixel_count; col++) {
3203 FX_BYTE back_alpha = dest_scan[3];
3204 if (back_alpha == 0) {
3205 if (clip_scan) {
3206 int src_alpha = clip_scan[col] * src_scan[3] / 255;
3207 dest_scan[3] = src_alpha;
3208 dest_scan[0] = src_scan[2];
3209 dest_scan[1] = src_scan[1];
3210 dest_scan[2] = src_scan[0];
3211 } else {
3212 FXARGB_RGBORDERCOPY(dest_scan, src_scan);
3213 }
3214 dest_scan += 4;
3215 src_scan += 4;
3216 continue;
3217 }
3218 FX_BYTE src_alpha;
3219 if (clip_scan == NULL) {
3220 src_alpha = src_scan[3];
3221 } else {
3222 src_alpha = clip_scan[col] * src_scan[3] / 255;
3223 }
3224 if (src_alpha == 0) {
3225 dest_scan += 4;
3226 src_scan += 4;
3227 continue;
3228 }
3229 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3230 dest_scan[3] = dest_alpha;
3231 int alpha_ratio = src_alpha * 255 / dest_alpha;
3232 if (bNonseparableBlend) {
3233 FX_BYTE dest_scan_o[3];
3234 dest_scan_o[0] = dest_scan[2];
3235 dest_scan_o[1] = dest_scan[1];
3236 dest_scan_o[2] = dest_scan[0];
3237 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3238 }
3239 for (int color = 0; color < 3; color++) {
3240 int index = 2 - color;
3241 if (blend_type) {
3242 int blended = bNonseparableBlend
3243 ? blended_colors[color]
3244 : _BLEND(blend_type, dest_scan[index], *src_scan);
3245 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
3246 dest_scan[index] =
3247 FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
3248 } else {
3249 dest_scan[index] =
3250 FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
3251 }
3252 src_scan++;
3253 }
3254 dest_scan += 4;
3255 src_scan++;
3256 }
3257 }
3258 void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan,
3259 FX_LPCBYTE src_scan,
3260 int width,
3261 int blend_type,
3262 int src_Bpp) {
3263 int blended_colors[3];
3264 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3265 int src_gap = src_Bpp - 3;
3266 for (int col = 0; col < width; col++) {
3267 FX_BYTE back_alpha = dest_scan[3];
3268 if (back_alpha == 0) {
3269 if (src_Bpp == 4) {
3270 FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
3271 } else {
3272 FXARGB_SETRGBORDERDIB(
3273 dest_scan,
3274 FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
3275 }
3276 dest_scan += 4;
3277 src_scan += src_Bpp;
3278 continue;
3279 }
3280 dest_scan[3] = 0xff;
3281 if (bNonseparableBlend) {
3282 FX_BYTE dest_scan_o[3];
3283 dest_scan_o[0] = dest_scan[2];
3284 dest_scan_o[1] = dest_scan[1];
3285 dest_scan_o[2] = dest_scan[0];
3286 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3287 }
3288 for (int color = 0; color < 3; color++) {
3289 int index = 2 - color;
3290 int src_color = FX_GAMMA(*src_scan);
3291 int blended = bNonseparableBlend
3292 ? blended_colors[color]
3293 : _BLEND(blend_type, dest_scan[index], src_color);
3294 dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
3295 src_scan++;
3296 }
3297 dest_scan += 4;
3298 src_scan += src_gap;
3299 }
3300 }
3301 inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan,
3302 FX_LPCBYTE src_scan,
3303 int width,
3304 int blend_type,
3305 int dest_Bpp,
3306 FX_LPCBYTE clip_scan) {
3307 int blended_colors[3];
3308 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3309 for (int col = 0; col < width; col++) {
3310 FX_BYTE src_alpha;
3311 if (clip_scan) {
3312 src_alpha = src_scan[3] * (*clip_scan++) / 255;
3313 } else {
3314 src_alpha = src_scan[3];
3315 }
3316 if (src_alpha == 0) {
3317 dest_scan += dest_Bpp;
3318 src_scan += 4;
3319 continue;
3320 }
3321 if (bNonseparableBlend) {
3322 FX_BYTE dest_scan_o[3];
3323 dest_scan_o[0] = dest_scan[2];
3324 dest_scan_o[1] = dest_scan[1];
3325 dest_scan_o[2] = dest_scan[0];
3326 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3327 }
3328 for (int color = 0; color < 3; color++) {
3329 int index = 2 - color;
3330 int back_color = FX_GAMMA(dest_scan[index]);
3331 int blended = bNonseparableBlend
3332 ? blended_colors[color]
3333 : _BLEND(blend_type, back_color, *src_scan);
3334 dest_scan[index] =
3335 FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
3336 src_scan++;
3337 }
3338 dest_scan += dest_Bpp;
3339 src_scan++;
3340 }
3341 }
3342 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(
3343 FX_LPBYTE dest_scan,
3344 FX_LPCBYTE src_scan,
3345 int width,
3346 int src_Bpp) {
3347 for (int col = 0; col < width; col++) {
3348 if (src_Bpp == 4) {
3349 FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
3350 } else {
3351 FXARGB_SETRGBORDERDIB(
3352 dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
3353 }
3354 dest_scan += 4;
3355 src_scan += src_Bpp;
3356 }
3357 }
3358 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan,
3359 FX_LPCBYTE src_scan,
3360 int width,
3361 int blend_type,
3362 int dest_Bpp,
3363 int src_Bpp) {
3364 int blended_colors[3];
3365 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3366 int src_gap = src_Bpp - 3;
3367 for (int col = 0; col < width; col++) {
3368 if (bNonseparableBlend) {
3369 FX_BYTE dest_scan_o[3];
3370 dest_scan_o[0] = dest_scan[2];
3371 dest_scan_o[1] = dest_scan[1];
3372 dest_scan_o[2] = dest_scan[0];
3373 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3374 }
3375 for (int color = 0; color < 3; color++) {
3376 int index = 2 - color;
3377 int back_color = FX_GAMMA(dest_scan[index]);
3378 int src_color = FX_GAMMA(*src_scan);
3379 int blended = bNonseparableBlend
3380 ? blended_colors[color]
3381 : _BLEND(blend_type, back_color, src_color);
3382 dest_scan[index] = FX_GAMMA_INVERSE(blended);
3383 src_scan++;
3384 }
3385 dest_scan += dest_Bpp;
3386 src_scan += src_gap;
3387 }
3388 }
3389 inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan,
3390 FX_LPCBYTE src_scan,
3391 int width,
3392 int dest_Bpp,
3393 FX_LPCBYTE clip_scan) {
3394 for (int col = 0; col < width; col++) {
3395 FX_BYTE src_alpha;
3396 if (clip_scan) {
3397 src_alpha = src_scan[3] * (*clip_scan++) / 255;
3398 } else {
3399 src_alpha = src_scan[3];
3400 }
3401 if (src_alpha == 255) {
3402 dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
3403 dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
3404 dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
3405 dest_scan += dest_Bpp;
3406 src_scan++;
3407 continue;
3408 }
3409 if (src_alpha == 0) {
3410 dest_scan += dest_Bpp;
3411 src_scan += 4;
3412 continue;
3413 }
3414 for (int color = 0; color < 3; color++) {
3415 int index = 2 - color;
3416 dest_scan[index] = FX_GAMMA_INVERSE(
3417 FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
3418 src_scan++;
3419 }
3420 dest_scan += dest_Bpp;
3421 src_scan++;
3422 }
3423 }
3424 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(
3425 FX_LPBYTE dest_scan,
3426 FX_LPCBYTE src_scan,
3427 int width,
3428 int dest_Bpp,
3429 int src_Bpp) {
3430 for (int col = 0; col < width; col++) {
3431 dest_scan[2] = src_scan[0];
3432 dest_scan[1] = src_scan[1];
3433 dest_scan[0] = src_scan[2];
3434 dest_scan += dest_Bpp;
3435 src_scan += src_Bpp;
3436 }
3437 }
3438 inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(
3439 FX_LPBYTE dest_scan,
3440 FX_LPCBYTE src_scan,
3441 int width,
3442 int blend_type,
3443 int src_Bpp,
3444 FX_LPCBYTE clip_scan) {
3445 int blended_colors[3];
3446 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3447 int src_gap = src_Bpp - 3;
3448 for (int col = 0; col < width; col++) {
3449 int src_alpha = *clip_scan++;
3450 FX_BYTE back_alpha = dest_scan[3];
3451 if (back_alpha == 0) {
3452 dest_scan[2] = FX_GAMMA(*src_scan++);
3453 dest_scan[1] = FX_GAMMA(*src_scan++);
3454 dest_scan[0] = FX_GAMMA(*src_scan++);
3455 src_scan += src_gap;
3456 dest_scan += 4;
3457 continue;
3458 }
3459 if (src_alpha == 0) {
3460 dest_scan += 4;
3461 src_scan += src_Bpp;
3462 continue;
3463 }
3464 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3465 dest_scan[3] = dest_alpha;
3466 int alpha_ratio = src_alpha * 255 / dest_alpha;
3467 if (bNonseparableBlend) {
3468 FX_BYTE dest_scan_o[3];
3469 dest_scan_o[0] = dest_scan[2];
3470 dest_scan_o[1] = dest_scan[1];
3471 dest_scan_o[2] = dest_scan[0];
3472 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3473 }
3474 for (int color = 0; color < 3; color++) {
3475 int index = 2 - color;
3476 int src_color = FX_GAMMA(*src_scan);
3477 int blended = bNonseparableBlend
3478 ? blended_colors[color]
3479 : _BLEND(blend_type, dest_scan[index], src_color);
3480 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
3481 dest_scan[index] =
3482 FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
3483 src_scan++;
3484 }
3485 dest_scan += 4;
3486 src_scan += src_gap;
3487 }
3488 }
3489 inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(
3490 FX_LPBYTE dest_scan,
3491 FX_LPCBYTE src_scan,
3492 int width,
3493 int blend_type,
3494 int dest_Bpp,
3495 int src_Bpp,
3496 FX_LPCBYTE clip_scan) {
3497 int blended_colors[3];
3498 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3499 int src_gap = src_Bpp - 3;
3500 for (int col = 0; col < width; col++) {
3501 FX_BYTE src_alpha = *clip_scan++;
3502 if (src_alpha == 0) {
3503 dest_scan += dest_Bpp;
3504 src_scan += src_Bpp;
3505 continue;
3506 }
3507 if (bNonseparableBlend) {
3508 FX_BYTE dest_scan_o[3];
3509 dest_scan_o[0] = dest_scan[2];
3510 dest_scan_o[1] = dest_scan[1];
3511 dest_scan_o[2] = dest_scan[0];
3512 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3513 }
3514 for (int color = 0; color < 3; color++) {
3515 int index = 2 - color;
3516 int src_color = FX_GAMMA(*src_scan);
3517 int back_color = FX_GAMMA(dest_scan[index]);
3518 int blended = bNonseparableBlend
3519 ? blended_colors[color]
3520 : _BLEND(blend_type, back_color, src_color);
3521 dest_scan[index] =
3522 FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
3523 src_scan++;
3524 }
3525 dest_scan += dest_Bpp;
3526 src_scan += src_gap;
3527 }
3528 }
3529 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(
3530 FX_LPBYTE dest_scan,
3531 FX_LPCBYTE src_scan,
3532 int width,
3533 int src_Bpp,
3534 FX_LPCBYTE clip_scan) {
3535 int src_gap = src_Bpp - 3;
3536 for (int col = 0; col < width; col++) {
3537 int src_alpha = clip_scan[col];
3538 if (src_alpha == 255) {
3539 dest_scan[2] = FX_GAMMA(*src_scan++);
3540 dest_scan[1] = FX_GAMMA(*src_scan++);
3541 dest_scan[0] = FX_GAMMA(*src_scan++);
3542 dest_scan[3] = 255;
3543 dest_scan += 4;
3544 src_scan += src_gap;
3545 continue;
3546 }
3547 if (src_alpha == 0) {
3548 dest_scan += 4;
3549 src_scan += src_Bpp;
3550 continue;
3551 }
3552 int back_alpha = dest_scan[3];
3553 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3554 dest_scan[3] = dest_alpha;
3555 int alpha_ratio = src_alpha * 255 / dest_alpha;
3556 for (int color = 0; color < 3; color++) {
3557 int index = 2 - color;
3558 dest_scan[index] =
3559 FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
3560 src_scan++;
3561 }
3562 dest_scan += 4;
3563 src_scan += src_gap;
3564 }
3565 }
3566 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(
3567 FX_LPBYTE dest_scan,
3568 FX_LPCBYTE src_scan,
3569 int width,
3570 int dest_Bpp,
3571 int src_Bpp,
3572 FX_LPCBYTE clip_scan) {
3573 for (int col = 0; col < width; col++) {
3574 int src_alpha = clip_scan[col];
3575 if (src_alpha == 255) {
3576 dest_scan[2] = src_scan[0];
3577 dest_scan[1] = src_scan[1];
3578 dest_scan[0] = src_scan[2];
3579 } else if (src_alpha) {
3580 dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(
3581 FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
3582 src_scan++;
3583 dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(
3584 FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
3585 src_scan++;
3586 dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(
3587 FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
3588 dest_scan += dest_Bpp;
3589 src_scan += src_Bpp - 2;
3590 continue;
3591 }
3592 dest_scan += dest_Bpp;
3593 src_scan += src_Bpp;
3594 }
3595 }
3596 inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(
3597 FX_LPBYTE dest_scan,
3598 FX_LPCBYTE src_scan,
3599 FX_ARGB* pPalette,
3600 int pixel_count,
3601 int DestBpp,
3602 FX_LPCBYTE clip_scan) {
3603 for (int col = 0; col < pixel_count; col++) {
3604 FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
3605 int src_r = FXARGB_R(argb);
3606 int src_g = FXARGB_G(argb);
3607 int src_b = FXARGB_B(argb);
3608 if (clip_scan && clip_scan[col] < 255) {
3609 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
3610 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
3611 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
3612 } else {
3613 dest_scan[2] = src_b;
3614 dest_scan[1] = src_g;
3615 dest_scan[0] = src_r;
3616 }
3617 dest_scan += DestBpp;
3618 src_scan++;
3619 }
3620 }
3621 inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(
3622 FX_LPBYTE dest_scan,
3623 FX_LPCBYTE src_scan,
3624 int src_left,
3625 FX_ARGB* pPalette,
3626 int pixel_count,
3627 int DestBpp,
3628 FX_LPCBYTE clip_scan) {
3629 int reset_r, reset_g, reset_b;
3630 int set_r, set_g, set_b;
3631 if (pPalette) {
2027 reset_r = FXARGB_R(pPalette[0]); 3632 reset_r = FXARGB_R(pPalette[0]);
2028 reset_g = FXARGB_G(pPalette[0]); 3633 reset_g = FXARGB_G(pPalette[0]);
2029 reset_b = FXARGB_B(pPalette[0]); 3634 reset_b = FXARGB_B(pPalette[0]);
2030 set_r = FXARGB_R(pPalette[1]); 3635 set_r = FXARGB_R(pPalette[1]);
2031 set_g = FXARGB_G(pPalette[1]); 3636 set_g = FXARGB_G(pPalette[1]);
2032 set_b = FXARGB_B(pPalette[1]); 3637 set_b = FXARGB_B(pPalette[1]);
2033 for (int col = 0; col < pixel_count; col ++) { 3638 } else {
2034 int src_r, src_g, src_b; 3639 reset_r = reset_g = reset_b = 0;
2035 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { 3640 set_r = set_g = set_b = 255;
2036 src_r = set_r; 3641 }
2037 src_g = set_g; 3642 for (int col = 0; col < pixel_count; col++) {
2038 src_b = set_b; 3643 int src_r, src_g, src_b;
2039 } else { 3644 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
2040 src_r = reset_r; 3645 src_r = set_r;
2041 src_g = reset_g; 3646 src_g = set_g;
2042 src_b = reset_b; 3647 src_b = set_b;
2043 } 3648 } else {
2044 if (clip_scan && clip_scan[col] < 255) { 3649 src_r = reset_r;
2045 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]); 3650 src_g = reset_g;
2046 dest_scan ++; 3651 src_b = reset_b;
2047 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]); 3652 }
2048 dest_scan ++; 3653 if (clip_scan && clip_scan[col] < 255) {
2049 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]); 3654 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
2050 dest_scan ++; 3655 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
2051 } else { 3656 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
2052 *dest_scan++ = src_b; 3657 } else {
2053 *dest_scan++ = src_g; 3658 dest_scan[2] = src_b;
2054 *dest_scan++ = src_r; 3659 dest_scan[1] = src_g;
2055 } 3660 dest_scan[0] = src_r;
2056 if (DestBpp == 4) { 3661 }
2057 dest_scan++; 3662 dest_scan += DestBpp;
2058 } 3663 }
2059 } 3664 }
2060 } 3665 inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(
2061 inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE s rc_scan, int width, 3666 FX_LPBYTE dest_scan,
2062 FX_DWORD* pPalette, FX_LPCBYTE clip_scan, 3667 FX_LPCBYTE src_scan,
2063 FX_LPCBYTE src_alpha_scan) 3668 int width,
2064 { 3669 FX_ARGB* pPalette,
2065 if (src_alpha_scan) { 3670 FX_LPCBYTE clip_scan) {
2066 for (int col = 0; col < width; col ++) { 3671 for (int col = 0; col < width; col++) {
2067 FX_ARGB argb = pPalette[*src_scan]; 3672 int src_r, src_g, src_b;
2068 src_scan ++; 3673 if (pPalette) {
2069 int src_r = FXARGB_R(argb); 3674 FX_ARGB argb = pPalette[*src_scan];
2070 int src_g = FXARGB_G(argb); 3675 src_r = FXARGB_R(argb);
2071 int src_b = FXARGB_B(argb); 3676 src_g = FXARGB_G(argb);
2072 FX_BYTE back_alpha = dest_scan[3]; 3677 src_b = FXARGB_B(argb);
2073 if (back_alpha == 0) { 3678 } else {
2074 if (clip_scan) { 3679 src_r = src_g = src_b = *src_scan;
2075 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255; 3680 }
2076 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g , src_b)); 3681 if (clip_scan == NULL || clip_scan[col] == 255) {
2077 } else { 3682 dest_scan[2] = FX_GAMMA(src_b);
2078 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b)); 3683 dest_scan[1] = FX_GAMMA(src_g);
2079 } 3684 dest_scan[0] = FX_GAMMA(src_r);
2080 dest_scan += 4; 3685 dest_scan[3] = 255;
2081 src_alpha_scan ++; 3686 src_scan++;
2082 continue; 3687 dest_scan += 4;
2083 } 3688 continue;
2084 FX_BYTE src_alpha; 3689 }
2085 if (clip_scan == NULL) { 3690 int src_alpha = clip_scan[col];
2086 src_alpha = *src_alpha_scan ++; 3691 if (src_alpha == 0) {
2087 } else { 3692 dest_scan += 4;
2088 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255; 3693 src_scan++;
2089 } 3694 continue;
2090 if (src_alpha == 0) { 3695 }
2091 dest_scan += 4; 3696 int back_alpha = dest_scan[3];
2092 continue; 3697 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2093 } 3698 dest_scan[3] = dest_alpha;
2094 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; 3699 int alpha_ratio = src_alpha * 255 / dest_alpha;
2095 dest_scan[3] = dest_alpha; 3700 dest_scan[2] =
2096 int alpha_ratio = src_alpha * 255 / dest_alpha; 3701 FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
2097 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); 3702 dest_scan[1] =
2098 dest_scan ++; 3703 FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
2099 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); 3704 dest_scan[0] =
2100 dest_scan ++; 3705 FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
2101 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); 3706 dest_scan += 4;
2102 dest_scan ++; 3707 src_scan++;
2103 dest_scan ++; 3708 }
2104 } 3709 }
2105 } else 3710 inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(
2106 for (int col = 0; col < width; col ++) { 3711 FX_LPBYTE dest_scan,
2107 FX_ARGB argb = pPalette[*src_scan]; 3712 FX_LPCBYTE src_scan,
2108 int src_r = FXARGB_R(argb); 3713 int src_left,
2109 int src_g = FXARGB_G(argb); 3714 int width,
2110 int src_b = FXARGB_B(argb); 3715 FX_ARGB* pPalette,
2111 if (clip_scan == NULL || clip_scan[col] == 255) { 3716 FX_LPCBYTE clip_scan) {
2112 *dest_scan++ = src_b; 3717 int reset_r, reset_g, reset_b;
2113 *dest_scan++ = src_g; 3718 int set_r, set_g, set_b;
2114 *dest_scan++ = src_r; 3719 if (pPalette) {
2115 *dest_scan++ = 255;
2116 src_scan ++;
2117 continue;
2118 }
2119 int src_alpha = clip_scan[col];
2120 if (src_alpha == 0) {
2121 dest_scan += 4;
2122 src_scan ++;
2123 continue;
2124 }
2125 int back_alpha = dest_scan[3];
2126 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2127 dest_scan[3] = dest_alpha;
2128 int alpha_ratio = src_alpha * 255 / dest_alpha;
2129 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2130 dest_scan ++;
2131 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2132 dest_scan ++;
2133 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2134 dest_scan ++;
2135 dest_scan ++;
2136 src_scan ++;
2137 }
2138 }
2139 void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan , int width,
2140 FX_DWORD* pPalette, FX_LPCBYTE clip_scan ,
2141 FX_LPBYTE dest_alpha_scan, FX_LPCBYTE sr c_alpha_scan)
2142 {
2143 if (src_alpha_scan) {
2144 for (int col = 0; col < width; col ++) {
2145 FX_ARGB argb = pPalette[*src_scan];
2146 src_scan ++;
2147 int src_r = FXARGB_R(argb);
2148 int src_g = FXARGB_G(argb);
2149 int src_b = FXARGB_B(argb);
2150 FX_BYTE back_alpha = *dest_alpha_scan;
2151 if (back_alpha == 0) {
2152 if (clip_scan) {
2153 int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
2154 *dest_alpha_scan ++ = src_alpha;
2155 } else {
2156 *dest_alpha_scan ++ = *src_alpha_scan;
2157 }
2158 *dest_scan ++ = src_b;
2159 *dest_scan ++ = src_g;
2160 *dest_scan ++ = src_r;
2161 src_alpha_scan ++;
2162 continue;
2163 }
2164 FX_BYTE src_alpha;
2165 if (clip_scan == NULL) {
2166 src_alpha = *src_alpha_scan++;
2167 } else {
2168 src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
2169 }
2170 if (src_alpha == 0) {
2171 dest_scan += 3;
2172 dest_alpha_scan ++;
2173 continue;
2174 }
2175 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2176 *dest_alpha_scan ++ = dest_alpha;
2177 int alpha_ratio = src_alpha * 255 / dest_alpha;
2178 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2179 dest_scan ++;
2180 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2181 dest_scan ++;
2182 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2183 dest_scan ++;
2184 }
2185 } else
2186 for (int col = 0; col < width; col ++) {
2187 FX_ARGB argb = pPalette[*src_scan];
2188 int src_r = FXARGB_R(argb);
2189 int src_g = FXARGB_G(argb);
2190 int src_b = FXARGB_B(argb);
2191 if (clip_scan == NULL || clip_scan[col] == 255) {
2192 *dest_scan++ = src_b;
2193 *dest_scan++ = src_g;
2194 *dest_scan++ = src_r;
2195 *dest_alpha_scan++ = 255;
2196 src_scan ++;
2197 continue;
2198 }
2199 int src_alpha = clip_scan[col];
2200 if (src_alpha == 0) {
2201 dest_scan += 3;
2202 dest_alpha_scan ++;
2203 src_scan ++;
2204 continue;
2205 }
2206 int back_alpha = *dest_alpha_scan;
2207 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2208 *dest_alpha_scan ++ = dest_alpha;
2209 int alpha_ratio = src_alpha * 255 / dest_alpha;
2210 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2211 dest_scan ++;
2212 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2213 dest_scan ++;
2214 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2215 dest_scan ++;
2216 src_scan ++;
2217 }
2218 }
2219 inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE s rc_scan, int src_left, int width,
2220 FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
2221 {
2222 int reset_r, reset_g, reset_b;
2223 int set_r, set_g, set_b;
2224 reset_r = FXARGB_R(pPalette[0]); 3720 reset_r = FXARGB_R(pPalette[0]);
2225 reset_g = FXARGB_G(pPalette[0]); 3721 reset_g = FXARGB_G(pPalette[0]);
2226 reset_b = FXARGB_B(pPalette[0]); 3722 reset_b = FXARGB_B(pPalette[0]);
2227 set_r = FXARGB_R(pPalette[1]); 3723 set_r = FXARGB_R(pPalette[1]);
2228 set_g = FXARGB_G(pPalette[1]); 3724 set_g = FXARGB_G(pPalette[1]);
2229 set_b = FXARGB_B(pPalette[1]); 3725 set_b = FXARGB_B(pPalette[1]);
2230 for (int col = 0; col < width; col ++) { 3726 } else {
2231 int src_r, src_g, src_b; 3727 reset_r = reset_g = reset_b = 0;
2232 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { 3728 set_r = set_g = set_b = 255;
2233 src_r = set_r; 3729 }
2234 src_g = set_g; 3730 for (int col = 0; col < width; col++) {
2235 src_b = set_b; 3731 int src_r, src_g, src_b;
3732 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
3733 src_r = set_r;
3734 src_g = set_g;
3735 src_b = set_b;
3736 } else {
3737 src_r = reset_r;
3738 src_g = reset_g;
3739 src_b = reset_b;
3740 }
3741 if (clip_scan == NULL || clip_scan[col] == 255) {
3742 dest_scan[2] = FX_GAMMA(src_b);
3743 dest_scan[1] = FX_GAMMA(src_g);
3744 dest_scan[0] = FX_GAMMA(src_r);
3745 dest_scan[3] = 255;
3746 dest_scan += 4;
3747 continue;
3748 }
3749 int src_alpha = clip_scan[col];
3750 if (src_alpha == 0) {
3751 dest_scan += 4;
3752 continue;
3753 }
3754 int back_alpha = dest_scan[3];
3755 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3756 dest_scan[3] = dest_alpha;
3757 int alpha_ratio = src_alpha * 255 / dest_alpha;
3758 dest_scan[2] =
3759 FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
3760 dest_scan[1] =
3761 FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
3762 dest_scan[0] =
3763 FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
3764 dest_scan += 4;
3765 }
3766 }
3767 void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan,
3768 FX_LPCBYTE src_scan,
3769 int mask_alpha,
3770 int src_r,
3771 int src_g,
3772 int src_b,
3773 int pixel_count,
3774 int blend_type,
3775 FX_LPCBYTE clip_scan) {
3776 for (int col = 0; col < pixel_count; col++) {
3777 int src_alpha;
3778 if (clip_scan) {
3779 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
3780 } else {
3781 src_alpha = mask_alpha * src_scan[col] / 255;
3782 }
3783 FX_BYTE back_alpha = dest_scan[3];
3784 if (back_alpha == 0) {
3785 FXARGB_SETRGBORDERDIB(dest_scan,
3786 FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
3787 dest_scan += 4;
3788 continue;
3789 }
3790 if (src_alpha == 0) {
3791 dest_scan += 4;
3792 continue;
3793 }
3794 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3795 dest_scan[3] = dest_alpha;
3796 int alpha_ratio = src_alpha * 255 / dest_alpha;
3797 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3798 int blended_colors[3];
3799 FX_BYTE src_scan[3];
3800 FX_BYTE dest_scan_o[3];
3801 src_scan[0] = src_b;
3802 src_scan[1] = src_g;
3803 src_scan[2] = src_r;
3804 dest_scan_o[0] = dest_scan[2];
3805 dest_scan_o[1] = dest_scan[1];
3806 dest_scan_o[2] = dest_scan[0];
3807 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3808 dest_scan[2] =
3809 FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
3810 dest_scan[1] =
3811 FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
3812 dest_scan[0] =
3813 FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
3814 } else if (blend_type) {
3815 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3816 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
3817 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
3818 blended = _BLEND(blend_type, dest_scan[1], src_g);
3819 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
3820 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
3821 blended = _BLEND(blend_type, dest_scan[0], src_r);
3822 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
3823 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
3824 } else {
3825 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
3826 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
3827 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
3828 }
3829 dest_scan += 4;
3830 }
3831 }
3832 void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan,
3833 FX_LPCBYTE src_scan,
3834 int mask_alpha,
3835 int src_r,
3836 int src_g,
3837 int src_b,
3838 int pixel_count,
3839 int blend_type,
3840 int Bpp,
3841 FX_LPCBYTE clip_scan) {
3842 for (int col = 0; col < pixel_count; col++) {
3843 int src_alpha;
3844 if (clip_scan) {
3845 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
3846 } else {
3847 src_alpha = mask_alpha * src_scan[col] / 255;
3848 }
3849 if (src_alpha == 0) {
3850 dest_scan += Bpp;
3851 continue;
3852 }
3853 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3854 int blended_colors[3];
3855 FX_BYTE src_scan[3];
3856 FX_BYTE dest_scan_o[3];
3857 src_scan[0] = src_b;
3858 src_scan[1] = src_g;
3859 src_scan[2] = src_r;
3860 dest_scan_o[0] = dest_scan[2];
3861 dest_scan_o[1] = dest_scan[1];
3862 dest_scan_o[2] = dest_scan[0];
3863 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3864 dest_scan[2] =
3865 FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
3866 dest_scan[1] =
3867 FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
3868 dest_scan[0] =
3869 FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
3870 } else if (blend_type) {
3871 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3872 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
3873 blended = _BLEND(blend_type, dest_scan[1], src_g);
3874 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
3875 blended = _BLEND(blend_type, dest_scan[0], src_r);
3876 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
3877 } else {
3878 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
3879 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
3880 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
3881 }
3882 dest_scan += Bpp;
3883 }
3884 }
3885 void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan,
3886 FX_LPCBYTE src_scan,
3887 int mask_alpha,
3888 int src_r,
3889 int src_g,
3890 int src_b,
3891 int src_left,
3892 int pixel_count,
3893 int blend_type,
3894 FX_LPCBYTE clip_scan) {
3895 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
3896 mask_alpha == 255) {
3897 FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
3898 for (int col = 0; col < pixel_count; col++) {
3899 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
3900 FXARGB_SETRGBORDERDIB(dest_scan, argb);
3901 }
3902 dest_scan += 4;
3903 }
3904 return;
3905 }
3906 for (int col = 0; col < pixel_count; col++) {
3907 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3908 dest_scan += 4;
3909 continue;
3910 }
3911 int src_alpha;
3912 if (clip_scan) {
3913 src_alpha = mask_alpha * clip_scan[col] / 255;
3914 } else {
3915 src_alpha = mask_alpha;
3916 }
3917 FX_BYTE back_alpha = dest_scan[3];
3918 if (back_alpha == 0) {
3919 FXARGB_SETRGBORDERDIB(dest_scan,
3920 FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
3921 dest_scan += 4;
3922 continue;
3923 }
3924 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
3925 dest_scan[3] = dest_alpha;
3926 int alpha_ratio = src_alpha * 255 / dest_alpha;
3927 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3928 int blended_colors[3];
3929 FX_BYTE src_scan[3];
3930 FX_BYTE dest_scan_o[3];
3931 src_scan[0] = src_b;
3932 src_scan[1] = src_g;
3933 src_scan[2] = src_r;
3934 dest_scan_o[0] = dest_scan[2];
3935 dest_scan_o[1] = dest_scan[1];
3936 dest_scan_o[2] = dest_scan[0];
3937 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3938 dest_scan[2] =
3939 FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
3940 dest_scan[1] =
3941 FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
3942 dest_scan[0] =
3943 FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
3944 } else if (blend_type) {
3945 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3946 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
3947 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
3948 blended = _BLEND(blend_type, dest_scan[1], src_g);
3949 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
3950 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
3951 blended = _BLEND(blend_type, dest_scan[0], src_r);
3952 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
3953 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
3954 } else {
3955 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
3956 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
3957 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
3958 }
3959 dest_scan += 4;
3960 }
3961 }
3962 void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan,
3963 FX_LPCBYTE src_scan,
3964 int mask_alpha,
3965 int src_r,
3966 int src_g,
3967 int src_b,
3968 int src_left,
3969 int pixel_count,
3970 int blend_type,
3971 int Bpp,
3972 FX_LPCBYTE clip_scan) {
3973 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
3974 mask_alpha == 255) {
3975 for (int col = 0; col < pixel_count; col++) {
3976 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
3977 dest_scan[2] = src_b;
3978 dest_scan[1] = src_g;
3979 dest_scan[0] = src_r;
3980 }
3981 dest_scan += Bpp;
3982 }
3983 return;
3984 }
3985 for (int col = 0; col < pixel_count; col++) {
3986 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
3987 dest_scan += Bpp;
3988 continue;
3989 }
3990 int src_alpha;
3991 if (clip_scan) {
3992 src_alpha = mask_alpha * clip_scan[col] / 255;
3993 } else {
3994 src_alpha = mask_alpha;
3995 }
3996 if (src_alpha == 0) {
3997 dest_scan += Bpp;
3998 continue;
3999 }
4000 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
4001 int blended_colors[3];
4002 FX_BYTE src_scan[3];
4003 FX_BYTE dest_scan_o[3];
4004 src_scan[0] = src_b;
4005 src_scan[1] = src_g;
4006 src_scan[2] = src_r;
4007 dest_scan_o[0] = dest_scan[2];
4008 dest_scan_o[1] = dest_scan[1];
4009 dest_scan_o[2] = dest_scan[0];
4010 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
4011 dest_scan[2] =
4012 FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
4013 dest_scan[1] =
4014 FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
4015 dest_scan[0] =
4016 FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
4017 } else if (blend_type) {
4018 int back_color = FX_GAMMA(dest_scan[2]);
4019 int blended = _BLEND(blend_type, back_color, src_b);
4020 dest_scan[2] =
4021 FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
4022 back_color = FX_GAMMA(dest_scan[1]);
4023 blended = _BLEND(blend_type, back_color, src_g);
4024 dest_scan[1] =
4025 FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
4026 back_color = FX_GAMMA(dest_scan[0]);
4027 blended = _BLEND(blend_type, back_color, src_r);
4028 dest_scan[0] =
4029 FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
4030 } else {
4031 dest_scan[2] = FX_GAMMA_INVERSE(
4032 FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
4033 dest_scan[1] = FX_GAMMA_INVERSE(
4034 FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
4035 dest_scan[0] = FX_GAMMA_INVERSE(
4036 FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
4037 }
4038 dest_scan += Bpp;
4039 }
4040 }
4041 inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format,
4042 int alpha_flag,
4043 FX_DWORD mask_color,
4044 int& mask_alpha,
4045 int& mask_red,
4046 int& mask_green,
4047 int& mask_blue,
4048 int& mask_black,
4049 void* icc_module,
4050 void* pIccTransform) {
4051 ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
4052 if (alpha_flag >> 8) {
4053 mask_alpha = alpha_flag & 0xff;
4054 mask_red = FXSYS_GetCValue(mask_color);
4055 mask_green = FXSYS_GetMValue(mask_color);
4056 mask_blue = FXSYS_GetYValue(mask_color);
4057 mask_black = FXSYS_GetKValue(mask_color);
4058 } else {
4059 mask_alpha = FXARGB_A(mask_color);
4060 mask_red = FXARGB_R(mask_color);
4061 mask_green = FXARGB_G(mask_color);
4062 mask_blue = FXARGB_B(mask_color);
4063 }
4064 if (dest_format == FXDIB_8bppMask) {
4065 return TRUE;
4066 }
4067 if ((dest_format & 0xff) == 8) {
4068 if (pIccTransform) {
4069 mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color)
4070 : FXARGB_TODIB(mask_color);
4071 FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
4072 pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
4073 mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
4074 } else {
4075 if (alpha_flag >> 8) {
4076 FX_BYTE r, g, b;
4077 AdobeCMYK_to_sRGB1(
4078 mask_red, mask_green, mask_blue, mask_black, r, g, b);
4079 mask_red = FXRGB2GRAY(r, g, b);
4080 } else {
4081 mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
4082 }
4083 if (dest_format & 0x0400) {
4084 mask_red = FX_CCOLOR(mask_red);
4085 }
4086 }
4087 } else {
4088 FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
4089 mask_color =
4090 (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
4091 if (pIccTransform) {
4092 pIccModule->TranslateScanline(
4093 pIccTransform, mask_color_p, mask_color_p, 1);
4094 mask_red = mask_color_p[2];
4095 mask_green = mask_color_p[1];
4096 mask_blue = mask_color_p[0];
4097 } else if (alpha_flag >> 8) {
4098 AdobeCMYK_to_sRGB1(mask_color_p[0],
4099 mask_color_p[1],
4100 mask_color_p[2],
4101 mask_color_p[3],
4102 mask_color_p[2],
4103 mask_color_p[1],
4104 mask_color_p[0]);
4105 mask_red = mask_color_p[2];
4106 mask_green = mask_color_p[1];
4107 mask_blue = mask_color_p[0];
4108 }
4109 }
4110 return TRUE;
4111 }
4112 inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format,
4113 FXDIB_Format dest_format,
4114 FX_DWORD*& pDestPalette,
4115 FX_DWORD* pSrcPalette,
4116 void* icc_module,
4117 void* pIccTransform) {
4118 ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
4119 FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
4120 FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
4121 pDestPalette = NULL;
4122 if (pIccTransform) {
4123 if (pSrcPalette) {
4124 if ((dest_format & 0xff) == 8) {
4125 int pal_count = 1 << (src_format & 0xff);
4126 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
4127 if (!gray_pal) {
4128 return;
4129 }
4130 pDestPalette = (FX_DWORD*)gray_pal;
4131 for (int i = 0; i < pal_count; i++) {
4132 FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i])
4133 : FXARGB_TODIB(pSrcPalette[i]);
4134 pIccModule->TranslateScanline(
4135 pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
4136 gray_pal++;
4137 }
4138 } else {
4139 int palsize = 1 << (src_format & 0xff);
4140 pDestPalette = FX_Alloc(FX_DWORD, palsize);
4141 if (!pDestPalette) {
4142 return;
4143 }
4144 for (int i = 0; i < palsize; i++) {
4145 FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i])
4146 : FXARGB_TODIB(pSrcPalette[i]);
4147 pIccModule->TranslateScanline(
4148 pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
4149 pDestPalette[i] =
4150 isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
4151 }
4152 }
4153 } else {
4154 int pal_count = 1 << (src_format & 0xff);
4155 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
4156 if (!gray_pal) {
4157 return;
4158 }
4159 if (pal_count == 2) {
4160 gray_pal[0] = 0;
4161 gray_pal[1] = 255;
4162 } else {
4163 for (int i = 0; i < pal_count; i++) {
4164 gray_pal[i] = i;
4165 }
4166 }
4167 if ((dest_format & 0xff) == 8) {
4168 pIccModule->TranslateScanline(
4169 pIccTransform, gray_pal, gray_pal, pal_count);
4170 pDestPalette = (FX_DWORD*)gray_pal;
4171 } else {
4172 pDestPalette = FX_Alloc(FX_DWORD, pal_count);
4173 if (!pDestPalette) {
4174 FX_Free(gray_pal);
4175 return;
4176 }
4177 for (int i = 0; i < pal_count; i++) {
4178 pIccModule->TranslateScanline(
4179 pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
4180 pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i])
4181 : FXARGB_TODIB(pDestPalette[i]);
4182 }
4183 FX_Free(gray_pal);
4184 }
4185 }
4186 } else {
4187 if (pSrcPalette) {
4188 if ((dest_format & 0xff) == 8) {
4189 int pal_count = 1 << (src_format & 0xff);
4190 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
4191 if (!gray_pal) {
4192 return;
4193 }
4194 pDestPalette = (FX_DWORD*)gray_pal;
4195 if (isSrcCmyk) {
4196 for (int i = 0; i < pal_count; i++) {
4197 FX_CMYK cmyk = pSrcPalette[i];
4198 FX_BYTE r, g, b;
4199 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk),
4200 FXSYS_GetMValue(cmyk),
4201 FXSYS_GetYValue(cmyk),
4202 FXSYS_GetKValue(cmyk),
4203 r,
4204 g,
4205 b);
4206 *gray_pal++ = FXRGB2GRAY(r, g, b);
4207 }
4208 } else
4209 for (int i = 0; i < pal_count; i++) {
4210 FX_ARGB argb = pSrcPalette[i];
4211 *gray_pal++ =
4212 FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
4213 }
4214 } else {
4215 int palsize = 1 << (src_format & 0xff);
4216 pDestPalette = FX_Alloc(FX_DWORD, palsize);
4217 if (!pDestPalette) {
4218 return;
4219 }
4220 if (isDstCmyk == isSrcCmyk) {
4221 FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
2236 } else { 4222 } else {
2237 src_r = reset_r; 4223 for (int i = 0; i < palsize; i++) {
2238 src_g = reset_g; 4224 FX_CMYK cmyk = pSrcPalette[i];
2239 src_b = reset_b; 4225 FX_BYTE r, g, b;
2240 } 4226 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk),
2241 if (clip_scan == NULL || clip_scan[col] == 255) { 4227 FXSYS_GetMValue(cmyk),
2242 *dest_scan++ = src_b; 4228 FXSYS_GetYValue(cmyk),
2243 *dest_scan++ = src_g; 4229 FXSYS_GetKValue(cmyk),
2244 *dest_scan++ = src_r; 4230 r,
4231 g,
4232 b);
4233 pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
4234 }
4235 }
4236 }
4237 } else {
4238 if ((dest_format & 0xff) == 8) {
4239 int pal_count = 1 << (src_format & 0xff);
4240 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
4241 if (!gray_pal) {
4242 return;
4243 }
4244 if (pal_count == 2) {
4245 gray_pal[0] = 0;
4246 gray_pal[1] = 255;
4247 } else {
4248 for (int i = 0; i < pal_count; i++) {
4249 gray_pal[i] = i;
4250 }
4251 }
4252 pDestPalette = (FX_DWORD*)gray_pal;
4253 } else {
4254 int palsize = 1 << (src_format & 0xff);
4255 pDestPalette = FX_Alloc(FX_DWORD, palsize);
4256 if (!pDestPalette) {
4257 return;
4258 }
4259 if (palsize == 2) {
4260 pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
4261 pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
4262 } else {
4263 for (int i = 0; i < palsize; i++) {
4264 pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
4265 }
4266 }
4267 if (isSrcCmyk != isDstCmyk) {
4268 for (int i = 0; i < palsize; i++) {
4269 FX_CMYK cmyk = pDestPalette[i];
4270 FX_BYTE r, g, b;
4271 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk),
4272 FXSYS_GetMValue(cmyk),
4273 FXSYS_GetYValue(cmyk),
4274 FXSYS_GetKValue(cmyk),
4275 r,
4276 g,
4277 b);
4278 pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
4279 }
4280 }
4281 }
4282 }
4283 }
4284 }
4285 CFX_ScanlineCompositor::CFX_ScanlineCompositor() {
4286 m_pSrcPalette = NULL;
4287 m_pCacheScanline = NULL;
4288 m_CacheSize = 0;
4289 m_bRgbByteOrder = FALSE;
4290 m_BlendType = FXDIB_BLEND_NORMAL;
4291 }
4292 CFX_ScanlineCompositor::~CFX_ScanlineCompositor() {
4293 if (m_pSrcPalette) {
4294 FX_Free(m_pSrcPalette);
4295 }
4296 if (m_pCacheScanline) {
4297 FX_Free(m_pCacheScanline);
4298 }
4299 }
4300 FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format,
4301 FXDIB_Format src_format,
4302 FX_INT32 width,
4303 FX_DWORD* pSrcPalette,
4304 FX_DWORD mask_color,
4305 int blend_type,
4306 FX_BOOL bClip,
4307 FX_BOOL bRgbByteOrder,
4308 int alpha_flag,
4309 void* pIccTransform) {
4310 m_SrcFormat = src_format;
4311 m_DestFormat = dest_format;
4312 m_BlendType = blend_type;
4313 m_bRgbByteOrder = bRgbByteOrder;
4314 ICodec_IccModule* pIccModule = NULL;
4315 if (CFX_GEModule::Get()->GetCodecModule()) {
4316 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
4317 }
4318 if (pIccModule == NULL) {
4319 pIccTransform = NULL;
4320 }
4321 m_pIccTransform = pIccTransform;
4322 if ((dest_format & 0xff) == 1) {
4323 return FALSE;
4324 }
4325 if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
4326 return _ScanlineCompositor_InitSourceMask(dest_format,
4327 alpha_flag,
4328 mask_color,
4329 m_MaskAlpha,
4330 m_MaskRed,
4331 m_MaskGreen,
4332 m_MaskBlue,
4333 m_MaskBlack,
4334 pIccModule,
4335 pIccTransform);
4336 }
4337 if (pIccTransform == NULL && (~src_format & 0x0400) &&
4338 (dest_format & 0x0400)) {
4339 return FALSE;
4340 }
4341 if ((m_SrcFormat & 0xff) <= 8) {
4342 if (dest_format == FXDIB_8bppMask) {
4343 return TRUE;
4344 }
4345 _ScanlineCompositor_InitSourcePalette(src_format,
4346 dest_format,
4347 m_pSrcPalette,
4348 pSrcPalette,
4349 pIccModule,
4350 pIccTransform);
4351 m_Transparency =
4352 (dest_format == FXDIB_Argb ? 1 : 0) + (dest_format & 0x0200 ? 2 : 0) +
4353 (dest_format & 0x0400 ? 4 : 0) + ((src_format & 0xff) == 1 ? 8 : 0);
4354 return TRUE;
4355 }
4356 m_Transparency = (src_format & 0x0200 ? 0 : 1) +
4357 (dest_format & 0x0200 ? 0 : 2) +
4358 (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0) +
4359 (bClip ? 8 : 0) + (src_format & 0x0400 ? 16 : 0) +
4360 (dest_format & 0x0400 ? 32 : 0) + (pIccTransform ? 64 : 0);
4361 return TRUE;
4362 }
4363 void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan,
4364 FX_LPCBYTE src_scan,
4365 int width,
4366 FX_LPCBYTE clip_scan,
4367 FX_LPCBYTE src_extra_alpha,
4368 FX_LPBYTE dst_extra_alpha) {
4369 int src_Bpp = (m_SrcFormat & 0xff) >> 3;
4370 int dest_Bpp = (m_DestFormat & 0xff) >> 3;
4371 if (m_bRgbByteOrder) {
4372 switch (m_Transparency) {
4373 case 0:
4374 case 4:
4375 case 8:
4376 case 12:
4377 _CompositeRow_Argb2Argb_RgbByteOrder(
4378 dest_scan, src_scan, width, m_BlendType, clip_scan);
4379 break;
4380 case 1:
4381 _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(
4382 dest_scan, src_scan, width, m_BlendType, src_Bpp);
4383 break;
4384 case 2:
4385 case 10:
4386 _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(
4387 dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
4388 break;
4389 case 3:
4390 _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(
4391 dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
4392 break;
4393 case 5:
4394 _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(
4395 dest_scan, src_scan, width, src_Bpp);
4396 break;
4397 case 6:
4398 case 14:
4399 _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(
4400 dest_scan, src_scan, width, dest_Bpp, clip_scan);
4401 break;
4402 case 7:
4403 _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(
4404 dest_scan, src_scan, width, dest_Bpp, src_Bpp);
4405 break;
4406 case 9:
4407 _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(
4408 dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
4409 break;
4410 case 11:
4411 _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan,
4412 src_scan,
4413 width,
4414 m_BlendType,
4415 dest_Bpp,
4416 src_Bpp,
4417 clip_scan);
4418 break;
4419 case 13:
4420 _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(
4421 dest_scan, src_scan, width, src_Bpp, clip_scan);
4422 break;
4423 case 15:
4424 _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(
4425 dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
4426 break;
4427 }
4428 return;
4429 }
4430 if (m_DestFormat == FXDIB_8bppMask) {
4431 if (m_SrcFormat & 0x0200) {
4432 if (m_SrcFormat == FXDIB_Argb) {
4433 _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
4434 } else {
4435 _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
4436 }
4437 } else {
4438 _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
4439 }
4440 } else if ((m_DestFormat & 0xff) == 8) {
4441 if (m_DestFormat & 0x0400) {
4442 for (int i = 0; i < width; i++) {
4443 *dest_scan = ~*dest_scan;
4444 dest_scan++;
4445 }
4446 }
4447 if (m_SrcFormat & 0x0200) {
4448 if (m_DestFormat & 0x0200) {
4449 _CompositeRow_Argb2Graya(dest_scan,
4450 src_scan,
4451 width,
4452 m_BlendType,
4453 clip_scan,
4454 src_extra_alpha,
4455 dst_extra_alpha,
4456 m_pIccTransform);
4457 } else {
4458 _CompositeRow_Argb2Gray(dest_scan,
4459 src_scan,
4460 width,
4461 m_BlendType,
4462 clip_scan,
4463 src_extra_alpha,
4464 m_pIccTransform);
4465 }
4466 } else {
4467 if (m_DestFormat & 0x0200) {
4468 _CompositeRow_Rgb2Graya(dest_scan,
4469 src_scan,
4470 src_Bpp,
4471 width,
4472 m_BlendType,
4473 clip_scan,
4474 dst_extra_alpha,
4475 m_pIccTransform);
4476 } else {
4477 _CompositeRow_Rgb2Gray(dest_scan,
4478 src_scan,
4479 src_Bpp,
4480 width,
4481 m_BlendType,
4482 clip_scan,
4483 m_pIccTransform);
4484 }
4485 }
4486 if (m_DestFormat & 0x0400) {
4487 for (int i = 0; i < width; i++) {
4488 *dest_scan = ~*dest_scan;
4489 dest_scan++;
4490 }
4491 }
4492 } else {
4493 int dest_Size = width * dest_Bpp + 4;
4494 if (dest_Size > m_CacheSize) {
4495 m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
4496 if (!m_pCacheScanline) {
4497 return;
4498 }
4499 m_CacheSize = dest_Size;
4500 }
4501 switch (m_Transparency) {
4502 case 0:
4503 case 4:
4504 case 8:
4505 case 4 + 8: {
4506 _CompositeRow_Argb2Argb(dest_scan,
4507 src_scan,
4508 width,
4509 m_BlendType,
4510 clip_scan,
4511 dst_extra_alpha,
4512 src_extra_alpha);
4513 } break;
4514 case 64:
4515 case 4 + 64:
4516 case 8 + 64:
4517 case 4 + 8 + 64: {
4518 _CompositeRow_Argb2Argb_Transform(dest_scan,
4519 src_scan,
4520 width,
4521 m_BlendType,
4522 clip_scan,
4523 dst_extra_alpha,
4524 src_extra_alpha,
4525 m_pCacheScanline,
4526 m_pIccTransform);
4527 } break;
4528 case 1:
4529 _CompositeRow_Rgb2Argb_Blend_NoClip(
4530 dest_scan, src_scan, width, m_BlendType, src_Bpp, dst_extra_alpha);
4531 break;
4532 case 1 + 64:
4533 _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan,
4534 src_scan,
4535 width,
4536 m_BlendType,
4537 src_Bpp,
4538 dst_extra_alpha,
4539 m_pCacheScanline,
4540 m_pIccTransform);
4541 break;
4542 case 1 + 8:
4543 _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan,
4544 src_scan,
4545 width,
4546 m_BlendType,
4547 src_Bpp,
4548 clip_scan,
4549 dst_extra_alpha);
4550 break;
4551 case 1 + 8 + 64:
4552 _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan,
4553 src_scan,
4554 width,
4555 m_BlendType,
4556 src_Bpp,
4557 clip_scan,
4558 dst_extra_alpha,
4559 m_pCacheScanline,
4560 m_pIccTransform);
4561 break;
4562 case 1 + 4:
4563 _CompositeRow_Rgb2Argb_NoBlend_NoClip(
4564 dest_scan, src_scan, width, src_Bpp, dst_extra_alpha);
4565 break;
4566 case 1 + 4 + 64:
4567 _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan,
4568 src_scan,
4569 width,
4570 src_Bpp,
4571 dst_extra_alpha,
4572 m_pCacheScanline,
4573 m_pIccTransform);
4574 break;
4575 case 1 + 4 + 8:
4576 _CompositeRow_Rgb2Argb_NoBlend_Clip(
4577 dest_scan, src_scan, width, src_Bpp, clip_scan, dst_extra_alpha);
4578 break;
4579 case 1 + 4 + 8 + 64:
4580 _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan,
4581 src_scan,
4582 width,
4583 src_Bpp,
4584 clip_scan,
4585 dst_extra_alpha,
4586 m_pCacheScanline,
4587 m_pIccTransform);
4588 break;
4589 case 2:
4590 case 2 + 8:
4591 _CompositeRow_Argb2Rgb_Blend(dest_scan,
4592 src_scan,
4593 width,
4594 m_BlendType,
4595 dest_Bpp,
4596 clip_scan,
4597 src_extra_alpha);
4598 break;
4599 case 2 + 64:
4600 case 2 + 8 + 64:
4601 _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan,
4602 src_scan,
4603 width,
4604 m_BlendType,
4605 dest_Bpp,
4606 clip_scan,
4607 src_extra_alpha,
4608 m_pCacheScanline,
4609 m_pIccTransform);
4610 break;
4611 case 2 + 4:
4612 case 2 + 4 + 8:
4613 _CompositeRow_Argb2Rgb_NoBlend(
4614 dest_scan, src_scan, width, dest_Bpp, clip_scan, src_extra_alpha);
4615 break;
4616 case 2 + 4 + 64:
4617 case 2 + 4 + 8 + 64:
4618 _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan,
4619 src_scan,
4620 width,
4621 dest_Bpp,
4622 clip_scan,
4623 src_extra_alpha,
4624 m_pCacheScanline,
4625 m_pIccTransform);
4626 break;
4627 case 1 + 2:
4628 _CompositeRow_Rgb2Rgb_Blend_NoClip(
4629 dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
4630 break;
4631 case 1 + 2 + 64:
4632 _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan,
4633 src_scan,
4634 width,
4635 m_BlendType,
4636 dest_Bpp,
4637 src_Bpp,
4638 m_pCacheScanline,
4639 m_pIccTransform);
4640 break;
4641 case 1 + 2 + 8:
4642 _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan,
4643 src_scan,
4644 width,
4645 m_BlendType,
4646 dest_Bpp,
4647 src_Bpp,
4648 clip_scan);
4649 break;
4650 case 1 + 2 + 8 + 64:
4651 _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan,
4652 src_scan,
4653 width,
4654 m_BlendType,
4655 dest_Bpp,
4656 src_Bpp,
4657 clip_scan,
4658 m_pCacheScanline,
4659 m_pIccTransform);
4660 break;
4661 case 1 + 2 + 4:
4662 _CompositeRow_Rgb2Rgb_NoBlend_NoClip(
4663 dest_scan, src_scan, width, dest_Bpp, src_Bpp);
4664 break;
4665 case 1 + 2 + 4 + 64:
4666 _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan,
4667 src_scan,
4668 width,
4669 dest_Bpp,
4670 src_Bpp,
4671 m_pCacheScanline,
4672 m_pIccTransform);
4673 break;
4674 case 1 + 2 + 4 + 8:
4675 _CompositeRow_Rgb2Rgb_NoBlend_Clip(
4676 dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
4677 break;
4678 case 1 + 2 + 4 + 8 + 64:
4679 _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan,
4680 src_scan,
4681 width,
4682 dest_Bpp,
4683 src_Bpp,
4684 clip_scan,
4685 m_pCacheScanline,
4686 m_pIccTransform);
4687 break;
4688 }
4689 }
4690 }
4691 void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan,
4692 FX_LPCBYTE src_scan,
4693 int src_left,
4694 int width,
4695 FX_LPCBYTE clip_scan,
4696 FX_LPCBYTE src_extra_alpha,
4697 FX_LPBYTE dst_extra_alpha) {
4698 if (m_bRgbByteOrder) {
4699 if (m_SrcFormat == FXDIB_1bppRgb) {
4700 if (m_DestFormat == FXDIB_8bppRgb) {
4701 return;
4702 } else if (m_DestFormat == FXDIB_Argb) {
4703 _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(
4704 dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
4705 } else {
4706 _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(
4707 dest_scan,
4708 src_scan,
4709 src_left,
4710 m_pSrcPalette,
4711 width,
4712 (m_DestFormat & 0xff) >> 3,
4713 clip_scan);
4714 }
4715 } else {
4716 if (m_DestFormat == FXDIB_8bppRgb) {
4717 return;
4718 } else if (m_DestFormat == FXDIB_Argb) {
4719 _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(
4720 dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
4721 } else {
4722 _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(
4723 dest_scan,
4724 src_scan,
4725 m_pSrcPalette,
4726 width,
4727 (m_DestFormat & 0xff) >> 3,
4728 clip_scan);
4729 }
4730 }
4731 return;
4732 }
4733 if (m_DestFormat == FXDIB_8bppMask) {
4734 _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
4735 return;
4736 } else if ((m_DestFormat & 0xff) == 8) {
4737 if (m_Transparency & 8) {
4738 if (m_DestFormat & 0x0200) {
4739 _CompositeRow_1bppPal2Graya(dest_scan,
4740 src_scan,
4741 src_left,
4742 (FX_LPCBYTE)m_pSrcPalette,
4743 width,
4744 m_BlendType,
4745 clip_scan,
4746 dst_extra_alpha);
4747 } else {
4748 _CompositeRow_1bppPal2Gray(dest_scan,
4749 src_scan,
4750 src_left,
4751 (FX_LPCBYTE)m_pSrcPalette,
4752 width,
4753 m_BlendType,
4754 clip_scan);
4755 }
4756 } else {
4757 if (m_DestFormat & 0x0200)
4758 _CompositeRow_8bppPal2Graya(dest_scan,
4759 src_scan,
4760 (FX_LPCBYTE)m_pSrcPalette,
4761 width,
4762 m_BlendType,
4763 clip_scan,
4764 dst_extra_alpha,
4765 src_extra_alpha);
4766 else
4767 _CompositeRow_8bppPal2Gray(dest_scan,
4768 src_scan,
4769 (FX_LPCBYTE)m_pSrcPalette,
4770 width,
4771 m_BlendType,
4772 clip_scan,
4773 src_extra_alpha);
4774 }
4775 } else {
4776 switch (m_Transparency) {
4777 case 1 + 2:
4778 _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan,
4779 src_scan,
4780 width,
4781 m_pSrcPalette,
4782 clip_scan,
4783 src_extra_alpha);
4784 break;
4785 case 1 + 2 + 8:
4786 _CompositeRow_1bppRgb2Argb_NoBlend(
4787 dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
4788 break;
4789 case 0:
4790 _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan,
4791 src_scan,
4792 m_pSrcPalette,
4793 width,
4794 (m_DestFormat & 0xff) >> 3,
4795 clip_scan,
4796 src_extra_alpha);
4797 break;
4798 case 0 + 8:
4799 _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan,
4800 src_scan,
4801 src_left,
4802 m_pSrcPalette,
4803 width,
4804 (m_DestFormat & 0xff) >> 3,
4805 clip_scan);
4806 break;
4807 case 0 + 2:
4808 _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan,
4809 src_scan,
4810 m_pSrcPalette,
4811 width,
4812 (m_DestFormat & 0xff) >> 3,
4813 clip_scan,
4814 src_extra_alpha);
4815 break;
4816 case 0 + 2 + 8:
4817 _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan,
4818 src_scan,
4819 src_left,
4820 width,
4821 m_pSrcPalette,
4822 clip_scan,
4823 dst_extra_alpha);
4824 break;
4825 break;
4826 }
4827 }
4828 }
4829 void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan,
4830 FX_LPCBYTE src_scan,
4831 int width,
4832 FX_LPCBYTE clip_scan,
4833 FX_LPBYTE dst_extra_alpha) {
4834 if (m_DestFormat == FXDIB_8bppMask) {
4835 _CompositeRow_ByteMask2Mask(
4836 dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
4837 } else if ((m_DestFormat & 0xff) == 8) {
4838 if (m_DestFormat & 0x0200) {
4839 _CompositeRow_ByteMask2Graya(dest_scan,
4840 src_scan,
4841 m_MaskAlpha,
4842 m_MaskRed,
4843 width,
4844 clip_scan,
4845 dst_extra_alpha);
4846 } else {
4847 _CompositeRow_ByteMask2Gray(
4848 dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
4849 }
4850 } else if (m_bRgbByteOrder) {
4851 if (m_DestFormat == FXDIB_Argb)
4852 _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan,
4853 src_scan,
4854 m_MaskAlpha,
4855 m_MaskRed,
4856 m_MaskGreen,
4857 m_MaskBlue,
4858 width,
4859 m_BlendType,
4860 clip_scan);
4861 else
4862 _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan,
4863 src_scan,
4864 m_MaskAlpha,
4865 m_MaskRed,
4866 m_MaskGreen,
4867 m_MaskBlue,
4868 width,
4869 m_BlendType,
4870 (m_DestFormat & 0xff) >> 3,
4871 clip_scan);
4872 return;
4873 } else if (m_DestFormat == FXDIB_Argb)
4874 _CompositeRow_ByteMask2Argb(dest_scan,
4875 src_scan,
4876 m_MaskAlpha,
4877 m_MaskRed,
4878 m_MaskGreen,
4879 m_MaskBlue,
4880 width,
4881 m_BlendType,
4882 clip_scan);
4883 else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
4884 _CompositeRow_ByteMask2Rgb(dest_scan,
4885 src_scan,
4886 m_MaskAlpha,
4887 m_MaskRed,
4888 m_MaskGreen,
4889 m_MaskBlue,
4890 width,
4891 m_BlendType,
4892 (m_DestFormat & 0xff) >> 3,
4893 clip_scan);
4894 else if (m_DestFormat == FXDIB_Rgba)
4895 _CompositeRow_ByteMask2Rgba(dest_scan,
4896 src_scan,
4897 m_MaskAlpha,
4898 m_MaskRed,
4899 m_MaskGreen,
4900 m_MaskBlue,
4901 width,
4902 m_BlendType,
4903 clip_scan,
4904 dst_extra_alpha);
4905 }
4906 void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan,
4907 FX_LPCBYTE src_scan,
4908 int src_left,
4909 int width,
4910 FX_LPCBYTE clip_scan,
4911 FX_LPBYTE dst_extra_alpha) {
4912 if (m_DestFormat == FXDIB_8bppMask) {
4913 _CompositeRow_BitMask2Mask(
4914 dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
4915 } else if ((m_DestFormat & 0xff) == 8) {
4916 if (m_DestFormat & 0x0200)
4917 _CompositeRow_BitMask2Graya(dest_scan,
4918 src_scan,
4919 m_MaskAlpha,
4920 m_MaskRed,
4921 src_left,
4922 width,
4923 clip_scan,
4924 dst_extra_alpha);
4925 else {
4926 _CompositeRow_BitMask2Gray(dest_scan,
4927 src_scan,
4928 m_MaskAlpha,
4929 m_MaskRed,
4930 src_left,
4931 width,
4932 clip_scan);
4933 }
4934 } else if (m_bRgbByteOrder) {
4935 if (m_DestFormat == FXDIB_Argb)
4936 _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan,
4937 src_scan,
4938 m_MaskAlpha,
4939 m_MaskRed,
4940 m_MaskGreen,
4941 m_MaskBlue,
4942 src_left,
4943 width,
4944 m_BlendType,
4945 clip_scan);
4946 else
4947 _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan,
4948 src_scan,
4949 m_MaskAlpha,
4950 m_MaskRed,
4951 m_MaskGreen,
4952 m_MaskBlue,
4953 src_left,
4954 width,
4955 m_BlendType,
4956 (m_DestFormat & 0xff) >> 3,
4957 clip_scan);
4958 return;
4959 } else if (m_DestFormat == FXDIB_Argb)
4960 _CompositeRow_BitMask2Argb(dest_scan,
4961 src_scan,
4962 m_MaskAlpha,
4963 m_MaskRed,
4964 m_MaskGreen,
4965 m_MaskBlue,
4966 src_left,
4967 width,
4968 m_BlendType,
4969 clip_scan);
4970 else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
4971 _CompositeRow_BitMask2Rgb(dest_scan,
4972 src_scan,
4973 m_MaskAlpha,
4974 m_MaskRed,
4975 m_MaskGreen,
4976 m_MaskBlue,
4977 src_left,
4978 width,
4979 m_BlendType,
4980 (m_DestFormat & 0xff) >> 3,
4981 clip_scan);
4982 }
4983 FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left,
4984 int dest_top,
4985 int width,
4986 int height,
4987 const CFX_DIBSource* pSrcBitmap,
4988 int src_left,
4989 int src_top,
4990 int blend_type,
4991 const CFX_ClipRgn* pClipRgn,
4992 FX_BOOL bRgbByteOrder,
4993 void* pIccTransform) {
4994 if (m_pBuffer == NULL) {
4995 return FALSE;
4996 }
4997 ASSERT(!pSrcBitmap->IsAlphaMask());
4998 ASSERT(m_bpp >= 8);
4999 if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
5000 return FALSE;
5001 }
5002 GetOverlapRect(dest_left,
5003 dest_top,
5004 width,
5005 height,
5006 pSrcBitmap->GetWidth(),
5007 pSrcBitmap->GetHeight(),
5008 src_left,
5009 src_top,
5010 pClipRgn);
5011 if (width == 0 || height == 0) {
5012 return TRUE;
5013 }
5014 const CFX_DIBitmap* pClipMask = NULL;
5015 FX_RECT clip_box;
5016 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
5017 ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
5018 pClipMask = pClipRgn->GetMask();
5019 clip_box = pClipRgn->GetBox();
5020 }
5021 CFX_ScanlineCompositor compositor;
5022 if (!compositor.Init(GetFormat(),
5023 pSrcBitmap->GetFormat(),
5024 width,
5025 pSrcBitmap->GetPalette(),
5026 0,
5027 blend_type,
5028 pClipMask != NULL,
5029 bRgbByteOrder,
5030 0,
5031 pIccTransform)) {
5032 return FALSE;
5033 }
5034 int dest_Bpp = m_bpp / 8;
5035 int src_Bpp = pSrcBitmap->GetBPP() / 8;
5036 FX_BOOL bRgb = FALSE;
5037 FX_BOOL bCmyk = FALSE;
5038 if (src_Bpp > 1) {
5039 if (pSrcBitmap->IsCmykImage()) {
5040 bCmyk = TRUE;
5041 } else {
5042 bRgb = TRUE;
5043 }
5044 }
5045 CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
5046 for (int row = 0; row < height; row++) {
5047 FX_LPBYTE dest_scan =
5048 m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
5049 FX_LPCBYTE src_scan =
5050 pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
5051 FX_LPCBYTE src_scan_extra_alpha =
5052 pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left
5053 : NULL;
5054 FX_LPBYTE dst_scan_extra_alpha =
5055 m_pAlphaMask
5056 ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left
5057 : NULL;
5058 FX_LPCBYTE clip_scan = NULL;
5059 if (pClipMask) {
5060 clip_scan = pClipMask->m_pBuffer +
5061 (dest_top + row - clip_box.top) * pClipMask->m_Pitch +
5062 (dest_left - clip_box.left);
5063 }
5064 if (bRgb) {
5065 compositor.CompositeRgbBitmapLine(dest_scan,
5066 src_scan,
5067 width,
5068 clip_scan,
5069 src_scan_extra_alpha,
5070 dst_scan_extra_alpha);
5071 } else {
5072 compositor.CompositePalBitmapLine(dest_scan,
5073 src_scan,
5074 src_left,
5075 width,
5076 clip_scan,
5077 src_scan_extra_alpha,
5078 dst_scan_extra_alpha);
5079 }
5080 }
5081 return TRUE;
5082 }
5083 FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left,
5084 int dest_top,
5085 int width,
5086 int height,
5087 const CFX_DIBSource* pMask,
5088 FX_DWORD color,
5089 int src_left,
5090 int src_top,
5091 int blend_type,
5092 const CFX_ClipRgn* pClipRgn,
5093 FX_BOOL bRgbByteOrder,
5094 int alpha_flag,
5095 void* pIccTransform) {
5096 if (m_pBuffer == NULL) {
5097 return FALSE;
5098 }
5099 ASSERT(pMask->IsAlphaMask());
5100 ASSERT(m_bpp >= 8);
5101 if (!pMask->IsAlphaMask() || m_bpp < 8) {
5102 return FALSE;
5103 }
5104 GetOverlapRect(dest_left,
5105 dest_top,
5106 width,
5107 height,
5108 pMask->GetWidth(),
5109 pMask->GetHeight(),
5110 src_left,
5111 src_top,
5112 pClipRgn);
5113 if (width == 0 || height == 0) {
5114 return TRUE;
5115 }
5116 int src_alpha =
5117 (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
5118 if (src_alpha == 0) {
5119 return TRUE;
5120 }
5121 const CFX_DIBitmap* pClipMask = NULL;
5122 FX_RECT clip_box;
5123 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
5124 ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
5125 pClipMask = pClipRgn->GetMask();
5126 clip_box = pClipRgn->GetBox();
5127 }
5128 int src_bpp = pMask->GetBPP();
5129 int Bpp = GetBPP() / 8;
5130 CFX_ScanlineCompositor compositor;
5131 if (!compositor.Init(GetFormat(),
5132 pMask->GetFormat(),
5133 width,
5134 NULL,
5135 color,
5136 blend_type,
5137 pClipMask != NULL,
5138 bRgbByteOrder,
5139 alpha_flag,
5140 pIccTransform)) {
5141 return FALSE;
5142 }
5143 for (int row = 0; row < height; row++) {
5144 FX_LPBYTE dest_scan =
5145 m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
5146 FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
5147 FX_LPBYTE dst_scan_extra_alpha =
5148 m_pAlphaMask
5149 ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left
5150 : NULL;
5151 FX_LPCBYTE clip_scan = NULL;
5152 if (pClipMask) {
5153 clip_scan = pClipMask->m_pBuffer +
5154 (dest_top + row - clip_box.top) * pClipMask->m_Pitch +
5155 (dest_left - clip_box.left);
5156 }
5157 if (src_bpp == 1) {
5158 compositor.CompositeBitMaskLine(dest_scan,
5159 src_scan,
5160 src_left,
5161 width,
5162 clip_scan,
5163 dst_scan_extra_alpha);
5164 } else {
5165 compositor.CompositeByteMaskLine(dest_scan,
5166 src_scan + src_left,
5167 width,
5168 clip_scan,
5169 dst_scan_extra_alpha);
5170 }
5171 }
5172 return TRUE;
5173 }
5174 FX_BOOL CFX_DIBitmap::CompositeRect(int left,
5175 int top,
5176 int width,
5177 int height,
5178 FX_DWORD color,
5179 int alpha_flag,
5180 void* pIccTransform) {
5181 if (m_pBuffer == NULL) {
5182 return FALSE;
5183 }
5184 int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
5185 if (src_alpha == 0) {
5186 return TRUE;
5187 }
5188 FX_RECT rect(left, top, left + width, top + height);
5189 rect.Intersect(0, 0, m_Width, m_Height);
5190 if (rect.IsEmpty()) {
5191 return TRUE;
5192 }
5193 width = rect.Width();
5194 FX_DWORD dst_color;
5195 if (alpha_flag >> 8) {
5196 dst_color = FXCMYK_TODIB(color);
5197 } else {
5198 dst_color = FXARGB_TODIB(color);
5199 }
5200 FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
5201 if (m_bpp == 8) {
5202 FX_BYTE gray = 255;
5203 if (!IsAlphaMask()) {
5204 if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() &&
5205 CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
5206 ICodec_IccModule* pIccModule =
5207 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
5208 pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
5209 } else {
5210 if (alpha_flag >> 8) {
5211 FX_BYTE r, g, b;
5212 AdobeCMYK_to_sRGB1(
5213 color_p[0], color_p[1], color_p[2], color_p[3], r, g, b);
5214 gray = FXRGB2GRAY(r, g, b);
5215 } else {
5216 gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
5217 }
5218 }
5219 if (IsCmykImage()) {
5220 gray = ~gray;
5221 }
5222 }
5223 for (int row = rect.top; row < rect.bottom; row++) {
5224 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
5225 if (src_alpha == 255) {
5226 FXSYS_memset8(dest_scan, gray, width);
5227 } else
5228 for (int col = 0; col < width; col++) {
5229 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
5230 dest_scan++;
5231 }
5232 }
5233 return TRUE;
5234 } else if (m_bpp == 1) {
5235 ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
5236 int left_shift = rect.left % 8;
5237 int right_shift = rect.right % 8;
5238 int width = rect.right / 8 - rect.left / 8;
5239 int index = 0;
5240 if (m_pPalette == NULL) {
5241 index = ((FX_BYTE)color == 0xff) ? 1 : 0;
5242 } else {
5243 for (int i = 0; i < 2; i++)
5244 if (m_pPalette[i] == color) {
5245 index = i;
5246 }
5247 }
5248 for (int row = rect.top; row < rect.bottom; row++) {
5249 FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
5250 FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
5251 FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
5252 FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
5253 if (width) {
5254 FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
5255 if (!index) {
5256 *dest_scan_top &= left_flag;
5257 *dest_scan_top_r &= right_flag;
5258 } else {
5259 *dest_scan_top |= ~left_flag;
5260 *dest_scan_top_r |= ~right_flag;
5261 }
5262 } else {
5263 if (!index) {
5264 *dest_scan_top &= left_flag | right_flag;
5265 } else {
5266 *dest_scan_top |= ~(left_flag | right_flag);
5267 }
5268 }
5269 }
5270 return TRUE;
5271 }
5272 ASSERT(m_bpp >= 24);
5273 if (m_bpp < 24) {
5274 return FALSE;
5275 }
5276 if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
5277 ICodec_IccModule* pIccModule =
5278 CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
5279 pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
5280 } else {
5281 if (alpha_flag >> 8 && !IsCmykImage())
5282 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color),
5283 FXSYS_GetMValue(color),
5284 FXSYS_GetYValue(color),
5285 FXSYS_GetKValue(color),
5286 color_p[2],
5287 color_p[1],
5288 color_p[0]);
5289 else if (!(alpha_flag >> 8) && IsCmykImage()) {
5290 return FALSE;
5291 }
5292 }
5293 if (!IsCmykImage()) {
5294 color_p[3] = (FX_BYTE)src_alpha;
5295 }
5296 int Bpp = m_bpp / 8;
5297 FX_BOOL bAlpha = HasAlpha();
5298 FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
5299 if (src_alpha == 255) {
5300 for (int row = rect.top; row < rect.bottom; row++) {
5301 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
5302 FX_LPBYTE dest_scan_alpha =
5303 m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left
5304 : NULL;
5305 if (dest_scan_alpha) {
5306 FXSYS_memset8(dest_scan_alpha, 0xff, width);
5307 }
5308 if (Bpp == 4) {
5309 FX_DWORD* scan = (FX_DWORD*)dest_scan;
5310 for (int col = 0; col < width; col++) {
5311 *scan++ = dst_color;
5312 }
5313 } else {
5314 for (int col = 0; col < width; col++) {
5315 *dest_scan++ = color_p[0];
5316 *dest_scan++ = color_p[1];
5317 *dest_scan++ = color_p[2];
5318 }
5319 }
5320 }
5321 return TRUE;
5322 }
5323 for (int row = rect.top; row < rect.bottom; row++) {
5324 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
5325 if (bAlpha) {
5326 if (bArgb) {
5327 for (int col = 0; col < width; col++) {
5328 FX_BYTE back_alpha = dest_scan[3];
5329 if (back_alpha == 0) {
5330 FXARGB_SETDIB(
5331 dest_scan,
5332 FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
5333 dest_scan += 4;
5334 continue;
5335 }
5336 FX_BYTE dest_alpha =
5337 back_alpha + src_alpha - back_alpha * src_alpha / 255;
5338 int alpha_ratio = src_alpha * 255 / dest_alpha;
5339 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
5340 dest_scan++;
5341 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
5342 dest_scan++;
5343 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
5344 dest_scan++;
5345 *dest_scan++ = dest_alpha;
5346 }
5347 } else {
5348 FX_LPBYTE dest_scan_alpha =
5349 (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
5350 for (int col = 0; col < width; col++) {
5351 FX_BYTE back_alpha = *dest_scan_alpha;
5352 if (back_alpha == 0) {
5353 *dest_scan_alpha++ = src_alpha;
5354 FXSYS_memcpy32(dest_scan, color_p, Bpp);
5355 dest_scan += Bpp;
5356 continue;
5357 }
5358 FX_BYTE dest_alpha =
5359 back_alpha + src_alpha - back_alpha * src_alpha / 255;
5360 *dest_scan_alpha++ = dest_alpha;
5361 int alpha_ratio = src_alpha * 255 / dest_alpha;
5362 for (int comps = 0; comps < Bpp; comps++) {
5363 *dest_scan =
5364 FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
5365 dest_scan++;
5366 }
5367 }
5368 }
5369 } else {
5370 for (int col = 0; col < width; col++) {
5371 for (int comps = 0; comps < Bpp; comps++) {
5372 if (comps == 3) {
2245 *dest_scan++ = 255; 5373 *dest_scan++ = 255;
2246 continue; 5374 continue;
2247 } 5375 }
2248 int src_alpha = clip_scan[col]; 5376 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
2249 if (src_alpha == 0) { 5377 dest_scan++;
2250 dest_scan += 4; 5378 }
2251 continue; 5379 }
2252 } 5380 }
2253 int back_alpha = dest_scan[3]; 5381 }
2254 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55; 5382 return TRUE;
2255 dest_scan[3] = dest_alpha; 5383 }
2256 int alpha_ratio = src_alpha * 255 / dest_alpha; 5384 CFX_BitmapComposer::CFX_BitmapComposer() {
2257 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); 5385 m_pScanlineV = NULL;
2258 dest_scan ++; 5386 m_pScanlineAlphaV = NULL;
2259 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); 5387 m_pClipScanV = NULL;
2260 dest_scan ++; 5388 m_pAddClipScan = NULL;
2261 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); 5389 m_bRgbByteOrder = FALSE;
2262 dest_scan ++; 5390 m_BlendType = FXDIB_BLEND_NORMAL;
2263 dest_scan ++; 5391 }
2264 } 5392 CFX_BitmapComposer::~CFX_BitmapComposer() {
2265 } 5393 if (m_pScanlineV) {
2266 void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan , int src_left, int width, 5394 FX_Free(m_pScanlineV);
2267 FX_DWORD* pPalette, FX_LPCBYTE clip_scan , 5395 }
2268 FX_LPBYTE dest_alpha_scan) 5396 if (m_pScanlineAlphaV) {
2269 { 5397 FX_Free(m_pScanlineAlphaV);
2270 int reset_r, reset_g, reset_b; 5398 }
2271 int set_r, set_g, set_b; 5399 if (m_pClipScanV) {
2272 reset_r = FXARGB_R(pPalette[0]); 5400 FX_Free(m_pClipScanV);
2273 reset_g = FXARGB_G(pPalette[0]); 5401 }
2274 reset_b = FXARGB_B(pPalette[0]); 5402 if (m_pAddClipScan) {
2275 set_r = FXARGB_R(pPalette[1]); 5403 FX_Free(m_pAddClipScan);
2276 set_g = FXARGB_G(pPalette[1]); 5404 }
2277 set_b = FXARGB_B(pPalette[1]); 5405 }
2278 for (int col = 0; col < width; col ++) { 5406 void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest,
2279 int src_r, src_g, src_b; 5407 const CFX_ClipRgn* pClipRgn,
2280 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { 5408 int bitmap_alpha,
2281 src_r = set_r; 5409 FX_DWORD mask_color,
2282 src_g = set_g; 5410 FX_RECT& dest_rect,
2283 src_b = set_b; 5411 FX_BOOL bVertical,
2284 } else { 5412 FX_BOOL bFlipX,
2285 src_r = reset_r; 5413 FX_BOOL bFlipY,
2286 src_g = reset_g; 5414 FX_BOOL bRgbByteOrder,
2287 src_b = reset_b; 5415 int alpha_flag,
2288 } 5416 void* pIccTransform,
2289 if (clip_scan == NULL || clip_scan[col] == 255) { 5417 int blend_type) {
2290 *dest_scan++ = src_b; 5418 m_pBitmap = pDest;
2291 *dest_scan++ = src_g; 5419 m_pClipRgn = pClipRgn;
2292 *dest_scan++ = src_r; 5420 m_DestLeft = dest_rect.left;
2293 *dest_alpha_scan++ = 255; 5421 m_DestTop = dest_rect.top;
2294 continue; 5422 m_DestWidth = dest_rect.Width();
2295 } 5423 m_DestHeight = dest_rect.Height();
2296 int src_alpha = clip_scan[col]; 5424 m_BitmapAlpha = bitmap_alpha;
2297 if (src_alpha == 0) { 5425 m_MaskColor = mask_color;
2298 dest_scan += 3; 5426 m_pClipMask = NULL;
2299 dest_alpha_scan ++; 5427 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
2300 continue; 5428 m_pClipMask = pClipRgn->GetMask();
2301 } 5429 }
2302 int back_alpha = *dest_alpha_scan; 5430 m_bVertical = bVertical;
2303 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55; 5431 m_bFlipX = bFlipX;
2304 *dest_alpha_scan ++ = dest_alpha; 5432 m_bFlipY = bFlipY;
2305 int alpha_ratio = src_alpha * 255 / dest_alpha; 5433 m_AlphaFlag = alpha_flag;
2306 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); 5434 m_pIccTransform = pIccTransform;
2307 dest_scan ++; 5435 m_bRgbByteOrder = bRgbByteOrder;
2308 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); 5436 m_BlendType = blend_type;
2309 dest_scan ++; 5437 }
2310 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); 5438 FX_BOOL CFX_BitmapComposer::SetInfo(int width,
2311 dest_scan ++; 5439 int height,
2312 } 5440 FXDIB_Format src_format,
2313 } 5441 FX_DWORD* pSrcPalette) {
2314 void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int m ask_alpha, int src_r, int src_g, int src_b, int pixel_count, 5442 m_SrcFormat = src_format;
2315 int blend_type, FX_LPCBYTE clip_scan) 5443 if (!m_Compositor.Init(m_pBitmap->GetFormat(),
2316 { 5444 src_format,
2317 for (int col = 0; col < pixel_count; col ++) { 5445 width,
2318 int src_alpha; 5446 pSrcPalette,
2319 if (clip_scan) { 5447 m_MaskColor,
2320 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; 5448 FXDIB_BLEND_NORMAL,
2321 } else { 5449 m_pClipMask != NULL || (m_BitmapAlpha < 255),
2322 src_alpha = mask_alpha * src_scan[col] / 255; 5450 m_bRgbByteOrder,
2323 } 5451 m_AlphaFlag,
2324 FX_BYTE back_alpha = dest_scan[3]; 5452 m_pIccTransform)) {
2325 if (back_alpha == 0) { 5453 return FALSE;
2326 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b) ); 5454 }
2327 dest_scan += 4; 5455 if (m_bVertical) {
2328 continue; 5456 m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
2329 } 5457 if (!m_pScanlineV) {
2330 if (src_alpha == 0) { 5458 return FALSE;
2331 dest_scan += 4; 5459 }
2332 continue; 5460 m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
2333 } 5461 if (!m_pClipScanV) {
2334 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55; 5462 return FALSE;
2335 dest_scan[3] = dest_alpha; 5463 }
2336 int alpha_ratio = src_alpha * 255 / dest_alpha; 5464 if (m_pBitmap->m_pAlphaMask) {
2337 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { 5465 m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
2338 int blended_colors[3]; 5466 if (!m_pScanlineAlphaV) {
2339 FX_BYTE src_scan[3];
2340 src_scan[0] = src_b;
2341 src_scan[1] = src_g;
2342 src_scan[2] = src_r;
2343 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2344 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ ratio);
2345 dest_scan ++;
2346 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ ratio);
2347 dest_scan ++;
2348 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ ratio);
2349 } else if (blend_type) {
2350 int blended = _BLEND(blend_type, *dest_scan, src_b);
2351 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2352 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2353 dest_scan ++;
2354 blended = _BLEND(blend_type, *dest_scan, src_g);
2355 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2356 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2357 dest_scan ++;
2358 blended = _BLEND(blend_type, *dest_scan, src_r);
2359 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2360 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2361 } else {
2362 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2363 dest_scan ++;
2364 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2365 dest_scan ++;
2366 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2367 }
2368 dest_scan += 2;
2369 }
2370 }
2371 void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int m ask_alpha, int src_r, int src_g, int src_b, int pixel_count,
2372 int blend_type, FX_LPCBYTE clip_scan,
2373 FX_LPBYTE dest_alpha_scan)
2374 {
2375 for (int col = 0; col < pixel_count; col ++) {
2376 int src_alpha;
2377 if (clip_scan) {
2378 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2379 } else {
2380 src_alpha = mask_alpha * src_scan[col] / 255;
2381 }
2382 FX_BYTE back_alpha = *dest_alpha_scan;
2383 if (back_alpha == 0) {
2384 *dest_scan ++ = src_b;
2385 *dest_scan ++ = src_g;
2386 *dest_scan ++ = src_r;
2387 *dest_alpha_scan ++ = src_alpha;
2388 continue;
2389 }
2390 if (src_alpha == 0) {
2391 dest_scan += 3;
2392 dest_alpha_scan ++;
2393 continue;
2394 }
2395 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2396 *dest_alpha_scan ++ = dest_alpha;
2397 int alpha_ratio = src_alpha * 255 / dest_alpha;
2398 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2399 int blended_colors[3];
2400 FX_BYTE src_scan[3];
2401 src_scan[0] = src_b;
2402 src_scan[1] = src_g;
2403 src_scan[2] = src_r;
2404 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2405 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ ratio);
2406 dest_scan ++;
2407 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ ratio);
2408 dest_scan ++;
2409 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ ratio);
2410 dest_scan ++;
2411 } else if (blend_type) {
2412 int blended = _BLEND(blend_type, *dest_scan, src_b);
2413 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2414 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2415 dest_scan ++;
2416 blended = _BLEND(blend_type, *dest_scan, src_g);
2417 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2418 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2419 dest_scan ++;
2420 blended = _BLEND(blend_type, *dest_scan, src_r);
2421 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2422 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2423 dest_scan ++;
2424 } else {
2425 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2426 dest_scan ++;
2427 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2428 dest_scan ++;
2429 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2430 dest_scan ++;
2431 }
2432 }
2433 }
2434 void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int ma sk_alpha, int src_r, int src_g, int src_b, int pixel_count,
2435 int blend_type, int Bpp, FX_LPCBYTE clip_scan)
2436 {
2437 for (int col = 0; col < pixel_count; col ++) {
2438 int src_alpha;
2439 if (clip_scan) {
2440 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2441 } else {
2442 src_alpha = mask_alpha * src_scan[col] / 255;
2443 }
2444 if (src_alpha == 0) {
2445 dest_scan += Bpp;
2446 continue;
2447 }
2448 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2449 int blended_colors[3];
2450 FX_BYTE src_scan[3];
2451 src_scan[0] = src_b;
2452 src_scan[1] = src_g;
2453 src_scan[2] = src_r;
2454 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2455 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_al pha);
2456 dest_scan ++;
2457 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_al pha);
2458 dest_scan ++;
2459 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_al pha);
2460 } else if (blend_type) {
2461 int blended = _BLEND(blend_type, *dest_scan, src_b);
2462 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2463 dest_scan ++;
2464 blended = _BLEND(blend_type, *dest_scan, src_g);
2465 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2466 dest_scan ++;
2467 blended = _BLEND(blend_type, *dest_scan, src_r);
2468 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2469 } else {
2470 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
2471 dest_scan ++;
2472 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
2473 dest_scan ++;
2474 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
2475 }
2476 dest_scan += Bpp - 2;
2477 }
2478 }
2479 void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int m ask_alpha, int pixel_count,
2480 FX_LPCBYTE clip_scan)
2481 {
2482 for (int col = 0; col < pixel_count; col ++) {
2483 int src_alpha;
2484 if (clip_scan) {
2485 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2486 } else {
2487 src_alpha = mask_alpha * src_scan[col] / 255;
2488 }
2489 FX_BYTE back_alpha = *dest_scan;
2490 if (!back_alpha) {
2491 *dest_scan = src_alpha;
2492 } else if (src_alpha) {
2493 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2494 }
2495 dest_scan ++;
2496 }
2497 }
2498 void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int m ask_alpha, int src_gray,
2499 int pixel_count, FX_LPCBYTE clip_scan)
2500 {
2501 for (int col = 0; col < pixel_count; col ++) {
2502 int src_alpha;
2503 if (clip_scan) {
2504 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2505 } else {
2506 src_alpha = mask_alpha * src_scan[col] / 255;
2507 }
2508 if (src_alpha) {
2509 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
2510 }
2511 dest_scan ++;
2512 }
2513 }
2514 void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
2515 int pixel_count, FX_LPCBYTE clip_scan,
2516 FX_LPBYTE dest_alpha_scan)
2517 {
2518 for (int col = 0; col < pixel_count; col ++) {
2519 int src_alpha;
2520 if (clip_scan) {
2521 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
2522 } else {
2523 src_alpha = mask_alpha * src_scan[col] / 255;
2524 }
2525 FX_BYTE back_alpha = *dest_alpha_scan;
2526 if (back_alpha == 0) {
2527 *dest_scan ++ = src_gray;
2528 *dest_alpha_scan ++ = src_alpha;
2529 continue;
2530 }
2531 if (src_alpha == 0) {
2532 dest_scan ++;
2533 dest_alpha_scan ++;
2534 continue;
2535 }
2536 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2537 *dest_alpha_scan++ = dest_alpha;
2538 int alpha_ratio = src_alpha * 255 / dest_alpha;
2539 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
2540 dest_scan ++;
2541 }
2542 }
2543 void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int ma sk_alpha, int src_r, int src_g, int src_b,
2544 int src_left, int pixel_count, int blend_type, F X_LPCBYTE clip_scan)
2545 {
2546 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 2 55) {
2547 FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
2548 for (int col = 0; col < pixel_count; col ++) {
2549 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8 ))) {
2550 FXARGB_SETDIB(dest_scan, argb);
2551 }
2552 dest_scan += 4;
2553 }
2554 return;
2555 }
2556 for (int col = 0; col < pixel_count; col ++) {
2557 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2558 dest_scan += 4;
2559 continue;
2560 }
2561 int src_alpha;
2562 if (clip_scan) {
2563 src_alpha = mask_alpha * clip_scan[col] / 255;
2564 } else {
2565 src_alpha = mask_alpha;
2566 }
2567 FX_BYTE back_alpha = dest_scan[3];
2568 if (back_alpha == 0) {
2569 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b) );
2570 dest_scan += 4;
2571 continue;
2572 }
2573 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2574 dest_scan[3] = dest_alpha;
2575 int alpha_ratio = src_alpha * 255 / dest_alpha;
2576 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2577 int blended_colors[3];
2578 FX_BYTE src_scan[3];
2579 src_scan[0] = src_b;
2580 src_scan[1] = src_g;
2581 src_scan[2] = src_r;
2582 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2583 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ ratio);
2584 dest_scan ++;
2585 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ ratio);
2586 dest_scan ++;
2587 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ ratio);
2588 } else if (blend_type) {
2589 int blended = _BLEND(blend_type, *dest_scan, src_b);
2590 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2591 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2592 dest_scan ++;
2593 blended = _BLEND(blend_type, *dest_scan, src_g);
2594 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2595 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2596 dest_scan ++;
2597 blended = _BLEND(blend_type, *dest_scan, src_r);
2598 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2599 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2600 } else {
2601 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2602 dest_scan ++;
2603 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2604 dest_scan ++;
2605 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2606 }
2607 dest_scan += 2;
2608 }
2609 }
2610 void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int ma sk_alpha, int src_r, int src_g, int src_b,
2611 int src_left, int pixel_count, int blend_type, F X_LPCBYTE clip_scan,
2612 FX_LPBYTE dest_alpha_scan)
2613 {
2614 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 2 55) {
2615 for (int col = 0; col < pixel_count; col ++) {
2616 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8 ))) {
2617 dest_scan[0] = src_b;
2618 dest_scan[1] = src_g;
2619 dest_scan[2] = src_r;
2620 *dest_alpha_scan = mask_alpha;
2621 }
2622 dest_scan += 3;
2623 dest_alpha_scan ++;
2624 }
2625 return;
2626 }
2627 for (int col = 0; col < pixel_count; col ++) {
2628 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2629 dest_scan += 3;
2630 dest_alpha_scan ++;
2631 continue;
2632 }
2633 int src_alpha;
2634 if (clip_scan) {
2635 src_alpha = mask_alpha * clip_scan[col] / 255;
2636 } else {
2637 src_alpha = mask_alpha;
2638 }
2639 FX_BYTE back_alpha = dest_scan[3];
2640 if (back_alpha == 0) {
2641 *dest_scan ++ = src_b;
2642 *dest_scan ++ = src_g;
2643 *dest_scan ++ = src_r;
2644 *dest_alpha_scan ++ = mask_alpha;
2645 continue;
2646 }
2647 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2648 *dest_alpha_scan ++ = dest_alpha;
2649 int alpha_ratio = src_alpha * 255 / dest_alpha;
2650 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2651 int blended_colors[3];
2652 FX_BYTE src_scan[3];
2653 src_scan[0] = src_b;
2654 src_scan[1] = src_g;
2655 src_scan[2] = src_r;
2656 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2657 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ ratio);
2658 dest_scan ++;
2659 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ ratio);
2660 dest_scan ++;
2661 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ ratio);
2662 dest_scan ++;
2663 } else if (blend_type) {
2664 int blended = _BLEND(blend_type, *dest_scan, src_b);
2665 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
2666 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2667 dest_scan ++;
2668 blended = _BLEND(blend_type, *dest_scan, src_g);
2669 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
2670 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2671 dest_scan ++;
2672 blended = _BLEND(blend_type, *dest_scan, src_r);
2673 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
2674 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
2675 dest_scan ++;
2676 } else {
2677 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
2678 dest_scan ++;
2679 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
2680 dest_scan ++;
2681 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
2682 dest_scan ++;
2683 }
2684 }
2685 }
2686 void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mas k_alpha, int src_r, int src_g, int src_b,
2687 int src_left, int pixel_count, int blend_type, in t Bpp, FX_LPCBYTE clip_scan)
2688 {
2689 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 2 55) {
2690 for (int col = 0; col < pixel_count; col ++) {
2691 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8 ))) {
2692 dest_scan[2] = src_r;
2693 dest_scan[1] = src_g;
2694 dest_scan[0] = src_b;
2695 }
2696 dest_scan += Bpp;
2697 }
2698 return;
2699 }
2700 for (int col = 0; col < pixel_count; col ++) {
2701 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2702 dest_scan += Bpp;
2703 continue;
2704 }
2705 int src_alpha;
2706 if (clip_scan) {
2707 src_alpha = mask_alpha * clip_scan[col] / 255;
2708 } else {
2709 src_alpha = mask_alpha;
2710 }
2711 if (src_alpha == 0) {
2712 dest_scan += Bpp;
2713 continue;
2714 }
2715 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
2716 int blended_colors[3];
2717 FX_BYTE src_scan[3];
2718 src_scan[0] = src_b;
2719 src_scan[1] = src_g;
2720 src_scan[2] = src_r;
2721 _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
2722 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_al pha);
2723 dest_scan ++;
2724 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_al pha);
2725 dest_scan ++;
2726 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_al pha);
2727 } else if (blend_type) {
2728 int blended = _BLEND(blend_type, *dest_scan, src_b);
2729 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2730 dest_scan++;
2731 blended = _BLEND(blend_type, *dest_scan, src_g);
2732 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2733 dest_scan++;
2734 blended = _BLEND(blend_type, *dest_scan, src_r);
2735 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
2736 } else {
2737 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
2738 dest_scan ++;
2739 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
2740 dest_scan ++;
2741 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
2742 }
2743 dest_scan += Bpp - 2;
2744 }
2745 }
2746 void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int ma sk_alpha, int src_left,
2747 int pixel_count, FX_LPCBYTE clip_scan)
2748 {
2749 for (int col = 0; col < pixel_count; col ++) {
2750 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2751 dest_scan ++;
2752 continue;
2753 }
2754 int src_alpha;
2755 if (clip_scan) {
2756 src_alpha = mask_alpha * clip_scan[col] / 255;
2757 } else {
2758 src_alpha = mask_alpha;
2759 }
2760 FX_BYTE back_alpha = *dest_scan;
2761 if (!back_alpha) {
2762 *dest_scan = src_alpha;
2763 } else if (src_alpha) {
2764 *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
2765 }
2766 dest_scan ++;
2767 }
2768 }
2769 void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int ma sk_alpha, int src_gray,
2770 int src_left, int pixel_count, FX_LPCBYTE clip_s can)
2771 {
2772 for (int col = 0; col < pixel_count; col ++) {
2773 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2774 dest_scan ++;
2775 continue;
2776 }
2777 int src_alpha;
2778 if (clip_scan) {
2779 src_alpha = mask_alpha * clip_scan[col] / 255;
2780 } else {
2781 src_alpha = mask_alpha;
2782 }
2783 if (src_alpha) {
2784 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
2785 }
2786 dest_scan ++;
2787 }
2788 }
2789 void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int m ask_alpha, int src_gray,
2790 int src_left, int pixel_count, FX_LPCBYTE clip_ scan,
2791 FX_LPBYTE dest_alpha_scan)
2792 {
2793 for (int col = 0; col < pixel_count; col ++) {
2794 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
2795 dest_scan ++;
2796 dest_alpha_scan ++;
2797 continue;
2798 }
2799 int src_alpha;
2800 if (clip_scan) {
2801 src_alpha = mask_alpha * clip_scan[col] / 255;
2802 } else {
2803 src_alpha = mask_alpha;
2804 }
2805 FX_BYTE back_alpha = *dest_alpha_scan;
2806 if (back_alpha == 0) {
2807 *dest_scan ++ = src_gray;
2808 *dest_alpha_scan ++ = src_alpha;
2809 continue;
2810 }
2811 if (src_alpha == 0) {
2812 dest_scan ++;
2813 dest_alpha_scan ++;
2814 continue;
2815 }
2816 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2817 *dest_alpha_scan++ = dest_alpha;
2818 int alpha_ratio = src_alpha * 255 / dest_alpha;
2819 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
2820 dest_scan ++;
2821 }
2822 }
2823 void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_sc an, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
2824 {
2825 int blended_colors[3];
2826 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
2827 for (int col = 0; col < pixel_count; col ++) {
2828 FX_BYTE back_alpha = dest_scan[3];
2829 if (back_alpha == 0) {
2830 if (clip_scan) {
2831 int src_alpha = clip_scan[col] * src_scan[3] / 255;
2832 dest_scan[3] = src_alpha;
2833 dest_scan[0] = src_scan[2];
2834 dest_scan[1] = src_scan[1];
2835 dest_scan[2] = src_scan[0];
2836 } else {
2837 FXARGB_RGBORDERCOPY(dest_scan, src_scan);
2838 }
2839 dest_scan += 4;
2840 src_scan += 4;
2841 continue;
2842 }
2843 FX_BYTE src_alpha;
2844 if (clip_scan == NULL) {
2845 src_alpha = src_scan[3];
2846 } else {
2847 src_alpha = clip_scan[col] * src_scan[3] / 255;
2848 }
2849 if (src_alpha == 0) {
2850 dest_scan += 4;
2851 src_scan += 4;
2852 continue;
2853 }
2854 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
2855 dest_scan[3] = dest_alpha;
2856 int alpha_ratio = src_alpha * 255 / dest_alpha;
2857 if (bNonseparableBlend) {
2858 FX_BYTE dest_scan_o[3];
2859 dest_scan_o[0] = dest_scan[2];
2860 dest_scan_o[1] = dest_scan[1];
2861 dest_scan_o[2] = dest_scan[0];
2862 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
2863 }
2864 for (int color = 0; color < 3; color ++) {
2865 int index = 2 - color;
2866 if (blend_type) {
2867 int blended = bNonseparableBlend ? blended_colors[color] :
2868 _BLEND(blend_type, dest_scan[index], *src_scan);
2869 blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
2870 dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
2871 } else {
2872 dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan , alpha_ratio);
2873 }
2874 src_scan ++;
2875 }
2876 dest_scan += 4;
2877 src_scan++;
2878 }
2879 }
2880 void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LP CBYTE src_scan, int width, int blend_type, int src_Bpp)
2881 {
2882 int blended_colors[3];
2883 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
2884 int src_gap = src_Bpp - 3;
2885 for (int col = 0; col < width; col ++) {
2886 FX_BYTE back_alpha = dest_scan[3];
2887 if (back_alpha == 0) {
2888 if (src_Bpp == 4) {
2889 FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_ scan));
2890 } else {
2891 FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
2892 }
2893 dest_scan += 4;
2894 src_scan += src_Bpp;
2895 continue;
2896 }
2897 dest_scan[3] = 0xff;
2898 if (bNonseparableBlend) {
2899 FX_BYTE dest_scan_o[3];
2900 dest_scan_o[0] = dest_scan[2];
2901 dest_scan_o[1] = dest_scan[1];
2902 dest_scan_o[2] = dest_scan[0];
2903 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
2904 }
2905 for (int color = 0; color < 3; color ++) {
2906 int index = 2 - color;
2907 int src_color = FX_GAMMA(*src_scan);
2908 int blended = bNonseparableBlend ? blended_colors[color] :
2909 _BLEND(blend_type, dest_scan[index], src_color);
2910 dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha) ;
2911 src_scan ++;
2912 }
2913 dest_scan += 4;
2914 src_scan += src_gap;
2915 }
2916 }
2917 inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LP CBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
2918 {
2919 int blended_colors[3];
2920 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
2921 for (int col = 0; col < width; col ++) {
2922 FX_BYTE src_alpha;
2923 if (clip_scan) {
2924 src_alpha = src_scan[3] * (*clip_scan++) / 255;
2925 } else {
2926 src_alpha = src_scan[3];
2927 }
2928 if (src_alpha == 0) {
2929 dest_scan += dest_Bpp;
2930 src_scan += 4;
2931 continue;
2932 }
2933 if (bNonseparableBlend) {
2934 FX_BYTE dest_scan_o[3];
2935 dest_scan_o[0] = dest_scan[2];
2936 dest_scan_o[1] = dest_scan[1];
2937 dest_scan_o[2] = dest_scan[0];
2938 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
2939 }
2940 for (int color = 0; color < 3; color ++) {
2941 int index = 2 - color;
2942 int back_color = FX_GAMMA(dest_scan[index]);
2943 int blended = bNonseparableBlend ? blended_colors[color] :
2944 _BLEND(blend_type, back_color, *src_scan);
2945 dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, bl ended, src_alpha));
2946 src_scan ++;
2947 }
2948 dest_scan += dest_Bpp;
2949 src_scan ++;
2950 }
2951 }
2952 inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_sc an, FX_LPCBYTE src_scan, int width, int src_Bpp)
2953 {
2954 for (int col = 0; col < width; col ++) {
2955 if (src_Bpp == 4) {
2956 FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan ));
2957 } else {
2958 FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_ scan[1], src_scan[0]));
2959 }
2960 dest_scan += 4;
2961 src_scan += src_Bpp;
2962 }
2963 }
2964 inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
2965 {
2966 int blended_colors[3];
2967 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
2968 int src_gap = src_Bpp - 3;
2969 for (int col = 0; col < width; col ++) {
2970 if (bNonseparableBlend) {
2971 FX_BYTE dest_scan_o[3];
2972 dest_scan_o[0] = dest_scan[2];
2973 dest_scan_o[1] = dest_scan[1];
2974 dest_scan_o[2] = dest_scan[0];
2975 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
2976 }
2977 for (int color = 0; color < 3; color ++) {
2978 int index = 2 - color;
2979 int back_color = FX_GAMMA(dest_scan[index]);
2980 int src_color = FX_GAMMA(*src_scan);
2981 int blended = bNonseparableBlend ? blended_colors[color] :
2982 _BLEND(blend_type, back_color, src_color);
2983 dest_scan[index] = FX_GAMMA_INVERSE(blended);
2984 src_scan ++;
2985 }
2986 dest_scan += dest_Bpp;
2987 src_scan += src_gap;
2988 }
2989 }
2990 inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_ LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
2991 {
2992 for (int col = 0; col < width; col ++) {
2993 FX_BYTE src_alpha;
2994 if (clip_scan) {
2995 src_alpha = src_scan[3] * (*clip_scan++) / 255;
2996 } else {
2997 src_alpha = src_scan[3];
2998 }
2999 if (src_alpha == 255) {
3000 dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
3001 dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
3002 dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
3003 dest_scan += dest_Bpp;
3004 src_scan ++;
3005 continue;
3006 }
3007 if (src_alpha == 0) {
3008 dest_scan += dest_Bpp;
3009 src_scan += 4;
3010 continue;
3011 }
3012 for (int color = 0; color < 3; color ++) {
3013 int index = 2 - color;
3014 dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_ scan[index]), *src_scan, src_alpha));
3015 src_scan ++;
3016 }
3017 dest_scan += dest_Bpp;
3018 src_scan ++;
3019 }
3020 }
3021 inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_sca n, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
3022 {
3023 for (int col = 0; col < width; col ++) {
3024 dest_scan[2] = src_scan[0];
3025 dest_scan[1] = src_scan[1];
3026 dest_scan[0] = src_scan[2];
3027 dest_scan += dest_Bpp;
3028 src_scan += src_Bpp;
3029 }
3030 }
3031 inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_sca n)
3032 {
3033 int blended_colors[3];
3034 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3035 int src_gap = src_Bpp - 3;
3036 for (int col = 0; col < width; col ++) {
3037 int src_alpha = *clip_scan ++;
3038 FX_BYTE back_alpha = dest_scan[3];
3039 if (back_alpha == 0) {
3040 dest_scan[2] = FX_GAMMA(*src_scan++);
3041 dest_scan[1] = FX_GAMMA(*src_scan++);
3042 dest_scan[0] = FX_GAMMA(*src_scan++);
3043 src_scan += src_gap;
3044 dest_scan += 4;
3045 continue;
3046 }
3047 if (src_alpha == 0) {
3048 dest_scan += 4;
3049 src_scan += src_Bpp;
3050 continue;
3051 }
3052 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3053 dest_scan[3] = dest_alpha;
3054 int alpha_ratio = src_alpha * 255 / dest_alpha;
3055 if (bNonseparableBlend) {
3056 FX_BYTE dest_scan_o[3];
3057 dest_scan_o[0] = dest_scan[2];
3058 dest_scan_o[1] = dest_scan[1];
3059 dest_scan_o[2] = dest_scan[0];
3060 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3061 }
3062 for (int color = 0; color < 3; color ++) {
3063 int index = 2 - color;
3064 int src_color = FX_GAMMA(*src_scan);
3065 int blended = bNonseparableBlend ? blended_colors[color] :
3066 _BLEND(blend_type, dest_scan[index], src_color);
3067 blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
3068 dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alph a_ratio);
3069 src_scan ++;
3070 }
3071 dest_scan += 4;
3072 src_scan += src_gap;
3073 }
3074 }
3075 inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, F X_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPC BYTE clip_scan)
3076 {
3077 int blended_colors[3];
3078 FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
3079 int src_gap = src_Bpp - 3;
3080 for (int col = 0; col < width; col ++) {
3081 FX_BYTE src_alpha = *clip_scan ++;
3082 if (src_alpha == 0) {
3083 dest_scan += dest_Bpp;
3084 src_scan += src_Bpp;
3085 continue;
3086 }
3087 if (bNonseparableBlend) {
3088 FX_BYTE dest_scan_o[3];
3089 dest_scan_o[0] = dest_scan[2];
3090 dest_scan_o[1] = dest_scan[1];
3091 dest_scan_o[2] = dest_scan[0];
3092 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3093 }
3094 for (int color = 0; color < 3; color ++) {
3095 int index = 2 - color;
3096 int src_color = FX_GAMMA(*src_scan);
3097 int back_color = FX_GAMMA(dest_scan[index]);
3098 int blended = bNonseparableBlend ? blended_colors[color] :
3099 _BLEND(blend_type, back_color, src_color);
3100 dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, bl ended, src_alpha));
3101 src_scan ++;
3102 }
3103 dest_scan += dest_Bpp;
3104 src_scan += src_gap;
3105 }
3106 }
3107 inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan , FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
3108 {
3109 int src_gap = src_Bpp - 3;
3110 for (int col = 0; col < width; col ++) {
3111 int src_alpha = clip_scan[col];
3112 if (src_alpha == 255) {
3113 dest_scan[2] = FX_GAMMA(*src_scan++);
3114 dest_scan[1] = FX_GAMMA(*src_scan++);
3115 dest_scan[0] = FX_GAMMA(*src_scan++);
3116 dest_scan[3] = 255;
3117 dest_scan += 4;
3118 src_scan += src_gap;
3119 continue;
3120 }
3121 if (src_alpha == 0) {
3122 dest_scan += 4;
3123 src_scan += src_Bpp;
3124 continue;
3125 }
3126 int back_alpha = dest_scan[3];
3127 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3128 dest_scan[3] = dest_alpha;
3129 int alpha_ratio = src_alpha * 255 / dest_alpha;
3130 for (int color = 0; color < 3; color ++) {
3131 int index = 2 - color;
3132 dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src _scan), alpha_ratio);
3133 src_scan ++;
3134 }
3135 dest_scan += 4;
3136 src_scan += src_gap;
3137 }
3138 }
3139 inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan )
3140 {
3141 for (int col = 0; col < width; col ++) {
3142 int src_alpha = clip_scan[col];
3143 if (src_alpha == 255) {
3144 dest_scan[2] = src_scan[0];
3145 dest_scan[1] = src_scan[1];
3146 dest_scan[0] = src_scan[2];
3147 } else if (src_alpha) {
3148 dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [2]), FX_GAMMA(*src_scan), src_alpha));
3149 src_scan ++;
3150 dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [1]), FX_GAMMA(*src_scan), src_alpha));
3151 src_scan ++;
3152 dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [0]), FX_GAMMA(*src_scan), src_alpha));
3153 dest_scan += dest_Bpp;
3154 src_scan += src_Bpp - 2;
3155 continue;
3156 }
3157 dest_scan += dest_Bpp;
3158 src_scan += src_Bpp;
3159 }
3160 }
3161 inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
3162 int DestBpp, FX_LPCBYTE clip_scan)
3163 {
3164 for (int col = 0; col < pixel_count; col ++) {
3165 FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
3166 int src_r = FXARGB_R(argb);
3167 int src_g = FXARGB_G(argb);
3168 int src_b = FXARGB_B(argb);
3169 if (clip_scan && clip_scan[col] < 255) {
3170 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col] );
3171 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col] );
3172 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col] );
3173 } else {
3174 dest_scan[2] = src_b;
3175 dest_scan[1] = src_g;
3176 dest_scan[0] = src_r;
3177 }
3178 dest_scan += DestBpp;
3179 src_scan ++;
3180 }
3181 }
3182 inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
3183 FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
3184 {
3185 int reset_r, reset_g, reset_b;
3186 int set_r, set_g, set_b;
3187 if (pPalette) {
3188 reset_r = FXARGB_R(pPalette[0]);
3189 reset_g = FXARGB_G(pPalette[0]);
3190 reset_b = FXARGB_B(pPalette[0]);
3191 set_r = FXARGB_R(pPalette[1]);
3192 set_g = FXARGB_G(pPalette[1]);
3193 set_b = FXARGB_B(pPalette[1]);
3194 } else {
3195 reset_r = reset_g = reset_b = 0;
3196 set_r = set_g = set_b = 255;
3197 }
3198 for (int col = 0; col < pixel_count; col ++) {
3199 int src_r, src_g, src_b;
3200 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
3201 src_r = set_r;
3202 src_g = set_g;
3203 src_b = set_b;
3204 } else {
3205 src_r = reset_r;
3206 src_g = reset_g;
3207 src_b = reset_b;
3208 }
3209 if (clip_scan && clip_scan[col] < 255) {
3210 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col] );
3211 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col] );
3212 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col] );
3213 } else {
3214 dest_scan[2] = src_b;
3215 dest_scan[1] = src_g;
3216 dest_scan[0] = src_r;
3217 }
3218 dest_scan += DestBpp;
3219 }
3220 }
3221 inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
3222 FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
3223 {
3224 for (int col = 0; col < width; col ++) {
3225 int src_r, src_g, src_b;
3226 if (pPalette) {
3227 FX_ARGB argb = pPalette[*src_scan];
3228 src_r = FXARGB_R(argb);
3229 src_g = FXARGB_G(argb);
3230 src_b = FXARGB_B(argb);
3231 } else {
3232 src_r = src_g = src_b = *src_scan;
3233 }
3234 if (clip_scan == NULL || clip_scan[col] == 255) {
3235 dest_scan[2] = FX_GAMMA(src_b);
3236 dest_scan[1] = FX_GAMMA(src_g);
3237 dest_scan[0] = FX_GAMMA(src_r);
3238 dest_scan[3] = 255;
3239 src_scan ++;
3240 dest_scan += 4;
3241 continue;
3242 }
3243 int src_alpha = clip_scan[col];
3244 if (src_alpha == 0) {
3245 dest_scan += 4;
3246 src_scan ++;
3247 continue;
3248 }
3249 int back_alpha = dest_scan[3];
3250 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3251 dest_scan[3] = dest_alpha;
3252 int alpha_ratio = src_alpha * 255 / dest_alpha;
3253 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ra tio);
3254 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ra tio);
3255 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ra tio);
3256 dest_scan += 4;
3257 src_scan ++;
3258 }
3259 }
3260 inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
3261 FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
3262 {
3263 int reset_r, reset_g, reset_b;
3264 int set_r, set_g, set_b;
3265 if (pPalette) {
3266 reset_r = FXARGB_R(pPalette[0]);
3267 reset_g = FXARGB_G(pPalette[0]);
3268 reset_b = FXARGB_B(pPalette[0]);
3269 set_r = FXARGB_R(pPalette[1]);
3270 set_g = FXARGB_G(pPalette[1]);
3271 set_b = FXARGB_B(pPalette[1]);
3272 } else {
3273 reset_r = reset_g = reset_b = 0;
3274 set_r = set_g = set_b = 255;
3275 }
3276 for (int col = 0; col < width; col ++) {
3277 int src_r, src_g, src_b;
3278 if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
3279 src_r = set_r;
3280 src_g = set_g;
3281 src_b = set_b;
3282 } else {
3283 src_r = reset_r;
3284 src_g = reset_g;
3285 src_b = reset_b;
3286 }
3287 if (clip_scan == NULL || clip_scan[col] == 255) {
3288 dest_scan[2] = FX_GAMMA(src_b);
3289 dest_scan[1] = FX_GAMMA(src_g);
3290 dest_scan[0] = FX_GAMMA(src_r);
3291 dest_scan[3] = 255;
3292 dest_scan += 4;
3293 continue;
3294 }
3295 int src_alpha = clip_scan[col];
3296 if (src_alpha == 0) {
3297 dest_scan += 4;
3298 continue;
3299 }
3300 int back_alpha = dest_scan[3];
3301 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3302 dest_scan[3] = dest_alpha;
3303 int alpha_ratio = src_alpha * 255 / dest_alpha;
3304 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ra tio);
3305 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ra tio);
3306 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ra tio);
3307 dest_scan += 4;
3308 }
3309 }
3310 void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE sr c_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
3311 int blend_type, FX_LPCBYTE clip_scan)
3312 {
3313 for (int col = 0; col < pixel_count; col ++) {
3314 int src_alpha;
3315 if (clip_scan) {
3316 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
3317 } else {
3318 src_alpha = mask_alpha * src_scan[col] / 255;
3319 }
3320 FX_BYTE back_alpha = dest_scan[3];
3321 if (back_alpha == 0) {
3322 FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g , src_b));
3323 dest_scan += 4;
3324 continue;
3325 }
3326 if (src_alpha == 0) {
3327 dest_scan += 4;
3328 continue;
3329 }
3330 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3331 dest_scan[3] = dest_alpha;
3332 int alpha_ratio = src_alpha * 255 / dest_alpha;
3333 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3334 int blended_colors[3];
3335 FX_BYTE src_scan[3];
3336 FX_BYTE dest_scan_o[3];
3337 src_scan[0] = src_b;
3338 src_scan[1] = src_g;
3339 src_scan[2] = src_r;
3340 dest_scan_o[0] = dest_scan[2];
3341 dest_scan_o[1] = dest_scan[1];
3342 dest_scan_o[2] = dest_scan[0];
3343 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3344 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], al pha_ratio);
3345 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], al pha_ratio);
3346 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], al pha_ratio);
3347 } else if (blend_type) {
3348 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3349 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
3350 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio) ;
3351 blended = _BLEND(blend_type, dest_scan[1], src_g);
3352 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
3353 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio) ;
3354 blended = _BLEND(blend_type, dest_scan[0], src_r);
3355 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
3356 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio) ;
3357 } else {
3358 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
3359 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
3360 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
3361 }
3362 dest_scan += 4;
3363 }
3364 }
3365 void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src _scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
3366 int blend_type, int Bpp, FX_LPCBYTE clip_scan)
3367 {
3368 for (int col = 0; col < pixel_count; col ++) {
3369 int src_alpha;
3370 if (clip_scan) {
3371 src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
3372 } else {
3373 src_alpha = mask_alpha * src_scan[col] / 255;
3374 }
3375 if (src_alpha == 0) {
3376 dest_scan += Bpp;
3377 continue;
3378 }
3379 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3380 int blended_colors[3];
3381 FX_BYTE src_scan[3];
3382 FX_BYTE dest_scan_o[3];
3383 src_scan[0] = src_b;
3384 src_scan[1] = src_g;
3385 src_scan[2] = src_r;
3386 dest_scan_o[0] = dest_scan[2];
3387 dest_scan_o[1] = dest_scan[1];
3388 dest_scan_o[2] = dest_scan[0];
3389 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3390 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], sr c_alpha);
3391 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], sr c_alpha);
3392 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], sr c_alpha);
3393 } else if (blend_type) {
3394 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3395 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
3396 blended = _BLEND(blend_type, dest_scan[1], src_g);
3397 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
3398 blended = _BLEND(blend_type, dest_scan[0], src_r);
3399 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
3400 } else {
3401 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
3402 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
3403 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
3404 }
3405 dest_scan += Bpp;
3406 }
3407 }
3408 void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src _scan, int mask_alpha, int src_r, int src_g, int src_b,
3409 int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
3410 {
3411 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 2 55) {
3412 FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
3413 for (int col = 0; col < pixel_count; col ++) {
3414 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8 ))) {
3415 FXARGB_SETRGBORDERDIB(dest_scan, argb);
3416 }
3417 dest_scan += 4;
3418 }
3419 return;
3420 }
3421 for (int col = 0; col < pixel_count; col ++) {
3422 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
3423 dest_scan += 4;
3424 continue;
3425 }
3426 int src_alpha;
3427 if (clip_scan) {
3428 src_alpha = mask_alpha * clip_scan[col] / 255;
3429 } else {
3430 src_alpha = mask_alpha;
3431 }
3432 FX_BYTE back_alpha = dest_scan[3];
3433 if (back_alpha == 0) {
3434 FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g , src_b));
3435 dest_scan += 4;
3436 continue;
3437 }
3438 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 2 55;
3439 dest_scan[3] = dest_alpha;
3440 int alpha_ratio = src_alpha * 255 / dest_alpha;
3441 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3442 int blended_colors[3];
3443 FX_BYTE src_scan[3];
3444 FX_BYTE dest_scan_o[3];
3445 src_scan[0] = src_b;
3446 src_scan[1] = src_g;
3447 src_scan[2] = src_r;
3448 dest_scan_o[0] = dest_scan[2];
3449 dest_scan_o[1] = dest_scan[1];
3450 dest_scan_o[2] = dest_scan[0];
3451 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3452 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], al pha_ratio);
3453 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], al pha_ratio);
3454 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], al pha_ratio);
3455 } else if (blend_type) {
3456 int blended = _BLEND(blend_type, dest_scan[2], src_b);
3457 blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
3458 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio) ;
3459 blended = _BLEND(blend_type, dest_scan[1], src_g);
3460 blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
3461 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio) ;
3462 blended = _BLEND(blend_type, dest_scan[0], src_r);
3463 blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
3464 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio) ;
3465 } else {
3466 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
3467 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
3468 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
3469 }
3470 dest_scan += 4;
3471 }
3472 }
3473 void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_ scan, int mask_alpha, int src_r, int src_g, int src_b,
3474 int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_ scan)
3475 {
3476 if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 2 55) {
3477 for (int col = 0; col < pixel_count; col ++) {
3478 if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8 ))) {
3479 dest_scan[2] = src_b;
3480 dest_scan[1] = src_g;
3481 dest_scan[0] = src_r;
3482 }
3483 dest_scan += Bpp;
3484 }
3485 return;
3486 }
3487 for (int col = 0; col < pixel_count; col ++) {
3488 if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)) )) {
3489 dest_scan += Bpp;
3490 continue;
3491 }
3492 int src_alpha;
3493 if (clip_scan) {
3494 src_alpha = mask_alpha * clip_scan[col] / 255;
3495 } else {
3496 src_alpha = mask_alpha;
3497 }
3498 if (src_alpha == 0) {
3499 dest_scan += Bpp;
3500 continue;
3501 }
3502 if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
3503 int blended_colors[3];
3504 FX_BYTE src_scan[3];
3505 FX_BYTE dest_scan_o[3];
3506 src_scan[0] = src_b;
3507 src_scan[1] = src_g;
3508 src_scan[2] = src_r;
3509 dest_scan_o[0] = dest_scan[2];
3510 dest_scan_o[1] = dest_scan[1];
3511 dest_scan_o[2] = dest_scan[0];
3512 _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
3513 dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], sr c_alpha);
3514 dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], sr c_alpha);
3515 dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], sr c_alpha);
3516 } else if (blend_type) {
3517 int back_color = FX_GAMMA(dest_scan[2]);
3518 int blended = _BLEND(blend_type, back_color, src_b);
3519 dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blende d, src_alpha));
3520 back_color = FX_GAMMA(dest_scan[1]);
3521 blended = _BLEND(blend_type, back_color, src_g);
3522 dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blende d, src_alpha));
3523 back_color = FX_GAMMA(dest_scan[0]);
3524 blended = _BLEND(blend_type, back_color, src_r);
3525 dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blende d, src_alpha));
3526 } else {
3527 dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [2]), src_b, src_alpha));
3528 dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [1]), src_g, src_alpha));
3529 dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan [0]), src_r, src_alpha));
3530 }
3531 dest_scan += Bpp;
3532 }
3533 }
3534 inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
3535 int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
3536 void* icc_module, void* pIccTransform)
3537 {
3538 ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
3539 if (alpha_flag >> 8) {
3540 mask_alpha = alpha_flag & 0xff;
3541 mask_red = FXSYS_GetCValue(mask_color);
3542 mask_green = FXSYS_GetMValue(mask_color);
3543 mask_blue = FXSYS_GetYValue(mask_color);
3544 mask_black = FXSYS_GetKValue(mask_color);
3545 } else {
3546 mask_alpha = FXARGB_A(mask_color);
3547 mask_red = FXARGB_R(mask_color);
3548 mask_green = FXARGB_G(mask_color);
3549 mask_blue = FXARGB_B(mask_color);
3550 }
3551 if (dest_format == FXDIB_8bppMask) {
3552 return TRUE;
3553 }
3554 if ((dest_format & 0xff) == 8) {
3555 if (pIccTransform) {
3556 mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_T ODIB(mask_color);
3557 FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
3558 pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
3559 mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
3560 } else {
3561 if (alpha_flag >> 8) {
3562 FX_BYTE r, g, b;
3563 AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
3564 r, g, b);
3565 mask_red = FXRGB2GRAY(r, g, b);
3566 } else {
3567 mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
3568 }
3569 if (dest_format & 0x0400) {
3570 mask_red = FX_CCOLOR(mask_red);
3571 }
3572 }
3573 } else {
3574 FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
3575 mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB (mask_color);
3576 if (pIccTransform) {
3577 pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_colo r_p, 1);
3578 mask_red = mask_color_p[2];
3579 mask_green = mask_color_p[1];
3580 mask_blue = mask_color_p[0];
3581 } else if (alpha_flag >> 8) {
3582 AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2] , mask_color_p[3],
3583 mask_color_p[2], mask_color_p[1], mask_color_p[0] );
3584 mask_red = mask_color_p[2];
3585 mask_green = mask_color_p[1];
3586 mask_blue = mask_color_p[0];
3587 }
3588 }
3589 return TRUE;
3590 }
3591 inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB _Format dest_format,
3592 FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
3593 void* icc_module, void* pIccTransform)
3594 {
3595 ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
3596 FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
3597 FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
3598 pDestPalette = NULL;
3599 if (pIccTransform) {
3600 if (pSrcPalette) {
3601 if ((dest_format & 0xff) == 8) {
3602 int pal_count = 1 << (src_format & 0xff);
3603 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
3604 if (!gray_pal) {
3605 return;
3606 }
3607 pDestPalette = (FX_DWORD*)gray_pal;
3608 for (int i = 0; i < pal_count; i ++) {
3609 FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
3610 pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_L PCBYTE)&color, 1);
3611 gray_pal ++;
3612 }
3613 } else {
3614 int palsize = 1 << (src_format & 0xff);
3615 pDestPalette = FX_Alloc(FX_DWORD, palsize);
3616 if (!pDestPalette) {
3617 return;
3618 }
3619 for (int i = 0; i < palsize; i ++) {
3620 FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
3621 pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&col or, (FX_LPCBYTE)&color, 1);
3622 pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_T ODIB(color);
3623 }
3624 }
3625 } else {
3626 int pal_count = 1 << (src_format & 0xff);
3627 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
3628 if (!gray_pal) {
3629 return;
3630 }
3631 if (pal_count == 2) {
3632 gray_pal[0] = 0;
3633 gray_pal[1] = 255;
3634 } else {
3635 for (int i = 0; i < pal_count; i++) {
3636 gray_pal[i] = i;
3637 }
3638 }
3639 if ((dest_format & 0xff) == 8) {
3640 pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
3641 pDestPalette = (FX_DWORD*)gray_pal;
3642 } else {
3643 pDestPalette = FX_Alloc(FX_DWORD, pal_count);
3644 if (!pDestPalette) {
3645 FX_Free(gray_pal);
3646 return;
3647 }
3648 for (int i = 0; i < pal_count; i ++) {
3649 pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDe stPalette[i], &gray_pal[i], 1);
3650 pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
3651 }
3652 FX_Free(gray_pal);
3653 }
3654 }
3655 } else {
3656 if (pSrcPalette) {
3657 if ((dest_format & 0xff) == 8) {
3658 int pal_count = 1 << (src_format & 0xff);
3659 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
3660 if (!gray_pal) {
3661 return;
3662 }
3663 pDestPalette = (FX_DWORD*)gray_pal;
3664 if (isSrcCmyk) {
3665 for (int i = 0; i < pal_count; i ++) {
3666 FX_CMYK cmyk = pSrcPalette[i];
3667 FX_BYTE r, g, b;
3668 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValu e(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
3669 r, g, b);
3670 *gray_pal ++ = FXRGB2GRAY(r, g, b);
3671 }
3672 } else
3673 for (int i = 0; i < pal_count; i ++) {
3674 FX_ARGB argb = pSrcPalette[i];
3675 *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb) , FXARGB_B(argb));
3676 }
3677 } else {
3678 int palsize = 1 << (src_format & 0xff);
3679 pDestPalette = FX_Alloc(FX_DWORD, palsize);
3680 if (!pDestPalette) {
3681 return;
3682 }
3683 if (isDstCmyk == isSrcCmyk) {
3684 FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(F X_DWORD));
3685 } else {
3686 for (int i = 0; i < palsize; i ++) {
3687 FX_CMYK cmyk = pSrcPalette[i];
3688 FX_BYTE r, g, b;
3689 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValu e(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
3690 r, g, b);
3691 pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
3692 }
3693 }
3694 }
3695 } else {
3696 if ((dest_format & 0xff) == 8) {
3697 int pal_count = 1 << (src_format & 0xff);
3698 FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
3699 if (!gray_pal) {
3700 return;
3701 }
3702 if (pal_count == 2) {
3703 gray_pal[0] = 0;
3704 gray_pal[1] = 255;
3705 } else {
3706 for (int i = 0; i < pal_count; i++) {
3707 gray_pal[i] = i;
3708 }
3709 }
3710 pDestPalette = (FX_DWORD*)gray_pal;
3711 } else {
3712 int palsize = 1 << (src_format & 0xff);
3713 pDestPalette = FX_Alloc(FX_DWORD, palsize);
3714 if (!pDestPalette) {
3715 return;
3716 }
3717 if (palsize == 2) {
3718 pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
3719 pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
3720 } else {
3721 for (int i = 0; i < palsize; i++) {
3722 pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x1010 1);
3723 }
3724 }
3725 if (isSrcCmyk != isDstCmyk) {
3726 for (int i = 0; i < palsize; i ++) {
3727 FX_CMYK cmyk = pDestPalette[i];
3728 FX_BYTE r, g, b;
3729 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValu e(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
3730 r, g, b);
3731 pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
3732 }
3733 }
3734 }
3735 }
3736 }
3737 }
3738 CFX_ScanlineCompositor::CFX_ScanlineCompositor()
3739 {
3740 m_pSrcPalette = NULL;
3741 m_pCacheScanline = NULL;
3742 m_CacheSize = 0;
3743 m_bRgbByteOrder = FALSE;
3744 m_BlendType = FXDIB_BLEND_NORMAL;
3745 }
3746 CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
3747 {
3748 if (m_pSrcPalette) {
3749 FX_Free(m_pSrcPalette);
3750 }
3751 if (m_pCacheScanline) {
3752 FX_Free(m_pCacheScanline);
3753 }
3754 }
3755 FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_ format, FX_INT32 width, FX_DWORD* pSrcPalette,
3756 FX_DWORD mask_color, int blend_type, FX_BOO L bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
3757 {
3758 m_SrcFormat = src_format;
3759 m_DestFormat = dest_format;
3760 m_BlendType = blend_type;
3761 m_bRgbByteOrder = bRgbByteOrder;
3762 ICodec_IccModule* pIccModule = NULL;
3763 if (CFX_GEModule::Get()->GetCodecModule()) {
3764 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
3765 }
3766 if (pIccModule == NULL) {
3767 pIccTransform = NULL;
3768 }
3769 m_pIccTransform = pIccTransform;
3770 if ((dest_format & 0xff) == 1) {
3771 return FALSE; 5467 return FALSE;
3772 } 5468 }
3773 if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) { 5469 }
3774 return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_ color, 5470 }
3775 m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack, 5471 if (m_BitmapAlpha < 255) {
3776 pIccModule, pIccTransform); 5472 m_pAddClipScan = FX_Alloc(
3777 } 5473 FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
3778 if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400 )) { 5474 if (!m_pAddClipScan) {
3779 return FALSE; 5475 return FALSE;
3780 } 5476 }
3781 if ((m_SrcFormat & 0xff) <= 8) { 5477 }
3782 if (dest_format == FXDIB_8bppMask) { 5478 return TRUE;
3783 return TRUE; 5479 }
3784 } 5480 void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan,
3785 _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPal ette, pSrcPalette, 5481 FX_LPCBYTE src_scan,
3786 pIccModule, pIccTransform); 5482 int dest_width,
3787 m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0) 5483 FX_LPCBYTE clip_scan,
3788 + (dest_format & 0x0200 ? 2 : 0) 5484 FX_LPCBYTE src_extra_alpha,
3789 + (dest_format & 0x0400 ? 4 : 0) 5485 FX_LPBYTE dst_extra_alpha) {
3790 + ((src_format & 0xff) == 1 ? 8 : 0); 5486 if (m_BitmapAlpha < 255) {
3791 return TRUE; 5487 if (clip_scan) {
3792 } 5488 for (int i = 0; i < dest_width; i++) {
3793 m_Transparency = (src_format & 0x0200 ? 0 : 1) 5489 m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
3794 + (dest_format & 0x0200 ? 0 : 2) 5490 }
3795 + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0) 5491 } else {
3796 + (bClip ? 8 : 0) 5492 FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
3797 + (src_format & 0x0400 ? 16 : 0) 5493 }
3798 + (dest_format & 0x0400 ? 32 : 0) 5494 clip_scan = m_pAddClipScan;
3799 + (pIccTransform ? 64 : 0); 5495 }
3800 return TRUE; 5496 if (m_SrcFormat == FXDIB_8bppMask) {
3801 } 5497 m_Compositor.CompositeByteMaskLine(
3802 void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCB YTE src_scan, int width, FX_LPCBYTE clip_scan, 5498 dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
3803 FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha) 5499 } else if ((m_SrcFormat & 0xff) == 8) {
3804 { 5500 m_Compositor.CompositePalBitmapLine(dest_scan,
3805 int src_Bpp = (m_SrcFormat & 0xff) >> 3; 5501 src_scan,
3806 int dest_Bpp = (m_DestFormat & 0xff) >> 3; 5502 0,
3807 if (m_bRgbByteOrder) { 5503 dest_width,
3808 switch (m_Transparency) { 5504 clip_scan,
3809 case 0: 5505 src_extra_alpha,
3810 case 4:
3811 case 8:
3812 case 12:
3813 _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
3814 break;
3815 case 1:
3816 _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_ scan, width, m_BlendType, src_Bpp);
3817 break;
3818 case 2:
3819 case 10:
3820 _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, w idth, m_BlendType, dest_Bpp, clip_scan);
3821 break;
3822 case 3:
3823 _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_s can, width, m_BlendType, dest_Bpp, src_Bpp);
3824 break;
3825 case 5:
3826 _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, sr c_scan, width, src_Bpp);
3827 break;
3828 case 6:
3829 case 14:
3830 _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
3831 break;
3832 case 7:
3833 _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src _scan, width, dest_Bpp, src_Bpp);
3834 break;
3835 case 9:
3836 _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_sc an, width, m_BlendType, src_Bpp, clip_scan);
3837 break;
3838 case 11:
3839 _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_sca n, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
3840 break;
3841 case 13:
3842 _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_ scan, width, src_Bpp, clip_scan);
3843 break;
3844 case 15:
3845 _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_s can, width, dest_Bpp, src_Bpp, clip_scan);
3846 break;
3847 }
3848 return;
3849 }
3850 if (m_DestFormat == FXDIB_8bppMask) {
3851 if (m_SrcFormat & 0x0200) {
3852 if (m_SrcFormat == FXDIB_Argb) {
3853 _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
3854 } else {
3855 _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_ scan);
3856 }
3857 } else {
3858 _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
3859 }
3860 } else if ((m_DestFormat & 0xff) == 8) {
3861 if (m_DestFormat & 0x0400) {
3862 for (int i = 0; i < width; i ++) {
3863 *dest_scan = ~*dest_scan;
3864 dest_scan++;
3865 }
3866 }
3867 if (m_SrcFormat & 0x0200) {
3868 if (m_DestFormat & 0x0200) {
3869 _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType , clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
3870 } else {
3871 _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
3872 }
3873 } else {
3874 if (m_DestFormat & 0x0200) {
3875 _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_B lendType, clip_scan, dst_extra_alpha, m_pIccTransform);
3876 } else {
3877 _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_Bl endType, clip_scan, m_pIccTransform);
3878 }
3879 }
3880 if (m_DestFormat & 0x0400) {
3881 for (int i = 0; i < width; i ++) {
3882 *dest_scan = ~*dest_scan;
3883 dest_scan++;
3884 }
3885 }
3886 } else {
3887 int dest_Size = width * dest_Bpp + 4;
3888 if (dest_Size > m_CacheSize) {
3889 m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
3890 if (!m_pCacheScanline) {
3891 return;
3892 }
3893 m_CacheSize = dest_Size;
3894 }
3895 switch (m_Transparency) {
3896 case 0:
3897 case 4:
3898 case 8:
3899 case 4+8: {
3900 _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendT ype, clip_scan,
3901 dst_extra_alpha, src_extra_alpha);
3902 }
3903 break;
3904 case 64:
3905 case 4+64:
3906 case 8+64:
3907 case 4+8+64: {
3908 _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width , m_BlendType, clip_scan,
3909 dst_extra_alpha, src_extra _alpha, m_pCacheScanline, m_pIccTransform);
3910 }
3911 break;
3912 case 1:
3913 _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
3914 dst_extra_alpha);
3915 break;
3916 case 1+64:
3917 _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_sca n, width, m_BlendType, src_Bpp,
3918 dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
3919 break;
3920 case 1+8:
3921 _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_ BlendType, src_Bpp, clip_scan,
3922 dst_extra_alpha);
3923 break;
3924 case 1+8+64:
3925 _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
3926 dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
3927 break;
3928 case 1+4:
3929 _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width , src_Bpp,
3930 dst_extra_alpha);
3931 break;
3932 case 1+4+64:
3933 _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_s can, width, src_Bpp,
3934 dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
3935 break;
3936 case 1+4+8:
3937 _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
3938 dst_extra_alpha);
3939 break;
3940 case 1+4+8+64:
3941 _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_sca n, width, src_Bpp, clip_scan,
3942 dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
3943 break;
3944 case 2:
3945 case 2+8:
3946 _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_Blend Type, dest_Bpp, clip_scan,
3947 src_extra_alpha);
3948 break;
3949 case 2+64:
3950 case 2+8+64:
3951 _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, widt h, m_BlendType, dest_Bpp, clip_scan,
3952 src_extra_alpha, m_pCache Scanline, m_pIccTransform);
3953 break;
3954 case 2+4:
3955 case 2+4+8:
3956 _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_ Bpp, clip_scan,
3957 src_extra_alpha);
3958 break;
3959 case 2+4+64:
3960 case 2+4+8+64:
3961 _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, wi dth, dest_Bpp, clip_scan,
3962 src_extra_alpha, m_pCacheScanline, m_pIccTransform);
3963 break;
3964 case 1+2:
3965 _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m _BlendType, dest_Bpp, src_Bpp);
3966 break;
3967 case 1+2+64:
3968 _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan , width, m_BlendType, dest_Bpp, src_Bpp,
3969 m_pCacheScanline, m_pIccTransform);
3970 break;
3971 case 1+2+8:
3972 _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_B lendType, dest_Bpp, src_Bpp, clip_scan);
3973 break;
3974 case 1+2+8+64:
3975 _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
3976 m_pCacheScanline, m_pIccTransform);
3977 break;
3978 case 1+2+4:
3979 _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
3980 break;
3981 case 1+2+4+64:
3982 _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_sc an, width, dest_Bpp, src_Bpp,
3983 m_pCacheScanline, m_pIccTransform);
3984 break;
3985 case 1+2+4+8:
3986 _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, d est_Bpp, src_Bpp, clip_scan);
3987 break;
3988 case 1+2+4+8+64:
3989 _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan , width, dest_Bpp, src_Bpp, clip_scan,
3990 m_pCacheScanline, m_pIccTransform);
3991 break;
3992 }
3993 }
3994 }
3995 void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCB YTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
3996 FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
3997 {
3998 if (m_bRgbByteOrder) {
3999 if (m_SrcFormat == FXDIB_1bppRgb) {
4000 if (m_DestFormat == FXDIB_8bppRgb) {
4001 return;
4002 } else if(m_DestFormat == FXDIB_Argb) {
4003 _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_s can, src_left, width, m_pSrcPalette, clip_scan);
4004 } else {
4005 _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_sc an, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
4006 }
4007 } else {
4008 if (m_DestFormat == FXDIB_8bppRgb) {
4009 return;
4010 } else if (m_DestFormat == FXDIB_Argb) {
4011 _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_s can, width, m_pSrcPalette, clip_scan);
4012 } else {
4013 _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_sc an, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
4014 }
4015 }
4016 return;
4017 }
4018 if (m_DestFormat == FXDIB_8bppMask) {
4019 _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
4020 return;
4021 } else if ((m_DestFormat & 0xff) == 8) {
4022 if (m_Transparency & 8) {
4023 if (m_DestFormat & 0x0200) {
4024 _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_L PCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
4025 } else {
4026 _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LP CBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
4027 }
4028 } else {
4029 if (m_DestFormat & 0x0200)
4030 _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_p SrcPalette, width, m_BlendType, clip_scan,
4031 dst_extra_alpha, src_extra_alpha);
4032 else
4033 _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pS rcPalette, width, m_BlendType, clip_scan,
4034 src_extra_alpha);
4035 }
4036 } else {
4037 switch (m_Transparency) {
4038 case 1+2:
4039 _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m _pSrcPalette, clip_scan,
4040 src_extra_alpha);
4041 break;
4042 case 1+2+8:
4043 _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left , width, m_pSrcPalette, clip_scan);
4044 break;
4045 case 0:
4046 _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPal ette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
4047 src_extra_alpha);
4048 break;
4049 case 0+8:
4050 _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
4051 break;
4052 case 0+2:
4053 _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPal ette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
4054 src_extra_alpha);
4055 break;
4056 case 0+2+8:
4057 _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left , width, m_pSrcPalette, clip_scan,
4058 dst_extra_alpha);
4059 break;
4060 break;
4061 }
4062 }
4063 }
4064 void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBY TE src_scan, int width, FX_LPCBYTE clip_scan,
4065 FX_LPBYTE dst_extra_alpha)
4066 {
4067 if (m_DestFormat == FXDIB_8bppMask) {
4068 _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, cli p_scan);
4069 } else if ((m_DestFormat & 0xff) == 8) {
4070 if (m_DestFormat & 0x0200) {
4071 _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_Mas kRed, width, clip_scan, dst_extra_alpha);
4072 } else {
4073 _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_Mask Red, width, clip_scan);
4074 }
4075 } else if (m_bRgbByteOrder) {
4076 if (m_DestFormat == FXDIB_Argb)
4077 _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_Mask Alpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
4078 width, m_BlendType, clip_scan);
4079 else
4080 _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskA lpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
4081 width, m_BlendType, (m_DestF ormat & 0xff) >> 3, clip_scan);
4082 return;
4083 } else if (m_DestFormat == FXDIB_Argb)
4084 _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
4085 width, m_BlendType, clip_scan);
4086 else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
4087 _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
4088 width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
4089 else if (m_DestFormat == FXDIB_Rgba)
4090 _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
4091 width, m_BlendType, clip_scan, dst_extra_alp ha);
4092 }
4093 void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYT E src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
4094 FX_LPBYTE dst_extra_alpha)
4095 {
4096 if (m_DestFormat == FXDIB_8bppMask) {
4097 _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, w idth, clip_scan);
4098 } else if ((m_DestFormat & 0xff) == 8) {
4099 if (m_DestFormat & 0x0200)
4100 _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_Mask Red, src_left, width, clip_scan,
4101 dst_extra_alpha); 5506 dst_extra_alpha);
4102 else { 5507 } else {
4103 _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskR ed, src_left, width, clip_scan); 5508 m_Compositor.CompositeRgbBitmapLine(dest_scan,
4104 } 5509 src_scan,
4105 } else if (m_bRgbByteOrder) { 5510 dest_width,
4106 if (m_DestFormat == FXDIB_Argb) 5511 clip_scan,
4107 _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskA lpha, m_MaskRed, m_MaskGreen, m_MaskBlue, 5512 src_extra_alpha,
4108 src_left, width, m_BlendType , clip_scan); 5513 dst_extra_alpha);
4109 else 5514 }
4110 _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAl pha, m_MaskRed, m_MaskGreen, m_MaskBlue, 5515 }
4111 src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan); 5516 void CFX_BitmapComposer::ComposeScanline(int line,
4112 return; 5517 FX_LPCBYTE scanline,
4113 } else if (m_DestFormat == FXDIB_Argb) 5518 FX_LPCBYTE scan_extra_alpha) {
4114 _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, 5519 if (m_bVertical) {
4115 src_left, width, m_BlendType, clip_scan); 5520 ComposeScanlineV(line, scanline, scan_extra_alpha);
4116 else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32) 5521 return;
4117 _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m _MaskGreen, m_MaskBlue, 5522 }
4118 src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan); 5523 FX_LPCBYTE clip_scan = NULL;
4119 } 5524 if (m_pClipMask)
4120 FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, in t height, 5525 clip_scan = m_pClipMask->GetBuffer() +
4121 const CFX_DIBSource* pSrcBitmap, int src_l eft, int src_top, 5526 (m_DestTop + line - m_pClipRgn->GetBox().top) *
4122 int blend_type, const CFX_ClipRgn* pClipRg n, FX_BOOL bRgbByteOrder, void* pIccTransform) 5527 m_pClipMask->GetPitch() +
4123 { 5528 (m_DestLeft - m_pClipRgn->GetBox().left);
4124 if (m_pBuffer == NULL) { 5529 FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
4125 return FALSE; 5530 m_DestLeft * m_pBitmap->GetBPP() / 8;
4126 } 5531 FX_LPBYTE dest_alpha_scan =
4127 ASSERT(!pSrcBitmap->IsAlphaMask()); 5532 m_pBitmap->m_pAlphaMask
4128 ASSERT(m_bpp >= 8); 5533 ? (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) +
4129 if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) { 5534 m_DestLeft
4130 return FALSE; 5535 : NULL;
4131 } 5536 DoCompose(dest_scan,
4132 GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), p SrcBitmap->GetHeight(), 5537 scanline,
4133 src_left, src_top, pClipRgn); 5538 m_DestWidth,
4134 if (width == 0 || height == 0) { 5539 clip_scan,
4135 return TRUE; 5540 scan_extra_alpha,
4136 } 5541 dest_alpha_scan);
4137 const CFX_DIBitmap* pClipMask = NULL; 5542 }
4138 FX_RECT clip_box; 5543 void CFX_BitmapComposer::ComposeScanlineV(int line,
4139 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) { 5544 FX_LPCBYTE scanline,
4140 ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF); 5545 FX_LPCBYTE scan_extra_alpha) {
4141 pClipMask = pClipRgn->GetMask(); 5546 int i;
4142 clip_box = pClipRgn->GetBox(); 5547 int Bpp = m_pBitmap->GetBPP() / 8;
4143 } 5548 int dest_pitch = m_pBitmap->GetPitch();
4144 CFX_ScanlineCompositor compositor; 5549 int dest_alpha_pitch =
4145 if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap ->GetPalette(), 0, blend_type, 5550 m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
4146 pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) { 5551 int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
4147 return FALSE; 5552 FX_LPBYTE dest_buf =
4148 } 5553 m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
4149 int dest_Bpp = m_bpp / 8; 5554 FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask
4150 int src_Bpp = pSrcBitmap->GetBPP() / 8; 5555 ? m_pBitmap->m_pAlphaMask->GetBuffer() +
4151 FX_BOOL bRgb = FALSE; 5556 dest_x + m_DestTop * dest_alpha_pitch
4152 FX_BOOL bCmyk = FALSE; 5557 : NULL;
4153 if (src_Bpp > 1) { 5558 if (m_bFlipY) {
4154 if (pSrcBitmap->IsCmykImage()) { 5559 dest_buf += dest_pitch * (m_DestHeight - 1);
4155 bCmyk = TRUE; 5560 dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
4156 } else { 5561 }
4157 bRgb = TRUE; 5562 int y_step = dest_pitch;
4158 } 5563 int y_alpha_step = dest_alpha_pitch;
4159 } 5564 if (m_bFlipY) {
4160 CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask; 5565 y_step = -y_step;
4161 for (int row = 0; row < height; row ++) { 5566 y_alpha_step = -y_alpha_step;
4162 FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp; 5567 }
4163 FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp; 5568 FX_LPBYTE src_scan = m_pScanlineV;
4164 FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScan line(src_top + row) + src_left : NULL; 5569 FX_LPBYTE dest_scan = dest_buf;
4165 FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask- >GetScanline(dest_top + row) + dest_left : NULL; 5570 for (i = 0; i < m_DestHeight; i++) {
4166 FX_LPCBYTE clip_scan = NULL; 5571 for (int j = 0; j < Bpp; j++) {
4167 if (pClipMask) { 5572 *src_scan++ = dest_scan[j];
4168 clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left); 5573 }
4169 } 5574 dest_scan += y_step;
4170 if (bRgb) { 5575 }
4171 compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_s can, src_scan_extra_alpha, dst_scan_extra_alpha); 5576 FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
4172 } else { 5577 FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
4173 compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, wid th, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha); 5578 if (dest_alpha_scan) {
4174 } 5579 for (i = 0; i < m_DestHeight; i++) {
4175 } 5580 *src_alpha_scan++ = *dest_alpha_scan;
4176 return TRUE; 5581 dest_alpha_scan += y_alpha_step;
4177 } 5582 }
4178 FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height, 5583 }
4179 const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, 5584 FX_LPBYTE clip_scan = NULL;
4180 int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform) 5585 if (m_pClipMask) {
4181 { 5586 clip_scan = m_pClipScanV;
4182 if (m_pBuffer == NULL) { 5587 int clip_pitch = m_pClipMask->GetPitch();
4183 return FALSE; 5588 FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() +
4184 } 5589 (m_DestTop - m_pClipRgn->GetBox().top) * clip_pitch +
4185 ASSERT(pMask->IsAlphaMask()); 5590 (dest_x - m_pClipRgn->GetBox().left);
4186 ASSERT(m_bpp >= 8);
4187 if (!pMask->IsAlphaMask() || m_bpp < 8) {
4188 return FALSE;
4189 }
4190 GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask- >GetHeight(), src_left, src_top, pClipRgn);
4191 if (width == 0 || height == 0) {
4192 return TRUE;
4193 }
4194 int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A( color);
4195 if (src_alpha == 0) {
4196 return TRUE;
4197 }
4198 const CFX_DIBitmap* pClipMask = NULL;
4199 FX_RECT clip_box;
4200 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
4201 ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
4202 pClipMask = pClipRgn->GetMask();
4203 clip_box = pClipRgn->GetBox();
4204 }
4205 int src_bpp = pMask->GetBPP();
4206 int Bpp = GetBPP() / 8;
4207 CFX_ScanlineCompositor compositor;
4208 if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, bl end_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
4209 return FALSE;
4210 }
4211 for (int row = 0; row < height; row ++) {
4212 FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
4213 FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
4214 FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask- >GetScanline(dest_top + row) + dest_left : NULL;
4215 FX_LPCBYTE clip_scan = NULL;
4216 if (pClipMask) {
4217 clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
4218 }
4219 if (src_bpp == 1) {
4220 compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width , clip_scan, dst_scan_extra_alpha);
4221 } else {
4222 compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, wid th, clip_scan, dst_scan_extra_alpha);
4223 }
4224 }
4225 return TRUE;
4226 }
4227 FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX _DWORD color, int alpha_flag, void* pIccTransform)
4228 {
4229 if (m_pBuffer == NULL) {
4230 return FALSE;
4231 }
4232 int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
4233 if (src_alpha == 0) {
4234 return TRUE;
4235 }
4236 FX_RECT rect(left, top, left + width, top + height);
4237 rect.Intersect(0, 0, m_Width, m_Height);
4238 if (rect.IsEmpty()) {
4239 return TRUE;
4240 }
4241 width = rect.Width();
4242 FX_DWORD dst_color;
4243 if (alpha_flag >> 8) {
4244 dst_color = FXCMYK_TODIB(color);
4245 } else {
4246 dst_color = FXARGB_TODIB(color);
4247 }
4248 FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
4249 if (m_bpp == 8) {
4250 FX_BYTE gray = 255;
4251 if (!IsAlphaMask()) {
4252 if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GE Module::Get()->GetCodecModule()->GetIccModule()) {
4253 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModu le()->GetIccModule();
4254 pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
4255 } else {
4256 if (alpha_flag >> 8) {
4257 FX_BYTE r, g, b;
4258 AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color _p[3],
4259 r, g, b);
4260 gray = FXRGB2GRAY(r, g, b);
4261 } else {
4262 gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], colo r_p[0]);
4263 }
4264 }
4265 if (IsCmykImage()) {
4266 gray = ~gray;
4267 }
4268 }
4269 for (int row = rect.top; row < rect.bottom; row ++) {
4270 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
4271 if (src_alpha == 255) {
4272 FXSYS_memset8(dest_scan, gray, width);
4273 } else
4274 for (int col = 0; col < width; col ++) {
4275 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
4276 dest_scan ++;
4277 }
4278 }
4279 return TRUE;
4280 } else if (m_bpp == 1) {
4281 ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
4282 int left_shift = rect.left % 8;
4283 int right_shift = rect.right % 8;
4284 int width = rect.right / 8 - rect.left / 8;
4285 int index = 0;
4286 if (m_pPalette == NULL) {
4287 index = ((FX_BYTE)color == 0xff) ? 1 : 0;
4288 } else {
4289 for (int i = 0; i < 2; i ++)
4290 if (m_pPalette[i] == color) {
4291 index = i;
4292 }
4293 }
4294 for (int row = rect.top; row < rect.bottom; row ++) {
4295 FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
4296 FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
4297 FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
4298 FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
4299 if (width) {
4300 FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
4301 if (!index) {
4302 *dest_scan_top &= left_flag;
4303 *dest_scan_top_r &= right_flag;
4304 } else {
4305 *dest_scan_top |= ~left_flag;
4306 *dest_scan_top_r |= ~right_flag;
4307 }
4308 } else {
4309 if (!index) {
4310 *dest_scan_top &= left_flag | right_flag;
4311 } else {
4312 *dest_scan_top |= ~(left_flag | right_flag);
4313 }
4314 }
4315 }
4316 return TRUE;
4317 }
4318 ASSERT(m_bpp >= 24);
4319 if (m_bpp < 24) {
4320 return FALSE;
4321 }
4322 if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
4323 ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->Ge tIccModule();
4324 pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
4325 } else {
4326 if (alpha_flag >> 8 && !IsCmykImage())
4327 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), F XSYS_GetYValue(color), FXSYS_GetKValue(color),
4328 color_p[2], color_p[1], color_p[0]);
4329 else if (!(alpha_flag >> 8) && IsCmykImage()) {
4330 return FALSE;
4331 }
4332 }
4333 if(!IsCmykImage()) {
4334 color_p[3] = (FX_BYTE)src_alpha;
4335 }
4336 int Bpp = m_bpp / 8;
4337 FX_BOOL bAlpha = HasAlpha();
4338 FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
4339 if (src_alpha == 255) {
4340 for (int row = rect.top; row < rect.bottom; row ++) {
4341 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
4342 FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask-> GetScanline(row) + rect.left : NULL;
4343 if (dest_scan_alpha) {
4344 FXSYS_memset8(dest_scan_alpha, 0xff, width);
4345 }
4346 if (Bpp == 4) {
4347 FX_DWORD* scan = (FX_DWORD*)dest_scan;
4348 for (int col = 0; col < width; col ++) {
4349 *scan ++ = dst_color;
4350 }
4351 } else {
4352 for (int col = 0; col < width; col ++) {
4353 *dest_scan ++ = color_p[0];
4354 *dest_scan ++ = color_p[1];
4355 *dest_scan ++ = color_p[2];
4356 }
4357 }
4358 }
4359 return TRUE;
4360 }
4361 for (int row = rect.top; row < rect.bottom; row ++) {
4362 FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
4363 if (bAlpha) {
4364 if (bArgb) {
4365 for (int col = 0; col < width; col ++) {
4366 FX_BYTE back_alpha = dest_scan[3];
4367 if (back_alpha == 0) {
4368 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[ 2], color_p[1], color_p[0]));
4369 dest_scan += 4;
4370 continue;
4371 }
4372 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * s rc_alpha / 255;
4373 int alpha_ratio = src_alpha * 255 / dest_alpha;
4374 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha _ratio);
4375 dest_scan ++;
4376 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha _ratio);
4377 dest_scan ++;
4378 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha _ratio);
4379 dest_scan ++;
4380 *dest_scan++ = dest_alpha;
4381 }
4382 } else {
4383 FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline (row) + rect.left;
4384 for (int col = 0; col < width; col ++) {
4385 FX_BYTE back_alpha = *dest_scan_alpha;
4386 if (back_alpha == 0) {
4387 *dest_scan_alpha++ = src_alpha;
4388 FXSYS_memcpy32(dest_scan, color_p, Bpp);
4389 dest_scan += Bpp;
4390 continue;
4391 }
4392 FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * s rc_alpha / 255;
4393 *dest_scan_alpha ++ = dest_alpha;
4394 int alpha_ratio = src_alpha * 255 / dest_alpha;
4395 for(int comps = 0; comps < Bpp; comps ++) {
4396 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps ], alpha_ratio);
4397 dest_scan ++;
4398 }
4399 }
4400 }
4401 } else {
4402 for (int col = 0; col < width; col ++) {
4403 for(int comps = 0; comps < Bpp; comps ++) {
4404 if (comps == 3) {
4405 *dest_scan ++ = 255;
4406 continue;
4407 }
4408 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], s rc_alpha);
4409 dest_scan ++;
4410 }
4411 }
4412 }
4413 }
4414 return TRUE;
4415 }
4416 CFX_BitmapComposer::CFX_BitmapComposer()
4417 {
4418 m_pScanlineV = NULL;
4419 m_pScanlineAlphaV = NULL;
4420 m_pClipScanV = NULL;
4421 m_pAddClipScan = NULL;
4422 m_bRgbByteOrder = FALSE;
4423 m_BlendType = FXDIB_BLEND_NORMAL;
4424 }
4425 CFX_BitmapComposer::~CFX_BitmapComposer()
4426 {
4427 if (m_pScanlineV) {
4428 FX_Free(m_pScanlineV);
4429 }
4430 if (m_pScanlineAlphaV) {
4431 FX_Free(m_pScanlineAlphaV);
4432 }
4433 if (m_pClipScanV) {
4434 FX_Free(m_pClipScanV);
4435 }
4436 if (m_pAddClipScan) {
4437 FX_Free(m_pAddClipScan);
4438 }
4439 }
4440 void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRg n, int bitmap_alpha,
4441 FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOO L bVertical,
4442 FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByt eOrder,
4443 int alpha_flag, void* pIccTransform, int blend_ type)
4444 {
4445 m_pBitmap = pDest;
4446 m_pClipRgn = pClipRgn;
4447 m_DestLeft = dest_rect.left;
4448 m_DestTop = dest_rect.top;
4449 m_DestWidth = dest_rect.Width();
4450 m_DestHeight = dest_rect.Height();
4451 m_BitmapAlpha = bitmap_alpha;
4452 m_MaskColor = mask_color;
4453 m_pClipMask = NULL;
4454 if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
4455 m_pClipMask = pClipRgn->GetMask();
4456 }
4457 m_bVertical = bVertical;
4458 m_bFlipX = bFlipX;
4459 m_bFlipY = bFlipY;
4460 m_AlphaFlag = alpha_flag;
4461 m_pIccTransform = pIccTransform;
4462 m_bRgbByteOrder = bRgbByteOrder;
4463 m_BlendType = blend_type;
4464 }
4465 FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_form at, FX_DWORD* pSrcPalette)
4466 {
4467 m_SrcFormat = src_format;
4468 if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalett e, m_MaskColor, FXDIB_BLEND_NORMAL,
4469 m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbB yteOrder, m_AlphaFlag, m_pIccTransform)) {
4470 return FALSE;
4471 }
4472 if (m_bVertical) {
4473 m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
4474 if (!m_pScanlineV) {
4475 return FALSE;
4476 }
4477 m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
4478 if (!m_pClipScanV) {
4479 return FALSE;
4480 }
4481 if (m_pBitmap->m_pAlphaMask) {
4482 m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
4483 if (!m_pScanlineAlphaV) {
4484 return FALSE;
4485 }
4486 }
4487 }
4488 if (m_BitmapAlpha < 255) {
4489 m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
4490 if (!m_pAddClipScan) {
4491 return FALSE;
4492 }
4493 }
4494 return TRUE;
4495 }
4496 void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
4497 FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_ext ra_alpha)
4498 {
4499 if (m_BitmapAlpha < 255) {
4500 if (clip_scan) {
4501 for (int i = 0; i < dest_width; i ++) {
4502 m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
4503 }
4504 } else {
4505 FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
4506 }
4507 clip_scan = m_pAddClipScan;
4508 }
4509 if (m_SrcFormat == FXDIB_8bppMask) {
4510 m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip _scan, dst_extra_alpha);
4511 } else if ((m_SrcFormat & 0xff) == 8) {
4512 m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
4513 } else {
4514 m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, cli p_scan, src_extra_alpha, dst_extra_alpha);
4515 }
4516 }
4517 void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBY TE scan_extra_alpha)
4518 {
4519 if (m_bVertical) {
4520 ComposeScanlineV(line, scanline, scan_extra_alpha);
4521 return;
4522 }
4523 FX_LPCBYTE clip_scan = NULL;
4524 if (m_pClipMask)
4525 clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->G etBox().top) *
4526 m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox() .left);
4527 FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
4528 m_DestLeft * m_pBitmap->GetBPP() / 8;
4529 FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
4530 (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline( line + m_DestTop) + m_DestLeft : NULL;
4531 DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, des t_alpha_scan);
4532 }
4533 void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCB YTE scan_extra_alpha)
4534 {
4535 int i;
4536 int Bpp = m_pBitmap->GetBPP() / 8;
4537 int dest_pitch = m_pBitmap->GetPitch();
4538 int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->Ge tPitch() : 0;
4539 int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
4540 FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * des t_pitch;
4541 FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
4542 m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m _DestTop * dest_alpha_pitch : NULL;
4543 if (m_bFlipY) { 5591 if (m_bFlipY) {
4544 dest_buf += dest_pitch * (m_DestHeight - 1); 5592 src_clip += clip_pitch * (m_DestHeight - 1);
4545 dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1); 5593 clip_pitch = -clip_pitch;
4546 } 5594 }
4547 int y_step = dest_pitch; 5595 for (i = 0; i < m_DestHeight; i++) {
4548 int y_alpha_step = dest_alpha_pitch; 5596 clip_scan[i] = *src_clip;
4549 if (m_bFlipY) { 5597 src_clip += clip_pitch;
4550 y_step = -y_step; 5598 }
4551 y_alpha_step = -y_alpha_step; 5599 }
4552 } 5600 DoCompose(m_pScanlineV,
4553 FX_LPBYTE src_scan = m_pScanlineV; 5601 scanline,
4554 FX_LPBYTE dest_scan = dest_buf; 5602 m_DestHeight,
4555 for (i = 0; i < m_DestHeight; i ++) { 5603 clip_scan,
4556 for (int j = 0; j < Bpp; j ++) { 5604 scan_extra_alpha,
4557 *src_scan++ = dest_scan[j]; 5605 m_pScanlineAlphaV);
4558 } 5606 src_scan = m_pScanlineV;
4559 dest_scan += y_step; 5607 dest_scan = dest_buf;
4560 } 5608 for (i = 0; i < m_DestHeight; i++) {
4561 FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV; 5609 for (int j = 0; j < Bpp; j++) {
4562 FX_LPBYTE dest_alpha_scan = dest_alpha_buf; 5610 dest_scan[j] = *src_scan++;
4563 if (dest_alpha_scan) { 5611 }
4564 for (i = 0; i < m_DestHeight; i ++) { 5612 dest_scan += y_step;
4565 *src_alpha_scan++ = *dest_alpha_scan; 5613 }
4566 dest_alpha_scan += y_alpha_step; 5614 src_alpha_scan = m_pScanlineAlphaV;
4567 } 5615 dest_alpha_scan = dest_alpha_buf;
4568 } 5616 if (dest_alpha_scan) {
4569 FX_LPBYTE clip_scan = NULL; 5617 for (i = 0; i < m_DestHeight; i++) {
4570 if (m_pClipMask) { 5618 *dest_alpha_scan = *src_alpha_scan++;
4571 clip_scan = m_pClipScanV; 5619 dest_alpha_scan += y_alpha_step;
4572 int clip_pitch = m_pClipMask->GetPitch(); 5620 }
4573 FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn ->GetBox().top) * 5621 }
4574 clip_pitch + (dest_x - m_pClipRgn->GetBox().left); 5622 }
4575 if (m_bFlipY) {
4576 src_clip += clip_pitch * (m_DestHeight - 1);
4577 clip_pitch = -clip_pitch;
4578 }
4579 for (i = 0; i < m_DestHeight; i ++) {
4580 clip_scan[i] = *src_clip;
4581 src_clip += clip_pitch;
4582 }
4583 }
4584 DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
4585 src_scan = m_pScanlineV;
4586 dest_scan = dest_buf;
4587 for (i = 0; i < m_DestHeight; i ++) {
4588 for (int j = 0; j < Bpp; j ++) {
4589 dest_scan[j] = *src_scan++;
4590 }
4591 dest_scan += y_step;
4592 }
4593 src_alpha_scan = m_pScanlineAlphaV;
4594 dest_alpha_scan = dest_alpha_buf;
4595 if (dest_alpha_scan) {
4596 for (i = 0; i < m_DestHeight; i ++) {
4597 *dest_alpha_scan = *src_alpha_scan++;
4598 dest_alpha_scan += y_alpha_step;
4599 }
4600 }
4601 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698