<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[180511] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/180511">180511</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-23 12:31:04 -0800 (Mon, 23 Feb 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Drawing an SVG image into a canvas using drawImage() ignores globalAlpha.
https://bugs.webkit.org/show_bug.cgi?id=141729.
Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2015-02-23
Reviewed by Simon Fraser.
Source/WebCore:
When drawing an SVG image and the drawing context is set to be transparent,
make sure this transparency is applied to the compositing layer.
Test: svg/canvas/canvas-global-alpha-svg.html
* platform/graphics/GraphicsContext.cpp:
(WebCore::GraphicsContext::setAlpha): Make setAlpha() calls the platform
function and sets 'm_state.alpha' to the input value.
(WebCore::GraphicsContext::alpha): Add a new function 'alpha()' which
returns the value of the global alpha.
* platform/graphics/GraphicsContext.h:
(WebCore::GraphicsContextState::GraphicsContextState): Add a new member
'alpha' to the context state since the getter function CGContextGetAlpha
is defined only in a private header file. Also move single line functions
from the source file to the header file.
* platform/graphics/cairo/GraphicsContextCairo.cpp:
(WebCore::GraphicsContext::setPlatformAlpha):
(WebCore::GraphicsContext::setAlpha): Deleted.
* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::GraphicsContext::setPlatformAlpha):
(WebCore::GraphicsContext::setAlpha): Deleted.
Rename setAlpha() to setPlatformAlpha() in the platform files. Add setAlpha()
to the core file. setAlpha() will set the value of 'm_state.alpha' and call
setPlatformAlpha().
* svg/graphics/SVGImage.cpp:
(WebCore::SVGImage::draw): If the drawing context is transparent, apply its
global alpha value to the compositing layer.
LayoutTests:
Add a new test which draws an SVG image on a canvas after setting its
globalAlpha to a value less than 1.
* svg/canvas/canvas-global-alpha-svg-expected.html: Added.
* svg/canvas/canvas-global-alpha-svg.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsContextcpp">trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsContexth">trunk/Source/WebCore/platform/graphics/GraphicsContext.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscairoGraphicsContextCairocpp">trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp">trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp</a></li>
<li><a href="#trunkSourceWebCoresvggraphicsSVGImagecpp">trunk/Source/WebCore/svg/graphics/SVGImage.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestssvgcanvascanvasglobalalphasvgexpectedhtml">trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg-expected.html</a></li>
<li><a href="#trunkLayoutTestssvgcanvascanvasglobalalphasvghtml">trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/LayoutTests/ChangeLog        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2015-02-23 Said Abou-Hallawa <sabouhallawa@apple.com>
+
+ Drawing an SVG image into a canvas using drawImage() ignores globalAlpha.
+ https://bugs.webkit.org/show_bug.cgi?id=141729.
+
+ Reviewed by Simon Fraser.
+
+ Add a new test which draws an SVG image on a canvas after setting its
+ globalAlpha to a value less than 1.
+
+ * svg/canvas/canvas-global-alpha-svg-expected.html: Added.
+ * svg/canvas/canvas-global-alpha-svg.html: Added.
+
</ins><span class="cx"> 2015-02-23 Gyuyoung Kim <gyuyoung.kim@samsung.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed EFL gardening. Mark tests of css3 overflow, border to ImageOnlyFailure.
</span></span></pre></div>
<a id="trunkLayoutTestssvgcanvascanvasglobalalphasvgexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg-expected.html (0 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg-expected.html         (rev 0)
+++ trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg-expected.html        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ div {
+ border-width: 25px;
+ border-style: solid;
+ border-color: green;
+ }
+ .main {
+ width: 100px;
+ height: 100px;
+ }
+ .sub {
+ width: 50px;
+ height: 50px;
+ }
+ .sub-sub {
+ width: 0px;
+ height: 0px;
+ }
+ .low-opacity {
+ opacity: 0.2;
+ }
+ </style>
+</head>
+<body>
+ <div class="main">
+ <div class="sub low-opacity">
+ <div class="sub-sub low-opacity"></div>
+ </div>
+ </div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestssvgcanvascanvasglobalalphasvghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg.html (0 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg.html         (rev 0)
+++ trunk/LayoutTests/svg/canvas/canvas-global-alpha-svg.html        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<body>
+ <canvas id="canvas"></canvas>
+ <script>
+ var canvas = document.getElementById("canvas");
+ canvas.width = 150;
+ canvas.height = 150;
+
+ var context = canvas.getContext("2d");
+ context.strokeStyle = "green";
+ context.lineWidth = 50;
+ context.strokeRect(0,0,150,150);
+
+ var svgImage = new Image();
+ svgImage.onload = function() {
+ context.globalAlpha = 0.2;
+         context.drawImage(svgImage, 25, 25);
+ };
+
+ svgImage.src = "data:image/svg+xml, \
+ <svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'> \
+ <rect width='100%' height='100%' style='fill:none;stroke:green;stroke-width:50%;'/> \
+ <rect x='25%' y='25%' width='50%' height='50%' fill='green' fill-opacity='0.2'/> \
+ </svg>";
+ </script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/ChangeLog        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2015-02-23 Said Abou-Hallawa <sabouhallawa@apple.com>
+
+ Drawing an SVG image into a canvas using drawImage() ignores globalAlpha.
+ https://bugs.webkit.org/show_bug.cgi?id=141729.
+
+ Reviewed by Simon Fraser.
+
+ When drawing an SVG image and the drawing context is set to be transparent,
+ make sure this transparency is applied to the compositing layer.
+
+ Test: svg/canvas/canvas-global-alpha-svg.html
+
+ * platform/graphics/GraphicsContext.cpp:
+ (WebCore::GraphicsContext::setAlpha): Make setAlpha() calls the platform
+ function and sets 'm_state.alpha' to the input value.
+
+ (WebCore::GraphicsContext::alpha): Add a new function 'alpha()' which
+ returns the value of the global alpha.
+
+ * platform/graphics/GraphicsContext.h:
+ (WebCore::GraphicsContextState::GraphicsContextState): Add a new member
+ 'alpha' to the context state since the getter function CGContextGetAlpha
+ is defined only in a private header file. Also move single line functions
+ from the source file to the header file.
+
+ * platform/graphics/cairo/GraphicsContextCairo.cpp:
+ (WebCore::GraphicsContext::setPlatformAlpha):
+ (WebCore::GraphicsContext::setAlpha): Deleted.
+ * platform/graphics/cg/GraphicsContextCG.cpp:
+ (WebCore::GraphicsContext::setPlatformAlpha):
+ (WebCore::GraphicsContext::setAlpha): Deleted.
+ Rename setAlpha() to setPlatformAlpha() in the platform files. Add setAlpha()
+ to the core file. setAlpha() will set the value of 'm_state.alpha' and call
+ setPlatformAlpha().
+
+ * svg/graphics/SVGImage.cpp:
+ (WebCore::SVGImage::draw): If the drawing context is transparent, apply its
+ global alpha value to the compositing layer.
+
</ins><span class="cx"> 2015-02-23 Eric Carlson <eric.carlson@apple.com>
</span><span class="cx">
</span><span class="cx"> Occasional crash in MediaPlayer::setPrivateBrowsingMode
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -208,12 +208,6 @@
</span><span class="cx"> clearPlatformShadow();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool GraphicsContext::hasShadow() const
-{
- return m_state.shadowColor.isValid() && m_state.shadowColor.alpha()
- && (m_state.shadowBlur || m_state.shadowOffset.width() || m_state.shadowOffset.height());
-}
-
</del><span class="cx"> bool GraphicsContext::getShadow(FloatSize& offset, float& blur, Color& color, ColorSpace& colorSpace) const
</span><span class="cx"> {
</span><span class="cx"> offset = m_state.shadowOffset;
</span><span class="lines">@@ -224,11 +218,6 @@
</span><span class="cx"> return hasShadow();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool GraphicsContext::hasBlurredShadow() const
-{
- return m_state.shadowColor.isValid() && m_state.shadowColor.alpha() && m_state.shadowBlur;
-}
-
</del><span class="cx"> #if USE(CAIRO)
</span><span class="cx"> bool GraphicsContext::mustUseShadowBlur() const
</span><span class="cx"> {
</span><span class="lines">@@ -247,36 +236,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-float GraphicsContext::strokeThickness() const
-{
- return m_state.strokeThickness;
-}
-
-StrokeStyle GraphicsContext::strokeStyle() const
-{
- return m_state.strokeStyle;
-}
-
-Color GraphicsContext::strokeColor() const
-{
- return m_state.strokeColor;
-}
-
-ColorSpace GraphicsContext::strokeColorSpace() const
-{
- return m_state.strokeColorSpace;
-}
-
-WindRule GraphicsContext::fillRule() const
-{
- return m_state.fillRule;
-}
-
-void GraphicsContext::setFillRule(WindRule fillRule)
-{
- m_state.fillRule = fillRule;
-}
-
</del><span class="cx"> void GraphicsContext::setFillColor(const Color& color, ColorSpace colorSpace)
</span><span class="cx"> {
</span><span class="cx"> m_state.fillColor = color;
</span><span class="lines">@@ -286,53 +245,18 @@
</span><span class="cx"> setPlatformFillColor(color, colorSpace);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Color GraphicsContext::fillColor() const
</del><ins>+void GraphicsContext::setShouldAntialias(bool shouldAntialias)
</ins><span class="cx"> {
</span><del>- return m_state.fillColor;
</del><ins>+ m_state.shouldAntialias = shouldAntialias;
+ setPlatformShouldAntialias(shouldAntialias);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-ColorSpace GraphicsContext::fillColorSpace() const
</del><ins>+void GraphicsContext::setShouldSmoothFonts(bool shouldSmoothFonts)
</ins><span class="cx"> {
</span><del>- return m_state.fillColorSpace;
</del><ins>+ m_state.shouldSmoothFonts = shouldSmoothFonts;
+ setPlatformShouldSmoothFonts(shouldSmoothFonts);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void GraphicsContext::setShouldAntialias(bool b)
-{
- m_state.shouldAntialias = b;
- setPlatformShouldAntialias(b);
-}
-
-bool GraphicsContext::shouldAntialias() const
-{
- return m_state.shouldAntialias;
-}
-
-void GraphicsContext::setShouldSmoothFonts(bool b)
-{
- m_state.shouldSmoothFonts = b;
- setPlatformShouldSmoothFonts(b);
-}
-
-bool GraphicsContext::shouldSmoothFonts() const
-{
- return m_state.shouldSmoothFonts;
-}
-
-void GraphicsContext::setShouldSubpixelQuantizeFonts(bool b)
-{
- m_state.shouldSubpixelQuantizeFonts = b;
-}
-
-bool GraphicsContext::shouldSubpixelQuantizeFonts() const
-{
- return m_state.shouldSubpixelQuantizeFonts;
-}
-
-const GraphicsContextState& GraphicsContext::state() const
-{
- return m_state;
-}
-
</del><span class="cx"> void GraphicsContext::setStrokePattern(Ref<Pattern>&& pattern)
</span><span class="cx"> {
</span><span class="cx"> m_state.strokeGradient.clear();
</span><span class="lines">@@ -357,36 +281,6 @@
</span><span class="cx"> m_state.fillPattern.clear();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Gradient* GraphicsContext::fillGradient() const
-{
- return m_state.fillGradient.get();
-}
-
-Gradient* GraphicsContext::strokeGradient() const
-{
- return m_state.strokeGradient.get();
-}
-
-Pattern* GraphicsContext::fillPattern() const
-{
- return m_state.fillPattern.get();
-}
-
-Pattern* GraphicsContext::strokePattern() const
-{
- return m_state.strokePattern.get();
-}
-
-void GraphicsContext::setShadowsIgnoreTransforms(bool ignoreTransforms)
-{
- m_state.shadowsIgnoreTransforms = ignoreTransforms;
-}
-
-bool GraphicsContext::shadowsIgnoreTransforms() const
-{
- return m_state.shadowsIgnoreTransforms;
-}
-
</del><span class="cx"> void GraphicsContext::beginTransparencyLayer(float opacity)
</span><span class="cx"> {
</span><span class="cx"> beginPlatformTransparencyLayer(opacity);
</span><span class="lines">@@ -400,32 +294,12 @@
</span><span class="cx"> --m_transparencyCount;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool GraphicsContext::isInTransparencyLayer() const
-{
- return (m_transparencyCount > 0) && supportsTransparencyLayers();
-}
-
-bool GraphicsContext::updatingControlTints() const
-{
- return m_updatingControlTints;
-}
-
</del><span class="cx"> void GraphicsContext::setUpdatingControlTints(bool b)
</span><span class="cx"> {
</span><span class="cx"> setPaintingDisabled(b);
</span><span class="cx"> m_updatingControlTints = b;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void GraphicsContext::setPaintingDisabled(bool f)
-{
- m_state.paintingDisabled = f;
-}
-
-bool GraphicsContext::paintingDisabled() const
-{
- return m_state.paintingDisabled;
-}
-
</del><span class="cx"> float GraphicsContext::drawText(const FontCascade& font, const TextRun& run, const FloatPoint& point, int from, int to)
</span><span class="cx"> {
</span><span class="cx"> if (paintingDisabled())
</span><span class="lines">@@ -610,11 +484,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-TextDrawingModeFlags GraphicsContext::textDrawingMode() const
-{
- return m_state.textDrawingMode;
-}
-
</del><span class="cx"> void GraphicsContext::setTextDrawingMode(TextDrawingModeFlags mode)
</span><span class="cx"> {
</span><span class="cx"> m_state.textDrawingMode = mode;
</span><span class="lines">@@ -679,6 +548,12 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+void GraphicsContext::setAlpha(float alpha)
+{
+ m_state.alpha = alpha;
+ setPlatformAlpha(alpha);
+}
+
</ins><span class="cx"> void GraphicsContext::setCompositeOperation(CompositeOperator compositeOperation, BlendMode blendMode)
</span><span class="cx"> {
</span><span class="cx"> m_state.compositeOperator = compositeOperation;
</span><span class="lines">@@ -686,26 +561,6 @@
</span><span class="cx"> setPlatformCompositeOperation(compositeOperation, blendMode);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-CompositeOperator GraphicsContext::compositeOperation() const
-{
- return m_state.compositeOperator;
-}
-
-BlendMode GraphicsContext::blendModeOperation() const
-{
- return m_state.blendMode;
-}
-
-void GraphicsContext::setDrawLuminanceMask(bool drawLuminanceMask)
-{
- m_state.drawLuminanceMask = drawLuminanceMask;
-}
-
-bool GraphicsContext::drawLuminanceMask() const
-{
- return m_state.drawLuminanceMask;
-}
-
</del><span class="cx"> #if !USE(CG)
</span><span class="cx"> // Implement this if you want to go ahead and push the drawing mode into your native context
</span><span class="cx"> // immediately.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.h (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsContext.h        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.h        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -113,19 +113,7 @@
</span><span class="cx">
</span><span class="cx"> struct GraphicsContextState {
</span><span class="cx"> GraphicsContextState()
</span><del>- : strokeThickness(0)
- , shadowBlur(0)
- , textDrawingMode(TextModeFill)
- , strokeColor(Color::black)
- , fillColor(Color::black)
- , strokeStyle(SolidStroke)
- , fillRule(RULE_NONZERO)
- , strokeColorSpace(ColorSpaceDeviceRGB)
- , fillColorSpace(ColorSpaceDeviceRGB)
- , shadowColorSpace(ColorSpaceDeviceRGB)
- , compositeOperator(CompositeSourceOver)
- , blendMode(BlendModeNormal)
- , shouldAntialias(true)
</del><ins>+ : shouldAntialias(true)
</ins><span class="cx"> , shouldSmoothFonts(true)
</span><span class="cx"> , shouldSubpixelQuantizeFonts(true)
</span><span class="cx"> , paintingDisabled(false)
</span><span class="lines">@@ -147,24 +135,25 @@
</span><span class="cx">
</span><span class="cx"> FloatSize shadowOffset;
</span><span class="cx">
</span><del>- float strokeThickness;
- float shadowBlur;
</del><ins>+ float strokeThickness { 0 };
+ float shadowBlur { 0 };
</ins><span class="cx">
</span><del>- TextDrawingModeFlags textDrawingMode;
</del><ins>+ TextDrawingModeFlags textDrawingMode { TextModeFill };
</ins><span class="cx">
</span><del>- Color strokeColor;
- Color fillColor;
</del><ins>+ Color strokeColor { Color::black };
+ Color fillColor { Color::black };
</ins><span class="cx"> Color shadowColor;
</span><span class="cx">
</span><del>- StrokeStyle strokeStyle;
- WindRule fillRule;
</del><ins>+ StrokeStyle strokeStyle { SolidStroke };
+ WindRule fillRule { RULE_NONZERO };
</ins><span class="cx">
</span><del>- ColorSpace strokeColorSpace;
- ColorSpace fillColorSpace;
- ColorSpace shadowColorSpace;
</del><ins>+ ColorSpace strokeColorSpace { ColorSpaceDeviceRGB };
+ ColorSpace fillColorSpace { ColorSpaceDeviceRGB };
+ ColorSpace shadowColorSpace { ColorSpaceDeviceRGB };
</ins><span class="cx">
</span><del>- CompositeOperator compositeOperator;
- BlendMode blendMode;
</del><ins>+ float alpha { 1 };
+ CompositeOperator compositeOperator { CompositeSourceOver };
+ BlendMode blendMode { BlendModeNormal };
</ins><span class="cx">
</span><span class="cx"> bool shouldAntialias : 1;
</span><span class="cx"> bool shouldSmoothFonts : 1;
</span><span class="lines">@@ -216,47 +205,50 @@
</span><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT PlatformGraphicsContext* platformContext() const;
</span><span class="cx">
</span><del>- float strokeThickness() const;
</del><span class="cx"> void setStrokeThickness(float);
</span><del>- StrokeStyle strokeStyle() const;
</del><ins>+ float strokeThickness() const { return m_state.strokeThickness; }
+
</ins><span class="cx"> void setStrokeStyle(StrokeStyle);
</span><del>- Color strokeColor() const;
- ColorSpace strokeColorSpace() const;
</del><ins>+ StrokeStyle strokeStyle() const { return m_state.strokeStyle; }
+
</ins><span class="cx"> WEBCORE_EXPORT void setStrokeColor(const Color&, ColorSpace);
</span><ins>+ Color strokeColor() const { return m_state.strokeColor; }
+ ColorSpace strokeColorSpace() const { return m_state.strokeColorSpace; }
</ins><span class="cx">
</span><span class="cx"> void setStrokePattern(Ref<Pattern>&&);
</span><del>- Pattern* strokePattern() const;
</del><ins>+ Pattern* strokePattern() const { return m_state.strokePattern.get(); }
</ins><span class="cx">
</span><span class="cx"> void setStrokeGradient(Ref<Gradient>&&);
</span><del>- Gradient* strokeGradient() const;
</del><ins>+ Gradient* strokeGradient() const { return m_state.strokeGradient.get(); }
</ins><span class="cx">
</span><del>- WindRule fillRule() const;
- void setFillRule(WindRule);
- Color fillColor() const;
- ColorSpace fillColorSpace() const;
</del><ins>+ void setFillRule(WindRule fillRule) { m_state.fillRule = fillRule; }
+ WindRule fillRule() const { return m_state.fillRule; }
+
</ins><span class="cx"> WEBCORE_EXPORT void setFillColor(const Color&, ColorSpace);
</span><ins>+ Color fillColor() const { return m_state.fillColor; }
+ ColorSpace fillColorSpace() const { return m_state.fillColorSpace; }
</ins><span class="cx">
</span><span class="cx"> void setFillPattern(Ref<Pattern>&&);
</span><del>- Pattern* fillPattern() const;
</del><ins>+ Pattern* fillPattern() const { return m_state.fillPattern.get(); }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void setFillGradient(Ref<Gradient>&&);
</span><del>- Gradient* fillGradient() const;
</del><ins>+ Gradient* fillGradient() const { return m_state.fillGradient.get(); }
</ins><span class="cx">
</span><del>- void setShadowsIgnoreTransforms(bool);
- bool shadowsIgnoreTransforms() const;
</del><ins>+ void setShadowsIgnoreTransforms(bool shadowsIgnoreTransforms) { m_state.shadowsIgnoreTransforms = shadowsIgnoreTransforms; }
+ bool shadowsIgnoreTransforms() const { return m_state.shadowsIgnoreTransforms; }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void setShouldAntialias(bool);
</span><del>- bool shouldAntialias() const;
</del><ins>+ bool shouldAntialias() const { return m_state.shouldAntialias; }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void setShouldSmoothFonts(bool);
</span><del>- bool shouldSmoothFonts() const;
</del><ins>+ bool shouldSmoothFonts() const { return m_state.shouldSmoothFonts; }
</ins><span class="cx">
</span><span class="cx"> // Normally CG enables subpixel-quantization because it improves the performance of aligning glyphs.
</span><span class="cx"> // In some cases we have to disable to to ensure a high-quality output of the glyphs.
</span><del>- void setShouldSubpixelQuantizeFonts(bool);
- bool shouldSubpixelQuantizeFonts() const;
</del><ins>+ void setShouldSubpixelQuantizeFonts(bool shouldSubpixelQuantizeFonts) { m_state.shouldSubpixelQuantizeFonts = shouldSubpixelQuantizeFonts; }
+ bool shouldSubpixelQuantizeFonts() const { return m_state.shouldSubpixelQuantizeFonts; }
</ins><span class="cx">
</span><del>- const GraphicsContextState& state() const;
</del><ins>+ const GraphicsContextState& state() const { return m_state; }
</ins><span class="cx">
</span><span class="cx"> #if USE(CG)
</span><span class="cx"> void applyStrokePattern();
</span><span class="lines">@@ -338,9 +330,9 @@
</span><span class="cx">
</span><span class="cx"> IntRect clipBounds() const;
</span><span class="cx">
</span><del>- TextDrawingModeFlags textDrawingMode() const;
</del><span class="cx"> void setTextDrawingMode(TextDrawingModeFlags);
</span><del>-
</del><ins>+ TextDrawingModeFlags textDrawingMode() const { return m_state.textDrawingMode; }
+
</ins><span class="cx"> float drawText(const FontCascade&, const TextRun&, const FloatPoint&, int from = 0, int to = -1);
</span><span class="cx"> void drawGlyphs(const FontCascade&, const Font&, const GlyphBuffer&, int from, int numGlyphs, const FloatPoint&);
</span><span class="cx"> void drawEmphasisMarks(const FontCascade&, const TextRun& , const AtomicString& mark, const FloatPoint&, int from = 0, int to = -1);
</span><span class="lines">@@ -367,26 +359,28 @@
</span><span class="cx"> static void updateDocumentMarkerResources();
</span><span class="cx"> void drawLineForDocumentMarker(const FloatPoint&, float width, DocumentMarkerLineStyle);
</span><span class="cx">
</span><del>- WEBCORE_EXPORT bool paintingDisabled() const;
- void setPaintingDisabled(bool);
</del><ins>+ void setPaintingDisabled(bool paintingDisabled) { m_state.paintingDisabled = paintingDisabled; }
+ WEBCORE_EXPORT bool paintingDisabled() const { return m_state.paintingDisabled; }
</ins><span class="cx">
</span><del>- WEBCORE_EXPORT bool updatingControlTints() const;
</del><span class="cx"> void setUpdatingControlTints(bool);
</span><ins>+ WEBCORE_EXPORT bool updatingControlTints() const { return m_updatingControlTints; }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void beginTransparencyLayer(float opacity);
</span><span class="cx"> WEBCORE_EXPORT void endTransparencyLayer();
</span><del>- bool isInTransparencyLayer() const;
</del><ins>+ bool isInTransparencyLayer() const { return (m_transparencyCount > 0) && supportsTransparencyLayers(); }
</ins><span class="cx">
</span><del>- bool hasShadow() const;
</del><span class="cx"> WEBCORE_EXPORT void setShadow(const FloatSize&, float blur, const Color&, ColorSpace);
</span><span class="cx"> // Legacy shadow blur radius is used for canvas, and -webkit-box-shadow.
</span><span class="cx"> // It has different treatment of radii > 8px.
</span><span class="cx"> void setLegacyShadow(const FloatSize&, float blur, const Color&, ColorSpace);
</span><span class="cx">
</span><del>- bool getShadow(FloatSize&, float&, Color&, ColorSpace&) const;
</del><span class="cx"> WEBCORE_EXPORT void clearShadow();
</span><ins>+ bool getShadow(FloatSize&, float&, Color&, ColorSpace&) const;
</ins><span class="cx">
</span><del>- bool hasBlurredShadow() const;
</del><ins>+ bool hasVisibleShadow() const { return m_state.shadowColor.isValid() && m_state.shadowColor.alpha(); }
+ bool hasShadow() const { return hasVisibleShadow() && (m_state.shadowBlur || m_state.shadowOffset.width() || m_state.shadowOffset.height()); }
+ bool hasBlurredShadow() const { return hasVisibleShadow() && m_state.shadowBlur; }
+
</ins><span class="cx"> #if USE(CAIRO)
</span><span class="cx"> bool mustUseShadowBlur() const;
</span><span class="cx"> #endif
</span><span class="lines">@@ -403,13 +397,14 @@
</span><span class="cx"> void setMiterLimit(float);
</span><span class="cx">
</span><span class="cx"> void setAlpha(float);
</span><ins>+ float alpha() const { return m_state.alpha; }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void setCompositeOperation(CompositeOperator, BlendMode = BlendModeNormal);
</span><del>- CompositeOperator compositeOperation() const;
- BlendMode blendModeOperation() const;
</del><ins>+ CompositeOperator compositeOperation() const { return m_state.compositeOperator; }
+ BlendMode blendModeOperation() const { return m_state.blendMode; }
</ins><span class="cx">
</span><del>- void setDrawLuminanceMask(bool);
- bool drawLuminanceMask() const;
</del><ins>+ void setDrawLuminanceMask(bool drawLuminanceMask) { m_state.drawLuminanceMask = drawLuminanceMask; }
+ bool drawLuminanceMask() const { return m_state.drawLuminanceMask; }
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void clip(const Path&, WindRule = RULE_EVENODD);
</span><span class="cx">
</span><span class="lines">@@ -540,6 +535,7 @@
</span><span class="cx"> void setPlatformShadow(const FloatSize&, float blur, const Color&, ColorSpace);
</span><span class="cx"> void clearPlatformShadow();
</span><span class="cx">
</span><ins>+ void setPlatformAlpha(float);
</ins><span class="cx"> void setPlatformCompositeOperation(CompositeOperator, BlendMode = BlendModeNormal);
</span><span class="cx">
</span><span class="cx"> void beginPlatformTransparencyLayer(float opacity);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscairoGraphicsContextCairocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -928,7 +928,7 @@
</span><span class="cx"> cairo_set_miter_limit(platformContext()->cr(), miter);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void GraphicsContext::setAlpha(float alpha)
</del><ins>+void GraphicsContext::setPlatformAlpha(float alpha)
</ins><span class="cx"> {
</span><span class="cx"> platformContext()->setGlobalAlpha(alpha);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -996,13 +996,6 @@
</span><span class="cx"> CGContextSetMiterLimit(platformContext(), limit);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void GraphicsContext::setAlpha(float alpha)
-{
- if (paintingDisabled())
- return;
- CGContextSetAlpha(platformContext(), alpha);
-}
-
</del><span class="cx"> void GraphicsContext::clearRect(const FloatRect& r)
</span><span class="cx"> {
</span><span class="cx"> if (paintingDisabled())
</span><span class="lines">@@ -1481,6 +1474,13 @@
</span><span class="cx"> CGContextSetShouldSmoothFonts(platformContext(), enable);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void GraphicsContext::setPlatformAlpha(float alpha)
+{
+ if (paintingDisabled())
+ return;
+ CGContextSetAlpha(platformContext(), alpha);
+}
+
</ins><span class="cx"> void GraphicsContext::setPlatformCompositeOperation(CompositeOperator mode, BlendMode blendMode)
</span><span class="cx"> {
</span><span class="cx"> if (paintingDisabled())
</span></span></pre></div>
<a id="trunkSourceWebCoresvggraphicsSVGImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/graphics/SVGImage.cpp (180510 => 180511)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/graphics/SVGImage.cpp        2015-02-23 19:27:36 UTC (rev 180510)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.cpp        2015-02-23 20:31:04 UTC (rev 180511)
</span><span class="lines">@@ -229,9 +229,11 @@
</span><span class="cx"> GraphicsContextStateSaver stateSaver(*context);
</span><span class="cx"> context->setCompositeOperation(compositeOp, blendMode);
</span><span class="cx"> context->clip(enclosingIntRect(dstRect));
</span><del>- bool compositingRequiresTransparencyLayer = compositeOp != CompositeSourceOver || blendMode != BlendModeNormal;
</del><ins>+
+ float alpha = context->alpha();
+ bool compositingRequiresTransparencyLayer = compositeOp != CompositeSourceOver || blendMode != BlendModeNormal || alpha < 1;
</ins><span class="cx"> if (compositingRequiresTransparencyLayer) {
</span><del>- context->beginTransparencyLayer(1);
</del><ins>+ context->beginTransparencyLayer(alpha);
</ins><span class="cx"> context->setCompositeOperation(CompositeSourceOver, BlendModeNormal);
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>