comparison mupdf-source/source/fitz/paint-glyph.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 // Copyright (C) 2004-2021 Artifex Software, Inc.
2 //
3 // This file is part of MuPDF.
4 //
5 // MuPDF is free software: you can redistribute it and/or modify it under the
6 // terms of the GNU Affero General Public License as published by the Free
7 // Software Foundation, either version 3 of the License, or (at your option)
8 // any later version.
9 //
10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Affero General Public License
16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
17 //
18 // Alternative licensing terms are available from the licensor.
19 // For commercial licensing, see <https://www.artifex.com/> or contact
20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
21 // CA 94129, USA, for further information.
22
23 /*
24 This file is #included by draw-paint.c multiple times to
25 produce optimised plotters.
26 */
27
28 #ifdef ALPHA
29 #define NAME alpha
30 #else
31 #define NAME solid
32 #endif
33
34 #ifdef DA
35 #define NAME2 _da
36 #else
37 #define NAME2
38 #endif
39
40 #ifdef EOP
41 #define NAME3 _op
42 #else
43 #define NAME3
44 #endif
45
46 #define FUNCTION_NAMER(NAME,N,NAME2,NAME3) fz_paint_glyph_##NAME##_##N##NAME2##NAME3
47 #define FUNCTION_NAME(NAME,N,NAME2,NAME3) FUNCTION_NAMER(NAME,N,NAME2,NAME3)
48
49 #ifdef EOP
50 #define IF_OVERPRINT_COMPONENT(k) if (fz_overprint_component(eop, k))
51 #else
52 #define IF_OVERPRINT_COMPONENT(k) if (1)
53 #endif
54
55 static fz_forceinline void
56 FUNCTION_NAME(NAME,N,NAME2,NAME3)(const unsigned char * FZ_RESTRICT colorbv,
57 #ifndef N
58 const int n1,
59 #endif
60 int span, unsigned char * FZ_RESTRICT dp, const fz_glyph *glyph, int w, int h, int skip_x, int skip_y
61 #ifdef EOP
62 , const fz_overprint *eop
63 #endif
64 )
65 {
66 #ifdef N
67 const int n1 = N;
68 #endif
69 #ifdef DA
70 const int n = n1 + 1;
71 #else
72 const int n = n1;
73 #endif
74 #ifdef ALPHA
75 int sa = FZ_EXPAND(colorbv[n1]);
76 #else
77 #if defined(N) && N == 1 && defined(DA)
78 const uint16_t color = *(const uint16_t *)colorbv;
79 #elif defined(N) && N == 3 && defined(DA)
80 const uint32_t color = *(const uint32_t *)colorbv;
81 #elif defined(N) && N == 4 && !defined(DA)
82 const uint32_t color = *(const uint32_t *)colorbv;
83 #endif
84 #endif
85 TRACK_FN();
86 while (h--)
87 {
88 int skip_xx, ww, len, extend;
89 const unsigned char *runp;
90 unsigned char *ddp = dp;
91 int offset = ((int *)(glyph->data))[skip_y++];
92 if (offset >= 0)
93 {
94 int eol = 0;
95 runp = &glyph->data[offset];
96 extend = 0;
97 ww = w;
98 skip_xx = skip_x;
99 while (skip_xx)
100 {
101 int v = *runp++;
102 switch (v & 3)
103 {
104 case 0: /* Extend */
105 extend = v>>2;
106 len = 0;
107 break;
108 case 1: /* Transparent */
109 len = (v>>2) + 1 + (extend<<6);
110 extend = 0;
111 if (len > skip_xx)
112 {
113 len -= skip_xx;
114 goto transparent_run;
115 }
116 break;
117 case 2: /* Solid */
118 eol = v & 4;
119 len = (v>>3) + 1 + (extend<<5);
120 extend = 0;
121 if (len > skip_xx)
122 {
123 len -= skip_xx;
124 goto solid_run;
125 }
126 break;
127 default: /* Intermediate */
128 eol = v & 4;
129 len = (v>>3) + 1 + (extend<<5);
130 extend = 0;
131 if (len > skip_xx)
132 {
133 runp += skip_xx;
134 len -= skip_xx;
135 goto intermediate_run;
136 }
137 runp += len;
138 break;
139 }
140 if (eol)
141 {
142 ww = 0;
143 break;
144 }
145 skip_xx -= len;
146 }
147 while (ww > 0)
148 {
149 int v = *runp++;
150 switch(v & 3)
151 {
152 case 0: /* Extend */
153 extend = v>>2;
154 break;
155 case 1: /* Transparent */
156 len = (v>>2) + 1 + (extend<<6);
157 extend = 0;
158 transparent_run:
159 if (len > ww)
160 len = ww;
161 ww -= len;
162 ddp += len * n;
163 break;
164 case 2: /* Solid */
165 eol = v & 4;
166 len = (v>>3) + 1 + (extend<<5);
167 extend = 0;
168 solid_run:
169 if (len > ww)
170 len = ww;
171 ww -= len;
172 do
173 {
174 #ifdef ALPHA
175 #if defined(N) && N == 1
176 IF_OVERPRINT_COMPONENT(0)
177 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa);
178 #ifdef DA
179 ddp[1] = FZ_BLEND(0xFF, ddp[1], sa);
180 ddp += 2;
181 #else
182 ddp++;
183 #endif
184 #elif defined(N) && N == 3
185 IF_OVERPRINT_COMPONENT(0)
186 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa);
187 IF_OVERPRINT_COMPONENT(1)
188 ddp[1] = FZ_BLEND(colorbv[1], ddp[1], sa);
189 IF_OVERPRINT_COMPONENT(2)
190 ddp[2] = FZ_BLEND(colorbv[2], ddp[2], sa);
191 #ifdef DA
192 ddp[3] = FZ_BLEND(0xFF, ddp[3], sa);
193 ddp += 4;
194 #else
195 ddp += 3;
196 #endif
197 #elif defined(N) && N == 4
198 IF_OVERPRINT_COMPONENT(0)
199 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa);
200 IF_OVERPRINT_COMPONENT(1)
201 ddp[1] = FZ_BLEND(colorbv[1], ddp[1], sa);
202 IF_OVERPRINT_COMPONENT(2)
203 ddp[2] = FZ_BLEND(colorbv[2], ddp[2], sa);
204 IF_OVERPRINT_COMPONENT(3)
205 ddp[3] = FZ_BLEND(colorbv[3], ddp[3], sa);
206 #ifdef DA
207 ddp[4] = FZ_BLEND(0xFF, ddp[4], sa);
208 ddp += 5;
209 #else
210 ddp += 4;
211 #endif
212 #else
213 int k = 0;
214 do
215 {
216 IF_OVERPRINT_COMPONENT(k)
217 *ddp = FZ_BLEND(colorbv[k], *ddp, sa);
218 k++;
219 ddp++;
220 }
221 while (k != n1);
222 #ifdef DA
223 *ddp = FZ_BLEND(0xFF, *ddp, sa);
224 ddp++;
225 #endif
226 #endif
227 #else
228 #if defined(N) && N == 1
229 #ifdef DA
230 #ifdef EOP
231 IF_OVERPRINT_COMPONENT(0)
232 ddp[0] = colorbv[0];
233 IF_OVERPRINT_COMPONENT(1)
234 *ddp[1] = colorbv[1];
235 #else
236 *(uint16_t *)ddp = color;
237 #endif
238 ddp += 2;
239 #else
240 *ddp++ = colorbv[0];
241 #endif
242 #elif defined(N) && N == 3
243 #ifdef DA
244 #ifdef EOP
245 IF_OVERPRINT_COMPONENT(0)
246 ddp[0] = colorbv[0];
247 IF_OVERPRINT_COMPONENT(1)
248 ddp[1] = colorbv[1];
249 IF_OVERPRINT_COMPONENT(2)
250 ddp[2] = colorbv[2];
251 IF_OVERPRINT_COMPONENT(3)
252 #else
253 *(uint32_t *)ddp = color;
254 #endif
255 ddp += 4;
256 #else
257 IF_OVERPRINT_COMPONENT(0)
258 ddp[0] = colorbv[0];
259 IF_OVERPRINT_COMPONENT(1)
260 ddp[1] = colorbv[1];
261 IF_OVERPRINT_COMPONENT(2)
262 ddp[2] = colorbv[2];
263 ddp += 3;
264 #endif
265 #elif defined(N) && N == 4
266 #ifdef DA
267 IF_OVERPRINT_COMPONENT(0)
268 ddp[0] = colorbv[0];
269 IF_OVERPRINT_COMPONENT(1)
270 ddp[1] = colorbv[1];
271 IF_OVERPRINT_COMPONENT(2)
272 ddp[2] = colorbv[2];
273 IF_OVERPRINT_COMPONENT(3)
274 ddp[3] = colorbv[3];
275 ddp[4] = colorbv[4];
276 ddp += 5;
277 #else
278 #ifdef EOP
279 IF_OVERPRINT_COMPONENT(0)
280 ddp[0] = colorbv[0];
281 IF_OVERPRINT_COMPONENT(1)
282 ddp[1] = colorbv[1];
283 IF_OVERPRINT_COMPONENT(2)
284 ddp[2] = colorbv[2];
285 ddp[3] = colorbv[3];
286 #else
287 *(uint32_t *)ddp = color;
288 #endif
289 ddp += 4;
290 #endif
291 #else
292 int k = 0;
293 do
294 {
295 IF_OVERPRINT_COMPONENT(k)
296 *ddp = colorbv[k];
297 k++;
298 ddp++;
299 }
300 while (k != n);
301 #endif
302 #endif
303 }
304 while (--len);
305 break;
306 default: /* Intermediate */
307 eol = v & 4;
308 len = (v>>3) + 1 + (extend<<5);
309 extend = 0;
310 intermediate_run:
311 if (len > ww)
312 len = ww;
313 ww -= len;
314 do
315 {
316 int k = 0;
317 int a = *runp++;
318 #ifdef ALPHA
319 a = FZ_COMBINE(sa, FZ_EXPAND(a));
320 #else
321 a = FZ_EXPAND(a);
322 #endif
323 (void)k;
324 #if defined(N) && N == 1
325 IF_OVERPRINT_COMPONENT(0)
326 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a);
327 #ifdef DA
328 ddp[1] = FZ_BLEND(0xFF, ddp[1], a);
329 ddp += 2;
330 #else
331 ddp++;
332 #endif
333 #elif defined(N) && N == 3
334 IF_OVERPRINT_COMPONENT(0)
335 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a);
336 IF_OVERPRINT_COMPONENT(1)
337 ddp[1] = FZ_BLEND(colorbv[1], ddp[1], a);
338 IF_OVERPRINT_COMPONENT(2)
339 ddp[2] = FZ_BLEND(colorbv[2], ddp[2], a);
340 #ifdef DA
341 ddp[3] = FZ_BLEND(0xFF, ddp[3], a);
342 ddp += 4;
343 #else
344 ddp += 3;
345 #endif
346 #elif defined(N) && N == 4
347 IF_OVERPRINT_COMPONENT(0)
348 ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a);
349 IF_OVERPRINT_COMPONENT(1)
350 ddp[1] = FZ_BLEND(colorbv[1], ddp[1], a);
351 IF_OVERPRINT_COMPONENT(2)
352 ddp[2] = FZ_BLEND(colorbv[2], ddp[2], a);
353 IF_OVERPRINT_COMPONENT(3)
354 ddp[3] = FZ_BLEND(colorbv[3], ddp[3], a);
355 #ifdef DA
356 ddp[4] = FZ_BLEND(0xFF, ddp[4], a);
357 ddp += 5;
358 #else
359 ddp += 4;
360 #endif
361 #else
362 do
363 {
364 IF_OVERPRINT_COMPONENT(k)
365 *ddp = FZ_BLEND(colorbv[k], *ddp, a);
366 k++;
367 ddp++;
368 }
369 while (k != n1);
370 #ifdef DA
371 *ddp = FZ_BLEND(0xFF, *ddp, a);
372 ddp++;
373 #endif
374 #endif
375 }
376 while (--len);
377 break;
378 }
379 if (eol)
380 break;
381 }
382 }
383 dp += span;
384 }
385 }
386
387 #undef NAME
388 #undef ALPHA
389 #undef NAME2
390 #undef NAME3
391 #undef EOP
392 #undef DA
393 #undef N
394 #undef FUNCTION_NAMER
395 #undef FUNCTION_NAME
396 #undef IF_OVERPRINT_COMPONENT