<div dir="ltr">The pointer comes from external object and it's lifetime is managed by it. I need to ensure that I will not use it anymore after leaving certain function. Hence it don't even need to be thread operation, So using clean function won't help here.<div><br></div><div>The problem here is that you can't say if transformed returns shallow or deep copy. Result depends on argument value. Of course the transform returning shallow copy on identity matrix is nice but should be documented somewhere. After reading docs I expected deep copy like from copy function. But maybe it's only me :)</div><div><br></div><div>Thanks for profound explanation.<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-11 12:10 GMT+01:00 Simon Hausmann <span dir="ltr"><<a href="mailto:Simon.Hausmann@qt.io" target="_blank">Simon.Hausmann@qt.io</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div>

<div style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif">
<p>Hi,</p>
<p><br>
</p>
<p>Thank you for the explanation of your use-case. What remains unclear to me is why it is necessary for you to ensure a deep copy?</p>
<p><br>
</p>
<p>Is it related to the fact that your image is created from a raw data pointer and after your worker thread is done, you cannot guarantee</p>
<p>for the life-time of the raw data anymore?</p>
<p><br>
</p>
<p>Perhaps you could use the QImage constructor that takes a cleanup function (and cleanupInfo pointer). If your worker thread</p>
<p>ends up making a copy of the image data as a result of your transformation, then your original copy can and will be deleted</p>
<p>when you discard the source of the transform() call. That is something that you can keep track of. Vice-versa if it's not being called,</p>
<p>then you know that transformed() (or generally speaking _any_ sequence of operations you may have done) still operate on a shallow</p>
<p>copy. Then you can do an explicit deep copy.</p>
<p><br>
</p>
<p>Generally speaking my impression - assuming I did understand your use-case correctly - is that your problem stems from the unknown</p>
<p>life-cycle of your data. I don't think the behavior of QImage::transformed() should be made worse for the common case where shallow</p>
<p>copying benefits performance and memory consumption.</p>
<p></p>
<p><br>
</p>
<p>Simon</p>
</div>
<hr style="display:inline-block;width:98%">
<div dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><span class=""><b>From:</b> Development <development-bounces+simon.hausmann=<a href="mailto:qt.io@qt-project.org" target="_blank">qt.io@qt-project.org</a>> on behalf of Tomasz Olszak <<a href="mailto:olszak.tomasz@gmail.com" target="_blank">olszak.tomasz@gmail.com</a>><br>
</span><b>Sent:</b> Monday, July 11, 2016 12:53:51 PM<br>
<b>To:</b> <a href="mailto:development@qt-project.org" target="_blank">development@qt-project.org</a><br>
<b>Subject:</b> Re: [Development] QImage::transformed returns shallow copy for QTransform::TxNone matrix type.</font>
<div> </div>
</div><div><div class="h5">
<div>
<div dir="ltr"><span style="font-size:12.8px">QImage::copy returns deep copy and has similar documentation so I assumed that when docs say copy it means deep copy.</span>
<div style="font-size:12.8px"><br>
</div>
<div style="font-size:12.8px">Let's consider common case:</div>
<div style="font-size:12.8px"><br>
</div>
<div style="font-size:12.8px">1. QImage img created from raw data pointer got from e.g. driver.</div>
<div style="font-size:12.8px">2. img used in thread to perform some transforms</div>
<div style="font-size:12.8px">3. Save result as deep copy</div>
<div style="font-size:12.8px"><br>
</div>
<div style="font-size:12.8px">Ensuring step 3 is most efficient and does not perform unnecessary copying I need to write something like:</div>
<div style="font-size:12.8px"><br>
</div>
<span style="font-size:12.8px">QTransform t;</span><br style="font-size:12.8px">
<span style="font-size:12.8px">if (m.type() == QTransform::TxNone)</span><br style="font-size:12.8px">
<span style="font-size:12.8px">    return img.copy();</span><br style="font-size:12.8px">
<span style="font-size:12.8px">else</span><br style="font-size:12.8px">
<span style="font-size:12.8px">    return img.transformed(m);</span><br style="font-size:12.8px">
<br style="font-size:12.8px">
<span style="font-size:12.8px">AFAIU img.transformed(m).copy() will copy twice when  m.type() != QTransform::TxNone right?</span>
<div style="font-size:12.8px"><br>
</div>
<div style="font-size:12.8px">Don't you think that is seems strange and is not documented enough?</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">2016-07-11 10:59 GMT+01:00 Simon Hausmann <span dir="ltr">
<<a href="mailto:Simon.Hausmann@qt.io" target="_blank">Simon.Hausmann@qt.io</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>
<div style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif">
<p>Hi,</p>
<p><br>
</p>
<p>Could you elaborate on what you see as the discrepancy between docs and implementation? The docs don't say whether</p>
<p>it's a shallow or a deep copy, so it looks to me that the implementation is within the bounds of the docs.</p>
<p><br>
</p>
<p>Plus it seems sensible to return a shallow copy, doesn't it?</p>
<p><br>
</p>
<p><br>
</p>
<p>Simon</p>
</div>
<hr style="display:inline-block;width:98%">
<div dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Development <development-bounces+simon.hausmann=<a href="mailto:qt.io@qt-project.org" target="_blank">qt.io@qt-project.org</a>> on behalf of Tomasz Olszak <<a href="mailto:olszak.tomasz@gmail.com" target="_blank">olszak.tomasz@gmail.com</a>><br>
<b>Sent:</b> Monday, July 11, 2016 11:38:06 AM<br>
<b>To:</b> <a href="mailto:development@qt-project.org" target="_blank">development@qt-project.org</a><br>
<b>Subject:</b> [Development] QImage::transformed returns shallow copy for QTransform::TxNone matrix type.</font>
<div> </div>
</div>
<div>
<div>
<div>
<div dir="ltr">Hello,
<div><br>
</div>
QImage:: transformed(const QTransform &matrix, Qt::TransformationMode mode = Qt::FastTransformation) docs:
<div><br>
"Returns a copy of the image that is transformed using the given transformation matrix and transformation mode."<br>
<br>
But if matrix.type() == QTransform::TxNone then shallow instead of deep copy is returned.<br>
<div><br>
</div>
<div>I'm happy to submit a fix but I don't know what is expected behaviour? Should implementation follow docs or docs or docs follow implementation here?</div>
<div><br>
</div>
<div>T.</div>
<div><br>
</div>
<div><br>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div></div></div>

</blockquote></div><br></div>