<HTML><BODY>Hi, Behdad<br>Sorry but your message is a bit vague for me in several places. <br>You wrote, for instance:<br>During stroke() / show_text/glyphs/...(), cairo_save(), set transformation<br> matrix to identity.<br>Q1: What a value should we take as "identity"? The initial? Could you be so kind to give an example (at least in a general manner that you used in the previous messages)?<br>Q2: Well. Suppose, I have changed the matrix to identity. But I'd like to paint a bigger (scale(2)) picture and, consequently, a bigger text on it. Will it happen if I reset a matrix before stroke() / show_text?<br>Q3: And if you are sure that the answer to Q2 is "yes, of cource". Why dont' a cairo team realize the "manual thechnique" of locking the line width / font size (which you have described below) but automatically not manually?<br><br><br>Regards,<br>Sergey<br><br>Вторник, 14 января 2014, 16:40 +08:00 от Behdad Esfahbod <behdad@behdad.org>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        <div id="">
        



    






        

        
        
        
        
        

        

        
        



<div class="js-helper js-readmsg-msg">
        <style type="text/css"></style>
         
        <div id="style_13896889360000000216" class="mr_read__body">
                <base target="_self" href="https://e.mail.ru/">
                
                        <div id="style_13896889360000000216_BODY"><br>
<br>
On 14-01-02 02:51 AM, Herb Sutter wrote:<br>
> Thanks Behdad,<br>
> <br>
>> During cairo's development, there were some decisions made that we<br>
>> regretted later on.  I was going to suggest that those be revisited for<br>
>> standardization, but reading the documents you linked, I think that will go<br>
>> down the same design-by-committee path that you are trying to avoid.<br>
> <br>
> It sounds like those would be good to know about regardless, if you could share.<br>
> <br>
> Actually we mainly want to avoid that for the initial proposal, but if there are known 'errata' that would be good to know about. Possibly they could be addressed in the C++ wrapping, if they can be addressed without changing Cairo. Alternatively, perhaps this would be a good point to consider addressing some of them in Cairo as well if you think that's proper, given that if this standardization process bears fruit the audience of the Cairo API will expand to a lot of new users. In any event I think it would be good to know about them.<br>
<br>
Bill already mentioned most of what I had in mind.  To reiterate:  Currently<br>
when one sets line width and font size, those are recorded in user-space, and<br>
as such following transformation matrix changes will change the final line<br>
width / font size.  This is unintuitive and troublesome.  Example:<br>
<br>
  set_line_width (10)<br>
  scale (2)<br>
  move_to / line_to / ...<br>
  stroke ()<br>
<br>
The stroke will now have width 20, not 10.<br>
<br>
To fix this, we want to lock the line width / font size in device space at the<br>
time they are set.  To fix these in the wrapper is not impossible:<br>
<br>
  - During set_line_width / set_font_size, multiply them by the current<br>
transformation matrix and set to *that*,<br>
<br>
  - During stroke() / show_text/glyphs/...(), cairo_save(), set transformation<br>
matrix to identity, stroke/show_text/..., and cairo_restore(),<br>
<br>
There are a few problems with this:<br>
<br>
  - For font_size: show_text/glyphs/... take glyph coordinates, so we need to<br>
multiply those by the current transformation matrix before resetting the<br>
matrix.  Alternatively, we can transform the font matrix by inverse of current<br>
transformation matrix and set that before the operation.<br>
<br>
  - For line_width there are more problems:<br>
<br>
    * Currently the set/get_line_width operate on a single number.  Whereas<br>
the stroke shape after a transformation matrix becomes an ellipse, so we<br>
cannot express that with a single number.  We can try saving the<br>
transformation matrix at the time of set_line_width, and before calling<br>
stroke(), set that matrix.  But tracking this with cairo_save()/restore()<br>
becomes tricky.  Also, this has implications on dashed lines.  I think the<br>
dash pattern also suffers from the same shortcomings.<br>
<br>
To summarize: there's a reason we have not fixed these in cairo itself: they<br>
are tricky to resolve now.  Perhaps others have ideas?  Perhaps we can add<br>
ugly-named new functions with the more useful semantics?<br>
<br>
behdad<br>
-- <br>
cairo mailing list<br>
<a href="sentmsg?compose&To=cairo@cairographics.org">cairo@cairographics.org</a><br>
<a href="http://lists.cairographics.org/mailman/listinfo/cairo" target="_blank">http://lists.cairographics.org/mailman/listinfo/cairo</a><br>
</div>
                        
                
                <base target="_self" href="https://e.mail.ru/">
        </div>

        
</div>


</div>
</blockquote>
<br>
<br>С уважением,<br>СК<br></BODY></HTML>