Coverage Report

Created: 2026-10-19 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/splash/SplashState.cc
Line
Count
Source
1
//========================================================================
2
//
3
// SplashState.cc
4
//
5
// Copyright 2003-2013 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#include <aconf.h>
10
11
#include <string.h>
12
#include "gmem.h"
13
#include "gmempp.h"
14
#include "SplashPattern.h"
15
#include "SplashScreen.h"
16
#include "SplashClip.h"
17
#include "SplashBitmap.h"
18
#include "SplashState.h"
19
20
//------------------------------------------------------------------------
21
// SplashState
22
//------------------------------------------------------------------------
23
24
// number of components in each color mode
25
int splashColorModeNComps[] = {
26
  1, 1, 3, 3
27
#if SPLASH_CMYK
28
  , 4
29
#endif
30
};
31
32
SplashState::SplashState(int width, int height, GBool vectorAntialias,
33
48.6k
       SplashScreenParams *screenParams) {
34
48.6k
  SplashColor color;
35
48.6k
  int i;
36
37
48.6k
  matrix[0] = 1;  matrix[1] = 0;
38
48.6k
  matrix[2] = 0;  matrix[3] = 1;
39
48.6k
  matrix[4] = 0;  matrix[5] = 0;
40
48.6k
  memset(&color, 0, sizeof(SplashColor));
41
48.6k
  strokePattern = new SplashSolidColor(color);
42
48.6k
  fillPattern = new SplashSolidColor(color);
43
48.6k
  screen = new SplashScreen(screenParams);
44
48.6k
  blendFunc = NULL;
45
48.6k
  strokeAlpha = 1;
46
48.6k
  fillAlpha = 1;
47
48.6k
  lineWidth = 1;
48
48.6k
  lineCap = splashLineCapButt;
49
48.6k
  lineJoin = splashLineJoinMiter;
50
48.6k
  miterLimit = 10;
51
48.6k
  flatness = 1;
52
48.6k
  lineDash = NULL;
53
48.6k
  lineDashLength = 0;
54
48.6k
  lineDashPhase = 0;
55
48.6k
  strokeAdjust = splashStrokeAdjustOff;
56
48.6k
  alphaIsShape = gFalse;
57
48.6k
  clip = new SplashClip(0, 0, width, height);
58
48.6k
  clipIsShared = gFalse;
59
48.6k
  softMask = NULL;
60
48.6k
  deleteSoftMask = gFalse;
61
48.6k
  inNonIsolatedGroup = gFalse;
62
48.6k
  inKnockoutGroup = gFalse;
63
48.6k
#if SPLASH_CMYK
64
48.6k
  rgbTransferR = (Guchar *)gmalloc(8 * 256);
65
48.6k
  rgbTransferG = rgbTransferR + 256;
66
48.6k
  rgbTransferB = rgbTransferG + 256;
67
48.6k
  grayTransfer = rgbTransferB + 256;
68
48.6k
  cmykTransferC = grayTransfer + 256;
69
48.6k
  cmykTransferM = cmykTransferC + 256;
70
48.6k
  cmykTransferY = cmykTransferM + 256;
71
48.6k
  cmykTransferK = cmykTransferY + 256;
72
#else
73
  rgbTransferR = (Guchar *)gmalloc(4 * 256);
74
  rgbTransferG = rgbTransferR + 256;
75
  rgbTransferB = rgbTransferG + 256;
76
  grayTransfer = rgbTransferB + 256;
77
#endif
78
12.5M
  for (i = 0; i < 256; ++i) {
79
12.4M
    rgbTransferR[i] = (Guchar)i;
80
12.4M
    rgbTransferG[i] = (Guchar)i;
81
12.4M
    rgbTransferB[i] = (Guchar)i;
82
12.4M
    grayTransfer[i] = (Guchar)i;
83
12.4M
#if SPLASH_CMYK
84
12.4M
    cmykTransferC[i] = (Guchar)i;
85
12.4M
    cmykTransferM[i] = (Guchar)i;
86
12.4M
    cmykTransferY[i] = (Guchar)i;
87
12.4M
    cmykTransferK[i] = (Guchar)i;
88
12.4M
#endif
89
12.4M
  }
90
48.6k
  transferIsShared = gFalse;
91
48.6k
  overprintMask = 0xffffffff;
92
48.6k
  enablePathSimplification = gFalse;
93
48.6k
  next = NULL;
94
48.6k
}
95
96
SplashState::SplashState(int width, int height, GBool vectorAntialias,
97
1.19k
       SplashScreen *screenA) {
98
1.19k
  SplashColor color;
99
1.19k
  int i;
100
101
1.19k
  matrix[0] = 1;  matrix[1] = 0;
102
1.19k
  matrix[2] = 0;  matrix[3] = 1;
103
1.19k
  matrix[4] = 0;  matrix[5] = 0;
104
1.19k
  memset(&color, 0, sizeof(SplashColor));
105
1.19k
  strokePattern = new SplashSolidColor(color);
106
1.19k
  fillPattern = new SplashSolidColor(color);
107
1.19k
  screen = screenA->copy();
108
1.19k
  blendFunc = NULL;
109
1.19k
  strokeAlpha = 1;
110
1.19k
  fillAlpha = 1;
111
1.19k
  lineWidth = 1;
112
1.19k
  lineCap = splashLineCapButt;
113
1.19k
  lineJoin = splashLineJoinMiter;
114
1.19k
  miterLimit = 10;
115
1.19k
  flatness = 1;
116
1.19k
  lineDash = NULL;
117
1.19k
  lineDashLength = 0;
118
1.19k
  lineDashPhase = 0;
119
1.19k
  strokeAdjust = splashStrokeAdjustOff;
120
1.19k
  alphaIsShape = gFalse;
121
1.19k
  clip = new SplashClip(0, 0, width, height);
122
1.19k
  clipIsShared = gFalse;
123
1.19k
  softMask = NULL;
124
1.19k
  deleteSoftMask = gFalse;
125
1.19k
  inNonIsolatedGroup = gFalse;
126
1.19k
  inKnockoutGroup = gFalse;
127
1.19k
#if SPLASH_CMYK
128
1.19k
  rgbTransferR = (Guchar *)gmalloc(8 * 256);
129
1.19k
  rgbTransferG = rgbTransferR + 256;
130
1.19k
  rgbTransferB = rgbTransferG + 256;
131
1.19k
  grayTransfer = rgbTransferB + 256;
132
1.19k
  cmykTransferC = grayTransfer + 256;
133
1.19k
  cmykTransferM = cmykTransferC + 256;
134
1.19k
  cmykTransferY = cmykTransferM + 256;
135
1.19k
  cmykTransferK = cmykTransferY + 256;
136
#else
137
  rgbTransferR = (Guchar *)gmalloc(4 * 256);
138
  rgbTransferG = rgbTransferR + 256;
139
  rgbTransferB = rgbTransferG + 256;
140
  grayTransfer = rgbTransferB + 256;
141
#endif
142
307k
  for (i = 0; i < 256; ++i) {
143
306k
    rgbTransferR[i] = (Guchar)i;
144
306k
    rgbTransferG[i] = (Guchar)i;
145
306k
    rgbTransferB[i] = (Guchar)i;
146
306k
    grayTransfer[i] = (Guchar)i;
147
306k
#if SPLASH_CMYK
148
306k
    cmykTransferC[i] = (Guchar)i;
149
306k
    cmykTransferM[i] = (Guchar)i;
150
306k
    cmykTransferY[i] = (Guchar)i;
151
306k
    cmykTransferK[i] = (Guchar)i;
152
306k
#endif
153
306k
  }
154
1.19k
  transferIsShared = gFalse;
155
1.19k
  overprintMask = 0xffffffff;
156
1.19k
  enablePathSimplification = gFalse;
157
1.19k
  next = NULL;
158
1.19k
}
159
160
1.93M
SplashState::SplashState(SplashState *state) {
161
1.93M
  memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord));
162
1.93M
  strokePattern = state->strokePattern->copy();
163
1.93M
  fillPattern = state->fillPattern->copy();
164
1.93M
  screen = state->screen->copy();
165
1.93M
  blendFunc = state->blendFunc;
166
1.93M
  strokeAlpha = state->strokeAlpha;
167
1.93M
  fillAlpha = state->fillAlpha;
168
1.93M
  lineWidth = state->lineWidth;
169
1.93M
  lineCap = state->lineCap;
170
1.93M
  lineJoin = state->lineJoin;
171
1.93M
  miterLimit = state->miterLimit;
172
1.93M
  flatness = state->flatness;
173
1.93M
  if (state->lineDash) {
174
1.97k
    lineDashLength = state->lineDashLength;
175
1.97k
    lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
176
1.97k
    memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
177
1.93M
  } else {
178
1.93M
    lineDash = NULL;
179
1.93M
    lineDashLength = 0;
180
1.93M
  }
181
1.93M
  lineDashPhase = state->lineDashPhase;
182
1.93M
  strokeAdjust = state->strokeAdjust;
183
1.93M
  alphaIsShape = state->alphaIsShape;
184
1.93M
  clip = state->clip;
185
1.93M
  clipIsShared = gTrue;
186
1.93M
  softMask = state->softMask;
187
1.93M
  deleteSoftMask = gFalse;
188
1.93M
  inNonIsolatedGroup = state->inNonIsolatedGroup;
189
1.93M
  inKnockoutGroup = state->inKnockoutGroup;
190
1.93M
  rgbTransferR = state->rgbTransferR;
191
1.93M
  rgbTransferG = state->rgbTransferG;
192
1.93M
  rgbTransferB = state->rgbTransferB;
193
1.93M
  grayTransfer = state->grayTransfer;
194
1.93M
#if SPLASH_CMYK
195
1.93M
  cmykTransferC = state->cmykTransferC;
196
1.93M
  cmykTransferM = state->cmykTransferM;
197
1.93M
  cmykTransferY = state->cmykTransferY;
198
1.93M
  cmykTransferK = state->cmykTransferK;
199
1.93M
#endif
200
1.93M
  transferIsShared = gTrue;
201
1.93M
  overprintMask = state->overprintMask;
202
1.93M
  enablePathSimplification = state->enablePathSimplification;
203
1.93M
  next = NULL;
204
1.93M
}
205
206
1.98M
SplashState::~SplashState() {
207
1.98M
  delete strokePattern;
208
1.98M
  delete fillPattern;
209
1.98M
  delete screen;
210
1.98M
  gfree(lineDash);
211
1.98M
  if (!clipIsShared) {
212
145k
    delete clip;
213
145k
  }
214
1.98M
  if (!transferIsShared) {
215
50.3k
    gfree(rgbTransferR);
216
50.3k
  }
217
1.98M
  if (deleteSoftMask && softMask) {
218
289
    delete softMask;
219
289
  }
220
1.98M
}
221
222
106k
void SplashState::setStrokePattern(SplashPattern *strokePatternA) {
223
106k
  delete strokePattern;
224
106k
  strokePattern = strokePatternA;
225
106k
}
226
227
1.15M
void SplashState::setFillPattern(SplashPattern *fillPatternA) {
228
1.15M
  delete fillPattern;
229
1.15M
  fillPattern = fillPatternA;
230
1.15M
}
231
232
0
void SplashState::setScreen(SplashScreen *screenA) {
233
0
  delete screen;
234
0
  screen = screenA;
235
0
}
236
237
void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
238
84.1k
            SplashCoord lineDashPhaseA) {
239
84.1k
  gfree(lineDash);
240
84.1k
  lineDashLength = lineDashLengthA;
241
84.1k
  if (lineDashLength > 0) {
242
849
    lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
243
849
    memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
244
83.3k
  } else {
245
83.3k
    lineDash = NULL;
246
83.3k
  }
247
84.1k
  lineDashPhase = lineDashPhaseA;
248
84.1k
}
249
250
0
GBool SplashState::lineDashContainsZeroLengthDashes() {
251
0
  int i;
252
253
0
  if (lineDashLength == 0) {
254
0
    return gFalse;
255
0
  }
256
257
  // if the line dash array has an odd number of elements, we need to
258
  // check all of the elements; if the length is even, we only need to
259
  // check even-number elements
260
0
  if (lineDashLength & 1) {
261
0
    for (i = 0; i < lineDashLength; ++i) {
262
0
      if (lineDash[i] == 0) {
263
0
  return gTrue;
264
0
      }
265
0
    }
266
0
  } else {
267
0
    for (i = 0; i < lineDashLength; i += 2) {
268
0
      if (lineDash[i] == 0) {
269
0
  return gTrue;
270
0
      }
271
0
    }
272
0
  }
273
0
  return gFalse;
274
0
}
275
276
void SplashState::clipResetToRect(SplashCoord x0, SplashCoord y0,
277
0
          SplashCoord x1, SplashCoord y1) {
278
0
  if (clipIsShared) {
279
0
    clip = clip->copy();
280
0
    clipIsShared = gFalse;
281
0
  }
282
0
  clip->resetToRect(x0, y0, x1, y1);
283
0
}
284
285
SplashError SplashState::clipToRect(SplashCoord x0, SplashCoord y0,
286
0
            SplashCoord x1, SplashCoord y1) {
287
0
  if (clipIsShared) {
288
0
    clip = clip->copy();
289
0
    clipIsShared = gFalse;
290
0
  }
291
0
  return clip->clipToRect(x0, y0, x1, y1);
292
0
}
293
294
109k
SplashError SplashState::clipToPath(SplashPath *path, GBool eo) {
295
109k
  if (clipIsShared) {
296
95.7k
    clip = clip->copy();
297
95.7k
    clipIsShared = gFalse;
298
95.7k
  }
299
109k
  return clip->clipToPath(path, matrix, flatness, eo,
300
109k
        enablePathSimplification, strokeAdjust);
301
109k
}
302
303
2.91k
void SplashState::setSoftMask(SplashBitmap *softMaskA, GBool deleteBitmap) {
304
2.91k
  if (deleteSoftMask) {
305
1.20k
    delete softMask;
306
1.20k
  }
307
2.91k
  softMask = softMaskA;
308
2.91k
  deleteSoftMask = deleteBitmap;
309
2.91k
}
310
311
void SplashState::setTransfer(Guchar *red, Guchar *green, Guchar *blue,
312
548
            Guchar *gray) {
313
548
#if SPLASH_CMYK
314
548
  int i;
315
548
#endif
316
317
548
  if (transferIsShared) {
318
446
#if SPLASH_CMYK
319
446
    rgbTransferR = (Guchar *)gmalloc(8 * 256);
320
446
    rgbTransferG = rgbTransferR + 256;
321
446
    rgbTransferB = rgbTransferG + 256;
322
446
    grayTransfer = rgbTransferB + 256;
323
446
    cmykTransferC = grayTransfer + 256;
324
446
    cmykTransferM = cmykTransferC + 256;
325
446
    cmykTransferY = cmykTransferM + 256;
326
446
    cmykTransferK = cmykTransferY + 256;
327
#else
328
    rgbTransferR = (Guchar *)gmalloc(4 * 256);
329
    rgbTransferG = rgbTransferR + 256;
330
    rgbTransferB = rgbTransferG + 256;
331
    grayTransfer = rgbTransferB + 256;
332
#endif
333
446
    transferIsShared = gFalse;
334
446
  }
335
548
  memcpy(rgbTransferR, red, 256);
336
548
  memcpy(rgbTransferG, green, 256);
337
548
  memcpy(rgbTransferB, blue, 256);
338
548
  memcpy(grayTransfer, gray, 256);
339
548
#if SPLASH_CMYK
340
140k
  for (i = 0; i < 256; ++i) {
341
140k
    cmykTransferC[i] = (Guchar)(255 - rgbTransferR[255 - i]);
342
140k
    cmykTransferM[i] = (Guchar)(255 - rgbTransferG[255 - i]);
343
140k
    cmykTransferY[i] = (Guchar)(255 - rgbTransferB[255 - i]);
344
140k
    cmykTransferK[i] = (Guchar)(255 - grayTransfer[255 - i]);
345
140k
  }
346
548
#endif
347
548
}
348