| 1 | /** | 
 
 
 
 
 | 2 | * This file has no copyright assigned and is placed in the Public Domain. | 
 
 
 
 
 | 3 | * This file is part of the mingw-w64 runtime package. | 
 
 
 
 
 | 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
 
 
 
 
 | 5 | */ | 
 
 
 
 
 | 6 | #ifndef _INC_D2D1HELPER | 
 
 
 
 
 | 7 | #define _INC_D2D1HELPER | 
 
 
 
 
 | 8 |  | 
 
 
 
 
 | 9 | #ifndef D2D_USE_C_DEFINITIONS | 
 
 
 
 
 | 10 |  | 
 
 
 
 
 | 11 | namespace D2D1 { | 
 
 
 
 
 | 12 |  | 
 
 
 
 
 | 13 | D2D1FORCEINLINE D2D1_MATRIX_3X2_F IdentityMatrix(); | 
 
 
 
 
 | 14 |  | 
 
 
 
 
 | 15 | template<typename T> struct TypeTraits { | 
 
 
 
 
 | 16 | typedef D2D1_POINT_2F  Point; | 
 
 
 
 
 | 17 | typedef D2D1_SIZE_F    Size; | 
 
 
 
 
 | 18 | typedef D2D1_RECT_F    Rect; | 
 
 
 
 
 | 19 | }; | 
 
 
 
 
 | 20 |  | 
 
 
 
 
 | 21 | template<> struct TypeTraits<UINT32> { | 
 
 
 
 
 | 22 | typedef D2D1_POINT_2U  Point; | 
 
 
 
 
 | 23 | typedef D2D1_SIZE_U    Size; | 
 
 
 
 
 | 24 | typedef D2D1_RECT_U    Rect; | 
 
 
 
 
 | 25 | }; | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | static inline FLOAT FloatMax() { | 
 
 
 
 
 | 28 | return 3.402823466e+38f; | 
 
 
 
 
 | 29 | } | 
 
 
 
 
 | 30 |  | 
 
 
 
 
 | 31 | template<typename T> D2D1FORCEINLINE typename TypeTraits<T>::Point Point2(T x, T y) { | 
 
 
 
 
 | 32 | typename TypeTraits<T>::Point r = {x,y}; | 
 
 
 
 
 | 33 | return r; | 
 
 
 
 
 | 34 | } | 
 
 
 
 
 | 35 |  | 
 
 
 
 
 | 36 | D2D1FORCEINLINE D2D1_POINT_2F Point2F(FLOAT x = 0.f, FLOAT y = 0.f) { | 
 
 
 
 
 | 37 | return Point2<FLOAT>(x, y); | 
 
 
 
 
 | 38 | } | 
 
 
 
 
 | 39 |  | 
 
 
 
 
 | 40 | D2D1FORCEINLINE D2D1_POINT_2U Point2U(UINT32 x = 0, UINT32 y = 0) { | 
 
 
 
 
 | 41 | return Point2<UINT32>(x, y); | 
 
 
 
 
 | 42 | } | 
 
 
 
 
 | 43 |  | 
 
 
 
 
 | 44 | template<typename T> D2D1FORCEINLINE typename TypeTraits<T>::Size Size(T width, T height) { | 
 
 
 
 
 | 45 | typename TypeTraits<T>::Size r = {width, height}; | 
 
 
 
 
 | 46 | return r; | 
 
 
 
 
 | 47 | } | 
 
 
 
 
 | 48 |  | 
 
 
 
 
 | 49 | D2D1FORCEINLINE D2D1_SIZE_F SizeF(FLOAT width = 0.0f, FLOAT height = 0.0f) { | 
 
 
 
 
 | 50 | return Size<FLOAT>(width, height); | 
 
 
 
 
 | 51 | } | 
 
 
 
 
 | 52 |  | 
 
 
 
 
 | 53 | D2D1FORCEINLINE D2D1_SIZE_U SizeU(UINT32 width = 0, UINT32 height = 0) { | 
 
 
 
 
 | 54 | return Size<UINT32>(width, height); | 
 
 
 
 
 | 55 | } | 
 
 
 
 
 | 56 |  | 
 
 
 
 
 | 57 | template<typename T> D2D1FORCEINLINE typename TypeTraits<T>::Rect Rect(T left, T top, T right, T bottom) { | 
 
 
 
 
 | 58 | typename TypeTraits<T>::Rect r = {left, top, right, bottom}; | 
 
 
 
 
 | 59 | return r; | 
 
 
 
 
 | 60 | } | 
 
 
 
 
 | 61 |  | 
 
 
 
 
 | 62 | D2D1FORCEINLINE D2D1_RECT_F RectF(FLOAT left = 0.0f, FLOAT top = 0.0f, FLOAT right = 0.0f, FLOAT bottom = 0.0f) { | 
 
 
 
 
 | 63 | return Rect<FLOAT>(left, top, right, bottom); | 
 
 
 
 
 | 64 | } | 
 
 
 
 
 | 65 |  | 
 
 
 
 
 | 66 | D2D1FORCEINLINE D2D1_RECT_U RectU(UINT32 left = 0, UINT32 top = 0, UINT32 right = 0, UINT32 bottom = 0) { | 
 
 
 
 
 | 67 | return Rect<UINT32>(left, top, right, bottom); | 
 
 
 
 
 | 68 | } | 
 
 
 
 
 | 69 |  | 
 
 
 
 
 | 70 | D2D1FORCEINLINE D2D1_RECT_F InfiniteRect() { | 
 
 
 
 
 | 71 | D2D1_RECT_F r = {-FloatMax(), -FloatMax(), FloatMax(),  FloatMax()}; | 
 
 
 
 
 | 72 | return r; | 
 
 
 
 
 | 73 | } | 
 
 
 
 
 | 74 |  | 
 
 
 
 
 | 75 | D2D1FORCEINLINE D2D1_ARC_SEGMENT ArcSegment(const D2D1_POINT_2F &point, const D2D1_SIZE_F &size, const FLOAT rotationAngle, D2D1_SWEEP_DIRECTION sweepDirection, D2D1_ARC_SIZE arcSize) { | 
 
 
 
 
 | 76 | D2D1_ARC_SEGMENT r = {point, size, rotationAngle, sweepDirection, arcSize}; | 
 
 
 
 
 | 77 | return r; | 
 
 
 
 
 | 78 | } | 
 
 
 
 
 | 79 |  | 
 
 
 
 
 | 80 | D2D1FORCEINLINE D2D1_BEZIER_SEGMENT BezierSegment(const D2D1_POINT_2F &point1, const D2D1_POINT_2F &point2, const D2D1_POINT_2F &point3) { | 
 
 
 
 
 | 81 | D2D1_BEZIER_SEGMENT r = {point1, point2, point3}; | 
 
 
 
 
 | 82 | return r; | 
 
 
 
 
 | 83 | } | 
 
 
 
 
 | 84 |  | 
 
 
 
 
 | 85 | D2D1FORCEINLINE D2D1_ELLIPSE Ellipse(const D2D1_POINT_2F ¢er, FLOAT radiusX, FLOAT radiusY) { | 
 
 
 
 
 | 86 | D2D1_ELLIPSE r = {center, radiusX, radiusY}; | 
 
 
 
 
 | 87 | return r; | 
 
 
 
 
 | 88 | } | 
 
 
 
 
 | 89 |  | 
 
 
 
 
 | 90 | D2D1FORCEINLINE D2D1_ROUNDED_RECT RoundedRect(const D2D1_RECT_F &rect, FLOAT radiusX, FLOAT radiusY) { | 
 
 
 
 
 | 91 | D2D1_ROUNDED_RECT r = {rect, radiusX, radiusY}; | 
 
 
 
 
 | 92 | return r; | 
 
 
 
 
 | 93 | } | 
 
 
 
 
 | 94 |  | 
 
 
 
 
 | 95 | D2D1FORCEINLINE D2D1_BRUSH_PROPERTIES BrushProperties( | 
 
 
 
 
 | 96 | FLOAT opacity = 1.0f, | 
 
 
 
 
 | 97 | const D2D1_MATRIX_3X2_F &transform = D2D1::IdentityMatrix()) { | 
 
 
 
 
 | 98 | D2D1_BRUSH_PROPERTIES r = {opacity, transform}; | 
 
 
 
 
 | 99 | return r; | 
 
 
 
 
 | 100 | } | 
 
 
 
 
 | 101 |  | 
 
 
 
 
 | 102 | D2D1FORCEINLINE D2D1_GRADIENT_STOP GradientStop(FLOAT position, const D2D1_COLOR_F &color) { | 
 
 
 
 
 | 103 | D2D1_GRADIENT_STOP r = {position, color}; | 
 
 
 
 
 | 104 | return r; | 
 
 
 
 
 | 105 | } | 
 
 
 
 
 | 106 |  | 
 
 
 
 
 | 107 | D2D1FORCEINLINE D2D1_QUADRATIC_BEZIER_SEGMENT QuadraticBezierSegment(const D2D1_POINT_2F &point1, const D2D1_POINT_2F &point2) { | 
 
 
 
 
 | 108 | D2D1_QUADRATIC_BEZIER_SEGMENT r = {point1, point2}; | 
 
 
 
 
 | 109 | return r; | 
 
 
 
 
 | 110 | } | 
 
 
 
 
 | 111 |  | 
 
 
 
 
 | 112 | D2D1FORCEINLINE D2D1_STROKE_STYLE_PROPERTIES StrokeStyleProperties( | 
 
 
 
 
 | 113 | D2D1_CAP_STYLE startCap = D2D1_CAP_STYLE_FLAT, | 
 
 
 
 
 | 114 | D2D1_CAP_STYLE endCap = D2D1_CAP_STYLE_FLAT, | 
 
 
 
 
 | 115 | D2D1_CAP_STYLE dashCap = D2D1_CAP_STYLE_FLAT, | 
 
 
 
 
 | 116 | D2D1_LINE_JOIN lineJoin = D2D1_LINE_JOIN_MITER, | 
 
 
 
 
 | 117 | FLOAT miterLimit = 10.0f, | 
 
 
 
 
 | 118 | D2D1_DASH_STYLE dashStyle = D2D1_DASH_STYLE_SOLID, | 
 
 
 
 
 | 119 | FLOAT dashOffset = 0.0f) { | 
 
 
 
 
 | 120 | D2D1_STROKE_STYLE_PROPERTIES r = {startCap, endCap, dashCap, lineJoin, miterLimit, dashStyle, dashOffset}; | 
 
 
 
 
 | 121 | return r; | 
 
 
 
 
 | 122 | } | 
 
 
 
 
 | 123 |  | 
 
 
 
 
 | 124 | D2D1FORCEINLINE D2D1_BITMAP_BRUSH_PROPERTIES BitmapBrushProperties( | 
 
 
 
 
 | 125 | D2D1_EXTEND_MODE extendModeX = D2D1_EXTEND_MODE_CLAMP, | 
 
 
 
 
 | 126 | D2D1_EXTEND_MODE extendModeY = D2D1_EXTEND_MODE_CLAMP, | 
 
 
 
 
 | 127 | D2D1_BITMAP_INTERPOLATION_MODE interpolationMode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR) { | 
 
 
 
 
 | 128 | D2D1_BITMAP_BRUSH_PROPERTIES r = {extendModeX, extendModeY, interpolationMode}; | 
 
 
 
 
 | 129 | return r; | 
 
 
 
 
 | 130 | } | 
 
 
 
 
 | 131 |  | 
 
 
 
 
 | 132 | D2D1FORCEINLINE D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES LinearGradientBrushProperties(const D2D1_POINT_2F &startPoint, const D2D1_POINT_2F &endPoint) { | 
 
 
 
 
 | 133 | D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES r = {startPoint, endPoint}; | 
 
 
 
 
 | 134 | return r; | 
 
 
 
 
 | 135 | } | 
 
 
 
 
 | 136 |  | 
 
 
 
 
 | 137 | D2D1FORCEINLINE D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES RadialGradientBrushProperties(const D2D1_POINT_2F ¢er, const D2D1_POINT_2F &gradientOriginOffset, FLOAT radiusX, FLOAT radiusY) { | 
 
 
 
 
 | 138 | D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES r = {center, gradientOriginOffset, radiusX, radiusY}; | 
 
 
 
 
 | 139 | return r; | 
 
 
 
 
 | 140 | } | 
 
 
 
 
 | 141 |  | 
 
 
 
 
 | 142 | D2D1FORCEINLINE D2D1_PIXEL_FORMAT PixelFormat( | 
 
 
 
 
 | 143 | DXGI_FORMAT dxgiFormat = DXGI_FORMAT_UNKNOWN, | 
 
 
 
 
 | 144 | D2D1_ALPHA_MODE alphaMode = D2D1_ALPHA_MODE_UNKNOWN) | 
 
 
 
 
 | 145 | { | 
 
 
 
 
 | 146 | D2D1_PIXEL_FORMAT r = {dxgiFormat, alphaMode}; | 
 
 
 
 
 | 147 | return r; | 
 
 
 
 
 | 148 | } | 
 
 
 
 
 | 149 |  | 
 
 
 
 
 | 150 | D2D1FORCEINLINE D2D1_BITMAP_PROPERTIES BitmapProperties(CONST D2D1_PIXEL_FORMAT &pixelFormat = D2D1::PixelFormat(), | 
 
 
 
 
 | 151 | FLOAT dpiX = 96.0f, FLOAT dpiY = 96.0f) { | 
 
 
 
 
 | 152 | D2D1_BITMAP_PROPERTIES r = {pixelFormat, dpiX, dpiY}; | 
 
 
 
 
 | 153 | return r; | 
 
 
 
 
 | 154 | } | 
 
 
 
 
 | 155 |  | 
 
 
 
 
 | 156 | D2D1FORCEINLINE D2D1_RENDER_TARGET_PROPERTIES RenderTargetProperties( | 
 
 
 
 
 | 157 | D2D1_RENDER_TARGET_TYPE type =  D2D1_RENDER_TARGET_TYPE_DEFAULT, | 
 
 
 
 
 | 158 | CONST D2D1_PIXEL_FORMAT &pixelFormat = D2D1::PixelFormat(), | 
 
 
 
 
 | 159 | FLOAT dpiX = 0.0, | 
 
 
 
 
 | 160 | FLOAT dpiY = 0.0, | 
 
 
 
 
 | 161 | D2D1_RENDER_TARGET_USAGE usage = D2D1_RENDER_TARGET_USAGE_NONE, | 
 
 
 
 
 | 162 | D2D1_FEATURE_LEVEL  minLevel = D2D1_FEATURE_LEVEL_DEFAULT) | 
 
 
 
 
 | 163 | { | 
 
 
 
 
 | 164 | D2D1_RENDER_TARGET_PROPERTIES r = {type, pixelFormat, dpiX, dpiY, usage, minLevel}; | 
 
 
 
 
 | 165 | return r; | 
 
 
 
 
 | 166 | } | 
 
 
 
 
 | 167 |  | 
 
 
 
 
 | 168 | D2D1FORCEINLINE D2D1_HWND_RENDER_TARGET_PROPERTIES HwndRenderTargetProperties( | 
 
 
 
 
 | 169 | HWND hwnd, | 
 
 
 
 
 | 170 | D2D1_SIZE_U pixelSize = D2D1::Size(static_cast<UINT>(0), static_cast<UINT>(0)), | 
 
 
 
 
 | 171 | D2D1_PRESENT_OPTIONS presentOptions = D2D1_PRESENT_OPTIONS_NONE) { | 
 
 
 
 
 | 172 | D2D1_HWND_RENDER_TARGET_PROPERTIES r = {hwnd, pixelSize, presentOptions}; | 
 
 
 
 
 | 173 | return r; | 
 
 
 
 
 | 174 | } | 
 
 
 
 
 | 175 |  | 
 
 
 
 
 | 176 | D2D1FORCEINLINE D2D1_LAYER_PARAMETERS LayerParameters( | 
 
 
 
 
 | 177 | CONST D2D1_RECT_F &contentBounds = D2D1::InfiniteRect(), | 
 
 
 
 
 | 178 | ID2D1Geometry *geometricMask = NULL, | 
 
 
 
 
 | 179 | D2D1_ANTIALIAS_MODE maskAntialiasMode = D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, | 
 
 
 
 
 | 180 | D2D1_MATRIX_3X2_F maskTransform = D2D1::IdentityMatrix(), | 
 
 
 
 
 | 181 | FLOAT opacity = 1.0, | 
 
 
 
 
 | 182 | ID2D1Brush *opacityBrush = NULL, | 
 
 
 
 
 | 183 | D2D1_LAYER_OPTIONS layerOptions = D2D1_LAYER_OPTIONS_NONE) { | 
 
 
 
 
 | 184 | D2D1_LAYER_PARAMETERS r = | 
 
 
 
 
 | 185 | {contentBounds, geometricMask, maskAntialiasMode, maskTransform, opacity, opacityBrush, layerOptions }; | 
 
 
 
 
 | 186 | return r; | 
 
 
 
 
 | 187 | } | 
 
 
 
 
 | 188 |  | 
 
 
 
 
 | 189 | D2D1FORCEINLINE D2D1_DRAWING_STATE_DESCRIPTION DrawingStateDescription( | 
 
 
 
 
 | 190 | D2D1_ANTIALIAS_MODE antialiasMode = D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, | 
 
 
 
 
 | 191 | D2D1_TEXT_ANTIALIAS_MODE textAntialiasMode = D2D1_TEXT_ANTIALIAS_MODE_DEFAULT, | 
 
 
 
 
 | 192 | D2D1_TAG tag1 = 0, | 
 
 
 
 
 | 193 | D2D1_TAG tag2 = 0, | 
 
 
 
 
 | 194 | const D2D1_MATRIX_3X2_F &transform = D2D1::IdentityMatrix()) { | 
 
 
 
 
 | 195 | D2D1_DRAWING_STATE_DESCRIPTION r = {antialiasMode, textAntialiasMode, tag1, tag2, transform}; | 
 
 
 
 
 | 196 | return r; | 
 
 
 
 
 | 197 | } | 
 
 
 
 
 | 198 |  | 
 
 
 
 
 | 199 | class ColorF : public D2D1_COLOR_F { | 
 
 
 
 
 | 200 | public: | 
 
 
 
 
 | 201 | enum Enum { | 
 
 
 
 
 | 202 | AliceBlue             = 0xf0f8ff, | 
 
 
 
 
 | 203 | AntiqueWhite          = 0xfaebd7, | 
 
 
 
 
 | 204 | Aqua                  = 0x00ffff, | 
 
 
 
 
 | 205 | Aquamarine            = 0x7fffd4, | 
 
 
 
 
 | 206 | Azure                 = 0xf0ffff, | 
 
 
 
 
 | 207 | Beige                 = 0xf5f5dc, | 
 
 
 
 
 | 208 | Bisque                = 0xffe4c4, | 
 
 
 
 
 | 209 | Black                 = 0x000000, | 
 
 
 
 
 | 210 | BlanchedAlmond        = 0xffebcd, | 
 
 
 
 
 | 211 | Blue                  = 0x0000ff, | 
 
 
 
 
 | 212 | BlueViolet            = 0x8a2be2, | 
 
 
 
 
 | 213 | Brown                 = 0xa52a2a, | 
 
 
 
 
 | 214 | BurlyWood             = 0xdeb887, | 
 
 
 
 
 | 215 | CadetBlue             = 0x5f9ea0, | 
 
 
 
 
 | 216 | Chartreuse            = 0x7fff00, | 
 
 
 
 
 | 217 | Chocolate             = 0xd2691e, | 
 
 
 
 
 | 218 | Coral                 = 0xff7f50, | 
 
 
 
 
 | 219 | CornflowerBlue        = 0x6495ed, | 
 
 
 
 
 | 220 | Cornsilk              = 0xfff8dc, | 
 
 
 
 
 | 221 | Crimson               = 0xdc143c, | 
 
 
 
 
 | 222 | Cyan                  = 0x00ffff, | 
 
 
 
 
 | 223 | DarkBlue              = 0x00008b, | 
 
 
 
 
 | 224 | DarkCyan              = 0x008b8b, | 
 
 
 
 
 | 225 | DarkGoldenrod         = 0xb8860b, | 
 
 
 
 
 | 226 | DarkGray              = 0xa9a9a9, | 
 
 
 
 
 | 227 | DarkGreen             = 0x006400, | 
 
 
 
 
 | 228 | DarkKhaki             = 0xbdb76b, | 
 
 
 
 
 | 229 | DarkMagenta           = 0x8b008b, | 
 
 
 
 
 | 230 | DarkOliveGreen        = 0x556B2f, | 
 
 
 
 
 | 231 | DarkOrange            = 0xff8c00, | 
 
 
 
 
 | 232 | DarkOrchid            = 0x9932cc, | 
 
 
 
 
 | 233 | DarkRed               = 0x8b0000, | 
 
 
 
 
 | 234 | DarkSalmon            = 0xe9967a, | 
 
 
 
 
 | 235 | DarkSeaGreen          = 0x8fbc8f, | 
 
 
 
 
 | 236 | DarkSlateBlue         = 0x483d8b, | 
 
 
 
 
 | 237 | DarkSlateGray         = 0x2f4f4f, | 
 
 
 
 
 | 238 | DarkTurquoise         = 0x00ced1, | 
 
 
 
 
 | 239 | DarkViolet            = 0x9400d3, | 
 
 
 
 
 | 240 | DeepPink              = 0xff1493, | 
 
 
 
 
 | 241 | DeepSkyBlue           = 0x00bfff, | 
 
 
 
 
 | 242 | DimGray               = 0x696969, | 
 
 
 
 
 | 243 | DodgerBlue            = 0x1e90ff, | 
 
 
 
 
 | 244 | Firebrick             = 0xb22222, | 
 
 
 
 
 | 245 | FloralWhite           = 0xfffaf0, | 
 
 
 
 
 | 246 | ForestGreen           = 0x228b22, | 
 
 
 
 
 | 247 | Fuchsia               = 0xff00ff, | 
 
 
 
 
 | 248 | Gainsboro             = 0xdcdcdc, | 
 
 
 
 
 | 249 | GhostWhite            = 0xf8f8ff, | 
 
 
 
 
 | 250 | Gold                  = 0xffd700, | 
 
 
 
 
 | 251 | Goldenrod             = 0xdaa520, | 
 
 
 
 
 | 252 | Gray                  = 0x808080, | 
 
 
 
 
 | 253 | Green                 = 0x008000, | 
 
 
 
 
 | 254 | GreenYellow           = 0xadff2f, | 
 
 
 
 
 | 255 | Honeydew              = 0xf0fff0, | 
 
 
 
 
 | 256 | HotPink               = 0xff69b4, | 
 
 
 
 
 | 257 | IndianRed             = 0xcd5c5c, | 
 
 
 
 
 | 258 | Indigo                = 0x4b0082, | 
 
 
 
 
 | 259 | Ivory                 = 0xfffff0, | 
 
 
 
 
 | 260 | Khaki                 = 0xf0e68c, | 
 
 
 
 
 | 261 | Lavender              = 0xe6e6fa, | 
 
 
 
 
 | 262 | LavenderBlush         = 0xfff0f5, | 
 
 
 
 
 | 263 | LawnGreen             = 0x7cfc00, | 
 
 
 
 
 | 264 | LemonChiffon          = 0xfffacd, | 
 
 
 
 
 | 265 | LightBlue             = 0xadd8e6, | 
 
 
 
 
 | 266 | LightCoral            = 0xf08080, | 
 
 
 
 
 | 267 | LightCyan             = 0xe0ffff, | 
 
 
 
 
 | 268 | LightGoldenrodYellow  = 0xfafad2, | 
 
 
 
 
 | 269 | LightGreen            = 0x90ee90, | 
 
 
 
 
 | 270 | LightGray             = 0xd3d3d3, | 
 
 
 
 
 | 271 | LightPink             = 0xffb6c1, | 
 
 
 
 
 | 272 | LightSalmon           = 0xffa07a, | 
 
 
 
 
 | 273 | LightSeaGreen         = 0x20b2aa, | 
 
 
 
 
 | 274 | LightSkyBlue          = 0x87cefa, | 
 
 
 
 
 | 275 | LightSlateGray        = 0x778899, | 
 
 
 
 
 | 276 | LightSteelBlue        = 0xb0c4de, | 
 
 
 
 
 | 277 | LightYellow           = 0xffffe0, | 
 
 
 
 
 | 278 | Lime                  = 0x00ff00, | 
 
 
 
 
 | 279 | LimeGreen             = 0x32cd32, | 
 
 
 
 
 | 280 | Linen                 = 0xfaf0e6, | 
 
 
 
 
 | 281 | Magenta               = 0xff00ff, | 
 
 
 
 
 | 282 | Maroon                = 0x800000, | 
 
 
 
 
 | 283 | MediumAquamarine      = 0x66cdaa, | 
 
 
 
 
 | 284 | MediumBlue            = 0x0000cd, | 
 
 
 
 
 | 285 | MediumOrchid          = 0xba55d3, | 
 
 
 
 
 | 286 | MediumPurple          = 0x9370db, | 
 
 
 
 
 | 287 | MediumSeaGreen        = 0x3cb371, | 
 
 
 
 
 | 288 | MediumSlateBlue       = 0x7b68ee, | 
 
 
 
 
 | 289 | MediumSpringGreen     = 0x00fa9a, | 
 
 
 
 
 | 290 | MediumTurquoise       = 0x48d1cc, | 
 
 
 
 
 | 291 | MediumVioletRed       = 0xc71585, | 
 
 
 
 
 | 292 | MidnightBlue          = 0x191970, | 
 
 
 
 
 | 293 | MintCream             = 0xf5fffa, | 
 
 
 
 
 | 294 | MistyRose             = 0xffe4e1, | 
 
 
 
 
 | 295 | Moccasin              = 0xffe4b5, | 
 
 
 
 
 | 296 | NavajoWhite           = 0xffdead, | 
 
 
 
 
 | 297 | Navy                  = 0x000080, | 
 
 
 
 
 | 298 | OldLace               = 0xfdf5e6, | 
 
 
 
 
 | 299 | Olive                 = 0x808000, | 
 
 
 
 
 | 300 | OliveDrab             = 0x6b8e23, | 
 
 
 
 
 | 301 | Orange                = 0xffa500, | 
 
 
 
 
 | 302 | OrangeRed             = 0xff4500, | 
 
 
 
 
 | 303 | Orchid                = 0xda70d6, | 
 
 
 
 
 | 304 | PaleGoldenrod         = 0xeee8aa, | 
 
 
 
 
 | 305 | PaleGreen             = 0x98fb98, | 
 
 
 
 
 | 306 | PaleTurquoise         = 0xafeeee, | 
 
 
 
 
 | 307 | PaleVioletRed         = 0xdb7093, | 
 
 
 
 
 | 308 | PapayaWhip            = 0xffefd5, | 
 
 
 
 
 | 309 | PeachPuff             = 0xffdab9, | 
 
 
 
 
 | 310 | Peru                  = 0xcd853f, | 
 
 
 
 
 | 311 | Pink                  = 0xffc0cb, | 
 
 
 
 
 | 312 | Plum                  = 0xdda0dd, | 
 
 
 
 
 | 313 | PowderBlue            = 0xb0e0e6, | 
 
 
 
 
 | 314 | Purple                = 0x800080, | 
 
 
 
 
 | 315 | Red                   = 0xff0000, | 
 
 
 
 
 | 316 | RosyBrown             = 0xbc8f8f, | 
 
 
 
 
 | 317 | RoyalBlue             = 0x4169e1, | 
 
 
 
 
 | 318 | SaddleBrown           = 0x8b4513, | 
 
 
 
 
 | 319 | Salmon                = 0xfa8072, | 
 
 
 
 
 | 320 | SandyBrown            = 0xf4a460, | 
 
 
 
 
 | 321 | SeaGreen              = 0x2e8B57, | 
 
 
 
 
 | 322 | SeaShell              = 0xfff5ee, | 
 
 
 
 
 | 323 | Sienna                = 0xa0522d, | 
 
 
 
 
 | 324 | Silver                = 0xc0c0c0, | 
 
 
 
 
 | 325 | SkyBlue               = 0x87ceeb, | 
 
 
 
 
 | 326 | SlateBlue             = 0x6a5acd, | 
 
 
 
 
 | 327 | SlateGray             = 0x708090, | 
 
 
 
 
 | 328 | Snow                  = 0xfffafa, | 
 
 
 
 
 | 329 | SpringGreen           = 0x00ff7f, | 
 
 
 
 
 | 330 | SteelBlue             = 0x4682B4, | 
 
 
 
 
 | 331 | Tan                   = 0xd2b48c, | 
 
 
 
 
 | 332 | Teal                  = 0x008080, | 
 
 
 
 
 | 333 | Thistle               = 0xd8bfd8, | 
 
 
 
 
 | 334 | Tomato                = 0xff6347, | 
 
 
 
 
 | 335 | Turquoise             = 0x40e0d0, | 
 
 
 
 
 | 336 | Violet                = 0xee82ee, | 
 
 
 
 
 | 337 | Wheat                 = 0xf5deb3, | 
 
 
 
 
 | 338 | White                 = 0xffffff, | 
 
 
 
 
 | 339 | WhiteSmoke            = 0xf5f5f5, | 
 
 
 
 
 | 340 | Yellow                = 0xffff00, | 
 
 
 
 
 | 341 | YellowGreen           = 0x9acd32 | 
 
 
 
 
 | 342 | }; | 
 
 
 
 
 | 343 |  | 
 
 
 
 
 | 344 | FORCEINLINE ColorF(UINT32 rgb, FLOAT _a = 1.0) { | 
 
 
 
 
 | 345 | init(rgb, _a); | 
 
 
 
 
 | 346 | } | 
 
 
 
 
 | 347 |  | 
 
 
 
 
 | 348 | D2D1FORCEINLINE ColorF(Enum knownColor, FLOAT _a = 1.0) { | 
 
 
 
 
 | 349 | init(knownColor, _a); | 
 
 
 
 
 | 350 | } | 
 
 
 
 
 | 351 |  | 
 
 
 
 
 | 352 | D2D1FORCEINLINE ColorF(FLOAT _r, FLOAT _g, FLOAT _b, FLOAT _a = 1.0) { | 
 
 
 
 
 | 353 | r = _r; | 
 
 
 
 
 | 354 | g = _g; | 
 
 
 
 
 | 355 | b = _b; | 
 
 
 
 
 | 356 | a = _a; | 
 
 
 
 
 | 357 | } | 
 
 
 
 
 | 358 | private: | 
 
 
 
 
 | 359 | D2D1FORCEINLINE void init(UINT32 rgb, FLOAT _a) { | 
 
 
 
 
 | 360 | r = static_cast<float>((rgb>>16)&0xff)/255.0f; | 
 
 
 
 
 | 361 | g = static_cast<float>((rgb>>8)&0xff)/255.0f; | 
 
 
 
 
 | 362 | b = static_cast<float>(rgb&0xff)/255.0f; | 
 
 
 
 
 | 363 | a = _a; | 
 
 
 
 
 | 364 | } | 
 
 
 
 
 | 365 | }; | 
 
 
 
 
 | 366 |  | 
 
 
 
 
 | 367 | class Matrix3x2F : public D2D1_MATRIX_3X2_F { | 
 
 
 
 
 | 368 | public: | 
 
 
 
 
 | 369 | D2D1FORCEINLINE Matrix3x2F(FLOAT __11, FLOAT __12, FLOAT __21, FLOAT __22, FLOAT __31, FLOAT __32) { | 
 
 
 
 
 | 370 | _11 = __11; | 
 
 
 
 
 | 371 | _12 = __12; | 
 
 
 
 
 | 372 | _21 = __21; | 
 
 
 
 
 | 373 | _22 = __22; | 
 
 
 
 
 | 374 | _31 = __31; | 
 
 
 
 
 | 375 | _32 = __32; | 
 
 
 
 
 | 376 | } | 
 
 
 
 
 | 377 |  | 
 
 
 
 
 | 378 | D2D1FORCEINLINE Matrix3x2F() {} | 
 
 
 
 
 | 379 |  | 
 
 
 
 
 | 380 | static D2D1FORCEINLINE Matrix3x2F Identity() { | 
 
 
 
 
 | 381 | return Matrix3x2F(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); | 
 
 
 
 
 | 382 | } | 
 
 
 
 
 | 383 |  | 
 
 
 
 
 | 384 | static D2D1FORCEINLINE Matrix3x2F Translation(D2D1_SIZE_F size) { | 
 
 
 
 
 | 385 | return Translation(size.width, size.height); | 
 
 
 
 
 | 386 | } | 
 
 
 
 
 | 387 |  | 
 
 
 
 
 | 388 | static D2D1FORCEINLINE Matrix3x2F Translation(FLOAT x, FLOAT y) { | 
 
 
 
 
 | 389 | return Matrix3x2F(1.0f, 0.0f, 0.0f, 1.0f, x, y); | 
 
 
 
 
 | 390 | } | 
 
 
 
 
 | 391 |  | 
 
 
 
 
 | 392 | static D2D1FORCEINLINE Matrix3x2F Scale(D2D1_SIZE_F size, D2D1_POINT_2F center = D2D1::Point2F()) { | 
 
 
 
 
 | 393 | return Scale(size.width, size.height, center); | 
 
 
 
 
 | 394 | } | 
 
 
 
 
 | 395 |  | 
 
 
 
 
 | 396 | static D2D1FORCEINLINE Matrix3x2F Scale(FLOAT x, FLOAT y, D2D1_POINT_2F center = D2D1::Point2F()) { | 
 
 
 
 
 | 397 | return Matrix3x2F(x, 0.0f, 0.0f, y, center.x - x*center.x, center.y - y*center.y); | 
 
 
 
 
 | 398 | } | 
 
 
 
 
 | 399 |  | 
 
 
 
 
 | 400 | static D2D1FORCEINLINE Matrix3x2F Rotation(FLOAT angle, D2D1_POINT_2F center = D2D1::Point2F()) { | 
 
 
 
 
 | 401 | Matrix3x2F r; | 
 
 
 
 
 | 402 | D2D1MakeRotateMatrix(angle, center, &r); | 
 
 
 
 
 | 403 | return r; | 
 
 
 
 
 | 404 | } | 
 
 
 
 
 | 405 |  | 
 
 
 
 
 | 406 | static D2D1FORCEINLINE Matrix3x2F Skew(FLOAT angleX, FLOAT angleY, D2D1_POINT_2F center = D2D1::Point2F()) { | 
 
 
 
 
 | 407 | Matrix3x2F r; | 
 
 
 
 
 | 408 | D2D1MakeSkewMatrix(angleX, angleY, center, &r); | 
 
 
 
 
 | 409 | return r; | 
 
 
 
 
 | 410 | } | 
 
 
 
 
 | 411 |  | 
 
 
 
 
 | 412 | static inline const Matrix3x2F *ReinterpretBaseType(const D2D1_MATRIX_3X2_F *pMatrix) { | 
 
 
 
 
 | 413 | return static_cast<const Matrix3x2F *>(pMatrix); | 
 
 
 
 
 | 414 | } | 
 
 
 
 
 | 415 |  | 
 
 
 
 
 | 416 | static inline Matrix3x2F *ReinterpretBaseType(D2D1_MATRIX_3X2_F *pMatrix) { | 
 
 
 
 
 | 417 | return static_cast<Matrix3x2F *>(pMatrix); | 
 
 
 
 
 | 418 | } | 
 
 
 
 
 | 419 |  | 
 
 
 
 
 | 420 | inline FLOAT Determinant() const { | 
 
 
 
 
 | 421 | return _11*_22 - _12*_21; | 
 
 
 
 
 | 422 | } | 
 
 
 
 
 | 423 |  | 
 
 
 
 
 | 424 | inline bool IsInvertible() const { | 
 
 
 
 
 | 425 | return !!D2D1IsMatrixInvertible(this); | 
 
 
 
 
 | 426 | } | 
 
 
 
 
 | 427 |  | 
 
 
 
 
 | 428 | inline bool Invert() { | 
 
 
 
 
 | 429 | return !!D2D1InvertMatrix(this); | 
 
 
 
 
 | 430 | } | 
 
 
 
 
 | 431 |  | 
 
 
 
 
 | 432 | inline bool IsIdentity() const { | 
 
 
 
 
 | 433 | return _11 == 1.0f && _12 == 0.0f && _21 == 0.0f && _22 == 1.0f && _31 == 0.0f && _32 == 0.0f; | 
 
 
 
 
 | 434 | } | 
 
 
 
 
 | 435 |  | 
 
 
 
 
 | 436 | inline void SetProduct(const Matrix3x2F &a, const Matrix3x2F &b) { | 
 
 
 
 
 | 437 | _11 = a._11*b._11 + a._12*b._21; | 
 
 
 
 
 | 438 | _12 = a._11*b._12 + a._12*b._22; | 
 
 
 
 
 | 439 | _21 = a._21*b._11 + a._22*b._21; | 
 
 
 
 
 | 440 | _22 = a._21*b._12 + a._22*b._22; | 
 
 
 
 
 | 441 | _31 = a._31*b._11 + a._32*b._21 + b._31; | 
 
 
 
 
 | 442 | _32 = a._31*b._12 + a._32*b._22 + b._32; | 
 
 
 
 
 | 443 | } | 
 
 
 
 
 | 444 |  | 
 
 
 
 
 | 445 | D2D1FORCEINLINE Matrix3x2F operator*(const Matrix3x2F &matrix) const { | 
 
 
 
 
 | 446 | Matrix3x2F r; | 
 
 
 
 
 | 447 | r.SetProduct(*this, matrix); | 
 
 
 
 
 | 448 | return r; | 
 
 
 
 
 | 449 | } | 
 
 
 
 
 | 450 |  | 
 
 
 
 
 | 451 | D2D1FORCEINLINE D2D1_POINT_2F TransformPoint(D2D1_POINT_2F point) const { | 
 
 
 
 
 | 452 | return Point2F(point.x*_11 + point.y*_21 + _31, point.x*_12 + point.y*_22 + _32); | 
 
 
 
 
 | 453 | } | 
 
 
 
 
 | 454 | }; | 
 
 
 
 
 | 455 |  | 
 
 
 
 
 | 456 | D2D1FORCEINLINE D2D1_POINT_2F operator*(const D2D1_POINT_2F &point, const D2D1_MATRIX_3X2_F &matrix) { | 
 
 
 
 
 | 457 | return Matrix3x2F::ReinterpretBaseType(&matrix)->TransformPoint(point); | 
 
 
 
 
 | 458 | } | 
 
 
 
 
 | 459 |  | 
 
 
 
 
 | 460 | D2D1FORCEINLINE D2D1_MATRIX_3X2_F IdentityMatrix() { | 
 
 
 
 
 | 461 | return Matrix3x2F::Identity(); | 
 
 
 
 
 | 462 | } | 
 
 
 
 
 | 463 |  | 
 
 
 
 
 | 464 | } | 
 
 
 
 
 | 465 |  | 
 
 
 
 
 | 466 | D2D1FORCEINLINE D2D1_MATRIX_3X2_F operator*(const D2D1_MATRIX_3X2_F &matrix1, const D2D1_MATRIX_3X2_F &matrix2) { | 
 
 
 
 
 | 467 | D2D1::Matrix3x2F r; | 
 
 
 
 
 | 468 | r.SetProduct(*D2D1::Matrix3x2F::ReinterpretBaseType(&matrix1), *D2D1::Matrix3x2F::ReinterpretBaseType(&matrix2)); | 
 
 
 
 
 | 469 | return r; | 
 
 
 
 
 | 470 | } | 
 
 
 
 
 | 471 |  | 
 
 
 
 
 | 472 | #endif /* D2D_USE_C_DEFINITIONS */ | 
 
 
 
 
 | 473 |  | 
 
 
 
 
 | 474 | #endif /*_INC_D2D1HELPER*/ |