[FTW] Refactor Direct2D code to follow Cairo's model to support modern WebKit
[WebKit-https.git] / Source / WebCore / platform / graphics / win / Direct2DOperations.h
1 /*
2  * Copyright (C) 2006-2019 Apple Inc.  All rights reserved.
3  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4  * Copyright (C) 2008, 2009 Dirk Schulze <krit@webkit.org>
5  * Copyright (C) 2008 Nuanti Ltd.
6  * Copyright (C) 2009 Brent Fulgham <bfulgham@webkit.org>
7  * Copyright (C) 2010, 2011 Igalia S.L.
8  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
9  * Copyright (C) 2012, Intel Corporation
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #pragma once
34
35 #if USE(DIRECT2D)
36
37 #include "DashArray.h"
38 #include "GraphicsContext.h"
39 #include "GraphicsTypes.h"
40 #include <d2d1.h>
41
42 namespace WebCore {
43
44 class AffineTransform;
45 class Color;
46 class FloatRect;
47 class FloatRoundedRect;
48 class FloatSize;
49 class Path;
50 class PlatformContextCairo;
51
52 struct GraphicsContextState;
53
54 namespace Direct2D {
55
56 namespace State {
57
58 void setStrokeThickness(PlatformContextDirect2D&, float);
59 void setStrokeStyle(PlatformContextDirect2D&, StrokeStyle);
60
61 void setCompositeOperation(PlatformContextDirect2D&, CompositeOperator, BlendMode);
62 void setShouldAntialias(PlatformContextDirect2D&, bool);
63
64 void setCTM(PlatformContextDirect2D&, const AffineTransform&);
65 AffineTransform getCTM(PlatformContextDirect2D&);
66
67 IntRect getClipBounds(PlatformContextDirect2D&);
68 FloatRect roundToDevicePixels(PlatformContextDirect2D&, const FloatRect&);
69
70 bool isAcceleratedContext(PlatformContextDirect2D&);
71
72 } // namespace State
73
74 struct FillSource {
75     FillSource() = default;
76     explicit FillSource(const GraphicsContextState&, PlatformContextDirect2D&);
77
78     float globalAlpha { 0 };
79     COMPtr<ID2D1Brush> brush;
80     Color color;
81
82     WindRule fillRule { WindRule::NonZero };
83 };
84
85 struct StrokeSource {
86     StrokeSource() = default;
87     explicit StrokeSource(const GraphicsContextState&, PlatformContextDirect2D&);
88
89     float globalAlpha { 0 };
90     float thickness { 0 };
91     COMPtr<ID2D1Brush> brush;
92     Color color;
93 };
94
95 struct ShadowState {
96     ShadowState() = default;
97     WEBCORE_EXPORT explicit ShadowState(const GraphicsContextState&);
98
99     bool isVisible() const;
100     bool isRequired(PlatformContextDirect2D&) const;
101
102     FloatSize offset;
103     float blur { 0 };
104     Color color;
105     bool ignoreTransforms { false };
106
107     float globalAlpha { 1.0 };
108     CompositeOperator globalCompositeOperator { CompositeSourceOver };
109 };
110
111 void setLineCap(PlatformContextDirect2D&, LineCap);
112 void setLineDash(PlatformContextDirect2D&, const DashArray&, float);
113 void setLineJoin(PlatformContextDirect2D&, LineJoin);
114 void setMiterLimit(PlatformContextDirect2D&, float);
115
116 void fillRect(PlatformContextDirect2D&, const FloatRect&, const FillSource&, const ShadowState&);
117 void fillRect(PlatformContextDirect2D&, const FloatRect&, const Color&, const ShadowState&);
118 void fillRectWithGradient(PlatformContextDirect2D&, const FloatRect&, ID2D1Brush*);
119 void fillRoundedRect(PlatformContextDirect2D&, const FloatRoundedRect&, const Color&, const ShadowState&);
120 void fillRectWithRoundedHole(PlatformContextDirect2D&, const FloatRect&, const FloatRoundedRect&, const FillSource&, const ShadowState&);
121 void fillPath(PlatformContextDirect2D&, const Path&, const FillSource&, const ShadowState&);
122 void fillPath(PlatformContextDirect2D&, const Path&, const Color&, const ShadowState&);
123
124 void strokeRect(PlatformContextDirect2D&, const FloatRect&, float, const StrokeSource&, const ShadowState&);
125 void strokePath(PlatformContextDirect2D&, const Path&, const StrokeSource&, const ShadowState&);
126 void clearRect(PlatformContextDirect2D&, const FloatRect&);
127
128 // FIXME(IMPLEMENT): void drawGlyphs(PlatformContextDirect2D&, const FillSource&, const StrokeSource&, const ShadowState&, const FloatPoint&, DirectWriteScaledFont*, double, const Vector<DirectWriteGlyphType>&, float, TextDrawingModeFlags, float, const FloatSize&, const Color&);
129
130 void drawNativeImage(PlatformContextDirect2D&, IWICBitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, CompositeOperator, BlendMode, ImageOrientation, InterpolationQuality, float, const ShadowState&);
131 void drawNativeImage(PlatformContextDirect2D&, ID2D1Bitmap*, const FloatSize& imageSize, const FloatRect&, const FloatRect&, CompositeOperator, BlendMode, ImageOrientation, InterpolationQuality, float, const ShadowState&);
132 void drawPath(PlatformContextDirect2D&, const Path&, const StrokeSource&, const ShadowState&);
133 void drawPattern(PlatformContextDirect2D&, IWICBitmap*, const IntSize&, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, CompositeOperator, BlendMode);
134
135 void drawWithoutShadow(PlatformContextDirect2D&, const FloatRect& boundingRect, const WTF::Function<void(ID2D1RenderTarget*)>& drawCommands);
136 void drawWithShadow(PlatformContextDirect2D&, const FloatRect& boundingRect, const ShadowState&, const WTF::Function<void(ID2D1RenderTarget*)>& drawCommands);
137 void drawWithShadowHelper(ID2D1RenderTarget* context, ID2D1Bitmap*, const Color& shadowColor, const FloatSize& shadowOffset, float shadowBlur);
138
139 void drawRect(PlatformContextDirect2D&, const FloatRect&, float, const Color&, StrokeStyle, const Color&);
140 void drawLine(PlatformContextDirect2D&, const FloatPoint&, const FloatPoint&, StrokeStyle, const Color&, float, bool);
141 void drawLinesForText(PlatformContextDirect2D&, const FloatPoint&, float thickness, const DashArray&, bool, bool, const Color&);
142 void drawDotsForDocumentMarker(PlatformContextDirect2D&, const FloatRect&, DocumentMarkerLineStyle);
143 void drawEllipse(PlatformContextDirect2D&, const FloatRect&, StrokeStyle, const Color&, float);
144 void fillEllipse(PlatformContextDirect2D&, const FloatRect&, const Color&, StrokeStyle, const Color&, float);
145
146 void drawFocusRing(PlatformContextDirect2D&, const Path&, float, const Color&);
147 void drawFocusRing(PlatformContextDirect2D&, const Vector<FloatRect>&, float, const Color&);
148
149 void flush(PlatformContextDirect2D&);
150 void save(PlatformContextDirect2D&);
151 void restore(PlatformContextDirect2D&);
152
153 void translate(PlatformContextDirect2D&, float, float);
154 void rotate(PlatformContextDirect2D&, float);
155 void scale(PlatformContextDirect2D&, const FloatSize&);
156 void concatCTM(PlatformContextDirect2D&, const AffineTransform&);
157
158 void beginTransparencyLayer(PlatformContextDirect2D&, float);
159 void endTransparencyLayer(PlatformContextDirect2D&);
160
161 void clip(PlatformContextDirect2D&, const FloatRect&);
162
163 void clipOut(PlatformContextDirect2D&, const FloatRect&);
164 void clipOut(PlatformContextDirect2D&, const Path&);
165 void clipPath(PlatformContextDirect2D&, const Path&, WindRule);
166 void clipPath(PlatformContextDirect2D&, ID2D1Geometry* path);
167
168 void clipToImageBuffer(PlatformContextDirect2D&, ID2D1RenderTarget*, const FloatRect&);
169
170 } // namespace Direct2D
171 } // namespace WebCore
172
173 #endif // USE(DIRECT2D)