<!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>[193897] trunk/Source/WebCore</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/193897">193897</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2015-12-10 02:23:06 -0800 (Thu, 10 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[TexMap] Clean up BitmapTexturePool
https://bugs.webkit.org/show_bug.cgi?id=152073

Reviewed by Daniel Bates.

Move BitmapTexturePoolEntry class under the BitmapTexturePool class, renaming
it to simply Entry and keeping it private. Have the constructor take in an
rvalue reference to the RefPtr&lt;BitmapTexture&gt; object. Remove the static
compareTimeLastUsed() function and use a lambda directly in its place.

Remove the default BitmapTexturePool constructor, which isn't used anywhere.
Have the constructor and some methods accept or return RefPtr objects, possibly
via rvalue references. Clean up the header file by removing a few unnecessary
header includes and using forward declarations where possible.

In the BitmapTexturePool implementation file, mark the two const variables as
static. The ::acquireTexture() method now uses the std::find_if() algorithm
to find a fitting Entry object in the Vector. The same method is also moved
upwards so we follow the order of declaration in the header. ::createTexture()
inlines the return of the new expression into the adoptRef() call in the return
statement.

TextureMapperGL constructor is updated to pass a copied RefPtr object into the
BitmapTexturePool constructor.

* platform/graphics/texmap/BitmapTexturePool.cpp:
(WebCore::BitmapTexturePool::BitmapTexturePool):
(WebCore::BitmapTexturePool::acquireTexture):
(WebCore::BitmapTexturePool::releaseUnusedTexturesTimerFired):
(WebCore::BitmapTexturePool::createTexture):
* platform/graphics/texmap/BitmapTexturePool.h:
(WebCore::BitmapTexturePool::Entry::Entry):
(WebCore::BitmapTexturePool::Entry::markUsed):
(WebCore::BitmapTexturePoolEntry::BitmapTexturePoolEntry): Deleted.
(WebCore::BitmapTexturePoolEntry::markUsed): Deleted.
(WebCore::BitmapTexturePoolEntry::compareTimeLastUsed): Deleted.
* platform/graphics/texmap/TextureMapperGL.cpp:
(WebCore::TextureMapperGL::TextureMapperGL):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapBitmapTexturePoolcpp">trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapBitmapTexturePoolh">trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapTextureMapperGLcpp">trunk/Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (193896 => 193897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-12-10 10:15:36 UTC (rev 193896)
+++ trunk/Source/WebCore/ChangeLog        2015-12-10 10:23:06 UTC (rev 193897)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2015-12-10  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [TexMap] Clean up BitmapTexturePool
+        https://bugs.webkit.org/show_bug.cgi?id=152073
+
+        Reviewed by Daniel Bates.
+
+        Move BitmapTexturePoolEntry class under the BitmapTexturePool class, renaming
+        it to simply Entry and keeping it private. Have the constructor take in an
+        rvalue reference to the RefPtr&lt;BitmapTexture&gt; object. Remove the static
+        compareTimeLastUsed() function and use a lambda directly in its place.
+
+        Remove the default BitmapTexturePool constructor, which isn't used anywhere.
+        Have the constructor and some methods accept or return RefPtr objects, possibly
+        via rvalue references. Clean up the header file by removing a few unnecessary
+        header includes and using forward declarations where possible.
+
+        In the BitmapTexturePool implementation file, mark the two const variables as
+        static. The ::acquireTexture() method now uses the std::find_if() algorithm
+        to find a fitting Entry object in the Vector. The same method is also moved
+        upwards so we follow the order of declaration in the header. ::createTexture()
+        inlines the return of the new expression into the adoptRef() call in the return
+        statement.
+
+        TextureMapperGL constructor is updated to pass a copied RefPtr object into the
+        BitmapTexturePool constructor.
+
+        * platform/graphics/texmap/BitmapTexturePool.cpp:
+        (WebCore::BitmapTexturePool::BitmapTexturePool):
+        (WebCore::BitmapTexturePool::acquireTexture):
+        (WebCore::BitmapTexturePool::releaseUnusedTexturesTimerFired):
+        (WebCore::BitmapTexturePool::createTexture):
+        * platform/graphics/texmap/BitmapTexturePool.h:
+        (WebCore::BitmapTexturePool::Entry::Entry):
+        (WebCore::BitmapTexturePool::Entry::markUsed):
+        (WebCore::BitmapTexturePoolEntry::BitmapTexturePoolEntry): Deleted.
+        (WebCore::BitmapTexturePoolEntry::markUsed): Deleted.
+        (WebCore::BitmapTexturePoolEntry::compareTimeLastUsed): Deleted.
+        * platform/graphics/texmap/TextureMapperGL.cpp:
+        (WebCore::TextureMapperGL::TextureMapperGL):
+
</ins><span class="cx"> 2015-12-10  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] RenderThemeGtk::platformActiveSelectionBackgroundColor, et. al. should not clobber state of cached GtkStyleContexts
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapBitmapTexturePoolcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.cpp (193896 => 193897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.cpp        2015-12-10 10:15:36 UTC (rev 193896)
+++ trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.cpp        2015-12-10 10:23:06 UTC (rev 193897)
</span><span class="lines">@@ -29,27 +29,36 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><span class="cx"> #include &quot;BitmapTextureGL.h&quot;
</span><del>-#include &quot;GLContext.h&quot;
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-const double s_releaseUnusedSecondsTolerance = 3;
-const double s_releaseUnusedTexturesTimerInterval = 0.5;
</del><ins>+static const double s_releaseUnusedSecondsTolerance = 3;
+static const double s_releaseUnusedTexturesTimerInterval = 0.5;
</ins><span class="cx"> 
</span><del>-BitmapTexturePool::BitmapTexturePool()
-    : m_releaseUnusedTexturesTimer(*this, &amp;BitmapTexturePool::releaseUnusedTexturesTimerFired)
-{
-}
-
</del><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><del>-BitmapTexturePool::BitmapTexturePool(PassRefPtr&lt;GraphicsContext3D&gt; context)
-    : m_context3D(context)
</del><ins>+BitmapTexturePool::BitmapTexturePool(RefPtr&lt;GraphicsContext3D&gt;&amp;&amp; context3D)
+    : m_context3D(WTF::move(context3D))
</ins><span class="cx">     , m_releaseUnusedTexturesTimer(*this, &amp;BitmapTexturePool::releaseUnusedTexturesTimerFired)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+RefPtr&lt;BitmapTexture&gt; BitmapTexturePool::acquireTexture(const IntSize&amp; size)
+{
+    Entry* selectedEntry = std::find_if(m_textures.begin(), m_textures.end(),
+        [&amp;size](Entry&amp; entry) { return entry.m_texture-&gt;refCount() == 1 &amp;&amp; entry.m_texture-&gt;size() == size; });
+
+    if (selectedEntry == m_textures.end()) {
+        m_textures.append(Entry(createTexture()));
+        selectedEntry = &amp;m_textures.last();
+    }
+
+    scheduleReleaseUnusedTextures();
+    selectedEntry-&gt;markIsInUse();
+    return selectedEntry-&gt;m_texture.copyRef();
+}
+
</ins><span class="cx"> void BitmapTexturePool::scheduleReleaseUnusedTextures()
</span><span class="cx"> {
</span><span class="cx">     if (m_releaseUnusedTexturesTimer.isActive())
</span><span class="lines">@@ -64,46 +73,22 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // Delete entries, which have been unused in s_releaseUnusedSecondsTolerance.
</span><del>-    std::sort(m_textures.begin(), m_textures.end(), BitmapTexturePoolEntry::compareTimeLastUsed);
</del><ins>+    std::sort(m_textures.begin(), m_textures.end(),
+        [](const Entry&amp; a, const Entry&amp; b) { return a.m_lastUsedTime &gt; b.m_lastUsedTime; });
</ins><span class="cx"> 
</span><span class="cx">     double minUsedTime = monotonicallyIncreasingTime() - s_releaseUnusedSecondsTolerance;
</span><span class="cx">     for (size_t i = 0; i &lt; m_textures.size(); ++i) {
</span><del>-        if (m_textures[i].m_timeLastUsed &lt; minUsedTime) {
</del><ins>+        if (m_textures[i].m_lastUsedTime &lt; minUsedTime) {
</ins><span class="cx">             m_textures.remove(i, m_textures.size() - i);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;BitmapTexture&gt; BitmapTexturePool::acquireTexture(const IntSize&amp; size)
</del><ins>+RefPtr&lt;BitmapTexture&gt; BitmapTexturePool::createTexture()
</ins><span class="cx"> {
</span><del>-    BitmapTexturePoolEntry* selectedEntry = 0;
-    for (auto&amp; entry : m_textures) {
-        // If the surface has only one reference (the one in m_textures), we can safely reuse it.
-        if (entry.m_texture-&gt;refCount() &gt; 1)
-            continue;
-
-        if (entry.m_texture-&gt;size() == size) {
-            selectedEntry = &amp;entry;
-            break;
-        }
-    }
-
-    if (!selectedEntry) {
-        m_textures.append(BitmapTexturePoolEntry(createTexture()));
-        selectedEntry = &amp;m_textures.last();
-    }
-
-    scheduleReleaseUnusedTextures();
-    selectedEntry-&gt;markUsed();
-    return selectedEntry-&gt;m_texture;
-}
-
-PassRefPtr&lt;BitmapTexture&gt; BitmapTexturePool::createTexture()
-{
</del><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><del>-    BitmapTextureGL* texture = new BitmapTextureGL(m_context3D);
-    return adoptRef(texture);
</del><ins>+    return adoptRef(new BitmapTextureGL(m_context3D));
</ins><span class="cx"> #else
</span><span class="cx">     return nullptr;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapBitmapTexturePoolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.h (193896 => 193897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.h        2015-12-10 10:15:36 UTC (rev 193896)
+++ trunk/Source/WebCore/platform/graphics/texmap/BitmapTexturePool.h        2015-12-10 10:23:06 UTC (rev 193897)
</span><span class="lines">@@ -28,8 +28,6 @@
</span><span class="cx"> #define BitmapTexturePool_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BitmapTexture.h&quot;
</span><del>-#include &quot;IntRect.h&quot;
-#include &quot;IntSize.h&quot;
</del><span class="cx"> #include &quot;Timer.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -39,46 +37,43 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class TextureMapper;
</del><ins>+class GraphicsContext3D;
+class IntSize;
</ins><span class="cx"> 
</span><del>-struct BitmapTexturePoolEntry {
-    explicit BitmapTexturePoolEntry(PassRefPtr&lt;BitmapTexture&gt; texture)
-        : m_texture(texture)
-    { }
-    inline void markUsed() { m_timeLastUsed = monotonicallyIncreasingTime(); }
-    static bool compareTimeLastUsed(const BitmapTexturePoolEntry&amp; a, const BitmapTexturePoolEntry&amp; b)
-    {
-        return a.m_timeLastUsed - b.m_timeLastUsed &gt; 0;
-    }
-
-    RefPtr&lt;BitmapTexture&gt; m_texture;
-    double m_timeLastUsed;
-};
-
</del><span class="cx"> class BitmapTexturePool {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(BitmapTexturePool);
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    BitmapTexturePool();
</del><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><del>-    explicit BitmapTexturePool(PassRefPtr&lt;GraphicsContext3D&gt;);
</del><ins>+    explicit BitmapTexturePool(RefPtr&lt;GraphicsContext3D&gt;&amp;&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    PassRefPtr&lt;BitmapTexture&gt; acquireTexture(const IntSize&amp;);
</del><ins>+    RefPtr&lt;BitmapTexture&gt; acquireTexture(const IntSize&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    struct Entry {
+        explicit Entry(RefPtr&lt;BitmapTexture&gt;&amp;&amp; texture)
+            : m_texture(WTF::move(texture))
+        { }
+
+        void markIsInUse() { m_lastUsedTime = monotonicallyIncreasingTime(); }
+
+        RefPtr&lt;BitmapTexture&gt; m_texture;
+        double m_lastUsedTime;
+    };
+
</ins><span class="cx">     void scheduleReleaseUnusedTextures();
</span><span class="cx">     void releaseUnusedTexturesTimerFired();
</span><del>-    PassRefPtr&lt;BitmapTexture&gt; createTexture();
</del><ins>+    RefPtr&lt;BitmapTexture&gt; createTexture();
</ins><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><span class="cx">     RefPtr&lt;GraphicsContext3D&gt; m_context3D;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Vector&lt;BitmapTexturePoolEntry&gt; m_textures;
</del><ins>+    Vector&lt;Entry&gt; m_textures;
</ins><span class="cx">     Timer m_releaseUnusedTexturesTimer;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+} // namespace WebCore
</ins><span class="cx"> 
</span><span class="cx"> #endif // BitmapTexturePool_h
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapTextureMapperGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp (193896 => 193897)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp        2015-12-10 10:15:36 UTC (rev 193896)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp        2015-12-10 10:23:06 UTC (rev 193897)
</span><span class="lines">@@ -238,7 +238,7 @@
</span><span class="cx">     m_context3D = GraphicsContext3D::createForCurrentGLContext();
</span><span class="cx">     m_data = new TextureMapperGLData(m_context3D.get());
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL)
</span><del>-    m_texturePool = std::make_unique&lt;BitmapTexturePool&gt;(m_context3D);
</del><ins>+    m_texturePool = std::make_unique&lt;BitmapTexturePool&gt;(m_context3D.copyRef());
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>