<?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>30442</bug_id>
          
          <creation_ts>2009-10-16 09:35:21 -0700</creation_ts>
          <short_desc>Add helper methods to determine whether a transformation matrix is only scaled or translated</short_desc>
          <delta_ts>2009-12-14 13:27:24 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Jakob Petsovits">jpetsovits</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>manyoso</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>155106</commentid>
    <comment_count>0</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2009-10-16 09:35:21 -0700</bug_when>
    <thetext>In order to determine whether a rectangle is still a rectangle after some transformation, it&apos;s sufficient to check if the transformation matrix only consists of scale and translation. That&apos;s a useful check to have, as you can, for example, use that knowledge to follow an optimized code path or a generic one. I think that check should be a helper method in TransformationMatrix - so far, I made use of that kind of check twice.

I could also imagine checks for scale-only and translation-only to be useful for some cases, so I&apos;m adding those too as they&apos;re very straightforward.

Patch attached below.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155108</commentid>
    <comment_count>1</comment_count>
      <attachid>41290</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2009-10-16 09:41:26 -0700</bug_when>
    <thetext>Created attachment 41290
Add helper methods to determine whether a transformation matrix is only scaled or translated.

The patch, as detailed above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155117</commentid>
    <comment_count>2</comment_count>
      <attachid>41290</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-10-16 09:59:17 -0700</bug_when>
    <thetext>Comment on attachment 41290
Add helper methods to determine whether a transformation matrix is only scaled or translated.

The method names are the only part I have a problem with.  Reading the patch it seems the identity matrix will return true for all of these methods.  &apos;isScaleOnly&apos; implies to me that an actual scale is set in the matrix.  Similarly for &apos;isTranslationOnly.&apos;  And then &apos;isScaleAndTranslationOnly&apos; is rather &apos;isIdentityAndOrScaleAndOrTranslation&apos;, but that is obviously too wordy.  Looking for right names...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155236</commentid>
    <comment_count>3</comment_count>
      <attachid>41327</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2009-10-16 14:28:22 -0700</bug_when>
    <thetext>Created attachment 41327
Add a mapsRectToRect() helper method to TransformationMatrix.

Incorporate feedback from smfr and manyoso, stripping down the patch to the bare minimum and tailoring it for the actual use case it is intended to cover (checking if a rect is still a rect after the transformation). The isScale() and isTranslation() methods that I included as &quot;bonus extra&quot; were removed, and the isScaleOrTranslation() method has been renamed to mapsRectToRect(), throwing out the 3D parts that are not used for mapRect() calculations.

Please review, thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155292</commentid>
    <comment_count>4</comment_count>
      <attachid>41327</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-16 15:53:17 -0700</bug_when>
    <thetext>Comment on attachment 41327
Add a mapsRectToRect() helper method to TransformationMatrix.

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; +    bool isScaleOnly() const
&gt; +    {
&gt; +        return (m12() == 0 &amp;&amp; m13() == 0 &amp;&amp; m14() == 0 &amp;&amp;
&gt; +                m21() == 0 &amp;&amp; m23() == 0 &amp;&amp; m24() == 0 &amp;&amp;
&gt; +                m31() == 0 &amp;&amp; m32() == 0 &amp;&amp; m34() == 0 &amp;&amp;
&gt; +                m41() == 0 &amp;&amp; m42() == 0 &amp;&amp; m43() == 0);
&gt; +    }

If your purpose is to be able to go into optimized code paths, you probably want to make sure m44 is 1 in isScaleOnly() since scaling the &apos;w&apos; component will certainly cause any optimizations I can think of to fail. You should probably make sure the diagonals are not 0 for the same reason. 

&gt; +
&gt; +    bool isTranslationOnly() const
&gt; +    {
&gt; +        return (m11() == 1 &amp;&amp; m12() == 0 &amp;&amp; m13() == 0 &amp;&amp; m14() == 0 &amp;&amp;
&gt; +                m21() == 0 &amp;&amp; m22() == 1 &amp;&amp; m23() == 0 &amp;&amp; m24() == 0 &amp;&amp;
&gt; +                m31() == 0 &amp;&amp; m32() == 0 &amp;&amp; m33() == 1 &amp;&amp; m34() == 0);
&gt; +    }

Similar to above, you probably don&apos;t want to allow a value other than 1 in m44 here.

&gt; +
&gt; +    bool isScaleAndTranslationOnly() const
&gt; +    {
&gt; +        return (m12() == 0 &amp;&amp; m13() == 0 &amp;&amp; m14() == 0 &amp;&amp;
&gt; +                m21() == 0 &amp;&amp; m23() == 0 &amp;&amp; m24() == 0 &amp;&amp;
&gt; +                m31() == 0 &amp;&amp; m32() == 0 &amp;&amp; m34() == 0);
&gt; +    }
&gt; +

Same comments above apply here.

In general I&apos;m a little uncomfortable with adding functions that have no immediate purpose. If you&apos;re thinking of optimizations on rectangle tests maybe it would be better to add some bounds checking methods that operate on a passed in FloatRect or FloatQuad and do the optimizations there.









&gt; +    // Check if a 2D rectangle (IntRect or FloatRect) will still be a rectangle
&gt; +    // after the transformation, i.e. it won&apos;t be rotated or skewed.
&gt; +    bool mapsRectToRect() const
&gt; +    {
&gt; +        return (m_matrix[0][1] == 0 &amp;&amp; m_matrix[0][3] == 0 &amp;&amp;
&gt; +                m_matrix[1][0] == 0 &amp;&amp; m_matrix[1][3] == 0);
&gt; +    }
&gt; +

But a rotated rectangle is still a rectangle. And it&apos;s very possible that a matrix that returned true from the above function would still not preserve rectangularity. For instance, something other than 1 in [3][3] would fail. It seems like you are trying to create a low-level function that serves a very specific purpose but it&apos;s not clear what that purpose is. If what you want is some optimized way to do bounds or intersection checking, perhaps it would be better to add that function to TransformationMatrix rather than a function like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155293</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-16 15:54:15 -0700</bug_when>
    <thetext>Sorry about that last comment. Please ignore everything above the big space in the middle. Just the last part is relevant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155509</commentid>
    <comment_count>6</comment_count>
      <attachid>41383</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2009-10-18 10:46:58 -0700</bug_when>
    <thetext>Created attachment 41383
Add a mapsRectToRect() helper method to TransformationMatrix (try 2)

&gt; But a rotated rectangle is still a rectangle.

It&apos;s not a &quot;Rect&quot; (IntRect, FloatRect) though, so the function name is correct - while the comment and commit message were slightly off this way, I changed those to say &quot;upright rectangle&quot; instead of just &quot;rectangle&quot;.

&gt; And it&apos;s very possible that a
&gt; matrix that returned true from the above function would still not preserve
&gt; rectangularity. For instance, something other than 1 in [3][3] would fail.

Well, the corresponding code in multVecMatrix() (2D version, used by mapPoint(), which is in turn used by mapQuad(), and that&apos;s used by mapRect()) goes like this:

double w = m_matrix[3][3] + x * m_matrix[0][3] + y * m_matrix[1][3];
if (w != 1 &amp;&amp; w != 0) {
    resultX /= w;
    resultY /= w;
}

Assuming that [0][3] and [1][3] are 0 (which my method ensures), w is not affected by the x and y coordinates, which means that similar input x/y values will result in similar output values as well. For IntRects and FloatRects, which feature similar x/y values for their edges, it means that even if [3][3] is something other than 1 it will still result in an upright {Int,Float}Rect. Personally I don&apos;t care whether I check for [3][3] or not, I just thought I&apos;d match the semantics with the function name.

&gt; It seems like you are trying to create a low-level function that serves a very
&gt; specific purpose but it&apos;s not clear what that purpose is. If what you want is
&gt; some optimized way to do bounds or intersection checking, perhaps it would be
&gt; better to add that function to TransformationMatrix rather than a function like
&gt; this.

Nope, it&apos;s not meant to do anything more lower-level than checking if I can avoid using (and cumbersome checking of) Quads.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158000</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-26 16:13:48 -0700</bug_when>
    <thetext>Chris or Simon are your best reviewers here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158751</commentid>
    <comment_count>8</comment_count>
      <attachid>42062</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2009-10-28 15:37:35 -0700</bug_when>
    <thetext>Created attachment 42062
Add FloatQuad::isRectilinear() to check whether it can be represented as FloatRect.

I had a talk with Simon and Chris on Skype, and it was determined that checking the matrix would not be the best approach for the intended goal (which can be paraphrased as &quot;determine whether a transformation will return a rectilinear quad in order to enable optimizations&quot;). Instead of checking the transformation itself, they suggested a new method FloatQuad::isRectilinear() to check the output of that transformation, which is a more generic approach and can be used in a couple more cases (e.g. also applies to rectangles turned by 90/270 degrees, and a few less common cases).

Here&apos;s the implementation; I tested with rectangles that are flipped and turned by 90, 180 and 5 degrees, the latter will return false for isRectilinear() while all of the others return true. Please review, hopefully this time it&apos;s the way to go :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167324</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-11-30 12:21:15 -0800</bug_when>
    <thetext>Attachment 42062 passed the style-queue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171525</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-12-14 13:08:11 -0800</bug_when>
    <thetext>ping, Simon, Chris?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171543</commentid>
    <comment_count>11</comment_count>
      <attachid>42062</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-14 13:27:19 -0800</bug_when>
    <thetext>Comment on attachment 42062
Add FloatQuad::isRectilinear() to check whether it can be represented as FloatRect.

Clearing flags on attachment: 42062

Committed r52115: &lt;http://trac.webkit.org/changeset/52115&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171544</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-14 13:27:24 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41290</attachid>
            <date>2009-10-16 09:41:26 -0700</date>
            <delta_ts>2009-10-16 14:28:22 -0700</delta_ts>
            <desc>Add helper methods to determine whether a transformation matrix is only scaled or translated.</desc>
            <filename>TransformationMatrix-scaled-translated-helpers.diff</filename>
            <type>text/plain</type>
            <size>2107</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTRkNTZkYS4uYmZhZWIzOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0xMC0xNiAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEFkZCBoZWxwZXIgbWV0aG9kcyB0byBkZXRlcm1pbmUgd2hldGhl
ciBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICAgICAgICBpcyBvbmx5IHNjYWxlZCBvciB0cmFu
c2xhdGVkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzA0NDIKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3Jt
YXRpb25NYXRyaXguaDoKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4Ojpp
c1NjYWxlT25seSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6aXNU
cmFuc2xhdGlvbk9ubHkpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6
OmlzU2NhbGVBbmRUcmFuc2xhdGlvbk9ubHkpOgorCiAyMDA5LTEwLTE2ICBUb3IgQXJuZSBWZXN0
YsO4ICA8dG9yLmFybmUudmVzdGJvQG5va2lhLmNvbT4KIAogICAgICAgICBQdWxsIG91dCByNDk2
NzYgYXMgaXQgY2F1c2VkIGJ1aWxkIGJyZWFrZ2VzIG9uIFN5bWJpYW4KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybWF0aW9uTWF0
cml4LmgKaW5kZXggODM3MTlkMi4uOTRjNTgwMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybWF0aW9uTWF0cml4LmgKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybWF0aW9uTWF0cml4LmgKQEAg
LTI1Nyw2ICsyNTcsMjggQEAgcHVibGljOgogICAgIC8vIFRocm93IGF3YXkgdGhlIG5vbi1hZmZp
bmUgcGFydHMgb2YgdGhlIG1hdHJpeCAobG9zc3khKQogICAgIHZvaWQgbWFrZUFmZmluZSgpOwog
CisgICAgYm9vbCBpc1NjYWxlT25seSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKG0x
MigpID09IDAgJiYgbTEzKCkgPT0gMCAmJiBtMTQoKSA9PSAwICYmCisgICAgICAgICAgICAgICAg
bTIxKCkgPT0gMCAmJiBtMjMoKSA9PSAwICYmIG0yNCgpID09IDAgJiYKKyAgICAgICAgICAgICAg
ICBtMzEoKSA9PSAwICYmIG0zMigpID09IDAgJiYgbTM0KCkgPT0gMCAmJgorICAgICAgICAgICAg
ICAgIG00MSgpID09IDAgJiYgbTQyKCkgPT0gMCAmJiBtNDMoKSA9PSAwKTsKKyAgICB9CisKKyAg
ICBib29sIGlzVHJhbnNsYXRpb25Pbmx5KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAo
bTExKCkgPT0gMSAmJiBtMTIoKSA9PSAwICYmIG0xMygpID09IDAgJiYgbTE0KCkgPT0gMCAmJgor
ICAgICAgICAgICAgICAgIG0yMSgpID09IDAgJiYgbTIyKCkgPT0gMSAmJiBtMjMoKSA9PSAwICYm
IG0yNCgpID09IDAgJiYKKyAgICAgICAgICAgICAgICBtMzEoKSA9PSAwICYmIG0zMigpID09IDAg
JiYgbTMzKCkgPT0gMSAmJiBtMzQoKSA9PSAwKTsKKyAgICB9CisKKyAgICBib29sIGlzU2NhbGVB
bmRUcmFuc2xhdGlvbk9ubHkoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtMTIoKSA9
PSAwICYmIG0xMygpID09IDAgJiYgbTE0KCkgPT0gMCAmJgorICAgICAgICAgICAgICAgIG0yMSgp
ID09IDAgJiYgbTIzKCkgPT0gMCAmJiBtMjQoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbTMx
KCkgPT0gMCAmJiBtMzIoKSA9PSAwICYmIG0zNCgpID09IDApOworICAgIH0KKwogICAgIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbTIpIGNvbnN0CiAgICAgewog
ICAgICAgICByZXR1cm4gKG1fbWF0cml4WzBdWzBdID09IG0yLm1fbWF0cml4WzBdWzBdICYmCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41327</attachid>
            <date>2009-10-16 14:28:22 -0700</date>
            <delta_ts>2009-10-18 10:46:58 -0700</delta_ts>
            <desc>Add a mapsRectToRect() helper method to TransformationMatrix.</desc>
            <filename>0001-Add-a-mapsRectToRect-helper-method-to-Transformation.patch</filename>
            <type>text/plain</type>
            <size>2496</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">RnJvbSBjYWJiMDQ3NjM0NWM3NjBjNGM1MGI0NTk2ZjBlMjBmZmFkMzE1MGM2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWtvYiBQZXRzb3ZpdHMgPGpwZXRzb3ZpdHNAcmltLmNvbT4K
RGF0ZTogRnJpLCAxNiBPY3QgMjAwOSAxNzoyMjoxMCAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdIEFk
ZCBhIG1hcHNSZWN0VG9SZWN0KCkgaGVscGVyIG1ldGhvZCB0byBUcmFuc2Zvcm1hdGlvbk1hdHJp
eC4KIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDQ0MgoKUGF0Y2gg
YnkgSmFrb2IgUGV0c292aXRzIDxqcGV0c292aXRzQHJpbS5jb20+IG9uIDIwMDktMTAtMTYKUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIDJE
IHJlY3RhbmdsZSAoSW50UmVjdApvciBGbG9hdFJlY3QpIHdpbGwgc3RpbGwgYmUgYSByZWN0YW5n
bGUgYWZ0ZXIgdGhlCnRyYW5zZm9ybWF0aW9uLCBpLmUuIGl0IHdvbid0IGJlIHJvdGF0ZWQgb3Ig
c2tld2VkLgoKKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9ybWF0aW9uTWF0
cml4Lmg6CihXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6bWFwc1JlY3RUb1JlY3QpOgot
LS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg
ICAxNCArKysrKysrKysrKysrKwogLi4uL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtYXRp
b25NYXRyaXguaCAgICAgfCAgICA4ICsrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDIyIGluc2Vy
dGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cg
Yi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA1NGQ1NmRhLi5iZjA4M2FkIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBA
CisyMDA5LTEwLTE2ICBKYWtvYiBQZXRzb3ZpdHMgIDxqcGV0c292aXRzQHJpbS5jb20+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIGEgbWFwc1Jl
Y3RUb1JlY3QoKSBoZWxwZXIgbWV0aG9kIHRvIFRyYW5zZm9ybWF0aW9uTWF0cml4LgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NDIKKworICAgICAg
ICBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIDJEIHJlY3RhbmdsZSAoSW50UmVjdAorICAg
ICAgICBvciBGbG9hdFJlY3QpIHdpbGwgc3RpbGwgYmUgYSByZWN0YW5nbGUgYWZ0ZXIgdGhlCisg
ICAgICAgIHRyYW5zZm9ybWF0aW9uLCBpLmUuIGl0IHdvbid0IGJlIHJvdGF0ZWQgb3Igc2tld2Vk
LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6Om1hcHNS
ZWN0VG9SZWN0KToKKwogMjAwOS0xMC0xNiAgVG9yIEFybmUgVmVzdGLDuCAgPHRvci5hcm5lLnZl
c3Rib0Bub2tpYS5jb20+CiAKICAgICAgICAgUHVsbCBvdXQgcjQ5Njc2IGFzIGl0IGNhdXNlZCBi
dWlsZCBicmVha2dlcyBvbiBTeW1iaWFuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtYXRpb25NYXRyaXguaCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oCmluZGV4IDgzNzE5
ZDIuLjZiY2RiYmQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNm
b3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oCkBAIC0yNTcsNiArMjU3LDE0IEBA
IHB1YmxpYzoKICAgICAvLyBUaHJvdyBhd2F5IHRoZSBub24tYWZmaW5lIHBhcnRzIG9mIHRoZSBt
YXRyaXggKGxvc3N5ISkKICAgICB2b2lkIG1ha2VBZmZpbmUoKTsKIAorICAgIC8vIENoZWNrIGlm
IGEgMkQgcmVjdGFuZ2xlIChJbnRSZWN0IG9yIEZsb2F0UmVjdCkgd2lsbCBzdGlsbCBiZSBhIHJl
Y3RhbmdsZQorICAgIC8vIGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiwgaS5lLiBpdCB3b24ndCBi
ZSByb3RhdGVkIG9yIHNrZXdlZC4KKyAgICBib29sIG1hcHNSZWN0VG9SZWN0KCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiAobV9tYXRyaXhbMF1bMV0gPT0gMCAmJiBtX21hdHJpeFswXVsz
XSA9PSAwICYmCisgICAgICAgICAgICAgICAgbV9tYXRyaXhbMV1bMF0gPT0gMCAmJiBtX21hdHJp
eFsxXVszXSA9PSAwKTsKKyAgICB9CisKICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIG0yKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIChtX21hdHJp
eFswXVswXSA9PSBtMi5tX21hdHJpeFswXVswXSAmJgotLSAKMS42LjMuMwoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41383</attachid>
            <date>2009-10-18 10:46:58 -0700</date>
            <delta_ts>2009-10-28 15:37:35 -0700</delta_ts>
            <desc>Add a mapsRectToRect() helper method to TransformationMatrix (try 2)</desc>
            <filename>0001-Add-a-mapsRectToRect-helper-method-to-Transformation.patch</filename>
            <type>text/plain</type>
            <size>2523</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">RnJvbSBjYWJiMDQ3NjM0NWM3NjBjNGM1MGI0NTk2ZjBlMjBmZmFkMzE1MGM2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWtvYiBQZXRzb3ZpdHMgPGpwZXRzb3ZpdHNAcmltLmNvbT4K
RGF0ZTogRnJpLCAxNiBPY3QgMjAwOSAxNzoyMjoxMCAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdIEFk
ZCBhIG1hcHNSZWN0VG9SZWN0KCkgaGVscGVyIG1ldGhvZCB0byBUcmFuc2Zvcm1hdGlvbk1hdHJp
eC4KIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDQ0MgoKUGF0Y2gg
YnkgSmFrb2IgUGV0c292aXRzIDxqcGV0c292aXRzQHJpbS5jb20+IG9uIDIwMDktMTAtMTYKUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIDJE
IHJlY3RhbmdsZSAoSW50UmVjdApvciBGbG9hdFJlY3QpIHdpbGwgc3RpbGwgYmUgYW4gdXByaWdo
dCByZWN0YW5nbGUgYWZ0ZXIKdGhlIHRyYW5zZm9ybWF0aW9uLCBpLmUuIGl0IHdvbid0IGJlIHJv
dGF0ZWQgb3Igc2tld2VkLgoKKiBwbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL1RyYW5zZm9y
bWF0aW9uTWF0cml4Lmg6CihXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6bWFwc1JlY3RU
b1JlY3QpOgotLS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAxNCArKysrKysrKysrKysrKwogLi4uL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJh
bnNmb3JtYXRpb25NYXRyaXguaCAgICAgfCAgICA4ICsrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQs
IDIyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA1NGQ1NmRhLi5iZjA4M2FkIDEwMDY0
NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwz
ICsxLDE3IEBACisyMDA5LTEwLTE2ICBKYWtvYiBQZXRzb3ZpdHMgIDxqcGV0c292aXRzQHJpbS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRk
IGEgbWFwc1JlY3RUb1JlY3QoKSBoZWxwZXIgbWV0aG9kIHRvIFRyYW5zZm9ybWF0aW9uTWF0cml4
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NDIK
KworICAgICAgICBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIDJEIHJlY3RhbmdsZSAoSW50
UmVjdAorICAgICAgICBvciBGbG9hdFJlY3QpIHdpbGwgc3RpbGwgYmUgYW4gdXByaWdodCByZWN0
YW5nbGUgYWZ0ZXIKKyAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9uLCBpLmUuIGl0IHdvbid0IGJl
IHJvdGF0ZWQgb3Igc2tld2VkLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNm
b3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3Jt
YXRpb25NYXRyaXg6Om1hcHNSZWN0VG9SZWN0KToKKwogMjAwOS0xMC0xNiAgVG9yIEFybmUgVmVz
dGLDuCAgPHRvci5hcm5lLnZlc3Rib0Bub2tpYS5jb20+CiAKICAgICAgICAgUHVsbCBvdXQgcjQ5
Njc2IGFzIGl0IGNhdXNlZCBidWlsZCBicmVha2dlcyBvbiBTeW1iaWFuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RyYW5zZm9ybXMvVHJhbnNmb3JtYXRpb25NYXRyaXgu
aCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1h
dHJpeC5oCmluZGV4IDgzNzE5ZDIuLjZiY2RiYmQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9UcmFuc2Zvcm1hdGlvbk1hdHJpeC5oCkBA
IC0yNTcsNiArMjU3LDE0IEBAIHB1YmxpYzoKICAgICAvLyBUaHJvdyBhd2F5IHRoZSBub24tYWZm
aW5lIHBhcnRzIG9mIHRoZSBtYXRyaXggKGxvc3N5ISkKICAgICB2b2lkIG1ha2VBZmZpbmUoKTsK
IAorICAgIC8vIENoZWNrIGlmIGEgMkQgcmVjdGFuZ2xlIChJbnRSZWN0IG9yIEZsb2F0UmVjdCkg
d2lsbCBzdGlsbCBiZSBhbiB1cHJpZ2h0CisgICAgLy8gcmVjdGFuZ2xlIGFmdGVyIHRoZSB0cmFu
c2Zvcm1hdGlvbiwgaS5lLiBpdCB3b24ndCBiZSByb3RhdGVkIG9yIHNrZXdlZC4KKyAgICBib29s
IG1hcHNSZWN0VG9SZWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAobV9tYXRyaXhb
MF1bMV0gPT0gMCAmJiBtX21hdHJpeFswXVszXSA9PSAwICYmCisgICAgICAgICAgICAgICAgbV9t
YXRyaXhbMV1bMF0gPT0gMCAmJiBtX21hdHJpeFsxXVszXSA9PSAwKTsKKyAgICB9CisKICAgICBi
b29sIG9wZXJhdG9yPT0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG0yKSBjb25zdAogICAg
IHsKICAgICAgICAgcmV0dXJuIChtX21hdHJpeFswXVswXSA9PSBtMi5tX21hdHJpeFswXVswXSAm
JgotLSAKMS42LjMuMwoK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42062</attachid>
            <date>2009-10-28 15:37:35 -0700</date>
            <delta_ts>2009-12-14 13:27:18 -0800</delta_ts>
            <desc>Add FloatQuad::isRectilinear() to check whether it can be represented as FloatRect.</desc>
            <filename>floatquad-isrectilinear.diff</filename>
            <type>text/plain</type>
            <size>2312</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YjIzZTQxYi4uNDgxZDY1ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNyBAQAorMjAwOS0xMC0yOCAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEFkZCBGbG9hdFF1YWQ6OmlzUmVjdGlsaW5lYXIoKSB0byBjaGVj
ayB3aGV0aGVyIGl0IGNhbiBiZSByZXByZXNlbnRlZCBhcyBGbG9hdFJlY3QuCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDQ0MgorCisgICAgICAgIFRo
aXMgZW5hYmxlcyBvcHRpbWl6YXRpb25zIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCisgICAg
ICAgIGFyYml0cmFyeSBGbG9hdFF1YWRzIGFuZCByZWN0aWxpbmVhciBvbmVzLgorCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvRmxvYXRRdWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZs
b2F0UXVhZDo6aXNSZWN0aWxpbmVhcik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRmxv
YXRRdWFkLmg6CisKIDIwMDktMTAtMjggIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5j
b20+CiAKICAgICAgICAgVW5yZXZpZXdlZCAtIGEgdHJpdmlhbCBmaXggdG8gZ2V0IFdpbmRvd3Mg
Ym90cyBydW5uaW5nLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9GbG9h
dFF1YWQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9GbG9hdFF1YWQuY3BwCmluZGV4
IDQyNzIzMGQuLmQxMDY5ZmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
RmxvYXRRdWFkLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zsb2F0UXVhZC5j
cHAKQEAgLTg1LDYgKzg1LDEyIEBAIEZsb2F0UmVjdCBGbG9hdFF1YWQ6OmJvdW5kaW5nQm94KCkg
Y29uc3QKICAgICByZXR1cm4gRmxvYXRSZWN0KGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0
b20gLSB0b3ApOwogfQogCitib29sIEZsb2F0UXVhZDo6aXNSZWN0aWxpbmVhcigpIGNvbnN0Cit7
CisgICAgcmV0dXJuIChtX3AxLngoKSA9PSBtX3AyLngoKSAmJiBtX3AyLnkoKSA9PSBtX3AzLnko
KSAmJiBtX3AzLngoKSA9PSBtX3A0LngoKSAmJiBtX3A0LnkoKSA9PSBtX3AxLnkoKSkKKyAgICAg
ICAgfHwgKG1fcDEueSgpID09IG1fcDIueSgpICYmIG1fcDIueCgpID09IG1fcDMueCgpICYmIG1f
cDMueSgpID09IG1fcDQueSgpICYmIG1fcDQueCgpID09IG1fcDEueCgpKTsKK30KKwogYm9vbCBG
bG9hdFF1YWQ6OmNvbnRhaW5zUG9pbnQoY29uc3QgRmxvYXRQb2ludCYgcCkgY29uc3QKIHsKICAg
ICByZXR1cm4gaXNQb2ludEluVHJpYW5nbGUocCwgbV9wMSwgbV9wMiwgbV9wMykgfHwgaXNQb2lu
dEluVHJpYW5nbGUocCwgbV9wMSwgbV9wMywgbV9wNCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0Zsb2F0UXVhZC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
bG9hdFF1YWQuaAppbmRleCA1OTgyOTY3Li42Y2Q4NmY2IDEwMDY0NAotLS0gYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0Zsb2F0UXVhZC5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvRmxvYXRRdWFkLmgKQEAgLTc0LDYgKzc0LDEyIEBAIHB1YmxpYzoKICAgICAvLyAic2xhbnRl
ZCIgZW1wdHkgcXVhZHMuCiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gYm91bmRp
bmdCb3goKS5pc0VtcHR5KCk7IH0KIAorICAgIC8vIFRlc3RzIHdoZXRoZXIgdGhpcyBxdWFkIGNh
biBiZSBsb3NzbGVzc2x5IHJlcHJlc2VudGVkIGJ5IGEgRmxvYXRSZWN0LAorICAgIC8vIHRoYXQg
aXMsIGlmIHR3byBlZGdlcyBhcmUgcGFyYWxsZWwgdG8gdGhlIHgtYXhpcyBhbmQgdGhlIG90aGVy
IHR3bworICAgIC8vIGFyZSBwYXJhbGxlbCB0byB0aGUgeS1heGlzLiBJZiB0aGlzIG1ldGhvZCBy
ZXR1cm5zIHRydWUsIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgRmxvYXRSZWN0IGNhbiBiZSBy
ZXRyaWV2ZWQgd2l0aCBib3VuZGluZ0JveCgpLgorICAgIGJvb2wgaXNSZWN0aWxpbmVhcigpIGNv
bnN0OworCiAgICAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlLCBv
ciBvbiBhbiBlZGdlIG9yIGNvcm5lciBvZiB0aGlzIHF1YWQuCiAgICAgYm9vbCBjb250YWluc1Bv
aW50KGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdDsKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>