Make SVGTransform::valueAsString use StringBuilder
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 17:09:11 +0000 (17:09 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 17:09:11 +0000 (17:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121498

Reviewed by Andreas Kling.

Source/WebCore:

* svg/SVGTransform.cpp:
(WebCore::SVGTransform::valueAsString): Use StringBuilder constently to
avoid creating temporary String objects that cause additional, slow
memory allocation.

Source/WTF:

* wtf/text/StringBuilder.cpp: Added appendNumber functions corresponding to all remaining
String::number functions. If we find we don't need all of these we can delete them later,
but I don't want to give clients a reason to prefer less-efficient API to StringBuilder.
* wtf/text/StringBuilder.h: Ditto.

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

Source/WTF/ChangeLog
Source/WTF/wtf/text/StringBuilder.cpp
Source/WTF/wtf/text/StringBuilder.h
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGTransform.cpp

index 79749a4..3f0464e 100644 (file)
@@ -1,3 +1,15 @@
+2013-09-17  Darin Adler  <darin@apple.com>
+
+        Make SVGTransform::valueAsString use StringBuilder
+        https://bugs.webkit.org/show_bug.cgi?id=121498
+
+        Reviewed by Andreas Kling.
+
+        * wtf/text/StringBuilder.cpp: Added appendNumber functions corresponding to all remaining
+        String::number functions. If we find we don't need all of these we can delete them later,
+        but I don't want to give clients a reason to prefer less-efficient API to StringBuilder.
+        * wtf/text/StringBuilder.h: Ditto.
+
 2013-09-16  Anders Carlsson  <andersca@apple.com>
 
         HashMap should work with move-only keys
index 745bca6..b672149 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "IntegerToStringConversion.h"
 #include "WTFString.h"
+#include <wtf/dtoa.h>
 
 namespace WTF {
 
@@ -328,6 +329,24 @@ void StringBuilder::appendNumber(unsigned long long number)
     numberToStringUnsigned<StringBuilder>(number, this);
 }
 
+void StringBuilder::appendNumber(double number, unsigned precision, TrailingZerosTruncatingPolicy trailingZerosTruncatingPolicy)
+{
+    NumberToStringBuffer buffer;
+    append(numberToFixedPrecisionString(number, precision, buffer, trailingZerosTruncatingPolicy == TruncateTrailingZeros));
+}
+
+void StringBuilder::appendECMAScriptNumber(double number)
+{
+    NumberToStringBuffer buffer;
+    append(numberToString(number, buffer));
+}
+
+void StringBuilder::appendFixedWidthNumber(double number, unsigned decimalPlaces)
+{
+    NumberToStringBuffer buffer;
+    append(numberToFixedWidthString(number, decimalPlaces, buffer));
+}
+
 bool StringBuilder::canShrink() const
 {
     // Only shrink the buffer if it's less than 80% full. Need to tune this heuristic!
index cf77d61..f5344cb 100644 (file)
@@ -160,6 +160,9 @@ public:
     WTF_EXPORT_PRIVATE void appendNumber(unsigned long);
     WTF_EXPORT_PRIVATE void appendNumber(long long);
     WTF_EXPORT_PRIVATE void appendNumber(unsigned long long);
+    WTF_EXPORT_PRIVATE void appendNumber(double, unsigned precision = 6, TrailingZerosTruncatingPolicy = TruncateTrailingZeros);
+    WTF_EXPORT_PRIVATE void appendECMAScriptNumber(double);
+    WTF_EXPORT_PRIVATE void appendFixedWidthNumber(double, unsigned decimalPlaces);
 
     String toString()
     {
index f060d62..0a4007e 100644 (file)
@@ -1,5 +1,17 @@
 2013-09-17  Darin Adler  <darin@apple.com>
 
+        Make SVGTransform::valueAsString use StringBuilder
+        https://bugs.webkit.org/show_bug.cgi?id=121498
+
+        Reviewed by Andreas Kling.
+
+        * svg/SVGTransform.cpp:
+        (WebCore::SVGTransform::valueAsString): Use StringBuilder constently to
+        avoid creating temporary String objects that cause additional, slow
+        memory allocation.
+
+2013-09-17  Darin Adler  <darin@apple.com>
+
         Get rid of a couple unneeded NeverDestroyed::get() calls
         https://bugs.webkit.org/show_bug.cgi?id=121500
 
index 20d6e88..09238a6 100644 (file)
@@ -174,28 +174,65 @@ String SVGTransform::valueAsString() const
         return prefix;
     case SVG_TRANSFORM_MATRIX: {
         StringBuilder builder;
-        builder.append(prefix + String::number(m_matrix.a()) + ' ' + String::number(m_matrix.b()) + ' ' + String::number(m_matrix.c()) + ' ' +
-                       String::number(m_matrix.d()) + ' ' + String::number(m_matrix.e()) + ' ' + String::number(m_matrix.f()) + ')');
+        builder.append(prefix);
+        builder.appendNumber(m_matrix.a());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.b());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.c());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.d());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.e());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.e());
+        builder.append(')');
+        return builder.toString();
+    }
+    case SVG_TRANSFORM_TRANSLATE: {
+        StringBuilder builder;
+        builder.append(prefix);
+        builder.appendNumber(m_matrix.e());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.e());
+        builder.append(')');
+        return builder.toString();
+    }
+    case SVG_TRANSFORM_SCALE: {
+        StringBuilder builder;
+        builder.append(prefix);
+        builder.appendNumber(m_matrix.xScale());
+        builder.append(' ');
+        builder.appendNumber(m_matrix.yScale());
+        builder.append(')');
         return builder.toString();
     }
-    case SVG_TRANSFORM_TRANSLATE:
-        return prefix + String::number(m_matrix.e()) + ' ' + String::number(m_matrix.f()) + ')';
-    case SVG_TRANSFORM_SCALE:
-        return prefix + String::number(m_matrix.xScale()) + ' ' + String::number(m_matrix.yScale()) + ')';
     case SVG_TRANSFORM_ROTATE: {
         double angleInRad = deg2rad(m_angle);
         double cosAngle = cos(angleInRad);
         double sinAngle = sin(angleInRad);
         float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - cosAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0);
         float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAngle / (1 - cosAngle) + m_matrix.f()) / 2 : 0);
-        if (cx || cy)
-            return prefix + String::number(m_angle) + ' ' + String::number(cx) + ' ' + String::number(cy) + ')';
-        return prefix + String::number(m_angle) + ')';
+        StringBuilder builder;
+        builder.append(prefix);
+        builder.appendNumber(m_angle);
+        if (cx || cy) {
+            builder.append(' ');
+            builder.appendNumber(cx);
+            builder.append(' ');
+            builder.appendNumber(cy);
+        }
+        builder.append(')');
+        return builder.toString();
     }
     case SVG_TRANSFORM_SKEWX:
-        return prefix + String::number(m_angle) + ')';
-    case SVG_TRANSFORM_SKEWY:
-        return prefix + String::number(m_angle) + ')';
+    case SVG_TRANSFORM_SKEWY: {
+        StringBuilder builder;
+        builder.append(prefix);
+        builder.appendNumber(m_angle);
+        builder.append(')');
+        return builder.toString();
+    }
     }
 
     ASSERT_NOT_REACHED();