6 * This file is part of the w32api package.
\r
9 * Created by Markus Koenig <markus@stber-koenig.de>
\r
11 * THIS SOFTWARE IS NOT COPYRIGHTED
\r
13 * This source code is offered for use in the public domain. You may
\r
14 * use, modify or distribute it freely.
\r
16 * This code is distributed in the hope that it will be useful but
\r
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
\r
18 * DISCLAIMED. This includes but is not limited to warranties of
\r
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\r
23 #ifndef __GDIPLUS_BRUSH_H
\r
24 #define __GDIPLUS_BRUSH_H
\r
26 #pragma GCC system_header
\r
30 #error "A C++ compiler is required to include gdiplusbrush.h."
\r
33 class Brush: public GdiplusBase
\r
35 friend class HatchBrush;
\r
36 friend class LinearGradientBrush;
\r
37 friend class PathGradientBrush;
\r
38 friend class SolidBrush;
\r
39 friend class TextureBrush;
\r
40 friend class Graphics;
\r
46 DllExports::GdipDeleteBrush(nativeBrush);
\r
48 virtual Brush* Clone() const // each subclass must implement this
\r
50 lastStatus = NotImplemented;
\r
54 Status GetLastStatus() const
\r
56 Status result = lastStatus;
\r
60 BrushType GetType() const
\r
62 BrushType result = BrushTypeSolidColor;
\r
63 updateStatus(DllExports::GdipGetBrushType(nativeBrush, &result));
\r
68 Brush(): nativeBrush(NULL), lastStatus(Ok) {}
\r
69 Brush(GpBrush *brush, Status status):
\r
70 nativeBrush(brush), lastStatus(status) {}
\r
71 Brush(const Brush& brush);
\r
72 Brush& operator=(const Brush&);
\r
74 Status updateStatus(Status newStatus) const
\r
76 if (newStatus != Ok) lastStatus = newStatus;
\r
80 GpBrush *nativeBrush;
\r
81 mutable Status lastStatus;
\r
84 class HatchBrush: public Brush
\r
87 HatchBrush(HatchStyle hatchStyle,
\r
88 const Color& foreColor,
\r
89 const Color& backColor = Color())
\r
91 GpHatch *nativeHatch = NULL;
\r
92 lastStatus = DllExports::GdipCreateHatchBrush(hatchStyle,
\r
93 foreColor.GetValue(), backColor.GetValue(),
\r
95 nativeBrush = nativeHatch;
\r
97 virtual HatchBrush* Clone() const
\r
99 GpBrush *cloneBrush = NULL;
\r
100 Status status = updateStatus(DllExports::GdipCloneBrush(
\r
101 nativeBrush, &cloneBrush));
\r
102 if (status == Ok) {
\r
103 HatchBrush *result =
\r
104 new HatchBrush(cloneBrush, lastStatus);
\r
106 DllExports::GdipDeleteBrush(cloneBrush);
\r
107 updateStatus(OutOfMemory);
\r
115 Status GetBackgroundColor(Color *color) const
\r
117 return updateStatus(DllExports::GdipGetHatchBackgroundColor(
\r
118 (GpHatch*) nativeBrush,
\r
119 color ? &color->Value : NULL));
\r
121 Status GetForegroundColor(Color *color) const
\r
123 return updateStatus(DllExports::GdipGetHatchForegroundColor(
\r
124 (GpHatch*) nativeBrush,
\r
125 color ? &color->Value : NULL));
\r
127 HatchStyle GetHatchStyle() const
\r
130 updateStatus(DllExports::GdipGetHatchStyle(
\r
131 (GpHatch*) nativeBrush, &result));
\r
136 HatchBrush(GpBrush *brush, Status status): Brush(brush, status) {}
\r
137 HatchBrush(const HatchBrush& brush);
\r
138 HatchBrush& operator=(const HatchBrush&);
\r
141 class LinearGradientBrush: public Brush
\r
144 LinearGradientBrush(const PointF& point1, const PointF& point2,
\r
145 const Color& color1, const Color& color2)
\r
147 GpLineGradient *nativeLineGradient = NULL;
\r
148 lastStatus = DllExports::GdipCreateLineBrush(
\r
150 color1.GetValue(), color2.GetValue(),
\r
151 WrapModeTile, &nativeLineGradient);
\r
152 nativeBrush = nativeLineGradient;
\r
154 LinearGradientBrush(const Point& point1, const Point& point2,
\r
155 const Color& color1, const Color& color2)
\r
157 GpLineGradient *nativeLineGradient = NULL;
\r
158 lastStatus = DllExports::GdipCreateLineBrushI(
\r
160 color1.GetValue(), color2.GetValue(),
\r
161 WrapModeTile, &nativeLineGradient);
\r
162 nativeBrush = nativeLineGradient;
\r
164 LinearGradientBrush(const RectF& rect, const Color& color1,
\r
165 const Color& color2, LinearGradientMode mode)
\r
167 GpLineGradient *nativeLineGradient = NULL;
\r
168 lastStatus = DllExports::GdipCreateLineBrushFromRect(
\r
169 &rect, color1.GetValue(), color2.GetValue(),
\r
170 mode, WrapModeTile, &nativeLineGradient);
\r
171 nativeBrush = nativeLineGradient;
\r
173 LinearGradientBrush(const Rect& rect, const Color& color1,
\r
174 const Color& color2, LinearGradientMode mode)
\r
176 GpLineGradient *nativeLineGradient = NULL;
\r
177 lastStatus = DllExports::GdipCreateLineBrushFromRectI(
\r
178 &rect, color1.GetValue(), color2.GetValue(),
\r
179 mode, WrapModeTile, &nativeLineGradient);
\r
180 nativeBrush = nativeLineGradient;
\r
182 LinearGradientBrush(const RectF& rect, const Color& color1,
\r
183 const Color& color2, REAL angle,
\r
184 BOOL isAngleScalable = FALSE)
\r
186 GpLineGradient *nativeLineGradient = NULL;
\r
187 lastStatus = DllExports::GdipCreateLineBrushFromRectWithAngle(
\r
188 &rect, color1.GetValue(), color2.GetValue(),
\r
189 angle, isAngleScalable, WrapModeTile,
\r
190 &nativeLineGradient);
\r
191 nativeBrush = nativeLineGradient;
\r
193 LinearGradientBrush(const Rect& rect, const Color& color1,
\r
194 const Color& color2, REAL angle,
\r
195 BOOL isAngleScalable = FALSE)
\r
197 GpLineGradient *nativeLineGradient = NULL;
\r
198 lastStatus = DllExports::GdipCreateLineBrushFromRectWithAngleI(
\r
199 &rect, color1.GetValue(), color2.GetValue(),
\r
200 angle, isAngleScalable, WrapModeTile,
\r
201 &nativeLineGradient);
\r
202 nativeBrush = nativeLineGradient;
\r
204 virtual LinearGradientBrush* Clone() const
\r
206 GpBrush *cloneBrush = NULL;
\r
207 Status status = updateStatus(DllExports::GdipCloneBrush(
\r
208 nativeBrush, &cloneBrush));
\r
209 if (status == Ok) {
\r
210 LinearGradientBrush *result =
\r
211 new LinearGradientBrush(cloneBrush, lastStatus);
\r
213 DllExports::GdipDeleteBrush(cloneBrush);
\r
214 updateStatus(OutOfMemory);
\r
222 Status GetBlend(REAL *blendFactors, REAL *blendPositions,
\r
225 return updateStatus(DllExports::GdipGetLineBlend(
\r
226 (GpLineGradient*) nativeBrush,
\r
227 blendFactors, blendPositions, count));
\r
229 INT GetBlendCount() const
\r
232 updateStatus(DllExports::GdipGetLineBlendCount(
\r
233 (GpLineGradient*) nativeBrush, &result));
\r
236 BOOL GetGammaCorrection() const
\r
238 BOOL result = FALSE;
\r
239 updateStatus(DllExports::GdipGetLineGammaCorrection(
\r
240 (GpLineGradient*) nativeBrush, &result));
\r
243 INT GetInterpolationColorCount() const
\r
246 updateStatus(DllExports::GdipGetLinePresetBlendCount(
\r
247 (GpLineGradient*) nativeBrush, &result));
\r
250 Status GetInterpolationColors(Color *presetColors,
\r
251 REAL *blendPositions, INT count) const
\r
253 if (!presetColors || count <= 0)
\r
254 return lastStatus = InvalidParameter;
\r
257 (ARGB*) DllExports::GdipAlloc(count * sizeof(ARGB));
\r
259 return lastStatus = OutOfMemory;
\r
261 Status status = updateStatus(DllExports::GdipGetLinePresetBlend(
\r
262 (GpLineGradient*) nativeBrush, presetArgb,
\r
263 blendPositions, count));
\r
264 for (INT i = 0; i < count; ++i) {
\r
265 presetColors[i].SetValue(presetArgb[i]);
\r
267 DllExports::GdipFree((void*) presetArgb);
\r
270 Status GetLinearColors(Color *colors) const
\r
272 if (!colors) return lastStatus = InvalidParameter;
\r
274 ARGB colorsArgb[2];
\r
275 Status status = updateStatus(DllExports::GdipGetLineColors(
\r
276 (GpLineGradient*) nativeBrush, colorsArgb));
\r
277 colors[0].SetValue(colorsArgb[0]);
\r
278 colors[1].SetValue(colorsArgb[1]);
\r
281 Status GetRectangle(RectF *rect) const
\r
283 return updateStatus(DllExports::GdipGetLineRect(
\r
284 (GpLineGradient*) nativeBrush, rect));
\r
286 Status GetRectangle(Rect *rect) const
\r
288 return updateStatus(DllExports::GdipGetLineRectI(
\r
289 (GpLineGradient*) nativeBrush, rect));
\r
291 Status GetTransform(Matrix *matrix) const
\r
293 return updateStatus(DllExports::GdipGetLineTransform(
\r
294 (GpLineGradient*) nativeBrush,
\r
295 matrix ? matrix->nativeMatrix : NULL));
\r
297 WrapMode GetWrapMode() const
\r
299 WrapMode wrapMode = WrapModeTile;
\r
300 updateStatus(DllExports::GdipGetLineWrapMode(
\r
301 (GpLineGradient*) nativeBrush, &wrapMode));
\r
304 Status MultiplyTransform(const Matrix *matrix,
\r
305 MatrixOrder order = MatrixOrderPrepend)
\r
307 return updateStatus(DllExports::GdipMultiplyLineTransform(
\r
308 (GpLineGradient*) nativeBrush,
\r
309 matrix ? matrix->nativeMatrix : NULL, order));
\r
311 Status ResetTransform()
\r
313 return updateStatus(DllExports::GdipResetLineTransform(
\r
314 (GpLineGradient*) nativeBrush));
\r
316 Status RotateTranform(REAL angle, MatrixOrder order = MatrixOrderPrepend)
\r
318 return updateStatus(DllExports::GdipRotateLineTransform(
\r
319 (GpLineGradient*) nativeBrush, angle, order));
\r
321 Status ScaleTransform(REAL sx, REAL sy,
\r
322 MatrixOrder order = MatrixOrderPrepend)
\r
324 return updateStatus(DllExports::GdipScaleLineTransform(
\r
325 (GpLineGradient*) nativeBrush, sx, sy, order));
\r
327 Status SetBlend(const REAL *blendFactors,
\r
328 const REAL *blendPositions, INT count)
\r
330 return updateStatus(DllExports::GdipSetLineBlend(
\r
331 (GpLineGradient*) nativeBrush,
\r
332 blendFactors, blendPositions, count));
\r
334 Status SetBlendBellShape(REAL focus, REAL scale = 1.0f)
\r
336 return updateStatus(DllExports::GdipSetLineSigmaBlend(
\r
337 (GpLineGradient*) nativeBrush,
\r
340 Status SetBlendTriangularShape(REAL focus, REAL scale = 1.0f)
\r
342 return updateStatus(DllExports::GdipSetLineLinearBlend(
\r
343 (GpLineGradient*) nativeBrush,
\r
346 Status SetGammaCorrection(BOOL useGammaCorrection)
\r
348 return updateStatus(DllExports::GdipSetLineGammaCorrection(
\r
349 (GpLineGradient*) nativeBrush,
\r
350 useGammaCorrection));
\r
352 Status SetInterpolationColors(const Color *presetColors,
\r
353 const REAL *blendPositions, INT count)
\r
355 if (!presetColors || count < 0)
\r
356 return lastStatus = InvalidParameter;
\r
359 (ARGB*) DllExports::GdipAlloc(count * sizeof(ARGB));
\r
361 return lastStatus = OutOfMemory;
\r
362 for (INT i = 0; i < count; ++i) {
\r
363 presetArgb[i] = presetColors[i].GetValue();
\r
366 Status status = updateStatus(DllExports::GdipSetLinePresetBlend(
\r
367 (GpLineGradient*) nativeBrush,
\r
368 presetArgb, blendPositions, count));
\r
369 DllExports::GdipFree((void*) presetArgb);
\r
372 Status SetLinearColors(const Color& color1, const Color& color2)
\r
374 return updateStatus(DllExports::GdipSetLineColors(
\r
375 (GpLineGradient*) nativeBrush,
\r
376 color1.GetValue(), color2.GetValue()));
\r
378 Status SetTransform(const Matrix *matrix)
\r
380 return updateStatus(DllExports::GdipSetLineTransform(
\r
381 (GpLineGradient*) nativeBrush,
\r
382 matrix ? matrix->nativeMatrix : NULL));
\r
384 Status SetWrapMode(WrapMode wrapMode)
\r
386 return updateStatus(DllExports::GdipSetLineWrapMode(
\r
387 (GpLineGradient*) nativeBrush, wrapMode));
\r
389 Status TranslateTransform(REAL dx, REAL dy,
\r
390 MatrixOrder order = MatrixOrderPrepend)
\r
392 return updateStatus(DllExports::GdipTranslateLineTransform(
\r
393 (GpLineGradient*) nativeBrush, dx, dy, order));
\r
397 LinearGradientBrush(GpBrush *brush, Status status): Brush(brush, status) {}
\r
398 LinearGradientBrush(const LinearGradientBrush& brush);
\r
399 LinearGradientBrush& operator=(const LinearGradientBrush&);
\r
402 class SolidBrush: public Brush
\r
405 SolidBrush(const Color& color)
\r
407 GpSolidFill *nativeSolidFill = NULL;
\r
408 lastStatus = DllExports::GdipCreateSolidFill(
\r
409 color.GetValue(), &nativeSolidFill);
\r
410 nativeBrush = nativeSolidFill;
\r
412 virtual SolidBrush* Clone() const
\r
414 GpBrush *cloneBrush = NULL;
\r
415 Status status = updateStatus(DllExports::GdipCloneBrush(
\r
416 nativeBrush, &cloneBrush));
\r
417 if (status == Ok) {
\r
418 SolidBrush *result =
\r
419 new SolidBrush(cloneBrush, lastStatus);
\r
421 DllExports::GdipDeleteBrush(cloneBrush);
\r
422 updateStatus(OutOfMemory);
\r
430 Status GetColor(Color *color) const
\r
432 return updateStatus(DllExports::GdipGetSolidFillColor(
\r
433 (GpSolidFill*) nativeBrush,
\r
434 color ? &color->Value : NULL));
\r
436 Status SetColor(const Color& color)
\r
438 return updateStatus(DllExports::GdipSetSolidFillColor(
\r
439 (GpSolidFill*) nativeBrush, color.GetValue()));
\r
443 SolidBrush(GpBrush *brush, Status status): Brush(brush, status) {}
\r
444 SolidBrush(const SolidBrush&);
\r
445 SolidBrush& operator=(const SolidBrush&);
\r
448 class TextureBrush: public Brush
\r
451 TextureBrush(Image *image, WrapMode wrapMode = WrapModeTile)
\r
453 GpTexture *nativeTexture = NULL;
\r
454 lastStatus = DllExports::GdipCreateTexture(
\r
455 image ? image->nativeImage : NULL,
\r
456 wrapMode, &nativeTexture);
\r
457 nativeBrush = nativeTexture;
\r
459 TextureBrush(Image *image, WrapMode wrapMode,
\r
460 REAL dstX, REAL dstY, REAL dstWidth, REAL dstHeight)
\r
462 GpTexture *nativeTexture = NULL;
\r
463 lastStatus = DllExports::GdipCreateTexture2(
\r
464 image ? image->nativeImage : NULL,
\r
465 wrapMode, dstX, dstY, dstWidth, dstHeight,
\r
467 nativeBrush = nativeTexture;
\r
469 TextureBrush(Image *image, WrapMode wrapMode,
\r
470 INT dstX, INT dstY, INT dstWidth, INT dstHeight)
\r
472 GpTexture *nativeTexture = NULL;
\r
473 lastStatus = DllExports::GdipCreateTexture2I(
\r
474 image ? image->nativeImage : NULL,
\r
475 wrapMode, dstX, dstY, dstWidth, dstHeight,
\r
477 nativeBrush = nativeTexture;
\r
479 TextureBrush(Image *image, WrapMode wrapMode, const RectF& dstRect)
\r
481 GpTexture *nativeTexture = NULL;
\r
482 lastStatus = DllExports::GdipCreateTexture2(
\r
483 image ? image->nativeImage : NULL, wrapMode,
\r
484 dstRect.X, dstRect.Y,
\r
485 dstRect.Width, dstRect.Height, &nativeTexture);
\r
486 nativeBrush = nativeTexture;
\r
488 TextureBrush(Image *image, WrapMode wrapMode, const Rect& dstRect)
\r
490 GpTexture *nativeTexture = NULL;
\r
491 lastStatus = DllExports::GdipCreateTexture2I(
\r
492 image ? image->nativeImage : NULL, wrapMode,
\r
493 dstRect.X, dstRect.Y,
\r
494 dstRect.Width, dstRect.Height, &nativeTexture);
\r
495 nativeBrush = nativeTexture;
\r
497 TextureBrush(Image *image, const RectF& dstRect,
\r
498 ImageAttributes *imageAttributes = NULL)
\r
500 GpTexture *nativeTexture = NULL;
\r
501 lastStatus = DllExports::GdipCreateTextureIA(
\r
502 image ? image->nativeImage : NULL,
\r
503 imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
\r
504 dstRect.X, dstRect.Y,
\r
505 dstRect.Width, dstRect.Height, &nativeTexture);
\r
506 nativeBrush = nativeTexture;
\r
508 TextureBrush(Image *image, const Rect& dstRect,
\r
509 ImageAttributes *imageAttributes = NULL)
\r
511 GpTexture *nativeTexture = NULL;
\r
512 lastStatus = DllExports::GdipCreateTextureIAI(
\r
513 image ? image->nativeImage : NULL,
\r
514 imageAttributes ? imageAttributes->nativeImageAttributes : NULL,
\r
515 dstRect.X, dstRect.Y,
\r
516 dstRect.Width, dstRect.Height, &nativeTexture);
\r
517 nativeBrush = nativeTexture;
\r
519 virtual TextureBrush* Clone() const
\r
521 GpBrush *cloneBrush = NULL;
\r
522 Status status = updateStatus(DllExports::GdipCloneBrush(
\r
523 nativeBrush, &cloneBrush));
\r
524 if (status == Ok) {
\r
525 TextureBrush *result =
\r
526 new TextureBrush(cloneBrush, lastStatus);
\r
528 DllExports::GdipDeleteBrush(cloneBrush);
\r
529 updateStatus(OutOfMemory);
\r
537 //TODO: implement TextureBrush::GetImage()
\r
538 //Image *GetImage() const
\r
540 // // where is the Image allocated (static,member,new,other)?
\r
541 // // GdipGetTextureImage just returns a GpImage*
\r
542 // updateStatus(NotImplemented);
\r
545 Status GetTransfrom(Matrix *matrix) const
\r
547 return updateStatus(DllExports::GdipGetTextureTransform(
\r
548 (GpTexture*) nativeBrush,
\r
549 matrix ? matrix->nativeMatrix : NULL));
\r
551 WrapMode GetWrapMode() const
\r
553 WrapMode result = WrapModeTile;
\r
554 updateStatus(DllExports::GdipGetTextureWrapMode(
\r
555 (GpTexture*) nativeBrush, &result));
\r
558 Status MultiplyTransform(const Matrix *matrix,
\r
559 MatrixOrder order = MatrixOrderPrepend)
\r
561 return updateStatus(DllExports::GdipMultiplyTextureTransform(
\r
562 (GpTexture*) nativeBrush,
\r
563 matrix ? matrix->nativeMatrix : NULL, order));
\r
565 Status ResetTransform()
\r
567 return updateStatus(DllExports::GdipResetTextureTransform(
\r
568 (GpTexture*) nativeBrush));
\r
570 Status RotateTransform(REAL angle,
\r
571 MatrixOrder order = MatrixOrderPrepend)
\r
573 return updateStatus(DllExports::GdipRotateTextureTransform(
\r
574 (GpTexture*) nativeBrush, angle, order));
\r
576 Status ScaleTransform(REAL sx, REAL sy,
\r
577 MatrixOrder order = MatrixOrderPrepend)
\r
579 return updateStatus(DllExports::GdipScaleTextureTransform(
\r
580 (GpTexture*) nativeBrush, sx, sy, order));
\r
582 Status SetTransform(const Matrix *matrix)
\r
584 return updateStatus(DllExports::GdipSetTextureTransform(
\r
585 (GpTexture*) nativeBrush,
\r
586 matrix ? matrix->nativeMatrix : NULL));
\r
588 Status SetWrapMode(WrapMode wrapMode)
\r
590 return updateStatus(DllExports::GdipSetTextureWrapMode(
\r
591 (GpTexture*) nativeBrush, wrapMode));
\r
593 Status TranslateTransform(REAL dx, REAL dy,
\r
594 MatrixOrder order = MatrixOrderPrepend)
\r
596 return updateStatus(DllExports::GdipTranslateTextureTransform(
\r
597 (GpTexture*) nativeBrush, dx, dy, order));
\r
601 TextureBrush(GpBrush *brush, Status status): Brush(brush, status) {}
\r
602 TextureBrush(const TextureBrush&);
\r
603 TextureBrush& operator=(const TextureBrush&);
\r
606 #endif /* __GDIPLUS_BRUSH_H */
\r