Coverage Report

Created: 2026-02-04 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/splash/SplashBitmap.h
Line
Count
Source
1
//========================================================================
2
//
3
// SplashBitmap.h
4
//
5
// Copyright 2003-2013 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#ifndef SPLASHBITMAP_H
10
#define SPLASHBITMAP_H
11
12
#include <aconf.h>
13
14
#include <stdio.h>
15
#include <limits.h>
16
// older compilers won't define SIZE_MAX in stdint.h without this
17
#ifndef __STDC_LIMIT_MACROS
18
#  define __STDC_LIMIT_MACROS 1
19
#endif
20
#include <stdint.h>
21
#include "SplashTypes.h"
22
23
//------------------------------------------------------------------------
24
25
// ssize_t isn't well-defined, so define our own
26
#if SIZE_MAX == UINT_MAX
27
  typedef int SplashBitmapRowSize;
28
# define SplashBitmapRowSizeMax INT_MAX
29
#else
30
  typedef long long SplashBitmapRowSize;
31
# define SplashBitmapRowSizeMax LLONG_MAX
32
#endif
33
34
//------------------------------------------------------------------------
35
// SplashBitmapMemCache
36
//------------------------------------------------------------------------
37
38
102k
#define splashBitmapMemCacheSize 4
39
40
struct SplashBitmapMemCacheEntry {
41
  void *data;
42
  int height;
43
  SplashBitmapRowSize rowSize;
44
};
45
46
// This holds onto a small number of freed bitmaps so they can be
47
// reused, avoiding system overhead for (re)allocating large chunks of
48
// memory. It's not thread-safe, so it needs to be owned by a single
49
// thread.
50
class SplashBitmapMemCache {
51
public:
52
53
  SplashBitmapMemCache();
54
  ~SplashBitmapMemCache();
55
56
private:
57
58
  void *alloc(int height, SplashBitmapRowSize rowSize);
59
  void free(void *data, int height, SplashBitmapRowSize rowSize);
60
61
  SplashBitmapMemCacheEntry cache[splashBitmapMemCacheSize];
62
63
  friend class SplashBitmap;
64
  friend class SplashAlphaBitmap;
65
};
66
67
//------------------------------------------------------------------------
68
// SplashBitmap
69
//------------------------------------------------------------------------
70
71
class SplashBitmap {
72
public:
73
74
  // Create a new bitmap.  It will have <widthA> x <heightA> pixels in
75
  // color mode <modeA>.  Rows will be padded out to a multiple of
76
  // <rowPad> bytes.  If <topDown> is false, the bitmap will be stored
77
  // upside-down, i.e., with the last row first in memory.
78
  SplashBitmap(int widthA, int heightA, int rowPad,
79
         SplashColorMode modeA, GBool alphaA,
80
         GBool topDown, SplashBitmapMemCache *cacheA);
81
82
  ~SplashBitmap();
83
84
355k
  int getWidth() { return width; }
85
249k
  int getHeight() { return height; }
86
126k
  SplashBitmapRowSize getRowSize() { return rowSize; }
87
1.70k
  size_t getAlphaRowSize() { return alphaRowSize; }
88
7.91k
  SplashColorMode getMode() { return mode; }
89
126k
  SplashColorPtr getDataPtr() { return data; }
90
111k
  Guchar *getAlphaPtr() { return alpha; }
91
92
  SplashError writePNMFile(char *fileName);
93
  SplashError writePNMFile(FILE *f);
94
  SplashError writeAlphaPGMFile(char *fileName);
95
96
  void getPixel(int x, int y, SplashColorPtr pixel);
97
  Guchar getAlpha(int x, int y);
98
99
  // Caller takes ownership of the bitmap data.  The SplashBitmap
100
  // object is no longer valid -- the next call should be to the
101
  // destructor.
102
  SplashColorPtr takeData();
103
104
  void doNotCache();
105
106
private:
107
108
  int width, height;    // size of bitmap
109
  SplashBitmapRowSize rowSize;  // size of one row of data, in bytes
110
        //   - negative for bottom-up bitmaps
111
  size_t alphaRowSize;    // size of one row of alpha, in bytes
112
  SplashColorMode mode;   // color mode
113
  SplashColorPtr data;    // pointer to row zero of the color data
114
  Guchar *alpha;    // pointer to row zero of the alpha data
115
        //   (always top-down)
116
117
  SplashBitmapMemCache *cache;
118
119
  friend class Splash;
120
};
121
122
123
//------------------------------------------------------------------------
124
// SplashAlphaBitmap
125
//------------------------------------------------------------------------
126
127
class SplashAlphaBitmap {
128
public:
129
130
  // Create a new alpha bitmap with <widthA> x <heightA> pixels.
131
  SplashAlphaBitmap(int widthA, int heightA, SplashBitmapMemCache *cacheA);
132
133
  ~SplashAlphaBitmap();
134
135
0
  int getWidth() { return width; }
136
0
  int getHeight() { return height; }
137
0
  size_t getAlphaRowSize() { return alphaRowSize; }
138
0
  Guchar *getAlphaPtr() { return alpha; }
139
140
private:
141
142
  int width, height;    // size of bitmap
143
  size_t alphaRowSize;    // size of one row, in bytes
144
  Guchar *alpha;    // pointer to the alpha data
145
146
  SplashBitmapMemCache *cache;
147
148
  friend class Splash;
149
};
150
151
#endif