xref: /aosp_15_r20/external/skia/src/utils/win/SkDWriteGeometrySink.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkDWriteToPath_DEFINED
9 #define SkDWriteToPath_DEFINED
10 
11 #include "include/core/SkTypes.h"
12 #include "src/utils/win/SkObjBase.h"
13 
14 class SkPath;
15 
16 #include <dwrite.h>
17 #include <d2d1.h>
18 
19 class SkDWriteGeometrySink : public IDWriteGeometrySink {
20 private:
21     LONG fRefCount;
22     SkPath* fPath;
23     bool fStarted;
24     D2D1_POINT_2F fCurrent;
25 
goingTo(const D2D1_POINT_2F pt)26     void goingTo(const D2D1_POINT_2F pt) {
27         if (!fStarted) {
28             fStarted = true;
29             fPath->moveTo(fCurrent.x, fCurrent.y);
30         }
31         fCurrent = pt;
32     }
33 
currentIsNot(const D2D1_POINT_2F pt)34     bool currentIsNot(const D2D1_POINT_2F pt) {
35         return fCurrent.x != pt.x || fCurrent.y != pt.y;
36     }
37 
38 protected:
39     explicit SkDWriteGeometrySink(SkPath* path);
40     virtual ~SkDWriteGeometrySink();
41 
42 public:
43     SK_STDMETHODIMP QueryInterface(REFIID iid, void **object) override;
44     SK_STDMETHODIMP_(ULONG) AddRef() override;
45     SK_STDMETHODIMP_(ULONG) Release() override;
46 
47     SK_STDMETHODIMP_(void) SetFillMode(D2D1_FILL_MODE fillMode) override;
48     SK_STDMETHODIMP_(void) SetSegmentFlags(D2D1_PATH_SEGMENT vertexFlags) override;
49     SK_STDMETHODIMP_(void) BeginFigure(D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin) override;
50     SK_STDMETHODIMP_(void) AddLines(const D2D1_POINT_2F *points, UINT pointsCount) override;
51     SK_STDMETHODIMP_(void) AddBeziers(const D2D1_BEZIER_SEGMENT *beziers, UINT beziersCount) override;
52     SK_STDMETHODIMP_(void) EndFigure(D2D1_FIGURE_END figureEnd) override;
53     SK_STDMETHODIMP Close() override;
54 
55     static HRESULT Create(SkPath* path, IDWriteGeometrySink** geometryToPath);
56 };
57 
58 #endif
59