1 /*
2  * gdiplusimageattributes.h
3  *
4  * GDI+ ImageAttributes class
5  *
6  * This file is part of the w32api package.
7  *
8  * Contributors:
9  *   Created by Markus Koenig <[email protected]>
10  *
11  * THIS SOFTWARE IS NOT COPYRIGHTED
12  *
13  * This source code is offered for use in the public domain. You may
14  * use, modify or distribute it freely.
15  *
16  * This code is distributed in the hope that it will be useful but
17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18  * DISCLAIMED. This includes but is not limited to warranties of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  */
22 
23 #ifndef __GDIPLUS_IMAGEATTRIBUTES_H
24 #define __GDIPLUS_IMAGEATTRIBUTES_H
25 #if __GNUC__ >=3
26 #pragma GCC system_header
27 #endif
28 
29 #ifndef __cplusplus
30 #error "A C++ compiler is required to include gdiplusimageattributes.h."
31 #endif
32 
33 class ImageAttributes: public GdiplusBase
34 {
35 	friend class Graphics;
36 	friend class TextureBrush;
37 
38 public:
ImageAttributes()39 	ImageAttributes(): nativeImageAttributes(NULL), lastStatus(Ok)
40 	{
41 		lastStatus = DllExports::GdipCreateImageAttributes(
42 				&nativeImageAttributes);
43 	}
~ImageAttributes()44 	~ImageAttributes()
45 	{
46 		DllExports::GdipDisposeImageAttributes(nativeImageAttributes);
47 	}
Clone()48 	ImageAttributes* Clone() const
49 	{
50 		GpImageAttributes *cloneImageAttributes = NULL;
51 		Status status = updateStatus(DllExports::GdipCloneImageAttributes(
52 				nativeImageAttributes, &cloneImageAttributes));
53 		if (status == Ok) {
54 			ImageAttributes *result = new ImageAttributes(
55 					cloneImageAttributes, lastStatus);
56 			if (!result) {
57 				DllExports::GdipDisposeImageAttributes(cloneImageAttributes);
58 				lastStatus = OutOfMemory;
59 			}
60 			return result;
61 		} else {
62 			return NULL;
63 		}
64 	}
65 
ClearBrushRemapTable()66 	Status ClearBrushRemapTable()
67 	{
68 		return updateStatus(DllExports::GdipSetImageAttributesRemapTable(
69 				nativeImageAttributes, ColorAdjustTypeBrush,
70 				FALSE, 0, NULL));
71 	}
72 	Status ClearColorKey(ColorAdjustType type = ColorAdjustTypeDefault)
73 	{
74 		return updateStatus(DllExports::GdipSetImageAttributesColorKeys(
75 				nativeImageAttributes, type, FALSE, 0, 0));
76 	}
77 	Status ClearColorMatrices(ColorAdjustType type = ColorAdjustTypeDefault)
78 	{
79 		return updateStatus(DllExports::GdipSetImageAttributesColorMatrix(
80 				nativeImageAttributes, type, FALSE,
81 				NULL, NULL, ColorMatrixFlagsDefault));
82 	}
83 	Status ClearColorMatrix(ColorAdjustType type = ColorAdjustTypeDefault)
84 	{
85 		return updateStatus(DllExports::GdipSetImageAttributesColorMatrix(
86 				nativeImageAttributes, type, FALSE,
87 				NULL, NULL, ColorMatrixFlagsDefault));
88 	}
89 	Status ClearGamma(ColorAdjustType type = ColorAdjustTypeDefault)
90 	{
91 		return updateStatus(DllExports::GdipSetImageAttributesGamma(
92 				nativeImageAttributes, type, FALSE, 1.0f));
93 	}
94 	Status ClearNoOp(ColorAdjustType type = ColorAdjustTypeDefault)
95 	{
96 		return updateStatus(DllExports::GdipSetImageAttributesNoOp(
97 				nativeImageAttributes, type, FALSE));
98 	}
99 	Status ClearOutputChannel(ColorAdjustType type = ColorAdjustTypeDefault)
100 	{
101 		return updateStatus(DllExports::GdipSetImageAttributesOutputChannel(
102 				nativeImageAttributes, type, FALSE,
103 				ColorChannelFlagsC));
104 	}
105 	Status ClearOutputChannelColorProfile(
106 			ColorAdjustType type = ColorAdjustTypeDefault)
107 	{
108 		return updateStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
109 				nativeImageAttributes, type, FALSE, NULL));
110 	}
111 	Status ClearRemapTable(ColorAdjustType type = ColorAdjustTypeDefault)
112 	{
113 		return updateStatus(DllExports::GdipSetImageAttributesRemapTable(
114 				nativeImageAttributes, type, FALSE, 0, NULL));
115 	}
116 	Status ClearThreshold(ColorAdjustType type = ColorAdjustTypeDefault)
117 	{
118 		return updateStatus(DllExports::GdipSetImageAttributesThreshold(
119 				nativeImageAttributes, type, FALSE, 0.0));
120 	}
GetAdjustedPalette(ColorPalette * colorPalette,ColorAdjustType type)121 	Status GetAdjustedPalette(ColorPalette *colorPalette,
122 			ColorAdjustType type) const
123 	{
124 		return updateStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
125 				nativeImageAttributes, colorPalette, type));
126 	}
GetLastStatus()127 	Status GetLastStatus() const
128 	{
129 		Status result = lastStatus;
130 		lastStatus = Ok;
131 		return result;
132 	}
133 	Status Reset(ColorAdjustType type = ColorAdjustTypeDefault)
134 	{
135 		return updateStatus(DllExports::GdipResetImageAttributes(
136 				nativeImageAttributes, type));
137 	}
SetBrushRemapTable(UINT mapSize,ColorMap * map)138 	Status SetBrushRemapTable(UINT mapSize, ColorMap *map)
139 	{
140 		return updateStatus(DllExports::GdipSetImageAttributesRemapTable(
141 				nativeImageAttributes, ColorAdjustTypeBrush,
142 				TRUE, mapSize, map));
143 	}
144 	Status SetColorKey(const Color& colorLow, const Color& colorHigh,
145 			ColorAdjustType type = ColorAdjustTypeDefault)
146 	{
147 		return updateStatus(DllExports::GdipSetImageAttributesColorKeys(
148 				nativeImageAttributes, type, TRUE,
149 				colorLow.GetValue(), colorHigh.GetValue()));
150 	}
151 	Status SetColorMatrices(const ColorMatrix *colorMatrix,
152 			const ColorMatrix *grayMatrix,
153 			ColorMatrixFlags mode = ColorMatrixFlagsDefault,
154 			ColorAdjustType type = ColorAdjustTypeDefault)
155 	{
156 		return updateStatus(DllExports::GdipSetImageAttributesColorMatrix(
157 				nativeImageAttributes, type, TRUE,
158 				colorMatrix, grayMatrix, mode));
159 	}
160 	Status SetColorMatrix(const ColorMatrix *colorMatrix,
161 			ColorMatrixFlags mode = ColorMatrixFlagsDefault,
162 			ColorAdjustType type = ColorAdjustTypeDefault)
163 	{
164 		return updateStatus(DllExports::GdipSetImageAttributesColorMatrix(
165 				nativeImageAttributes, type, TRUE,
166 				colorMatrix, NULL, mode));
167 	}
168 	Status SetGamma(REAL gamma,
169 			ColorAdjustType type = ColorAdjustTypeDefault)
170 	{
171 		return updateStatus(DllExports::GdipSetImageAttributesGamma(
172 				nativeImageAttributes, type, TRUE, gamma));
173 	}
174 	Status SetNoOp(ColorAdjustType type = ColorAdjustTypeDefault)
175 	{
176 		return updateStatus(DllExports::GdipSetImageAttributesNoOp(
177 				nativeImageAttributes, type, TRUE));
178 	}
179 	Status SetOutputChannel(ColorChannelFlags channelFlags,
180 			ColorAdjustType type = ColorAdjustTypeDefault)
181 	{
182 		return updateStatus(DllExports::GdipSetImageAttributesOutputChannel(
183 				nativeImageAttributes, type, TRUE,
184 				channelFlags));
185 	}
186 	Status SetOutputChannelColorProfile(const WCHAR *colorProfileFilename,
187 			ColorAdjustType type = ColorAdjustTypeDefault)
188 	{
189 		return updateStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
190 				nativeImageAttributes, type, TRUE,
191 				colorProfileFilename));
192 	}
193 	Status SetRemapTable(UINT mapSize, const ColorMap *map,
194 			ColorAdjustType type = ColorAdjustTypeDefault)
195 	{
196 		return updateStatus(DllExports::GdipSetImageAttributesRemapTable(
197 				nativeImageAttributes, type, TRUE,
198 				mapSize, map));
199 	}
200 	Status SetThreshold(REAL threshold,
201 			ColorAdjustType type = ColorAdjustTypeDefault)
202 	{
203 		return updateStatus(DllExports::GdipSetImageAttributesThreshold(
204 				nativeImageAttributes, type, TRUE, threshold));
205 	}
206 	Status SetToIdentity(ColorAdjustType type = ColorAdjustTypeDefault)
207 	{
208 		return updateStatus(DllExports::GdipSetImageAttributesToIdentity(
209 				nativeImageAttributes, type));
210 	}
211 	Status SetWrapMode(WrapMode wrap, const Color& color = Color(),
212 			BOOL clamp = FALSE)
213 	{
214 		return updateStatus(DllExports::GdipSetImageAttributesWrapMode(
215 				nativeImageAttributes, wrap,
216 				color.GetValue(), clamp));
217 	}
218 
219 private:
ImageAttributes(GpImageAttributes * imageAttributes,Status status)220 	ImageAttributes(GpImageAttributes *imageAttributes, Status status):
221 		nativeImageAttributes(imageAttributes), lastStatus(status) {}
222 	ImageAttributes(const ImageAttributes&);
223 	ImageAttributes& operator=(const ImageAttributes&);
224 
updateStatus(Status newStatus)225 	Status updateStatus(Status newStatus) const
226 	{
227 		if (newStatus != Ok) lastStatus = newStatus;
228 		return newStatus;
229 	}
230 
231 	GpImageAttributes *nativeImageAttributes;
232 	mutable Status lastStatus;
233 };
234 
235 
236 #endif /* __GDIPLUS_IMAGEATTRIBUTES_H */
237