Implementing HiDpi scaling

fedang list at fedang.net
Mon Jul 8 11:23:15 UTC 2024


Hello Emmanuele,
Sorry to revive an old thread.

I implemented scaling the way you told me (I think). Rendering with 
cairo works nicely with the device scale.
I have an issue with text tough.

Pangocairo seems to be outputting a cloudy/garbled and not quite sharp 
text after I used cairo_surface_set_device_scale. Even with antialiasing 
it did not go away.

I tried both with and without pango_cairo_context_set_resolution (after 
cairo_surface_set_device_scale).

Is there a way to keep the text sharp or is it a limitation of the 
surface scaling? Any other possible solution?

Thanks,
Federico

On 3/20/24 13:03, Emmanuele Bassi wrote:
> The way "high DPI" support is implemented is typically this:
>
> - You retrieve the scaling factor from the windowing system; in the 
> case of X11 you can deduce the scaling factor from the ratio between 
> the width and the height of the target monitor: anything below 192 is 
> generally considered "1" and anything above is generally considered 
> "2". If you want to go into fractional scaling territory, you'll 
> likely need some other mechanism, like a user configuration setting.
> - Once you have a scaling factor, you create a windowing system 
> surface that has two units:
>   1. device pixels, which are the physical pixels on the monitor
>   2. logical pixels, which are the scaled pixels for drawing operations
>
> Your surfaces have to be created with the size in device pixels; then 
> you call cairo_surface_set_device_scale() with the scaling factor you 
> computed:
>
> https://www.cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-set-device-scale
>
> After that, every drawing operation must be in **logical** pixels, and 
> the Cairo will automatically scale every coordinate and size 
> appropriately.
>
> It is your responsibility to deal with device and logical coordinates; 
> for instance, windowing system events will be in device coordinates, 
> but if you're exposing their information to other code you will need 
> to scale them appropriately.
>
> Ciao,
>  Emmanuele.
>
> On Wed, 20 Mar 2024 at 11:47, Federico Angelilli <list at fedang.net> wrote:
>
>     Hello,
>     Sorry for the late reply.
>
>     I am using cairo for drawing and pango for the text. I am creating
>     a window with xcb and using cairo_xcb_surface.
>
>     I can easily extract the dpi information from the xrandr api
>     calls. Now that I have this ratio, I have to use it somewhere to
>     scale my canvas appropriately.
>
>     I will try using cairo_scale, and should I also scale the size of
>     the xcb_surface by the same ratio?
>
>     Anyway my main concern about antialising is that since I am making
>     layered shapes (think buttons) the border and the background will
>     not match up pixel perfect (which is something that I have seen in
>     other project using cairo).
>
>     Does what I described about scaling the surface makes sense or am
>     I misinterpreting cairo_scale?
>
>     Regards
>
>     Ps:
>     I will soon try and post the results
>
>
>     On March 18, 2024 1:46:54 PM GMT+01:00, Dov Grobgeld
>     <dov.grobgeld at gmail.com> wrote:
>
>         I think that you should describe in detail what you expect.
>
>         In pure vector graphics a contour may cut through a pixel and
>         partially obscure it, and it is then the responsibility of the
>         graphics engine to create anti-aliased graphics by mixing the
>         colors of the background and the foreground. As a user you
>         typically don't need to concern yourself with that as it is
>         done automatically.
>
>         However, e.g. for text this may cause "fuzzy" characters and
>         the engine will then fallback to moving the contours and scale
>         the font so that the glyphs fall on whole pixels.
>
>         Note that the use of anti-aliased graphics is less needed, and
>         less visible, for an HDPI device.
>
>         In any case all that you will typically need is cairo_scale()
>         as Uli Shlachter already described.
>
>         Try it!
>
>         Regards,
>
>
>         On Sun, Mar 17, 2024 at 12:46 PM Federico Angelilli
>         <list at fedang.net> wrote:
>
>             Hi
>
>             Will cairo_scale make a pixel perfect image for non
>             integer scales? To my understanding the scale matrix will
>             be multiplied to all the coordinates scaling the
>             coordinates appropriately. Should I also scale the whole
>             surface by that same factor?
>
>             Regards
>
>
>             On March 16, 2024 6:27:56 PM GMT+01:00, Uli Schlachter
>             <psychon at znc.in> wrote:
>
>                 Hi Am 14.03.24 um 16:34 schrieb fedang:
>
>                     Hello all, I am writing a small X11 app using
>                     cairo as the drawing backend. I was wondering if
>                     and how to implement fractional scaling to
>                     accommodate high dpi screens. After searching
>                     online I found almost nothing, so here I am. Can
>                     someone give me some pointers on what to do? I can
>                     get a scale factor for the screens (depending on
>                     the size) but I have no idea how to actually use
>                     it in the draw code. 
>
>                 I'm not sure if I understand the question. You can use
>                 cairo_scale() to set a scale factor for all drawing.
>                 So I would say that you can just apply the scale
>                 factor with cairo_scale() before drawing. Of course,
>                 this assumes that you don't use
>                 cairo_identity_matrix() or cairo_set_matrix() in your
>                 drawing. Instead, cairo_save() and cairo_restore()
>                 should be used around temporary modifications of the
>                 transformations. Cheers, Uli
>
>
>
> -- 
> https://www.bassi.io
> [@] ebassi [@gmail.com <http://gmail.com>]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo/attachments/20240708/5ddcb4e0/attachment.htm>


More information about the cairo mailing list