Home | History | Annotate | Download | only in include
      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 &center, 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 &center, 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*/
    475