<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>42267</bug_id>
          
          <creation_ts>2010-07-14 09:05:35 -0700</creation_ts>
          <short_desc>Canvas: Make assigning the same fillStyle or strokeStyle a fast no-op</short_desc>
          <delta_ts>2010-07-14 09:55:21 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Performance</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>oliver</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>251221</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-07-14 09:05:35 -0700</bug_when>
    <thetext>Right now we always call into the GraphicsContext which is a fairly expensive operation (at least for Qt.)
This can easily be avoided for cases where you set the fillStyle or strokeStyle to the same value it already is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>251222</commentid>
    <comment_count>1</comment_count>
      <attachid>61529</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-07-14 09:11:36 -0700</bug_when>
    <thetext>Created attachment 61529
Proposed patch

Benchmarking with Hixie&apos;s fillRect video test:
http://hixie.ch/tests/adhoc/perf/video/002.html

BEFORE:

Elapsed wall-clock time: 905ms (ideal: 640ms).
Elapsed non-idle time: 265ms (ideal: 0ms).
Speed: 16.57fps (ideal: 25.00fps).

AFTER:

Elapsed wall-clock time: 853ms (ideal: 640ms).
Elapsed non-idle time: 213ms (ideal: 0ms).
Speed: 17.58fps (ideal: 25.00fps).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>251230</commentid>
    <comment_count>2</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-07-14 09:40:02 -0700</bug_when>
    <thetext>This can be made even faster by skipping the CanvasStyle construction path for color strings. This will make it hard to drop the custom JS bindings for fillStyle and strokeStyle though. ;(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>251232</commentid>
    <comment_count>3</comment_count>
      <attachid>61529</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-07-14 09:40:50 -0700</bug_when>
    <thetext>Comment on attachment 61529
Proposed patch

&gt; +    if (m_type == RGBA)
&gt; +        return m_rgba == other.m_rgba;
&gt; +
&gt; +    if (m_type == Gradient)
&gt; +        return m_gradient == other.m_gradient;
&gt; +
&gt; +    if (m_type == ImagePattern)
&gt; +        return m_pattern == other.m_pattern;
&gt; +
&gt; +    if (m_type == CMYKA)
&gt; +        return m_cmyka.c == other.m_cmyka.c
&gt; +            &amp;&amp; m_cmyka.m == other.m_cmyka.m
&gt; +            &amp;&amp; m_cmyka.y == other.m_cmyka.y
&gt; +            &amp;&amp; m_cmyka.k == other.m_cmyka.k
&gt; +            &amp;&amp; m_cmyka.a == other.m_cmyka.a;

I&apos;d suggest using a switch here instead of if statements.

&gt; +        bool operator==(const CanvasStyle&amp;) const;

Typically it&apos;s better style to use a friend function rather than a member function for ==, since it allows conversions to be performed on both the left and right side of an expression, whereas a member function only allows conversions on the right side.

r=me despite that</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>251233</commentid>
    <comment_count>4</comment_count>
      <attachid>61529</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-07-14 09:43:33 -0700</bug_when>
    <thetext>Comment on attachment 61529
Proposed patch

Setting cq-, will make Darin&apos;s suggested adjustments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>251246</commentid>
    <comment_count>5</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-07-14 09:55:21 -0700</bug_when>
    <thetext>Committed r63327: &lt;http://trac.webkit.org/changeset/63327&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>61529</attachid>
            <date>2010-07-14 09:11:36 -0700</date>
            <delta_ts>2010-07-14 09:43:33 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-42267.diff</filename>
            <type>text/plain</type>
            <size>3619</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZDM4MzkyYS4uMDliZTAxYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMCBAQAorMjAxMC0wNy0xNCAgQW5kcmVhcyBLbGlu
ZyAgPGFuZHJlYXMua2xpbmdAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIENhbnZhczogTWFrZSBhc3NpZ25pbmcgdGhlIHNhbWUgZmls
bFN0eWxlIG9yIHN0cm9rZVN0eWxlIGEgZmFzdCBuby1vcAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIyNjcKKworICAgICAgICBBdm9pZCBjYWxsaW5n
IGludG8gR3JhcGhpY3NDb250ZXh0IHdoZW4gc2V0dGluZyBhIHN0eWxlIHRvIGl0cyBjdXJyZW50
IHZhbHVlLgorCisgICAgICAgICogaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6c2V0U3Ry
b2tlU3R5bGUpOiBSZXR1cm4gZWFybHkgaWYgdGhlCisgICAgICAgIG5ldyBzdHlsZSBpcyB0aGUg
c2FtZSBhcyB0aGUgY3VycmVudCBvbmUuCisgICAgICAgIChXZWJDb3JlOjpDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQ6OnNldEZpbGxTdHlsZSk6IFNhbWUuCisgICAgICAgICogaHRtbC9jYW52YXMv
Q2FudmFzU3R5bGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzU3R5bGU6Om9wZXJhdG9y
PT0pOiBBZGRlZC4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9DYW52YXNTdHlsZS5oOgorCiAyMDEw
LTA3LTE0ICBTdGV2ZSBCbG9jayAgPHN0ZXZlYmxvY2tAZ29vZ2xlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBKZXJlbXkgT3Jsb3cuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvY2FudmFz
L0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAgYi9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRC5jcHAKaW5kZXggMGRiMzUwNS4uYzFiMjE0MiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuY3BwCisrKyBi
L1dlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcApAQCAtMTcy
LDYgKzE3Miw5IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpzZXRTdHJva2VTdHls
ZShQYXNzUmVmUHRyPENhbnZhc1N0eWxlPiBzdHlsZSkKICAgICBpZiAoIXN0eWxlKQogICAgICAg
ICByZXR1cm47CiAKKyAgICBpZiAoc3RhdGUoKS5tX3N0cm9rZVN0eWxlICYmICpzdHlsZSA9PSAq
c3RhdGUoKS5tX3N0cm9rZVN0eWxlKQorICAgICAgICByZXR1cm47CisKICAgICBpZiAoY2FudmFz
KCktPm9yaWdpbkNsZWFuKCkpIHsKICAgICAgICAgaWYgKENhbnZhc1BhdHRlcm4qIHBhdHRlcm4g
PSBzdHlsZS0+Y2FudmFzUGF0dGVybigpKSB7CiAgICAgICAgICAgICBpZiAoIXBhdHRlcm4tPm9y
aWdpbkNsZWFuKCkpCkBAIC0xOTUsNiArMTk4LDkgQEAgdm9pZCBDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ6OnNldEZpbGxTdHlsZShQYXNzUmVmUHRyPENhbnZhc1N0eWxlPiBzdHlsZSkKIHsKICAg
ICBpZiAoIXN0eWxlKQogICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc3RhdGUoKS5tX2ZpbGxT
dHlsZSAmJiAqc3R5bGUgPT0gKnN0YXRlKCkubV9maWxsU3R5bGUpCisgICAgICAgIHJldHVybjsK
ICAKICAgICBpZiAoY2FudmFzKCktPm9yaWdpbkNsZWFuKCkpIHsKICAgICAgICAgaWYgKENhbnZh
c1BhdHRlcm4qIHBhdHRlcm4gPSBzdHlsZS0+Y2FudmFzUGF0dGVybigpKSB7CmRpZmYgLS1naXQg
YS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1N0eWxlLmNwcCBiL1dlYkNvcmUvaHRtbC9jYW52
YXMvQ2FudmFzU3R5bGUuY3BwCmluZGV4IDY3ZTgyMDEuLjFkY2E0ODYgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzU3R5bGUuY3BwCisrKyBiL1dlYkNvcmUvaHRtbC9jYW52
YXMvQ2FudmFzU3R5bGUuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiQ2FudmFzR3Jh
ZGllbnQuaCIKICNpbmNsdWRlICJDYW52YXNQYXR0ZXJuLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlIDx3dGYvUGFz
c1JlZlB0ci5oPgogCiAjaWYgUExBVEZPUk0oQ0cpCkBAIC0xMjAsNiArMTIxLDMxIEBAIFBhc3NS
ZWZQdHI8Q2FudmFzU3R5bGU+IENhbnZhc1N0eWxlOjpjcmVhdGUoUGFzc1JlZlB0cjxDYW52YXNQ
YXR0ZXJuPiBwYXR0ZXJuKQogICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2FudmFzU3R5bGUocGF0
dGVybikpOwogfQogCitib29sIENhbnZhc1N0eWxlOjpvcGVyYXRvcj09KGNvbnN0IENhbnZhc1N0
eWxlJiBvdGhlcikgY29uc3QKK3sKKyAgICBpZiAobV90eXBlICE9IG90aGVyLm1fdHlwZSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fdHlwZSA9PSBSR0JBKQorICAgICAgICBy
ZXR1cm4gbV9yZ2JhID09IG90aGVyLm1fcmdiYTsKKworICAgIGlmIChtX3R5cGUgPT0gR3JhZGll
bnQpCisgICAgICAgIHJldHVybiBtX2dyYWRpZW50ID09IG90aGVyLm1fZ3JhZGllbnQ7CisKKyAg
ICBpZiAobV90eXBlID09IEltYWdlUGF0dGVybikKKyAgICAgICAgcmV0dXJuIG1fcGF0dGVybiA9
PSBvdGhlci5tX3BhdHRlcm47CisKKyAgICBpZiAobV90eXBlID09IENNWUtBKQorICAgICAgICBy
ZXR1cm4gbV9jbXlrYS5jID09IG90aGVyLm1fY215a2EuYworICAgICAgICAgICAgJiYgbV9jbXlr
YS5tID09IG90aGVyLm1fY215a2EubQorICAgICAgICAgICAgJiYgbV9jbXlrYS55ID09IG90aGVy
Lm1fY215a2EueQorICAgICAgICAgICAgJiYgbV9jbXlrYS5rID09IG90aGVyLm1fY215a2Euawor
ICAgICAgICAgICAgJiYgbV9jbXlrYS5hID09IG90aGVyLm1fY215a2EuYTsKKworICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBDYW52YXNTdHls
ZTo6YXBwbHlTdHJva2VDb2xvcihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQpCiB7CiAgICAgaWYg
KCFjb250ZXh0KQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNTdHlsZS5o
IGIvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNTdHlsZS5oCmluZGV4IDE4ZTU1Y2YuLmM0YmNh
ZWQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzU3R5bGUuaAorKysgYi9X
ZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1N0eWxlLmgKQEAgLTU1LDYgKzU1LDggQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkIGFwcGx5RmlsbENvbG9yKEdyYXBoaWNzQ29udGV4
dCopOwogICAgICAgICB2b2lkIGFwcGx5U3Ryb2tlQ29sb3IoR3JhcGhpY3NDb250ZXh0Kik7CiAK
KyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENhbnZhc1N0eWxlJikgY29uc3Q7CisKICAg
ICBwcml2YXRlOgogICAgICAgICBDYW52YXNTdHlsZShSR0JBMzIgcmdiYSk7CiAgICAgICAgIENh
bnZhc1N0eWxlKGZsb2F0IGdyYXlMZXZlbCk7Cg==
</data>
<flag name="review"
          id="49567"
          type_id="1"
          status="+"
          setter="darin"
    />
    <flag name="commit-queue"
          id="49568"
          type_id="3"
          status="-"
          setter="kling"
    />
          </attachment>
      

    </bug>

</bugzilla>