Re: font size change only in large steps

Alois Treindl <[email protected]> Sat, 29 Sep 2018 10:52:00 +0200
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
I added font size changes to the example, and print extents with
metric on and off.

The problem which I am addressing appears: font size
changes only in steps.

9.0 pt on Size: 49x7 9.0 pt off Size: 45.7764x7

9.1 pt on Size: 49x7 9.1 pt off Size: 45.7764x7

9.2 pt on Size: 49x7 9.2 pt off Size: 45.7764x7

9.3 pt on Size: 49x7 9.3 pt off Size: 45.7764x7

9.4 pt on Size: 49x7 9.4 pt off Size: 45.7764x7

9.5 pt on Size: 51x7 9.5 pt off Size: 50.5293x7

9.6 pt on Size: 51x7 9.6 pt off Size: 50.5293x7

9.7 pt on Size: 51x7 9.7 pt off Size: 50.5293x7

9.8 pt on Size: 51x7 9.8 pt off Size: 50.5293x7

9.9 pt on Size: 51x7 9.9 pt off Size: 50.5293x7

10.0 pt on Size: 51x7 10.0 pt off Size: 50.5293x7

I ran also the same example but with PDF surface, and get as
output:

ctest2

9.0 pt on Size: 45.4951x6.8125 9.0 pt off Size:
45.4951x6.8125

9.1 pt on Size: 45.4951x6.8125 9.1 pt off Size:
45.4951x6.8125

9.2 pt on Size: 45.4951x6.8125 9.2 pt off Size:
45.4951x6.8125

9.3 pt on Size: 45.4951x6.8125 9.3 pt off Size:
45.4951x6.8125

9.4 pt on Size: 45.4951x6.8125 9.4 pt off Size:
45.4951x6.8125

9.5 pt on Size: 50.5605x7.5625 9.5 pt off Size:
50.5605x7.5625

9.6 pt on Size: 50.5605x7.5625 9.6 pt off Size:
50.5605x7.5625

9.7 pt on Size: 50.5605x7.5625 9.7 pt off Size:
50.5605x7.5625

9.8 pt on Size: 50.5605x7.5625 9.8 pt off Size:
50.5605x7.5625

9.9 pt on Size: 50.5605x7.5625 9.9 pt off Size:
50.5605x7.5625

10.0 pt on Size: 50.5605x7.5625 10.0 pt off Size:
50.5605x7.5625

with PDF, metrics on or off makes no difference. But the font size
changes are in steps.

On 29.09.18 08:12, Uli Schlachter
wrote:

Hi,

On 28.09.2018 14:10, Alois Treindl wrote:

I noticed that cairo does not allow me to set a precise font size, like 9.4 pt
or 9.7 pt.
What I get is exactly the same font size, for a range of font sizes.

Try disabling metrics hinting via CAIRO_HINT_METRICS_OFF. See the
attached example program. Per the docs, this metrics hinting quantizises
font metrics so that they are integer values in device space, i.e. does
exactly what you are trying to get rid of.

You might also want to do cairo_font_options_set_hint_style(opt,
CAIRO_HINT_STYLE_NONE), depending on, well, if you want the font
outlines to be hinted or not.

Cheers,
Uli

-- 
cairo mailing list
[email protected]
https://lists.cairographics.org/mailman/listinfo/cairo
ctest1.c (text/plain, 984 B)
#include <cairo.h>
#include <stdio.h>

static void measure(cairo_t *cr, char *s)
{
	cairo_text_extents_t exts;
	cairo_text_extents(cr, "Some text", &exts);

	printf("%s Size: %gx%g", s, exts.width, exts.height);
}

int main()
{
  int i; 
  char t[80];
  double pt;
  cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1000, 1000);
  cairo_t *cr = cairo_create(s);
  cairo_font_options_t *opt, *opt0 = cairo_font_options_create();
  cairo_get_font_options(cr, opt0);
  opt = cairo_font_options_copy(opt0);
  cairo_font_options_set_hint_metrics(opt, CAIRO_HINT_METRICS_OFF);
  for (i = 90; i <= 100; i++) {
    pt = i * 0.1;
    cairo_set_font_size(cr, pt);
    cairo_set_font_options(cr, opt0);
    sprintf(t, "%.1lf pt on ", pt);
    measure(cr, t);
    cairo_set_font_options(cr, opt);
    sprintf(t, "\t%.1lf pt off ", pt);
    measure(cr, t);
    printf("\n");
  }
  cairo_font_options_destroy(opt);
  cairo_destroy(cr);
  cairo_surface_destroy(s);

	return 0;
}