<!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>[192900] trunk/Source</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/192900">192900</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-12-01 12:26:05 -0800 (Tue, 01 Dec 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Use Optional for matrix inverses
https://bugs.webkit.org/show_bug.cgi?id=151575
Patch by Alex Christensen <achristensen@webkit.org> on 2015-12-01
Reviewed by Myles C. Maxfield.
Source/WebCore:
This patch should have no change in behavior. Some unnecessary checks are removed.
There are a few places where we are no longer multiplying by the identity matrix.
This should remind future coders that not all matrices are invertible.
* css/WebKitCSSMatrix.cpp:
(WebCore::WebKitCSSMatrix::inverse):
(WebCore::WebKitCSSMatrix::translate):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::restore):
(WebCore::CanvasRenderingContext2D::scale):
(WebCore::CanvasRenderingContext2D::rotate):
(WebCore::CanvasRenderingContext2D::translate):
(WebCore::CanvasRenderingContext2D::transform):
(WebCore::CanvasRenderingContext2D::setTransform):
(WebCore::CanvasRenderingContext2D::isPointInPathInternal):
(WebCore::CanvasRenderingContext2D::isPointInStrokeInternal):
* platform/graphics/GraphicsContext.cpp:
(WebCore::GraphicsContext::computeLineBoundsAndAntialiasingModeForText):
* platform/graphics/ShadowBlur.cpp:
(WebCore::ShadowBlur::calculateLayerBoundingRect):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput):
* platform/graphics/cg/ImageBufferCG.cpp:
(WebCore::ImageBuffer::putByteArray):
* platform/graphics/filters/Filter.h:
(WebCore::Filter::setFilterScale):
(WebCore::Filter::absoluteTransform):
(WebCore::Filter::mapAbsolutePointToLocalPoint):
(WebCore::Filter::renderingMode):
(WebCore::Filter::setRenderingMode):
* platform/graphics/texmap/TextureMapperLayer.cpp:
(WebCore::TextureMapperLayer::paintSelfAndChildrenWithReplica):
(WebCore::TextureMapperLayer::replicaTransform):
(WebCore::TextureMapperLayer::setAnimatedFilters):
(WebCore::TextureMapperLayer::mapScrollOffset):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::transformedVisibleRect):
(WebCore::CoordinatedGraphicsLayer::computeTransformedVisibleRect):
* platform/graphics/transforms/AffineTransform.cpp:
(WebCore::AffineTransform::yScale):
(WebCore::det):
(WebCore::AffineTransform::isInvertible):
(WebCore::AffineTransform::inverse):
(WebCore::AffineTransform::det): Deleted.
* platform/graphics/transforms/AffineTransform.h:
* platform/graphics/transforms/TransformState.cpp:
(WebCore::TransformState::mappedPoint):
(WebCore::TransformState::mappedQuad):
(WebCore::TransformState::mapQuad):
(WebCore::TransformState::flattenWithTransform):
* platform/graphics/transforms/TransformationMatrix.cpp:
(WebCore::TransformationMatrix::isInvertible):
(WebCore::TransformationMatrix::inverse):
* platform/graphics/transforms/TransformationMatrix.h:
* rendering/HitTestingTransformState.cpp:
(WebCore::HitTestingTransformState::flattenWithTransform):
(WebCore::HitTestingTransformState::mappedPoint):
(WebCore::HitTestingTransformState::mappedQuad):
(WebCore::HitTestingTransformState::mappedArea):
(WebCore::HitTestingTransformState::boundsOfMappedArea):
* rendering/PaintInfo.h:
(WebCore::PaintInfo::applyTransform):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintLayerByApplyingTransform):
(WebCore::RenderLayer::hitTestLayer):
* rendering/svg/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::nodeAtFloatPoint):
* rendering/svg/RenderSVGForeignObject.cpp:
(WebCore::RenderSVGForeignObject::nodeAtFloatPoint):
* rendering/svg/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::nodeAtFloatPoint):
* rendering/svg/RenderSVGResourceClipper.cpp:
(WebCore::RenderSVGResourceClipper::hitTestClipContent):
* rendering/svg/RenderSVGResourceFilter.cpp:
(WebCore::RenderSVGResourceFilter::postApplyResource):
* rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::nodeAtPoint):
* rendering/svg/RenderSVGShape.cpp:
(WebCore::RenderSVGShape::setupNonScalingStrokeContext):
(WebCore::RenderSVGShape::nodeAtFloatPoint):
(WebCore::RenderSVGShape::calculateStrokeBoundingBox):
* rendering/svg/RenderSVGText.cpp:
(WebCore::RenderSVGText::nodeAtFloatPoint):
* rendering/svg/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::intersectRepaintRectWithShadows):
* rendering/svg/SVGRenderingContext.cpp:
(WebCore::SVGRenderingContext::clipToImageBuffer):
* svg/SVGLocatable.cpp:
(WebCore::SVGLocatable::getTransformToElement):
* svg/SVGMatrix.h:
(WebCore::SVGMatrix::inverse):
(WebCore::SVGMatrix::rotateFromVector):
Source/WebKit2:
* WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
(WebKit::NetscapePlugin::convertFromRootView):
* WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
(WebKit::NetscapePlugin::convertPoint):
* WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm:
(WebKit::PDFPlugin::convertFromPDFViewToRootView):
(WebKit::PDFPlugin::convertFromPDFViewToScreen):
(WebKit::PDFPlugin::boundsOnScreen):
(WebKit::PDFPlugin::geometryDidChange):
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::geometryDidChange):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssWebKitCSSMatrixcpp">trunk/Source/WebCore/css/WebKitCSSMatrix.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlcanvasCanvasRenderingContext2Dcpp">trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsContextcpp">trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsShadowBlurcpp">trunk/Source/WebCore/platform/graphics/ShadowBlur.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgImageBufferCGcpp">trunk/Source/WebCore/platform/graphics/cg/ImageBufferCG.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFilterh">trunk/Source/WebCore/platform/graphics/filters/Filter.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapTextureMapperLayercpp">trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp">trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsAffineTransformcpp">trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsAffineTransformh">trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformStatecpp">trunk/Source/WebCore/platform/graphics/transforms/TransformState.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixcpp">trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixh">trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h</a></li>
<li><a href="#trunkSourceWebCorerenderingHitTestingTransformStatecpp">trunk/Source/WebCore/rendering/HitTestingTransformState.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingPaintInfoh">trunk/Source/WebCore/rendering/PaintInfo.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGContainercpp">trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGForeignObjectcpp">trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGImagecpp">trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceClippercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceFiltercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGRootcpp">trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGShapecpp">trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGTextcpp">trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGRenderSupportcpp">trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGRenderingContextcpp">trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLocatablecpp">trunk/Source/WebCore/svg/SVGLocatable.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGMatrixh">trunk/Source/WebCore/svg/SVGMatrix.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCoordinatedGraphicsWebViewcpp">trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsNetscapeNetscapePlugincpp">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsNetscapemacNetscapePluginMacmm">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsPDFDeprecatedPDFPluginmm">trunk/Source/WebKit2/WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm">trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/ChangeLog        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -1,3 +1,103 @@
</span><ins>+2015-12-01 Alex Christensen <achristensen@webkit.org>
+
+ Use Optional for matrix inverses
+ https://bugs.webkit.org/show_bug.cgi?id=151575
+
+ Reviewed by Myles C. Maxfield.
+
+ This patch should have no change in behavior. Some unnecessary checks are removed.
+ There are a few places where we are no longer multiplying by the identity matrix.
+ This should remind future coders that not all matrices are invertible.
+
+ * css/WebKitCSSMatrix.cpp:
+ (WebCore::WebKitCSSMatrix::inverse):
+ (WebCore::WebKitCSSMatrix::translate):
+ * html/canvas/CanvasRenderingContext2D.cpp:
+ (WebCore::CanvasRenderingContext2D::restore):
+ (WebCore::CanvasRenderingContext2D::scale):
+ (WebCore::CanvasRenderingContext2D::rotate):
+ (WebCore::CanvasRenderingContext2D::translate):
+ (WebCore::CanvasRenderingContext2D::transform):
+ (WebCore::CanvasRenderingContext2D::setTransform):
+ (WebCore::CanvasRenderingContext2D::isPointInPathInternal):
+ (WebCore::CanvasRenderingContext2D::isPointInStrokeInternal):
+ * platform/graphics/GraphicsContext.cpp:
+ (WebCore::GraphicsContext::computeLineBoundsAndAntialiasingModeForText):
+ * platform/graphics/ShadowBlur.cpp:
+ (WebCore::ShadowBlur::calculateLayerBoundingRect):
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::paintWithVideoOutput):
+ * platform/graphics/cg/ImageBufferCG.cpp:
+ (WebCore::ImageBuffer::putByteArray):
+ * platform/graphics/filters/Filter.h:
+ (WebCore::Filter::setFilterScale):
+ (WebCore::Filter::absoluteTransform):
+ (WebCore::Filter::mapAbsolutePointToLocalPoint):
+ (WebCore::Filter::renderingMode):
+ (WebCore::Filter::setRenderingMode):
+ * platform/graphics/texmap/TextureMapperLayer.cpp:
+ (WebCore::TextureMapperLayer::paintSelfAndChildrenWithReplica):
+ (WebCore::TextureMapperLayer::replicaTransform):
+ (WebCore::TextureMapperLayer::setAnimatedFilters):
+ (WebCore::TextureMapperLayer::mapScrollOffset):
+ * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
+ (WebCore::CoordinatedGraphicsLayer::transformedVisibleRect):
+ (WebCore::CoordinatedGraphicsLayer::computeTransformedVisibleRect):
+ * platform/graphics/transforms/AffineTransform.cpp:
+ (WebCore::AffineTransform::yScale):
+ (WebCore::det):
+ (WebCore::AffineTransform::isInvertible):
+ (WebCore::AffineTransform::inverse):
+ (WebCore::AffineTransform::det): Deleted.
+ * platform/graphics/transforms/AffineTransform.h:
+ * platform/graphics/transforms/TransformState.cpp:
+ (WebCore::TransformState::mappedPoint):
+ (WebCore::TransformState::mappedQuad):
+ (WebCore::TransformState::mapQuad):
+ (WebCore::TransformState::flattenWithTransform):
+ * platform/graphics/transforms/TransformationMatrix.cpp:
+ (WebCore::TransformationMatrix::isInvertible):
+ (WebCore::TransformationMatrix::inverse):
+ * platform/graphics/transforms/TransformationMatrix.h:
+ * rendering/HitTestingTransformState.cpp:
+ (WebCore::HitTestingTransformState::flattenWithTransform):
+ (WebCore::HitTestingTransformState::mappedPoint):
+ (WebCore::HitTestingTransformState::mappedQuad):
+ (WebCore::HitTestingTransformState::mappedArea):
+ (WebCore::HitTestingTransformState::boundsOfMappedArea):
+ * rendering/PaintInfo.h:
+ (WebCore::PaintInfo::applyTransform):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::paintLayerByApplyingTransform):
+ (WebCore::RenderLayer::hitTestLayer):
+ * rendering/svg/RenderSVGContainer.cpp:
+ (WebCore::RenderSVGContainer::nodeAtFloatPoint):
+ * rendering/svg/RenderSVGForeignObject.cpp:
+ (WebCore::RenderSVGForeignObject::nodeAtFloatPoint):
+ * rendering/svg/RenderSVGImage.cpp:
+ (WebCore::RenderSVGImage::nodeAtFloatPoint):
+ * rendering/svg/RenderSVGResourceClipper.cpp:
+ (WebCore::RenderSVGResourceClipper::hitTestClipContent):
+ * rendering/svg/RenderSVGResourceFilter.cpp:
+ (WebCore::RenderSVGResourceFilter::postApplyResource):
+ * rendering/svg/RenderSVGRoot.cpp:
+ (WebCore::RenderSVGRoot::nodeAtPoint):
+ * rendering/svg/RenderSVGShape.cpp:
+ (WebCore::RenderSVGShape::setupNonScalingStrokeContext):
+ (WebCore::RenderSVGShape::nodeAtFloatPoint):
+ (WebCore::RenderSVGShape::calculateStrokeBoundingBox):
+ * rendering/svg/RenderSVGText.cpp:
+ (WebCore::RenderSVGText::nodeAtFloatPoint):
+ * rendering/svg/SVGRenderSupport.cpp:
+ (WebCore::SVGRenderSupport::intersectRepaintRectWithShadows):
+ * rendering/svg/SVGRenderingContext.cpp:
+ (WebCore::SVGRenderingContext::clipToImageBuffer):
+ * svg/SVGLocatable.cpp:
+ (WebCore::SVGLocatable::getTransformToElement):
+ * svg/SVGMatrix.h:
+ (WebCore::SVGMatrix::inverse):
+ (WebCore::SVGMatrix::rotateFromVector):
+
</ins><span class="cx"> 2015-12-01 Tim Horton <timothy_horton@apple.com>
</span><span class="cx">
</span><span class="cx"> Remove swipe snapshot before main document load if scroll position is already restored
</span></span></pre></div>
<a id="trunkSourceWebCorecssWebKitCSSMatrixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/WebKitCSSMatrix.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/WebKitCSSMatrix.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/css/WebKitCSSMatrix.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -101,12 +101,11 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<WebKitCSSMatrix> WebKitCSSMatrix::inverse(ExceptionCode& ec) const
</span><span class="cx"> {
</span><del>- if (!m_matrix.isInvertible()) {
- ec = NOT_SUPPORTED_ERR;
- return nullptr;
- }
-
- return WebKitCSSMatrix::create(m_matrix.inverse());
</del><ins>+ if (auto inverse = m_matrix.inverse())
+ return WebKitCSSMatrix::create(inverse.value());
+
+ ec = NOT_SUPPORTED_ERR;
+ return nullptr;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<WebKitCSSMatrix> WebKitCSSMatrix::translate(double x, double y, double z) const
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlcanvasCanvasRenderingContext2Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -346,7 +346,8 @@
</span><span class="cx"> return;
</span><span class="cx"> m_path.transform(state().transform);
</span><span class="cx"> m_stateStack.removeLast();
</span><del>- m_path.transform(state().transform.inverse());
</del><ins>+ if (Optional<AffineTransform> inverse = state().transform.inverse())
+ m_path.transform(inverse.value());
</ins><span class="cx"> GraphicsContext* c = drawingContext();
</span><span class="cx"> if (!c)
</span><span class="cx"> return;
</span><span class="lines">@@ -673,7 +674,7 @@
</span><span class="cx"> if (!state().hasInvertibleTransform)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- if (!std::isfinite(sx) | !std::isfinite(sy))
</del><ins>+ if (!std::isfinite(sx) || !std::isfinite(sy))
</ins><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> AffineTransform newTransform = state().transform;
</span><span class="lines">@@ -683,7 +684,7 @@
</span><span class="cx">
</span><span class="cx"> realizeSaves();
</span><span class="cx">
</span><del>- if (!newTransform.isInvertible()) {
</del><ins>+ if (!sx || !sy) {
</ins><span class="cx"> modifiableState().hasInvertibleTransform = false;
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="lines">@@ -711,11 +712,6 @@
</span><span class="cx">
</span><span class="cx"> realizeSaves();
</span><span class="cx">
</span><del>- if (!newTransform.isInvertible()) {
- modifiableState().hasInvertibleTransform = false;
- return;
- }
-
</del><span class="cx"> modifiableState().transform = newTransform;
</span><span class="cx"> c->rotate(angleInRadians);
</span><span class="cx"> m_path.transform(AffineTransform().rotate(-angleInRadians / piDouble * 180.0));
</span><span class="lines">@@ -739,11 +735,6 @@
</span><span class="cx">
</span><span class="cx"> realizeSaves();
</span><span class="cx">
</span><del>- if (!newTransform.isInvertible()) {
- modifiableState().hasInvertibleTransform = false;
- return;
- }
-
</del><span class="cx"> modifiableState().transform = newTransform;
</span><span class="cx"> c->translate(tx, ty);
</span><span class="cx"> m_path.transform(AffineTransform().translate(-tx, -ty));
</span><span class="lines">@@ -767,14 +758,13 @@
</span><span class="cx">
</span><span class="cx"> realizeSaves();
</span><span class="cx">
</span><del>- if (!newTransform.isInvertible()) {
- modifiableState().hasInvertibleTransform = false;
</del><ins>+ if (auto inverse = newTransform.inverse()) {
+ modifiableState().transform = newTransform;
+ c->concatCTM(transform);
+ m_path.transform(inverse.value());
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><del>-
- modifiableState().transform = newTransform;
- c->concatCTM(transform);
- m_path.transform(transform.inverse());
</del><ins>+ modifiableState().hasInvertibleTransform = false;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void CanvasRenderingContext2D::setTransform(float m11, float m12, float m21, float m22, float dx, float dy)
</span><span class="lines">@@ -1108,9 +1098,8 @@
</span><span class="cx"> if (!state().hasInvertibleTransform)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- FloatPoint point(x, y);
- AffineTransform ctm = state().transform;
- FloatPoint transformedPoint = ctm.inverse().mapPoint(point);
</del><ins>+ FloatPoint transformedPoint = state().transform.inverse().valueOr(AffineTransform()).mapPoint(FloatPoint(x, y));
+
</ins><span class="cx"> if (!std::isfinite(transformedPoint.x()) || !std::isfinite(transformedPoint.y()))
</span><span class="cx"> return false;
</span><span class="cx">
</span><span class="lines">@@ -1129,9 +1118,7 @@
</span><span class="cx"> if (!state().hasInvertibleTransform)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- FloatPoint point(x, y);
- AffineTransform ctm = state().transform;
- FloatPoint transformedPoint = ctm.inverse().mapPoint(point);
</del><ins>+ FloatPoint transformedPoint = state().transform.inverse().valueOr(AffineTransform()).mapPoint(FloatPoint(x, y));
</ins><span class="cx"> if (!std::isfinite(transformedPoint.x()) || !std::isfinite(transformedPoint.y()))
</span><span class="cx"> return false;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -705,13 +705,11 @@
</span><span class="cx">
</span><span class="cx"> FloatRect GraphicsContext::computeLineBoundsAndAntialiasingModeForText(const FloatPoint& point, float width, bool printing, bool& shouldAntialias, Color& color)
</span><span class="cx"> {
</span><del>- FloatPoint origin;
</del><ins>+ FloatPoint origin = point;
</ins><span class="cx"> float thickness = std::max(strokeThickness(), 0.5f);
</span><span class="cx">
</span><span class="cx"> shouldAntialias = true;
</span><del>- if (printing)
- origin = point;
- else {
</del><ins>+ if (!printing) {
</ins><span class="cx"> AffineTransform transform = getCTM(GraphicsContext::DefinitelyIncludeDeviceScale);
</span><span class="cx"> if (transform.preservesAxisAlignment())
</span><span class="cx"> shouldAntialias = false;
</span><span class="lines">@@ -731,7 +729,8 @@
</span><span class="cx">
</span><span class="cx"> FloatPoint devicePoint = transform.mapPoint(point);
</span><span class="cx"> FloatPoint deviceOrigin = FloatPoint(roundf(devicePoint.x()), ceilf(devicePoint.y()));
</span><del>- origin = transform.inverse().mapPoint(deviceOrigin);
</del><ins>+ if (auto inverse = transform.inverse())
+ origin = inverse.value().mapPoint(deviceOrigin);
</ins><span class="cx"> }
</span><span class="cx"> return FloatRect(origin.x(), origin.y(), width, thickness);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsShadowBlurcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ShadowBlur.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ShadowBlur.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/ShadowBlur.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -399,7 +399,7 @@
</span><span class="cx"> if (m_shadowsIgnoreTransforms && !transform.isIdentity()) {
</span><span class="cx"> FloatQuad transformedPolygon = transform.mapQuad(FloatQuad(shadowedRect));
</span><span class="cx"> transformedPolygon.move(m_offset);
</span><del>- layerRect = transform.inverse().mapQuad(transformedPolygon).boundingBox();
</del><ins>+ layerRect = transform.inverse().valueOr(AffineTransform()).mapQuad(transformedPolygon).boundingBox();
</ins><span class="cx"> } else {
</span><span class="cx"> layerRect = shadowedRect;
</span><span class="cx"> layerRect.move(m_offset);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -2371,7 +2371,7 @@
</span><span class="cx"> GraphicsContextStateSaver stateSaver(context);
</span><span class="cx"> FloatRect imageRect(0, 0, CGImageGetWidth(m_lastImage.get()), CGImageGetHeight(m_lastImage.get()));
</span><span class="cx"> AffineTransform videoTransform = [firstEnabledVideoTrack preferredTransform];
</span><del>- FloatRect transformedOutputRect = videoTransform.inverse().mapRect(outputRect);
</del><ins>+ FloatRect transformedOutputRect = videoTransform.inverse().valueOr(AffineTransform()).mapRect(outputRect);
</ins><span class="cx">
</span><span class="cx"> context.concatCTM(videoTransform);
</span><span class="cx"> context.drawNativeImage(m_lastImage.get(), imageRect.size(), transformedOutputRect, imageRect);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgImageBufferCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/ImageBufferCG.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/ImageBufferCG.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/cg/ImageBufferCG.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -318,10 +318,14 @@
</span><span class="cx"> // Set up context for using drawImage as a direct bit copy
</span><span class="cx"> CGContextRef destContext = context().platformContext();
</span><span class="cx"> CGContextSaveGState(destContext);
</span><del>- if (coordinateSystem == LogicalCoordinateSystem)
- CGContextConcatCTM(destContext, AffineTransform(getUserToBaseCTM(destContext)).inverse());
- else
- CGContextConcatCTM(destContext, AffineTransform(CGContextGetCTM(destContext)).inverse());
</del><ins>+
+ if (coordinateSystem == LogicalCoordinateSystem) {
+ if (auto inverse = AffineTransform(getUserToBaseCTM(destContext)).inverse())
+ CGContextConcatCTM(destContext, inverse.value());
+ } else {
+ if (auto inverse = AffineTransform(CGContextGetCTM(destContext)).inverse())
+ CGContextConcatCTM(destContext, inverse.value());
+ }
</ins><span class="cx"> CGContextResetClip(destContext);
</span><span class="cx"> CGContextSetInterpolationQuality(destContext, kCGInterpolationNone);
</span><span class="cx"> CGContextSetAlpha(destContext, 1.0);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFilterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/Filter.h        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx"> void setFilterScale(float scale) { m_filterScale = scale; }
</span><span class="cx">
</span><span class="cx"> const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
</span><del>- FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_absoluteTransform.inverse().mapPoint(point); }
</del><ins>+ FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_absoluteTransform.inverse().valueOr(AffineTransform()).mapPoint(point); }
</ins><span class="cx">
</span><span class="cx"> RenderingMode renderingMode() const { return m_renderingMode; }
</span><span class="cx"> void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapTextureMapperLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx"> TextureMapperPaintOptions replicaOptions(options);
</span><span class="cx"> replicaOptions.transform
</span><span class="cx"> .multiply(m_state.replicaLayer->m_currentTransform.combined())
</span><del>- .multiply(m_currentTransform.combined().inverse());
</del><ins>+ .multiply(m_currentTransform.combined().inverse().valueOr(TransformationMatrix()));
</ins><span class="cx"> paintSelfAndChildren(replicaOptions);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -231,7 +231,7 @@
</span><span class="cx">
</span><span class="cx"> TransformationMatrix TextureMapperLayer::replicaTransform()
</span><span class="cx"> {
</span><del>- return TransformationMatrix(m_state.replicaLayer->m_currentTransform.combined()).multiply(m_currentTransform.combined().inverse());
</del><ins>+ return TransformationMatrix(m_state.replicaLayer->m_currentTransform.combined()).multiply(m_currentTransform.combined().inverse().valueOr(TransformationMatrix()));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TextureMapperLayer::setAnimatedFilters(const FilterOperations& filters)
</span><span class="lines">@@ -723,7 +723,7 @@
</span><span class="cx"> FloatSize TextureMapperLayer::mapScrollOffset(const FloatSize& offset)
</span><span class="cx"> {
</span><span class="cx"> double zeroX, zeroY, offsetX, offsetY;
</span><del>- TransformationMatrix transform = m_currentTransform.combined().inverse();
</del><ins>+ TransformationMatrix transform = m_currentTransform.combined().inverse().valueOr(TransformationMatrix());
</ins><span class="cx"> transform.map(0, 0, zeroX, zeroY);
</span><span class="cx"> transform.map(offset.width(), offset.height(), offsetX, offsetY);
</span><span class="cx"> return FloatSize(offsetX - zeroX, offsetY - zeroY);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -913,7 +913,7 @@
</span><span class="cx"> // Return a projection of the visible rect (surface coordinates) onto the layer's plane (layer coordinates).
</span><span class="cx"> // The resulting quad might be squewed and the visible rect is the bounding box of this quad,
</span><span class="cx"> // so it might spread further than the real visible area (and then even more amplified by the cover rect multiplier).
</span><del>- ASSERT(m_cachedInverseTransform == m_layerTransform.combined().inverse());
</del><ins>+ ASSERT(m_cachedInverseTransform == m_layerTransform.combined().inverse().valueOr(TransformationMatrix()));
</ins><span class="cx"> FloatRect rect = m_cachedInverseTransform.clampedBoundsOfProjectedQuad(FloatQuad(m_coordinator->visibleContentsRect()));
</span><span class="cx"> clampToContentsRectIfRectIsInfinite(rect, size());
</span><span class="cx"> return enclosingIntRect(rect);
</span><span class="lines">@@ -1105,7 +1105,7 @@
</span><span class="cx"> m_layerTransform.setChildrenTransform(childrenTransform());
</span><span class="cx"> m_layerTransform.combineTransforms(parent() ? toCoordinatedGraphicsLayer(parent())->m_layerTransform.combinedForChildren() : TransformationMatrix());
</span><span class="cx">
</span><del>- m_cachedInverseTransform = m_layerTransform.combined().inverse();
</del><ins>+ m_cachedInverseTransform = m_layerTransform.combined().inverse().valueOr(TransformationMatrix());
</ins><span class="cx">
</span><span class="cx"> // The combined transform will be used in tiledBackingStoreVisibleRect.
</span><span class="cx"> setNeedsVisibleRectAdjustment();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsAffineTransformcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -92,23 +92,23 @@
</span><span class="cx"> return sqrt(m_transform[2] * m_transform[2] + m_transform[3] * m_transform[3]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-double AffineTransform::det() const
</del><ins>+static double det(const std::array<double, 6>& transform)
</ins><span class="cx"> {
</span><del>- return m_transform[0] * m_transform[3] - m_transform[1] * m_transform[2];
</del><ins>+ return transform[0] * transform[3] - transform[1] * transform[2];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool AffineTransform::isInvertible() const
</span><span class="cx"> {
</span><del>- double determinant = det();
</del><ins>+ double determinant = det(m_transform);
</ins><span class="cx">
</span><span class="cx"> return std::isfinite(determinant) && determinant != 0;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-AffineTransform AffineTransform::inverse() const
</del><ins>+Optional<AffineTransform> AffineTransform::inverse() const
</ins><span class="cx"> {
</span><del>- double determinant = det();
</del><ins>+ double determinant = det(m_transform);
</ins><span class="cx"> if (!std::isfinite(determinant) || determinant == 0)
</span><del>- return AffineTransform();
</del><ins>+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> AffineTransform result;
</span><span class="cx"> if (isIdentityOrTranslation()) {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsAffineTransformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include "PlatformExportMacros.h"
</span><span class="cx"> #include <array>
</span><span class="cx"> #include <wtf/FastMalloc.h>
</span><ins>+#include <wtf/Optional.h>
</ins><span class="cx">
</span><span class="cx"> #if USE(CG)
</span><span class="cx"> typedef struct CGAffineTransform CGAffineTransform;
</span><span class="lines">@@ -117,9 +118,8 @@
</span><span class="cx"> WEBCORE_EXPORT double xScale() const;
</span><span class="cx"> WEBCORE_EXPORT double yScale() const;
</span><span class="cx">
</span><del>- double det() const;
- WEBCORE_EXPORT bool isInvertible() const;
- WEBCORE_EXPORT AffineTransform inverse() const;
</del><ins>+ bool isInvertible() const; // If you call this this, you're probably doing it wrong.
+ WEBCORE_EXPORT Optional<AffineTransform> inverse() const;
</ins><span class="cx">
</span><span class="cx"> void blend(const AffineTransform& from, double progress);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformState.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformState.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformState.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -170,7 +170,7 @@
</span><span class="cx"> if (m_direction == ApplyTransformDirection)
</span><span class="cx"> return m_accumulatedTransform->mapPoint(point);
</span><span class="cx">
</span><del>- return m_accumulatedTransform->inverse().projectPoint(point, wasClamped);
</del><ins>+ return m_accumulatedTransform->inverse().valueOr(TransformationMatrix()).projectPoint(point, wasClamped);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> FloatQuad TransformState::mappedQuad(bool* wasClamped) const
</span><span class="lines">@@ -218,7 +218,7 @@
</span><span class="cx"> if (direction == ApplyTransformDirection)
</span><span class="cx"> quad = m_accumulatedTransform->mapQuad(quad);
</span><span class="cx">
</span><del>- quad = m_accumulatedTransform->inverse().projectQuad(quad, wasClamped);
</del><ins>+ quad = m_accumulatedTransform->inverse().valueOr(TransformationMatrix()).projectQuad(quad, wasClamped);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TransformState::flattenWithTransform(const TransformationMatrix& t, bool* wasClamped)
</span><span class="lines">@@ -233,7 +233,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } else {
</span><del>- TransformationMatrix inverseTransform = t.inverse();
</del><ins>+ TransformationMatrix inverseTransform = t.inverse().valueOr(TransformationMatrix());
</ins><span class="cx"> if (m_mapPoint)
</span><span class="cx"> m_lastPlanarPoint = inverseTransform.projectPoint(m_lastPlanarPoint);
</span><span class="cx"> if (m_mapQuad) {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -1445,7 +1445,7 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-TransformationMatrix TransformationMatrix::inverse() const
</del><ins>+Optional<TransformationMatrix> TransformationMatrix::inverse() const
</ins><span class="cx"> {
</span><span class="cx"> if (isIdentityOrTranslation()) {
</span><span class="cx"> // identity matrix
</span><span class="lines">@@ -1460,9 +1460,10 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> TransformationMatrix invMat;
</span><del>- bool inverted = WebCore::inverse(m_matrix, invMat.m_matrix);
- if (!inverted)
- return TransformationMatrix();
</del><ins>+ // FIXME: Use LU decomposition to apply the inverse instead of calculating the inverse explicitly.
+ // Calculating the inverse of a 4x4 matrix using cofactors is numerically unstable and unnecessary to apply the inverse transformation to a point.
+ if (!WebCore::inverse(m_matrix, invMat.m_matrix))
+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> return invMat;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "IntPoint.h"
</span><span class="cx"> #include <string.h> //for memcpy
</span><span class="cx"> #include <wtf/FastMalloc.h>
</span><ins>+#include <wtf/Optional.h>
</ins><span class="cx">
</span><span class="cx"> #if USE(CA)
</span><span class="cx"> typedef struct CATransform3D CATransform3D;
</span><span class="lines">@@ -251,12 +252,9 @@
</span><span class="cx"> // Returns a transformation that maps a rect to a rect.
</span><span class="cx"> static TransformationMatrix rectToRect(const FloatRect&, const FloatRect&);
</span><span class="cx">
</span><del>- bool isInvertible() const;
</del><ins>+ bool isInvertible() const; // If you call this this, you're probably doing it wrong.
+ WEBCORE_EXPORT Optional<TransformationMatrix> inverse() const;
</ins><span class="cx">
</span><del>- // Returns the identity matrix if it is not invertible.
- // Use isInvertible() before calling this if you need to know.
- WEBCORE_EXPORT TransformationMatrix inverse() const;
-
</del><span class="cx"> // Decompose the matrix into its component parts.
</span><span class="cx"> struct Decomposed2Type {
</span><span class="cx"> double scaleX, scaleY;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingHitTestingTransformStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/HitTestingTransformState.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/HitTestingTransformState.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/HitTestingTransformState.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -55,10 +55,11 @@
</span><span class="cx">
</span><span class="cx"> void HitTestingTransformState::flattenWithTransform(const TransformationMatrix& t)
</span><span class="cx"> {
</span><del>- TransformationMatrix inverseTransform = t.inverse();
- m_lastPlanarPoint = inverseTransform.projectPoint(m_lastPlanarPoint);
- m_lastPlanarQuad = inverseTransform.projectQuad(m_lastPlanarQuad);
- m_lastPlanarArea = inverseTransform.projectQuad(m_lastPlanarArea);
</del><ins>+ if (Optional<TransformationMatrix> inverse = t.inverse()) {
+ m_lastPlanarPoint = inverse.value().projectPoint(m_lastPlanarPoint);
+ m_lastPlanarQuad = inverse.value().projectQuad(m_lastPlanarQuad);
+ m_lastPlanarArea = inverse.value().projectQuad(m_lastPlanarArea);
+ }
</ins><span class="cx">
</span><span class="cx"> m_accumulatedTransform.makeIdentity();
</span><span class="cx"> m_accumulatingTransform = false;
</span><span class="lines">@@ -66,22 +67,31 @@
</span><span class="cx">
</span><span class="cx"> FloatPoint HitTestingTransformState::mappedPoint() const
</span><span class="cx"> {
</span><del>- return m_accumulatedTransform.inverse().projectPoint(m_lastPlanarPoint);
</del><ins>+ if (auto inverse = m_accumulatedTransform.inverse())
+ return inverse.value().projectPoint(m_lastPlanarPoint);
+ return m_lastPlanarPoint;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> FloatQuad HitTestingTransformState::mappedQuad() const
</span><span class="cx"> {
</span><del>- return m_accumulatedTransform.inverse().projectQuad(m_lastPlanarQuad);
</del><ins>+ if (auto inverse = m_accumulatedTransform.inverse())
+ return inverse.value().projectQuad(m_lastPlanarQuad);
+ return m_lastPlanarQuad;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> FloatQuad HitTestingTransformState::mappedArea() const
</span><span class="cx"> {
</span><del>- return m_accumulatedTransform.inverse().projectQuad(m_lastPlanarArea);
</del><ins>+ if (auto inverse = m_accumulatedTransform.inverse())
+ return inverse.value().projectQuad(m_lastPlanarArea);
+ return m_lastPlanarArea;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> LayoutRect HitTestingTransformState::boundsOfMappedArea() const
</span><span class="cx"> {
</span><del>- return m_accumulatedTransform.inverse().clampedBoundsOfProjectedQuad(m_lastPlanarArea);
</del><ins>+ if (auto inverse = m_accumulatedTransform.inverse())
+ return inverse.value().clampedBoundsOfProjectedQuad(m_lastPlanarArea);
+ TransformationMatrix identity;
+ return identity.clampedBoundsOfProjectedQuad(m_lastPlanarArea);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingPaintInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/PaintInfo.h (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/PaintInfo.h        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/PaintInfo.h        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx"> if (rect.isInfinite())
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- FloatRect tranformedRect(localToAncestorTransform.inverse().mapRect(rect));
</del><ins>+ FloatRect tranformedRect(localToAncestorTransform.inverse().valueOr(AffineTransform()).mapRect(rect));
</ins><span class="cx"> rect.setLocation(LayoutPoint(tranformedRect.location()));
</span><span class="cx"> rect.setSize(LayoutSize(tranformedRect.size()));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -4410,7 +4410,7 @@
</span><span class="cx">
</span><span class="cx"> // Now do a paint with the root layer shifted to be us.
</span><span class="cx"> LayoutSize adjustedSubpixelAccumulation = offsetForThisLayer - LayoutSize(devicePixelSnappedOffsetForThisLayer);
</span><del>- LayerPaintingInfo transformedPaintingInfo(this, LayoutRect(encloseRectToDevicePixels(transform.inverse().mapRect(paintingInfo.paintDirtyRect), deviceScaleFactor)),
</del><ins>+ LayerPaintingInfo transformedPaintingInfo(this, LayoutRect(encloseRectToDevicePixels(transform.inverse().valueOr(AffineTransform()).mapRect(paintingInfo.paintDirtyRect), deviceScaleFactor)),
</ins><span class="cx"> paintingInfo.paintBehavior, adjustedSubpixelAccumulation, paintingInfo.subtreePaintRoot, paintingInfo.overlapTestRequests);
</span><span class="cx"> paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags);
</span><span class="cx"> }
</span><span class="lines">@@ -5056,9 +5056,9 @@
</span><span class="cx">
</span><span class="cx"> // Check for hit test on backface if backface-visibility is 'hidden'
</span><span class="cx"> if (localTransformState && renderer().style().backfaceVisibility() == BackfaceVisibilityHidden) {
</span><del>- TransformationMatrix invertedMatrix = localTransformState->m_accumulatedTransform.inverse();
</del><ins>+ Optional<TransformationMatrix> invertedMatrix = localTransformState->m_accumulatedTransform.inverse();
</ins><span class="cx"> // If the z-vector of the matrix is negative, the back is facing towards the viewer.
</span><del>- if (invertedMatrix.m33() < 0)
</del><ins>+ if (invertedMatrix && invertedMatrix.value().m33() < 0)
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGContainercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -173,7 +173,7 @@
</span><span class="cx"> if (!pointIsInsideViewportClip(pointInParent))
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- FloatPoint localPoint = localToParentTransform().inverse().mapPoint(pointInParent);
</del><ins>+ FloatPoint localPoint = localToParentTransform().inverse().valueOr(AffineTransform()).mapPoint(pointInParent);
</ins><span class="cx">
</span><span class="cx"> if (!SVGRenderSupport::pointInClippingArea(*this, localPoint))
</span><span class="cx"> return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGForeignObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -183,7 +183,7 @@
</span><span class="cx"> if (hitTestAction != HitTestForeground)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- FloatPoint localPoint = localTransform().inverse().mapPoint(pointInParent);
</del><ins>+ FloatPoint localPoint = localTransform().inverse().valueOr(AffineTransform()).mapPoint(pointInParent);
</ins><span class="cx">
</span><span class="cx"> // Early exit if local point is not contained in clipped viewport area
</span><span class="cx"> if (SVGRenderSupport::isOverflowHidden(*this) && !m_viewport.contains(localPoint))
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx"> PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style().pointerEvents());
</span><span class="cx"> bool isVisible = (style().visibility() == VISIBLE);
</span><span class="cx"> if (isVisible || !hitRules.requireVisible) {
</span><del>- FloatPoint localPoint = localToParentTransform().inverse().mapPoint(pointInParent);
</del><ins>+ FloatPoint localPoint = localToParentTransform().inverse().valueOr(AffineTransform()).mapPoint(pointInParent);
</ins><span class="cx">
</span><span class="cx"> if (!SVGRenderSupport::pointInClippingArea(*this, localPoint))
</span><span class="cx"> return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceClippercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -267,10 +267,10 @@
</span><span class="cx"> AffineTransform transform;
</span><span class="cx"> transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
</span><span class="cx"> transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height());
</span><del>- point = transform.inverse().mapPoint(point);
</del><ins>+ point = transform.inverse().valueOr(AffineTransform()).mapPoint(point);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- point = clipPathElement().animatedLocalTransform().inverse().mapPoint(point);
</del><ins>+ point = clipPathElement().animatedLocalTransform().inverse().valueOr(AffineTransform()).mapPoint(point);
</ins><span class="cx">
</span><span class="cx"> for (Node* childNode = clipPathElement().firstChild(); childNode; childNode = childNode->nextSibling()) {
</span><span class="cx"> RenderObject* renderer = childNode->renderer();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceFiltercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -268,7 +268,7 @@
</span><span class="cx">
</span><span class="cx"> ImageBuffer* resultImage = lastEffect->asImageBuffer();
</span><span class="cx"> if (resultImage) {
</span><del>- context->concatCTM(filterData->shearFreeAbsoluteTransform.inverse());
</del><ins>+ context->concatCTM(filterData->shearFreeAbsoluteTransform.inverse().valueOr(AffineTransform()));
</ins><span class="cx">
</span><span class="cx"> context->scale(FloatSize(1 / filterData->filter->filterResolution().width(), 1 / filterData->filter->filterResolution().height()));
</span><span class="cx"> context->drawImageBuffer(*resultImage, lastEffect->absolutePaintRect());
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGRootcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -418,7 +418,7 @@
</span><span class="cx"> // Only test SVG content if the point is in our content box.
</span><span class="cx"> // FIXME: This should be an intersection when rect-based hit tests are supported by nodeAtFloatPoint.
</span><span class="cx"> if (contentBoxRect().contains(pointInBorderBox)) {
</span><del>- FloatPoint localPoint = localToParentTransform().inverse().mapPoint(FloatPoint(pointInParent));
</del><ins>+ FloatPoint localPoint = localToParentTransform().inverse().valueOr(AffineTransform()).mapPoint(FloatPoint(pointInParent));
</ins><span class="cx">
</span><span class="cx"> for (RenderObject* child = lastChild(); child; child = child->previousSibling()) {
</span><span class="cx"> // FIXME: nodeAtFloatPoint() doesn't handle rect-based hit tests yet.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGShapecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -197,11 +197,12 @@
</span><span class="cx">
</span><span class="cx"> bool RenderSVGShape::setupNonScalingStrokeContext(AffineTransform& strokeTransform, GraphicsContextStateSaver& stateSaver)
</span><span class="cx"> {
</span><del>- if (!strokeTransform.isInvertible())
</del><ins>+ Optional<AffineTransform> inverse = strokeTransform.inverse();
+ if (!inverse)
</ins><span class="cx"> return false;
</span><span class="cx">
</span><span class="cx"> stateSaver.save();
</span><del>- stateSaver.context()->concatCTM(strokeTransform.inverse());
</del><ins>+ stateSaver.context()->concatCTM(inverse.value());
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -334,7 +335,7 @@
</span><span class="cx"> if (hitTestAction != HitTestForeground)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- FloatPoint localPoint = m_localTransform.inverse().mapPoint(pointInParent);
</del><ins>+ FloatPoint localPoint = m_localTransform.inverse().valueOr(AffineTransform()).mapPoint(pointInParent);
</ins><span class="cx">
</span><span class="cx"> if (!SVGRenderSupport::pointInClippingArea(*this, localPoint))
</span><span class="cx"> return false;
</span><span class="lines">@@ -406,10 +407,10 @@
</span><span class="cx"> BoundingRectStrokeStyleApplier strokeStyle(*this);
</span><span class="cx"> if (hasNonScalingStroke()) {
</span><span class="cx"> AffineTransform nonScalingTransform = nonScalingStrokeTransform();
</span><del>- if (nonScalingTransform.isInvertible()) {
</del><ins>+ if (Optional<AffineTransform> inverse = nonScalingTransform.inverse()) {
</ins><span class="cx"> Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform);
</span><span class="cx"> FloatRect strokeBoundingRect = usePath->strokeBoundingRect(&strokeStyle);
</span><del>- strokeBoundingRect = nonScalingTransform.inverse().mapRect(strokeBoundingRect);
</del><ins>+ strokeBoundingRect = inverse.value().mapRect(strokeBoundingRect);
</ins><span class="cx"> strokeBoundingBox.unite(strokeBoundingRect);
</span><span class="cx"> }
</span><span class="cx"> } else
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -436,7 +436,7 @@
</span><span class="cx"> if (isVisible || !hitRules.requireVisible) {
</span><span class="cx"> if ((hitRules.canHitStroke && (style().svgStyle().hasStroke() || !hitRules.requireStroke))
</span><span class="cx"> || (hitRules.canHitFill && (style().svgStyle().hasFill() || !hitRules.requireFill))) {
</span><del>- FloatPoint localPoint = localToParentTransform().inverse().mapPoint(pointInParent);
</del><ins>+ FloatPoint localPoint = localToParentTransform().inverse().valueOr(AffineTransform()).mapPoint(pointInParent);
</ins><span class="cx">
</span><span class="cx"> if (!SVGRenderSupport::pointInClippingArea(*this, localPoint))
</span><span class="cx"> return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGRenderSupportcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -355,7 +355,7 @@
</span><span class="cx"> if (localToRootTransform.isIdentity())
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- AffineTransform rootToLocalTransform = localToRootTransform.inverse();
</del><ins>+ AffineTransform rootToLocalTransform = localToRootTransform.inverse().valueOr(AffineTransform());
</ins><span class="cx"> repaintRect = rootToLocalTransform.mapRect(repaintRect);
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGRenderingContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -316,7 +316,7 @@
</span><span class="cx">
</span><span class="cx"> // The mask image has been created in the absolute coordinate space, as the image should not be scaled.
</span><span class="cx"> // So the actual masking process has to be done in the absolute coordinate space as well.
</span><del>- context.concatCTM(absoluteTransform.inverse());
</del><ins>+ context.concatCTM(absoluteTransform.inverse().valueOr(AffineTransform()));
</ins><span class="cx"> context.clipToImageBuffer(*imageBuffer, absoluteTargetRect);
</span><span class="cx"> context.concatCTM(absoluteTransform);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLocatablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLocatable.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLocatable.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/svg/SVGLocatable.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -103,11 +103,12 @@
</span><span class="cx">
</span><span class="cx"> if (is<SVGGraphicsElement>(target)) {
</span><span class="cx"> AffineTransform targetCTM = downcast<SVGGraphicsElement>(*target).getCTM(styleUpdateStrategy);
</span><del>- if (!targetCTM.isInvertible()) {
</del><ins>+ if (auto inverse = targetCTM.inverse())
+ ctm = inverse.value() * ctm;
+ else {
</ins><span class="cx"> ec = SVGException::SVG_MATRIX_NOT_INVERTABLE;
</span><span class="cx"> return ctm;
</span><span class="cx"> }
</span><del>- ctm = targetCTM.inverse() * ctm;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return ctm;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGMatrixh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGMatrix.h (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGMatrix.h        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebCore/svg/SVGMatrix.h        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -106,11 +106,11 @@
</span><span class="cx">
</span><span class="cx"> SVGMatrix inverse(ExceptionCode& ec) const
</span><span class="cx"> {
</span><del>- AffineTransform transform = AffineTransform::inverse();
- if (!isInvertible())
- ec = SVGException::SVG_MATRIX_NOT_INVERTABLE;
-
- return transform;
</del><ins>+ if (auto inverse = AffineTransform::inverse())
+ return inverse.value();
+
+ ec = SVGException::SVG_MATRIX_NOT_INVERTABLE;
+ return AffineTransform();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> SVGMatrix rotateFromVector(double x, double y, ExceptionCode& ec)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/ChangeLog        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-12-01 Alex Christensen <achristensen@webkit.org>
+
+ Use Optional for matrix inverses
+ https://bugs.webkit.org/show_bug.cgi?id=151575
+
+ Reviewed by Myles C. Maxfield.
+
+ * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+ (WebKit::NetscapePlugin::convertFromRootView):
+ * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
+ (WebKit::NetscapePlugin::convertPoint):
+ * WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm:
+ (WebKit::PDFPlugin::convertFromPDFViewToRootView):
+ (WebKit::PDFPlugin::convertFromPDFViewToScreen):
+ (WebKit::PDFPlugin::boundsOnScreen):
+ (WebKit::PDFPlugin::geometryDidChange):
+ * WebProcess/Plugins/PDF/PDFPlugin.mm:
+ (WebKit::PDFPlugin::geometryDidChange):
+
</ins><span class="cx"> 2015-12-01 Tim Horton <timothy_horton@apple.com>
</span><span class="cx">
</span><span class="cx"> Remove swipe snapshot before main document load if scroll position is already restored
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCoordinatedGraphicsWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -227,7 +227,7 @@
</span><span class="cx">
</span><span class="cx"> AffineTransform WebView::transformFromScene() const
</span><span class="cx"> {
</span><del>- return transformToScene().inverse();
</del><ins>+ return transformToScene().inverse().valueOr(AffineTransform());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> AffineTransform WebView::transformToScene() const
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapeNetscapePlugincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -1122,11 +1122,11 @@
</span><span class="cx">
</span><span class="cx"> bool NetscapePlugin::convertFromRootView(const IntPoint& pointInRootViewCoordinates, IntPoint& pointInPluginCoordinates)
</span><span class="cx"> {
</span><del>- if (!m_pluginToRootViewTransform.isInvertible())
- return false;
-
- pointInPluginCoordinates = m_pluginToRootViewTransform.inverse().mapPoint(pointInRootViewCoordinates);
- return true;
</del><ins>+ if (auto inverse = m_pluginToRootViewTransform.inverse()) {
+ pointInPluginCoordinates = inverse.value().mapPoint(pointInRootViewCoordinates);
+ return true;
+ }
+ return false;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetscapePlugin::mutedStateChanged(bool muted)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapemacNetscapePluginMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -146,16 +146,16 @@
</span><span class="cx"> if (!getScreenTransform(destSpace, destTransform))
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- if (!destTransform.isInvertible())
- return false;
</del><ins>+ if (auto inverse = destTransform.inverse()) {
+ AffineTransform transform = inverse.value() * sourceTransform;
</ins><span class="cx">
</span><del>- AffineTransform transform = destTransform.inverse() * sourceTransform;
</del><ins>+ FloatPoint destinationPoint = transform.mapPoint(FloatPoint(sourceX, sourceY));
</ins><span class="cx">
</span><del>- FloatPoint destinationPoint = transform.mapPoint(FloatPoint(sourceX, sourceY));
-
- destX = destinationPoint.x();
- destY = destinationPoint.y();
- return true;
</del><ins>+ destX = destinationPoint.x();
+ destY = destinationPoint.y();
+ return true;
+ }
+ return false;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsPDFDeprecatedPDFPluginmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/DeprecatedPDFPlugin.mm        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -1187,7 +1187,7 @@
</span><span class="cx"> IntPoint PDFPlugin::convertFromPDFViewToRootView(const IntPoint& point) const
</span><span class="cx"> {
</span><span class="cx"> IntPoint pointInPluginCoordinates(point.x(), size().height() - point.y());
</span><del>- return m_rootViewToPluginTransform.inverse().mapPoint(pointInPluginCoordinates);
</del><ins>+ return m_rootViewToPluginTransform.inverse().valueOr(AffineTransform()).mapPoint(pointInPluginCoordinates);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> FloatRect PDFPlugin::convertFromPDFViewToScreen(const FloatRect& rect) const
</span><span class="lines">@@ -1198,7 +1198,7 @@
</span><span class="cx"> return FloatRect();
</span><span class="cx">
</span><span class="cx"> FloatPoint originInPluginCoordinates(rect.x(), size().height() - rect.y() - rect.height());
</span><del>- FloatRect rectInRootViewCoordinates = m_rootViewToPluginTransform.inverse().mapRect(FloatRect(originInPluginCoordinates, rect.size()));
</del><ins>+ FloatRect rectInRootViewCoordinates = m_rootViewToPluginTransform.inverse().valueOr(AffineTransform()).mapRect(FloatRect(originInPluginCoordinates, rect.size()));
</ins><span class="cx">
</span><span class="cx"> return frameView->contentsToScreen(enclosingIntRect(rectInRootViewCoordinates));
</span><span class="cx"> }
</span><span class="lines">@@ -1211,7 +1211,7 @@
</span><span class="cx"> return IntRect();
</span><span class="cx">
</span><span class="cx"> FloatRect bounds = FloatRect(FloatPoint(), size());
</span><del>- FloatRect rectInRootViewCoordinates = m_rootViewToPluginTransform.inverse().mapRect(bounds);
</del><ins>+ FloatRect rectInRootViewCoordinates = m_rootViewToPluginTransform.inverse().valueOr(AffineTransform()).mapRect(bounds);
</ins><span class="cx"> return frameView->contentsToScreen(enclosingIntRect(rectInRootViewCoordinates));
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1221,7 +1221,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> m_size = pluginSize;
</span><del>- m_rootViewToPluginTransform = pluginToRootViewTransform.inverse();
</del><ins>+ m_rootViewToPluginTransform = pluginToRootViewTransform.inverse().valueOr(AffineTransform());
</ins><span class="cx"> [m_pdfLayerController setFrameSize:pluginSize];
</span><span class="cx">
</span><span class="cx"> [CATransaction begin];
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm (192899 => 192900)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-12-01 20:11:20 UTC (rev 192899)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-12-01 20:26:05 UTC (rev 192900)
</span><span class="lines">@@ -932,7 +932,7 @@
</span><span class="cx"> void PDFPlugin::geometryDidChange(const IntSize& pluginSize, const IntRect&, const AffineTransform& pluginToRootViewTransform)
</span><span class="cx"> {
</span><span class="cx"> m_pluginToRootViewTransform = pluginToRootViewTransform;
</span><del>- m_rootViewToPluginTransform = pluginToRootViewTransform.inverse();
</del><ins>+ m_rootViewToPluginTransform = pluginToRootViewTransform.inverse().valueOr(AffineTransform());
</ins><span class="cx"> m_size = pluginSize;
</span><span class="cx">
</span><span class="cx"> FrameView* frameView = webFrame()->coreFrame()->view();
</span></span></pre>
</div>
</div>
</body>
</html>