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 #ifdef USE_GCC_PRAGMAS
15 #pragma interface
16 #endif
17 
18 #include <stdio.h>
19 #include <limits.h>
20 // older compilers won't define SIZE_MAX in stdint.h without this
21 #ifndef __STDC_LIMIT_MACROS
22 #  define __STDC_LIMIT_MACROS 1
23 #endif
24 #include <stdint.h>
25 #include "SplashTypes.h"
26 
27 //------------------------------------------------------------------------
28 
29 // ssize_t isn't well-defined, so define our own
30 #if SIZE_MAX == UINT_MAX
31   typedef int SplashBitmapRowSize;
32 # define SplashBitmapRowSizeMax INT_MAX
33 #else
34   typedef long long SplashBitmapRowSize;
35 # define SplashBitmapRowSizeMax LLONG_MAX
36 #endif
37 
38 //------------------------------------------------------------------------
39 // SplashBitmap
40 //------------------------------------------------------------------------
41 
42 class SplashBitmap {
43 public:
44 
45   // Create a new bitmap.  It will have <widthA> x <heightA> pixels in
46   // color mode <modeA>.  Rows will be padded out to a multiple of
47   // <rowPad> bytes.  If <topDown> is false, the bitmap will be stored
48   // upside-down, i.e., with the last row first in memory.
49   SplashBitmap(int widthA, int heightA, int rowPad,
50 	       SplashColorMode modeA, GBool alphaA,
51 	       GBool topDown, SplashBitmap *parentA);
52 
53   ~SplashBitmap();
54 
getWidth()55   int getWidth() { return width; }
getHeight()56   int getHeight() { return height; }
getRowSize()57   SplashBitmapRowSize getRowSize() { return rowSize; }
getAlphaRowSize()58   size_t getAlphaRowSize() { return alphaRowSize; }
getMode()59   SplashColorMode getMode() { return mode; }
getDataPtr()60   SplashColorPtr getDataPtr() { return data; }
getAlphaPtr()61   Guchar *getAlphaPtr() { return alpha; }
62 
63   SplashError writePNMFile(char *fileName);
64   SplashError writePNMFile(FILE *f);
65   SplashError writeAlphaPGMFile(char *fileName);
66 
67   void getPixel(int x, int y, SplashColorPtr pixel);
68   Guchar getAlpha(int x, int y);
69 
70   // Caller takes ownership of the bitmap data.  The SplashBitmap
71   // object is no longer valid -- the next call should be to the
72   // destructor.
73   SplashColorPtr takeData();
74 
75 private:
76 
77   int width, height;		// size of bitmap
78   SplashBitmapRowSize rowSize;	// size of one row of data, in bytes
79 				//   - negative for bottom-up bitmaps
80   size_t alphaRowSize;		// size of one row of alpha, in bytes
81   SplashColorMode mode;		// color mode
82   SplashColorPtr data;		// pointer to row zero of the color data
83   Guchar *alpha;		// pointer to row zero of the alpha data
84 				//   (always top-down)
85 
86   // save the last-allocated (large) bitmap data and reuse if possible
87   SplashBitmap *parent;
88   SplashColorPtr oldData;
89   Guchar *oldAlpha;
90   SplashBitmapRowSize oldRowSize;
91   size_t oldAlphaRowSize;
92   int oldHeight;
93 
94   friend class Splash;
95 };
96 
97 
98 #endif
99