Mercurial > hgrepos > Python2 > PyMuPDF
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 |
