e70b1169980eced3650a55f514f7daa4ee34a442
[WebKit-https.git] / Source / WebCore / platform / graphics / win / GraphicsContextPlatformPrivateDirect2D.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "COMPtr.h"
29 #include "Color.h"
30 #include <d2d1.h>
31 #include <d2d1_1.h>
32 #include <d2d1effects.h>
33 #include <d2d1helper.h>
34 #include <windows.h>
35 #include <wtf/TinyLRUCache.h>
36
37 namespace WebCore {
38
39 class GraphicsContextPlatformPrivate {
40     WTF_MAKE_FAST_ALLOCATED;
41 public:
42     GraphicsContextPlatformPrivate(ID2D1RenderTarget*);
43     ~GraphicsContextPlatformPrivate();
44
45     enum Direct2DLayerType { AxisAlignedClip, LayerClip };
46
47     void clip(const FloatRect&);
48     void clip(const Path&);
49     void clip(ID2D1Geometry*);
50
51     void beginDraw();
52     void endDraw();
53     void flush();
54     void save();
55     void scale(const FloatSize&);
56     void restore();
57     void rotate(float);
58     void translate(float, float);
59     void concatCTM(const AffineTransform&);
60     void setCTM(const AffineTransform&);
61
62     void setLineCap(LineCap);
63     void setLineJoin(LineJoin);
64     void setStrokeStyle(StrokeStyle);
65     void setMiterLimit(float);
66     void setDashOffset(float);
67     void setPatternWidth(float);
68     void setPatternOffset(float);
69     void setStrokeThickness(float);
70     void setDashes(const DashArray&);
71
72     ID2D1RenderTarget* renderTarget() { return m_renderTarget.get(); }
73     ID2D1Layer* clipLayer() const { return m_renderStates.last().m_activeLayer.get(); }
74     ID2D1StrokeStyle* strokeStyle();
75
76     COMPtr<ID2D1SolidColorBrush> brushWithColor(const D2D1_COLOR_F&);
77
78     HDC m_hdc { nullptr };
79     D2D1_BLEND_MODE m_blendMode { D2D1_BLEND_MODE_MULTIPLY };
80     D2D1_COMPOSITE_MODE m_compositeMode { D2D1_COMPOSITE_MODE_SOURCE_OVER };
81     bool m_shouldIncludeChildWindows { false };
82     bool m_strokeSyleIsDirty { false };
83
84     COMPtr<ID2D1SolidColorBrush> m_solidStrokeBrush;
85     COMPtr<ID2D1SolidColorBrush> m_solidFillBrush;
86     COMPtr<ID2D1BitmapBrush> m_patternStrokeBrush;
87     COMPtr<ID2D1BitmapBrush> m_patternFillBrush;
88
89 private:
90     void recomputeStrokeStyle();
91
92     COMPtr<ID2D1RenderTarget> m_renderTarget;
93     HashMap<RGBA32, COMPtr<ID2D1SolidColorBrush>> m_solidColoredBrushCache;
94     COMPtr<ID2D1SolidColorBrush> m_whiteBrush;
95     COMPtr<ID2D1SolidColorBrush> m_zeroBrush;
96     COMPtr<ID2D1StrokeStyle> m_d2dStrokeStyle;
97
98     struct RenderState {
99         COMPtr<ID2D1DrawingStateBlock> m_drawingStateBlock;
100         COMPtr<ID2D1Layer> m_activeLayer;
101         Vector<Direct2DLayerType> m_clips;
102     };
103
104     Vector<RenderState> m_renderStates;
105
106     D2D1_CAP_STYLE m_lineCap { D2D1_CAP_STYLE_FLAT };
107     D2D1_LINE_JOIN m_lineJoin { D2D1_LINE_JOIN_MITER };
108     StrokeStyle m_strokeStyle { SolidStroke };
109     DashArray m_dashes;
110     float m_miterLimit { 1.0f };
111     float m_dashOffset { 0 };
112     float m_patternWidth { 1.0f };
113     float m_patternOffset { 0 };
114     float m_strokeThickness { 0 };
115 };
116
117 class D2DContextStateSaver {
118 public:
119     D2DContextStateSaver(GraphicsContextPlatformPrivate& context, bool saveAndRestore = true)
120         : m_context(context)
121         , m_saveAndRestore(saveAndRestore)
122     {
123         if (m_saveAndRestore)
124             m_context.save();
125     }
126
127     ~D2DContextStateSaver()
128     {
129         if (m_saveAndRestore)
130             m_context.restore();
131     }
132
133     void save()
134     {
135         ASSERT(!m_saveAndRestore);
136         m_context.save();
137         m_saveAndRestore = true;
138     }
139
140     void restore()
141     {
142         ASSERT(m_saveAndRestore);
143         m_context.restore();
144         m_saveAndRestore = false;
145     }
146
147     bool didSave() const
148     {
149         return m_saveAndRestore;
150     }
151
152 private:
153     GraphicsContextPlatformPrivate& m_context;
154     bool m_saveAndRestore { false };
155 };
156
157 }