Mercurial > hgrepos > Python2 > PyMuPDF
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/source/fitz/paint-glyph.h Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,396 @@ +// Copyright (C) 2004-2021 Artifex Software, Inc. +// +// This file is part of MuPDF. +// +// MuPDF is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +// details. +// +// You should have received a copy of the GNU Affero General Public License +// along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html> +// +// Alternative licensing terms are available from the licensor. +// For commercial licensing, see <https://www.artifex.com/> or contact +// Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, +// CA 94129, USA, for further information. + +/* + This file is #included by draw-paint.c multiple times to + produce optimised plotters. +*/ + +#ifdef ALPHA +#define NAME alpha +#else +#define NAME solid +#endif + +#ifdef DA +#define NAME2 _da +#else +#define NAME2 +#endif + +#ifdef EOP +#define NAME3 _op +#else +#define NAME3 +#endif + +#define FUNCTION_NAMER(NAME,N,NAME2,NAME3) fz_paint_glyph_##NAME##_##N##NAME2##NAME3 +#define FUNCTION_NAME(NAME,N,NAME2,NAME3) FUNCTION_NAMER(NAME,N,NAME2,NAME3) + +#ifdef EOP +#define IF_OVERPRINT_COMPONENT(k) if (fz_overprint_component(eop, k)) +#else +#define IF_OVERPRINT_COMPONENT(k) if (1) +#endif + +static fz_forceinline void +FUNCTION_NAME(NAME,N,NAME2,NAME3)(const unsigned char * FZ_RESTRICT colorbv, +#ifndef N + const int n1, +#endif + int span, unsigned char * FZ_RESTRICT dp, const fz_glyph *glyph, int w, int h, int skip_x, int skip_y +#ifdef EOP + , const fz_overprint *eop +#endif + ) +{ +#ifdef N + const int n1 = N; +#endif +#ifdef DA + const int n = n1 + 1; +#else + const int n = n1; +#endif +#ifdef ALPHA + int sa = FZ_EXPAND(colorbv[n1]); +#else +#if defined(N) && N == 1 && defined(DA) + const uint16_t color = *(const uint16_t *)colorbv; +#elif defined(N) && N == 3 && defined(DA) + const uint32_t color = *(const uint32_t *)colorbv; +#elif defined(N) && N == 4 && !defined(DA) + const uint32_t color = *(const uint32_t *)colorbv; +#endif +#endif + TRACK_FN(); + while (h--) + { + int skip_xx, ww, len, extend; + const unsigned char *runp; + unsigned char *ddp = dp; + int offset = ((int *)(glyph->data))[skip_y++]; + if (offset >= 0) + { + int eol = 0; + runp = &glyph->data[offset]; + extend = 0; + ww = w; + skip_xx = skip_x; + while (skip_xx) + { + int v = *runp++; + switch (v & 3) + { + case 0: /* Extend */ + extend = v>>2; + len = 0; + break; + case 1: /* Transparent */ + len = (v>>2) + 1 + (extend<<6); + extend = 0; + if (len > skip_xx) + { + len -= skip_xx; + goto transparent_run; + } + break; + case 2: /* Solid */ + eol = v & 4; + len = (v>>3) + 1 + (extend<<5); + extend = 0; + if (len > skip_xx) + { + len -= skip_xx; + goto solid_run; + } + break; + default: /* Intermediate */ + eol = v & 4; + len = (v>>3) + 1 + (extend<<5); + extend = 0; + if (len > skip_xx) + { + runp += skip_xx; + len -= skip_xx; + goto intermediate_run; + } + runp += len; + break; + } + if (eol) + { + ww = 0; + break; + } + skip_xx -= len; + } + while (ww > 0) + { + int v = *runp++; + switch(v & 3) + { + case 0: /* Extend */ + extend = v>>2; + break; + case 1: /* Transparent */ + len = (v>>2) + 1 + (extend<<6); + extend = 0; +transparent_run: + if (len > ww) + len = ww; + ww -= len; + ddp += len * n; + break; + case 2: /* Solid */ + eol = v & 4; + len = (v>>3) + 1 + (extend<<5); + extend = 0; +solid_run: + if (len > ww) + len = ww; + ww -= len; + do + { +#ifdef ALPHA +#if defined(N) && N == 1 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa); +#ifdef DA + ddp[1] = FZ_BLEND(0xFF, ddp[1], sa); + ddp += 2; +#else + ddp++; +#endif +#elif defined(N) && N == 3 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa); + IF_OVERPRINT_COMPONENT(1) + ddp[1] = FZ_BLEND(colorbv[1], ddp[1], sa); + IF_OVERPRINT_COMPONENT(2) + ddp[2] = FZ_BLEND(colorbv[2], ddp[2], sa); +#ifdef DA + ddp[3] = FZ_BLEND(0xFF, ddp[3], sa); + ddp += 4; +#else + ddp += 3; +#endif +#elif defined(N) && N == 4 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], sa); + IF_OVERPRINT_COMPONENT(1) + ddp[1] = FZ_BLEND(colorbv[1], ddp[1], sa); + IF_OVERPRINT_COMPONENT(2) + ddp[2] = FZ_BLEND(colorbv[2], ddp[2], sa); + IF_OVERPRINT_COMPONENT(3) + ddp[3] = FZ_BLEND(colorbv[3], ddp[3], sa); +#ifdef DA + ddp[4] = FZ_BLEND(0xFF, ddp[4], sa); + ddp += 5; +#else + ddp += 4; +#endif +#else + int k = 0; + do + { + IF_OVERPRINT_COMPONENT(k) + *ddp = FZ_BLEND(colorbv[k], *ddp, sa); + k++; + ddp++; + } + while (k != n1); +#ifdef DA + *ddp = FZ_BLEND(0xFF, *ddp, sa); + ddp++; +#endif +#endif +#else +#if defined(N) && N == 1 +#ifdef DA +#ifdef EOP + IF_OVERPRINT_COMPONENT(0) + ddp[0] = colorbv[0]; + IF_OVERPRINT_COMPONENT(1) + *ddp[1] = colorbv[1]; +#else + *(uint16_t *)ddp = color; +#endif + ddp += 2; +#else + *ddp++ = colorbv[0]; +#endif +#elif defined(N) && N == 3 +#ifdef DA +#ifdef EOP + IF_OVERPRINT_COMPONENT(0) + ddp[0] = colorbv[0]; + IF_OVERPRINT_COMPONENT(1) + ddp[1] = colorbv[1]; + IF_OVERPRINT_COMPONENT(2) + ddp[2] = colorbv[2]; + IF_OVERPRINT_COMPONENT(3) +#else + *(uint32_t *)ddp = color; +#endif + ddp += 4; +#else + IF_OVERPRINT_COMPONENT(0) + ddp[0] = colorbv[0]; + IF_OVERPRINT_COMPONENT(1) + ddp[1] = colorbv[1]; + IF_OVERPRINT_COMPONENT(2) + ddp[2] = colorbv[2]; + ddp += 3; +#endif +#elif defined(N) && N == 4 +#ifdef DA + IF_OVERPRINT_COMPONENT(0) + ddp[0] = colorbv[0]; + IF_OVERPRINT_COMPONENT(1) + ddp[1] = colorbv[1]; + IF_OVERPRINT_COMPONENT(2) + ddp[2] = colorbv[2]; + IF_OVERPRINT_COMPONENT(3) + ddp[3] = colorbv[3]; + ddp[4] = colorbv[4]; + ddp += 5; +#else +#ifdef EOP + IF_OVERPRINT_COMPONENT(0) + ddp[0] = colorbv[0]; + IF_OVERPRINT_COMPONENT(1) + ddp[1] = colorbv[1]; + IF_OVERPRINT_COMPONENT(2) + ddp[2] = colorbv[2]; + ddp[3] = colorbv[3]; +#else + *(uint32_t *)ddp = color; +#endif + ddp += 4; +#endif +#else + int k = 0; + do + { + IF_OVERPRINT_COMPONENT(k) + *ddp = colorbv[k]; + k++; + ddp++; + } + while (k != n); +#endif +#endif + } + while (--len); + break; + default: /* Intermediate */ + eol = v & 4; + len = (v>>3) + 1 + (extend<<5); + extend = 0; +intermediate_run: + if (len > ww) + len = ww; + ww -= len; + do + { + int k = 0; + int a = *runp++; +#ifdef ALPHA + a = FZ_COMBINE(sa, FZ_EXPAND(a)); +#else + a = FZ_EXPAND(a); +#endif + (void)k; +#if defined(N) && N == 1 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a); +#ifdef DA + ddp[1] = FZ_BLEND(0xFF, ddp[1], a); + ddp += 2; +#else + ddp++; +#endif +#elif defined(N) && N == 3 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a); + IF_OVERPRINT_COMPONENT(1) + ddp[1] = FZ_BLEND(colorbv[1], ddp[1], a); + IF_OVERPRINT_COMPONENT(2) + ddp[2] = FZ_BLEND(colorbv[2], ddp[2], a); +#ifdef DA + ddp[3] = FZ_BLEND(0xFF, ddp[3], a); + ddp += 4; +#else + ddp += 3; +#endif +#elif defined(N) && N == 4 + IF_OVERPRINT_COMPONENT(0) + ddp[0] = FZ_BLEND(colorbv[0], ddp[0], a); + IF_OVERPRINT_COMPONENT(1) + ddp[1] = FZ_BLEND(colorbv[1], ddp[1], a); + IF_OVERPRINT_COMPONENT(2) + ddp[2] = FZ_BLEND(colorbv[2], ddp[2], a); + IF_OVERPRINT_COMPONENT(3) + ddp[3] = FZ_BLEND(colorbv[3], ddp[3], a); +#ifdef DA + ddp[4] = FZ_BLEND(0xFF, ddp[4], a); + ddp += 5; +#else + ddp += 4; +#endif +#else + do + { + IF_OVERPRINT_COMPONENT(k) + *ddp = FZ_BLEND(colorbv[k], *ddp, a); + k++; + ddp++; + } + while (k != n1); +#ifdef DA + *ddp = FZ_BLEND(0xFF, *ddp, a); + ddp++; +#endif +#endif + } + while (--len); + break; + } + if (eol) + break; + } + } + dp += span; + } +} + +#undef NAME +#undef ALPHA +#undef NAME2 +#undef NAME3 +#undef EOP +#undef DA +#undef N +#undef FUNCTION_NAMER +#undef FUNCTION_NAME +#undef IF_OVERPRINT_COMPONENT
