<br><br><div class="gmail_quote">On Tue, Feb 2, 2010 at 12:37 AM, Adrian Page <span dir="ltr">&lt;<a href="mailto:adrian@pagenet.plus.com" target="_blank">adrian@pagenet.plus.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div style="word-wrap: break-word;"><br><div><div><div>On 1 Feb 2010, at 11:08AM, Dmitry Kazakov wrote:</div><blockquote type="cite"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div style="word-wrap: break-word;"><div>It gives the desired result - the smallest integer rectangle containing the QRectF. That&#39;s what we&#39;re after.</div></div></blockquote><div><br>No, it doesn&#39;t. Because truncating and adding 0.5 is not stable over scaling. Just right over the thing we do in KisImage.<br>


<br>Example:<br><br>QPointF convertToQPointF(QPoint pt) {<br>    return QPointF((pt.x()+0.5)*2, (pt.y()+0.5)*2);<br>}<br><br>QRectF convertToQRectF(QRect rc) {<br>    return QRectF(convertToQPointF(rc.topLeft()), convertToQPointF(rc.bottomRight()));<br>


}<br><br>void main()<br>{<br>    QRect rect(0,0,6,4);<br>    qDebug()&lt;&lt;&quot;intRect:&quot;&lt;&lt;rect&lt;&lt;rect.topLeft()&lt;&lt;rect.bottomRight();<br><br>    QRectF floatRect(convertToQRectF(rect));<br>    qDebug()&lt;&lt;&quot;floatRect:&quot;&lt;&lt;floatRect&lt;&lt;floatRect.topLeft()&lt;&lt;floatRect.bottomRight();<br>


<br>    QRect alignedRect(floatRect.toAlignedRect());<br>    qDebug()&lt;&lt;&quot;alignedRect:&quot;&lt;&lt;alignedRect&lt;&lt;alignedRect.topLeft()&lt;&lt;alignedRect.bottomRight();<br>}<br><br>The result will be the following:<br>


intRect: QRect(0,0 6x4) QPoint(0,0) QPoint(5,3)<br>floatRect: QRectF(1,1 10x6) QPointF(1, 1)QPointF(11, 7)<br>alignedRect: QRect(1,1 10x6) QPoint(1,1) QPoint(10,6)<br><br><br>That is surely NOT what we desired. (btw, this example is almost a piece code from KisImage<br>

</div></div></blockquote><div><br></div></div><div>Well, you&#39;ve written your own convertToQRectF() and written it wrong ;-). I just checked krita and there is no QRect to QRectF conversion function, and the reason is none is required - it&#39;s simply QRectF(QRect).</div>

</div></div></blockquote><div><br>QPointF KisImage::pixelToDocument(const QPoint &amp;pixelCoord) const<br>{<br>    return QPointF((pixelCoord.x() + 0.5) / xRes(), (pixelCoord.y() + 0.5) / yRes());<br>}<br> <br>Now i doubt it is called from somewhere. But it is present there. Maybe just remove it then? QPoint-&gt;QPointF will be translated automatically.<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div style="word-wrap: break-word;"><div><div> You&#39;re mixing up concepts in your function as converting the opposite corner points as points, then putting those into a QRectF gives a different kind of conversion. You&#39;re effectively scaling the QRectF(0.5, 0.5, 5, 3) by 2, and getting the result QRectF(1, 1, 10, 6) - which is right. And QRect(1, 1, 10, 6)  is the correct conversion back to QRect.</div>

<div><br></div><div>Converting rectangles is different to converting points. The QRectF(0.0, 0.0, 6.0, 4.0) is the correct conversion of the QRect(0, 0, 6, 4). It is the rectangle equal to the border of the 6x4 rectangle. And if you scale it by 2, you get QRectF(0, 0, 12, 8) - the border of the double sized QRect(0, 0, 6, 4).</div>
</div></div></blockquote><div><br>Why do you add 0.5 then? =)<br><br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div style="word-wrap: break-word;">
<div><div><div></div></div>Well, you&#39;ve helped convince me that QRectF(QRect) is correct, and toAlignedRect() is correct, so I don&#39;t see a huge problem. </div></div></blockquote><div><br>Great! But still why 0.5? %) <br>
</div></div><br><br><br clear="all"><br>-- <br>Dmitry Kazakov<br>