<!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 &lt;achristensen@webkit.org&gt; 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  &lt;achristensen@webkit.org&gt;
+
+        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  &lt;timothy_horton@apple.com&gt;
</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&lt;WebKitCSSMatrix&gt; WebKitCSSMatrix::inverse(ExceptionCode&amp; 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&lt;WebKitCSSMatrix&gt; 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&lt;AffineTransform&gt; 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-&gt;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-&gt;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-&gt;concatCTM(transform);
+        m_path.transform(inverse.value());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><del>-
-    modifiableState().transform = newTransform;
-    c-&gt;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&amp; point, float width, bool printing, bool&amp; shouldAntialias, Color&amp; 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 &amp;&amp; !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&amp; absoluteTransform() const { return m_absoluteTransform; }
</span><del>-    FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint&amp; point) const { return m_absoluteTransform.inverse().mapPoint(point); }
</del><ins>+    FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint&amp; 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-&gt;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-&gt;m_currentTransform.combined()).multiply(m_currentTransform.combined().inverse());
</del><ins>+    return TransformationMatrix(m_state.replicaLayer-&gt;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&amp; filters)
</span><span class="lines">@@ -723,7 +723,7 @@
</span><span class="cx"> FloatSize TextureMapperLayer::mapScrollOffset(const FloatSize&amp; 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-&gt;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())-&gt;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&lt;double, 6&gt;&amp; 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) &amp;&amp; determinant != 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-AffineTransform AffineTransform::inverse() const
</del><ins>+Optional&lt;AffineTransform&gt; 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 &quot;PlatformExportMacros.h&quot;
</span><span class="cx"> #include &lt;array&gt;
</span><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><ins>+#include &lt;wtf/Optional.h&gt;
</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&lt;AffineTransform&gt; inverse() const;
</ins><span class="cx"> 
</span><span class="cx">     void blend(const AffineTransform&amp; 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-&gt;mapPoint(point);
</span><span class="cx"> 
</span><del>-    return m_accumulatedTransform-&gt;inverse().projectPoint(point, wasClamped);
</del><ins>+    return m_accumulatedTransform-&gt;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-&gt;mapQuad(quad);
</span><span class="cx"> 
</span><del>-    quad = m_accumulatedTransform-&gt;inverse().projectQuad(quad, wasClamped);
</del><ins>+    quad = m_accumulatedTransform-&gt;inverse().valueOr(TransformationMatrix()).projectQuad(quad, wasClamped);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformState::flattenWithTransform(const TransformationMatrix&amp; 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&lt;TransformationMatrix&gt; 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 &quot;IntPoint.h&quot;
</span><span class="cx"> #include &lt;string.h&gt; //for memcpy
</span><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><ins>+#include &lt;wtf/Optional.h&gt;
</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&amp;, const FloatRect&amp;);
</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&lt;TransformationMatrix&gt; 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&amp; 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&lt;TransformationMatrix&gt; 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 &amp;&amp; renderer().style().backfaceVisibility() == BackfaceVisibilityHidden) {
</span><del>-        TransformationMatrix invertedMatrix = localTransformState-&gt;m_accumulatedTransform.inverse();
</del><ins>+        Optional&lt;TransformationMatrix&gt; invertedMatrix = localTransformState-&gt;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() &lt; 0)
</del><ins>+        if (invertedMatrix &amp;&amp; invertedMatrix.value().m33() &lt; 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) &amp;&amp; !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-&gt;nextSibling()) {
</span><span class="cx">         RenderObject* renderer = childNode-&gt;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-&gt;asImageBuffer();
</span><span class="cx">         if (resultImage) {
</span><del>-            context-&gt;concatCTM(filterData-&gt;shearFreeAbsoluteTransform.inverse());
</del><ins>+            context-&gt;concatCTM(filterData-&gt;shearFreeAbsoluteTransform.inverse().valueOr(AffineTransform()));
</ins><span class="cx"> 
</span><span class="cx">             context-&gt;scale(FloatSize(1 / filterData-&gt;filter-&gt;filterResolution().width(), 1 / filterData-&gt;filter-&gt;filterResolution().height()));
</span><span class="cx">             context-&gt;drawImageBuffer(*resultImage, lastEffect-&gt;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-&gt;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&amp; strokeTransform, GraphicsContextStateSaver&amp; stateSaver)
</span><span class="cx"> {
</span><del>-    if (!strokeTransform.isInvertible())
</del><ins>+    Optional&lt;AffineTransform&gt; 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()-&gt;concatCTM(strokeTransform.inverse());
</del><ins>+    stateSaver.context()-&gt;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&lt;AffineTransform&gt; inverse = nonScalingTransform.inverse()) {
</ins><span class="cx">                 Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform);
</span><span class="cx">                 FloatRect strokeBoundingRect = usePath-&gt;strokeBoundingRect(&amp;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 &amp;&amp; (style().svgStyle().hasStroke() || !hitRules.requireStroke))
</span><span class="cx">             || (hitRules.canHitFill &amp;&amp; (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&lt;SVGGraphicsElement&gt;(target)) {
</span><span class="cx">         AffineTransform targetCTM = downcast&lt;SVGGraphicsElement&gt;(*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&amp; 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&amp; 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  &lt;achristensen@webkit.org&gt;
+
+        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  &lt;timothy_horton@apple.com&gt;
</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&amp; pointInRootViewCoordinates, IntPoint&amp; 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&amp; 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&amp; 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-&gt;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-&gt;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&amp; pluginSize, const IntRect&amp;, const AffineTransform&amp; 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()-&gt;coreFrame()-&gt;view();
</span></span></pre>
</div>
</div>

</body>
</html>