Coverage Report

Created: 2025-07-23 08:13

/src/poppler/splash/Splash.h
Line
Count
Source (jump to first uncovered line)
1
//========================================================================
2
//
3
// Splash.h
4
//
5
//========================================================================
6
7
//========================================================================
8
//
9
// Modified under the Poppler project - http://poppler.freedesktop.org
10
//
11
// All changes made under the Poppler project to this file are licensed
12
// under GPL version 2 or later
13
//
14
// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
15
// Copyright (C) 2007, 2011, 2018, 2019, 2021, 2022 Albert Astals Cid <aacid@kde.org>
16
// Copyright (C) 2010-2013, 2015 Thomas Freitag <Thomas.Freitag@alfa.de>
17
// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
18
// Copyright (C) 2012, 2017 Adrian Johnson <ajohnson@redneon.com>
19
// Copyright (C) 2020 Oliver Sander <oliver.sander@tu-dresden.de>
20
// Copyright (C) 2020 Tobias Deiminger <haxtibal@posteo.de>
21
//
22
// To see a description of the changes please see the Changelog file that
23
// came with your tarball or type make ChangeLog if you are building from git
24
//
25
//========================================================================
26
27
#ifndef SPLASH_H
28
#define SPLASH_H
29
30
#include <cstddef>
31
#include "SplashTypes.h"
32
#include "SplashClip.h"
33
#include "SplashPattern.h"
34
#include "poppler_private_export.h"
35
36
class SplashBitmap;
37
struct SplashGlyphBitmap;
38
class SplashState;
39
class SplashScreen;
40
class SplashPath;
41
class SplashXPath;
42
class SplashFont;
43
struct SplashPipe;
44
45
//------------------------------------------------------------------------
46
47
// Retrieves the next line of pixels in an image mask.  Normally,
48
// fills in *<line> and returns true.  If the image stream is
49
// exhausted, returns false.
50
typedef bool (*SplashImageMaskSource)(void *data, SplashColorPtr pixel);
51
52
// Retrieves the next line of pixels in an image.  Normally, fills in
53
// *<line> and returns true.  If the image stream is exhausted,
54
// returns false.
55
typedef bool (*SplashImageSource)(void *data, SplashColorPtr colorLine, unsigned char *alphaLine);
56
57
// Use ICCColorSpace to transform a bitmap
58
typedef void (*SplashICCTransform)(void *data, SplashBitmap *bitmap);
59
60
//------------------------------------------------------------------------
61
62
enum SplashPipeResultColorCtrl
63
{
64
    splashPipeResultColorNoAlphaBlendCMYK,
65
    splashPipeResultColorNoAlphaBlendDeviceN,
66
    splashPipeResultColorNoAlphaBlendRGB,
67
    splashPipeResultColorNoAlphaBlendMono,
68
    splashPipeResultColorAlphaNoBlendMono,
69
    splashPipeResultColorAlphaNoBlendRGB,
70
    splashPipeResultColorAlphaNoBlendCMYK,
71
    splashPipeResultColorAlphaNoBlendDeviceN,
72
    splashPipeResultColorAlphaBlendMono,
73
    splashPipeResultColorAlphaBlendRGB,
74
    splashPipeResultColorAlphaBlendCMYK,
75
    splashPipeResultColorAlphaBlendDeviceN
76
};
77
78
//------------------------------------------------------------------------
79
// Splash
80
//------------------------------------------------------------------------
81
82
class POPPLER_PRIVATE_EXPORT Splash
83
{
84
public:
85
    // Create a new rasterizer object.
86
    Splash(SplashBitmap *bitmapA, bool vectorAntialiasA, SplashScreenParams *screenParams = nullptr);
87
    Splash(SplashBitmap *bitmapA, bool vectorAntialiasA, SplashScreen *screenA);
88
89
    ~Splash();
90
91
    Splash(const Splash &) = delete;
92
    Splash &operator=(const Splash &) = delete;
93
94
    //----- state read
95
96
    SplashCoord *getMatrix();
97
    SplashPattern *getStrokePattern();
98
    SplashPattern *getFillPattern();
99
    SplashScreen *getScreen();
100
    SplashBlendFunc getBlendFunc();
101
    SplashCoord getStrokeAlpha();
102
    SplashCoord getFillAlpha();
103
    SplashCoord getLineWidth();
104
    int getLineCap();
105
    int getLineJoin();
106
    SplashCoord getMiterLimit();
107
    SplashCoord getFlatness();
108
    SplashCoord getLineDashPhase();
109
    bool getStrokeAdjust();
110
    SplashClip *getClip();
111
    SplashBitmap *getSoftMask();
112
    bool getInNonIsolatedGroup();
113
114
    //----- state write
115
116
    void setMatrix(SplashCoord *matrix);
117
    void setStrokePattern(SplashPattern *strokePattern);
118
    void setFillPattern(SplashPattern *fillPattern);
119
    void setScreen(SplashScreen *screen);
120
    void setBlendFunc(SplashBlendFunc func);
121
    void setStrokeAlpha(SplashCoord alpha);
122
    void setFillAlpha(SplashCoord alpha);
123
    void setPatternAlpha(SplashCoord strokeAlpha, SplashCoord fillAlpha);
124
    void clearPatternAlpha();
125
    void setFillOverprint(bool fop);
126
    void setStrokeOverprint(bool sop);
127
    void setOverprintMode(int opm);
128
    void setLineWidth(SplashCoord lineWidth);
129
    void setLineCap(int lineCap);
130
    void setLineJoin(int lineJoin);
131
    void setMiterLimit(SplashCoord miterLimit);
132
    void setFlatness(SplashCoord flatness);
133
    // the <lineDash> array will be copied
134
    void setLineDash(std::vector<SplashCoord> &&lineDash, SplashCoord lineDashPhase);
135
    void setStrokeAdjust(bool strokeAdjust);
136
    // NB: uses transformed coordinates.
137
    void clipResetToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1);
138
    // NB: uses transformed coordinates.
139
    SplashError clipToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1);
140
    // NB: uses untransformed coordinates.
141
    SplashError clipToPath(SplashPath *path, bool eo);
142
    void setSoftMask(SplashBitmap *softMask);
143
    void setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, int alpha0XA, int alpha0YA);
144
    void setTransfer(unsigned char *red, unsigned char *green, unsigned char *blue, unsigned char *gray);
145
    void setOverprintMask(unsigned int overprintMask, bool additive);
146
147
    //----- state save/restore
148
149
    void saveState();
150
    SplashError restoreState();
151
152
    //----- drawing operations
153
154
    // Fill the bitmap with <color>.  This is not subject to clipping.
155
    void clear(SplashColorPtr color, unsigned char alpha = 0x00);
156
157
    // Stroke a path using the current stroke pattern.
158
    SplashError stroke(SplashPath *path);
159
160
    // Fill a path using the current fill pattern.
161
    SplashError fill(SplashPath *path, bool eo);
162
163
    // Fill a path, XORing with the current fill pattern.
164
    SplashError xorFill(SplashPath *path, bool eo);
165
166
    // Draw a character, using the current fill pattern.
167
    SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font);
168
169
    // Draw a glyph, using the current fill pattern.  This function does
170
    // not free any data, i.e., it ignores glyph->freeData.
171
    void fillGlyph(SplashCoord x, SplashCoord y, SplashGlyphBitmap *glyph);
172
173
    // Draws an image mask using the fill color.  This will read <h>
174
    // lines of <w> pixels from <src>, starting with the top line.  "1"
175
    // pixels will be drawn with the current fill color; "0" pixels are
176
    // transparent.  The matrix:
177
    //    [ mat[0] mat[1] 0 ]
178
    //    [ mat[2] mat[3] 0 ]
179
    //    [ mat[4] mat[5] 1 ]
180
    // maps a unit square to the desired destination for the image, in
181
    // PostScript style:
182
    //    [x' y' 1] = [x y 1] * mat
183
    // Note that the Splash y axis points downward, and the image source
184
    // is assumed to produce pixels in raster order, starting from the
185
    // top line.
186
    SplashError fillImageMask(SplashImageMaskSource src, void *srcData, int w, int h, SplashCoord *mat, bool glyphMode);
187
188
    // Draw an image.  This will read <h> lines of <w> pixels from
189
    // <src>, starting with the top line.  These pixels are assumed to
190
    // be in the source mode, <srcMode>.  If <srcAlpha> is true, the
191
    // alpha values returned by <src> are used; otherwise they are
192
    // ignored.  The following combinations of source and target modes
193
    // are supported:
194
    //    source       target
195
    //    ------       ------
196
    //    Mono1        Mono1
197
    //    Mono8        Mono1   -- with dithering
198
    //    Mono8        Mono8
199
    //    RGB8         RGB8
200
    //    BGR8         BGR8
201
    //    CMYK8        CMYK8
202
    // The matrix behaves as for fillImageMask.
203
    SplashError drawImage(SplashImageSource src, SplashICCTransform tf, void *srcData, SplashColorMode srcMode, bool srcAlpha, int w, int h, SplashCoord *mat, bool interpolate, bool tilingPattern = false);
204
205
    // Composite a rectangular region from <src> onto this Splash
206
    // object.
207
    SplashError composite(SplashBitmap *src, int xSrc, int ySrc, int xDest, int yDest, int w, int h, bool noClip, bool nonIsolated, bool knockout = false, SplashCoord knockoutOpacity = 1.0);
208
209
    // Composite this Splash object onto a background color.  The
210
    // background alpha is assumed to be 1.
211
    void compositeBackground(SplashColorConstPtr color);
212
213
    // Copy a rectangular region from <src> onto the bitmap belonging to
214
    // this Splash object.  The destination alpha values are all set to
215
    // zero.
216
    SplashError blitTransparent(SplashBitmap *src, int xSrc, int ySrc, int xDest, int yDest, int w, int h);
217
    void blitImage(SplashBitmap *src, bool srcAlpha, int xDest, int yDest);
218
219
    //----- misc
220
221
    // Construct a path for a stroke, given the path to be stroked and
222
    // the line width <w>.  All other stroke parameters are taken from
223
    // the current state.  If <flatten> is true, this function will
224
    // first flatten the path and handle the linedash.
225
    SplashPath *makeStrokePath(SplashPath *path, SplashCoord w, bool flatten = true);
226
227
    // Return the associated bitmap.
228
0
    SplashBitmap *getBitmap() { return bitmap; }
229
230
    // Set the minimum line width.
231
345k
    void setMinLineWidth(SplashCoord w) { minLineWidth = w; }
232
233
    // Setter/Getter for thin line mode
234
345k
    void setThinLineMode(SplashThinLineMode thinLineModeA) { thinLineMode = thinLineModeA; }
235
175k
    SplashThinLineMode getThinLineMode() { return thinLineMode; }
236
237
    // Get clipping status for the last drawing operation subject to
238
    // clipping.
239
0
    SplashClipResult getClipRes() { return opClipRes; }
240
241
    // Toggle debug mode on or off.
242
0
    void setDebugMode(bool debugModeA) { debugMode = debugModeA; }
243
244
#if 1 //~tmp: turn off anti-aliasing temporarily
245
0
    void setInShading(bool sh) { inShading = sh; }
246
74.4k
    bool getVectorAntialias() { return vectorAntialias; }
247
219k
    void setVectorAntialias(bool vaa) { vectorAntialias = vaa; }
248
#endif
249
250
    // Do shaded fills with dynamic patterns
251
    //
252
    // clipToStrokePath: Whether the current clip region is a stroke path.
253
    //   In that case, strokeAlpha is used rather than fillAlpha.
254
    SplashError shadedFill(SplashPath *path, bool hasBBox, SplashPattern *pattern, bool clipToStrokePath);
255
    // Draw a gouraud triangle shading.
256
    bool gouraudTriangleShadedFill(SplashGouraudColor *shading);
257
258
private:
259
    void pipeInit(SplashPipe *pipe, int x, int y, SplashPattern *pattern, SplashColorPtr cSrc, unsigned char aInput, bool usesShape, bool nonIsolatedGroup, bool knockout = false, unsigned char knockoutOpacity = 255);
260
    void pipeRun(SplashPipe *pipe);
261
    void pipeRunSimpleMono1(SplashPipe *pipe);
262
    void pipeRunSimpleMono8(SplashPipe *pipe);
263
    void pipeRunSimpleRGB8(SplashPipe *pipe);
264
    void pipeRunSimpleXBGR8(SplashPipe *pipe);
265
    void pipeRunSimpleBGR8(SplashPipe *pipe);
266
    void pipeRunSimpleCMYK8(SplashPipe *pipe);
267
    void pipeRunSimpleDeviceN8(SplashPipe *pipe);
268
    void pipeRunAAMono1(SplashPipe *pipe);
269
    void pipeRunAAMono8(SplashPipe *pipe);
270
    void pipeRunAARGB8(SplashPipe *pipe);
271
    void pipeRunAAXBGR8(SplashPipe *pipe);
272
    void pipeRunAABGR8(SplashPipe *pipe);
273
    void pipeRunAACMYK8(SplashPipe *pipe);
274
    void pipeRunAADeviceN8(SplashPipe *pipe);
275
    void pipeSetXY(SplashPipe *pipe, int x, int y);
276
    void pipeIncX(SplashPipe *pipe);
277
    void drawPixel(SplashPipe *pipe, int x, int y, bool noClip);
278
    void drawAAPixelInit();
279
    void drawAAPixel(SplashPipe *pipe, int x, int y);
280
    void drawSpan(SplashPipe *pipe, int x0, int x1, int y, bool noClip);
281
    void drawAALine(SplashPipe *pipe, int x0, int x1, int y, bool adjustLine = false, unsigned char lineOpacity = 0);
282
    void transform(const SplashCoord *matrix, SplashCoord xi, SplashCoord yi, SplashCoord *xo, SplashCoord *yo);
283
    void strokeNarrow(SplashPath *path);
284
    void strokeWide(SplashPath *path, SplashCoord w);
285
    SplashPath *flattenPath(SplashPath *path, SplashCoord *matrix, SplashCoord flatness);
286
    void flattenCurve(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1, SplashCoord x2, SplashCoord y2, SplashCoord x3, SplashCoord y3, SplashCoord *matrix, SplashCoord flatness2, SplashPath *fPath);
287
    SplashPath *makeDashedPath(SplashPath *xPath);
288
    void getBBoxFP(SplashPath *path, SplashCoord *xMinA, SplashCoord *yMinA, SplashCoord *xMaxA, SplashCoord *yMaxA);
289
    SplashError fillWithPattern(SplashPath *path, bool eo, SplashPattern *pattern, SplashCoord alpha);
290
    bool pathAllOutside(SplashPath *path);
291
    void fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, bool noclip);
292
    void arbitraryTransformMask(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, SplashCoord *mat, bool glyphMode);
293
    SplashBitmap *scaleMask(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight);
294
    void scaleMaskYdownXdown(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
295
    void scaleMaskYdownXup(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
296
    void scaleMaskYupXdown(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
297
    void scaleMaskYupXup(SplashImageMaskSource src, void *srcData, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
298
    void blitMask(SplashBitmap *src, int xDest, int yDest, SplashClipResult clipRes);
299
    SplashError arbitraryTransformImage(SplashImageSource src, SplashICCTransform tf, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, SplashCoord *mat, bool interpolate,
300
                                        bool tilingPattern = false);
301
    SplashBitmap *scaleImage(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, bool interpolate, bool tilingPattern = false);
302
    bool scaleImageYdownXdown(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
303
    bool scaleImageYdownXup(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
304
    bool scaleImageYupXdown(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
305
    bool scaleImageYupXup(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
306
    bool scaleImageYupXupBilinear(SplashImageSource src, void *srcData, SplashColorMode srcMode, int nComps, bool srcAlpha, int srcWidth, int srcHeight, int scaledWidth, int scaledHeight, SplashBitmap *dest);
307
    void vertFlipImage(SplashBitmap *img, int width, int height, int nComps);
308
    void blitImage(SplashBitmap *src, bool srcAlpha, int xDest, int yDest, SplashClipResult clipRes);
309
    void blitImageClipped(SplashBitmap *src, bool srcAlpha, int xSrc, int ySrc, int xDest, int yDest, int w, int h);
310
    void dumpPath(SplashPath *path);
311
    void dumpXPath(SplashXPath *path);
312
313
    static SplashPipeResultColorCtrl pipeResultColorNoAlphaBlend[];
314
    static SplashPipeResultColorCtrl pipeResultColorAlphaNoBlend[];
315
    static SplashPipeResultColorCtrl pipeResultColorAlphaBlend[];
316
    static int pipeNonIsoGroupCorrection[];
317
318
    SplashBitmap *bitmap;
319
    SplashState *state;
320
    SplashBitmap *aaBuf;
321
    int aaBufY;
322
    SplashBitmap *alpha0Bitmap; // for non-isolated groups, this is the
323
                                //   bitmap containing the alpha0 values
324
    int alpha0X, alpha0Y; // offset within alpha0Bitmap
325
    SplashCoord aaGamma[splashAASize * splashAASize + 1];
326
    SplashCoord minLineWidth;
327
    SplashThinLineMode thinLineMode;
328
    SplashClipResult opClipRes;
329
    bool vectorAntialias;
330
    bool inShading;
331
    bool debugMode;
332
};
333
334
#endif