summaryrefslogtreecommitdiffstats
path: root/ue2/imgsynth2/cbitmap.h
blob: 785e2f11d682cd125213efd9887b644d82eae143 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/**
 * @module cbitmap
 * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
 * @brief  Abstract implementation of CFile handling Bitmaps.
 * @date   17.04.2009
 */

#ifndef CBITMAP_H
#define CBITMAP_H

#include <stdint.h>
#include <map>
#include "cfile.h"
#include "cpixelformat.h"

/**
 * @class CBitmap
 * @brief Implementation of CFile handling Bitmaps.
 *
 * In order to support operations on bitmaps with different color bitcounts
 * different implementations of CPixelFormat are used. These classes are
 * allowed to modify the bitmap headers and pixelbuffer directly.
 *
 * On error CFile::FileError is thrown.
 */
class CBitmap : public CFile
{
  public:
    /**
     * @method CBitmap
     * @brief  Default ctor
     * @param  -
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    CBitmap()
      : m_pixeldata(NULL), m_pixelformat(NULL), m_rowsize(0)
    {}


    /**
     * @method ~CBitmap
     * @brief  Default dtor
     * @param  -
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual ~CBitmap();

    /**
     * @method read
     * @brief  Reads Windows Bitmap from filestream.
     *         On error an exception is thrown.
     * @param  in filestream to read data from
     * @return -
     * @globalvars none
     * @exception CFile::FileError
     * @exception bad_alloc
     * @conditions none
     */
    virtual void read(std::ifstream& in) = 0;

    /**
     * @method write
     * @brief  Writes Windows Bitmap to filestream.
     * @param  out      filestream to read data from
     * @return -
     * @globalvars none
     * @exception  FileError
     * @exception  bad_alloc
     * @conditions none
     */
    virtual void write(std::ofstream& out) = 0;

    /**
     * @method getPixelData
     * @brief  Returns pointer to pixelbuffer
     * @param  -
     * @return pointer to pixelbuffer
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    uint8_t *getPixelData()
    {
      return m_pixeldata;
    }

    /**
     * @method getColorTable
     * @brief  Returns reference to colortable
     * @param  -
     * @return reference to colortable
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    std::map<uint32_t, CPixelFormat::RGBPIXEL *>& getColorTable()
    {
      return m_colortable;
    }

    /**
     * @method getRowSize
     * @brief  Returns number of bytes of one row
     * @param  -
     * @return number of bytes of one row
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    uint32_t getRowSize()
    {
      return m_rowsize;
    }

    /**
     * @method getPixelDataSize
     * @brief  Return size of pixelbuffer
     * @param  -
     * @return size of pixelbuffer
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const uint32_t getPixelDataSize() = 0;

    /**
     * @method getHeight
     * @brief  Return height of bitmap in pixel
     * @param  -
     * @return height of bitmap in pixel
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const uint32_t getHeight() = 0;

    /**
     * @method getWidth
     * @brief  Return width of bitmap in pixel
     * @param  -
     * @return width of bitmap in pixel
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const uint32_t getWidth() = 0;

    /**
     * @method isMirrored
     * @brief  Windows Bitmaps can be stored upside down
     * @param  -
     * @return true if bitmap is stored upside down. false otherwise
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const bool isMirrored() = 0;

    /**
     * @method hasColorTable
     * @brief  Check if bitmap has a colortable
     *         (we don't support this yet for windows bitmaps)
     * @param  -
     * @return true if bitmap has a colortable. false otherwise
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const bool hasColorTable() = 0;

  protected:
    /**
     * @method callFunc
     * @brief  Delegates the function and its parameters to the correct
     *         internal method
     * @param  func   function name
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  ParserError
     * @conditions none
     */
    void callFunc(const std::string& func, const std::list<std::string>& params);

    /**
     * @method fillrect
     * @brief  Fills rectangle in image starting on position x, y
     *         width size width, height and color red, green, blue.
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  FileError
     * @conditions none
     *
     * Scriptfile syntax: fillrect(x, y, width, height, red, green, blue)
     */
    void fillrect(std::list<std::string> params);

    /**
     * @method invert
     * @brief  Invert image
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  FileError
     * @conditions none
     *
     * Scriptfile syntax: invert()
     */
    void invert(std::list<std::string> params);

    /**
     * @method brightness
     * @brief  Increase/decrease brightness of image
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  FileError
     * @conditions none
     *
     * Scriptfile syntax: brightness(factor)
     */
    void brightness(std::list<std::string> params);

    /**
     * @method mirror_y
     * @brief  Mirror image around the y-axis
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  FileError
     * @conditions none
     *
     * Scriptfile syntax: mirror_y()
     */
    void mirror_y(std::list<std::string> params);

    /**
     * @method mirror_x
     * @brief  Mirror image around the x-axis
     * @param  params function parameters as list
     * @return -
     * @globalvars none
     * @exception  FileError
     * @conditions none
     *
     * Scriptfile syntax: mirror_y()
     */
    void mirror_x(std::list<std::string> params);

    /* members */
    /** pointer to pixelbuffer */
    uint8_t *m_pixeldata;
    /** colortable map */
    std::map<uint32_t, CPixelFormat::RGBPIXEL *> m_colortable;
    /** set of supported PixelFormat handlers */
    std::set<CPixelFormat *> m_handlers;
    /** pointer to CPixelFormat implementation */
    CPixelFormat *m_pixelformat;
    /** number of bytes of one row in the image */
    uint32_t m_rowsize;
};

#endif

/* vim: set et sw=2 ts=2: */