FontDescription copies should share families list, not duplicate it.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Nov 2013 11:01:42 +0000 (11:01 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Nov 2013 11:01:42 +0000 (11:01 +0000)
<https://webkit.org/b/124338>

Source/WebCore:

Turn FontDescription::m_families into a RefCountedArray<AtomicString>
instead of a Vector<AtomicString, 1>. This allows FontDescription to
share the families list between copies, instead of each object having
its own Vector.

Also, FontDescription itself shrinks by 16 bytes.

Reviewed by Antti Koivisto.

Source/WTF:

Add RefCountedArray::operator==.

Reviewed by Antti Koivisto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@159279 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/RefCountedArray.h
Source/WebCore/ChangeLog
Source/WebCore/css/DeprecatedStyleBuilder.cpp
Source/WebCore/platform/graphics/FontDescription.cpp
Source/WebCore/platform/graphics/FontDescription.h

index 2865984..54527c7 100644 (file)
@@ -1,3 +1,12 @@
+2013-11-14  Andreas Kling  <akling@apple.com>
+
+        FontDescription copies should share families list, not duplicate it.
+        <https://webkit.org/b/124338>
+
+        Add RefCountedArray::operator==.
+
+        Reviewed by Antti Koivisto.
+
 2013-11-13  Anders Carlsson  <andersca@apple.com>
 
         Add a Vector constructor that takes an std::initializer_list
index 55abe25..a55d7ae 100644 (file)
@@ -155,6 +155,22 @@ public:
     
     T& operator[](size_t i) { return at(i); }
     const T& operator[](size_t i) const { return at(i); }
+
+    bool operator==(const RefCountedArray& other) const
+    {
+        if (m_data == other.m_data)
+            return true;
+        if (!m_data || !other.m_data)
+            return false;
+        unsigned length = Header::fromPayload(m_data)->length;
+        if (length != Header::fromPayload(other.m_data)->length)
+            return false;
+        for (unsigned i = 0; i < length; ++i) {
+            if (m_data[i] != other.m_data[i])
+                return false;
+        }
+        return true;
+    }
     
 private:
     struct Header {
index b4c33b9..2bd23f2 100644 (file)
@@ -1,3 +1,17 @@
+2013-11-14  Andreas Kling  <akling@apple.com>
+
+        FontDescription copies should share families list, not duplicate it.
+        <https://webkit.org/b/124338>
+
+        Turn FontDescription::m_families into a RefCountedArray<AtomicString>
+        instead of a Vector<AtomicString, 1>. This allows FontDescription to
+        share the families list between copies, instead of each object having
+        its own Vector.
+
+        Also, FontDescription itself shrinks by 16 bytes.
+
+        Reviewed by Antti Koivisto.
+
 2013-11-14  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         Introduce FILTER_TYPE_CASTS for child filter class
index 99a75aa..49de14e 100644 (file)
@@ -710,7 +710,7 @@ public:
         bool oldFamilyUsedFixedDefaultSize = fontDescription.useFixedDefaultSize();
         fontDescription.setGenericFamily(FontDescription::NoFamily);
 
-        Vector<AtomicString, 1> families;
+        Vector<AtomicString> families;
         families.reserveInitialCapacity(valueList.length());
 
         for (unsigned i = 0; i < valueList.length(); ++i) {
@@ -764,7 +764,7 @@ public:
 
         if (families.isEmpty())
             return;
-        fontDescription.adoptFamilies(families);
+        fontDescription.setFamilies(families);
 
         if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize() != oldFamilyUsedFixedDefaultSize)
             styleResolver->setFontSize(fontDescription, Style::fontSizeForKeyword(CSSValueXxSmall + fontDescription.keywordSize() - 1, !oldFamilyUsedFixedDefaultSize, styleResolver->document()));
index 44bf39e..84bb5af 100644 (file)
@@ -33,8 +33,7 @@
 namespace WebCore {
 
 struct SameSizeAsFontDescription {
-    Vector<AtomicString, 1> families;
-    RefPtr<FontFeatureSettings> m_featureSettings;
+    void* pointers[2];
     float sizes[2];
     // FXIME: Make them fit into one word.
     uint32_t bitfields;
index 6878276..3ff1790 100644 (file)
@@ -35,7 +35,7 @@
 #include "TextRenderingMode.h"
 #include "WebKitFontFamilyNames.h"
 #include <wtf/MathExtras.h>
-
+#include <wtf/RefCountedArray.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
@@ -107,7 +107,7 @@ public:
     unsigned familyCount() const { return m_families.size(); }
     const AtomicString& firstFamily() const { return familyAt(0); }
     const AtomicString& familyAt(unsigned i) const { return m_families[i]; }
-    const Vector<AtomicString, 1>& families() const { return m_families; }
+    const RefCountedArray<AtomicString>& families() const { return m_families; }
 
     float specifiedSize() const { return m_specifiedSize; }
     float computedSize() const { return m_computedSize; }
@@ -141,8 +141,8 @@ public:
     FontDescription makeNormalFeatureSettings() const;
 
     void setOneFamily(const AtomicString& family) { ASSERT(m_families.size() == 1); m_families[0] = family; }
-    void setFamilies(const Vector<AtomicString, 1>& families) { m_families = families; }
-    void adoptFamilies(Vector<AtomicString, 1>& families) { m_families.swap(families); }
+    void setFamilies(const Vector<AtomicString>& families) { m_families = RefCountedArray<AtomicString>(families); }
+    void setFamilies(const RefCountedArray<AtomicString>& families) { m_families = families; }
     void setComputedSize(float s) { m_computedSize = clampToFloat(s); }
     void setSpecifiedSize(float s) { m_specifiedSize = clampToFloat(s); }
     void setItalic(FontItalic i) { m_italic = i; }
@@ -183,7 +183,7 @@ public:
 #endif
 
 private:
-    Vector<AtomicString, 1> m_families;
+    RefCountedArray<AtomicString> m_families;
     RefPtr<FontFeatureSettings> m_featureSettings;
 
     float m_specifiedSize;   // Specified CSS value. Independent of rendering issues such as integer