[cairo] line width questions

Simon Budig simon at budig.de
Mon Aug 18 14:40:10 PDT 2008


Ian Britten (britten at caris.com) wrote:
> Simon Budig wrote:
> At least for now, I'd like to keep this focused on PDF (and maybe the
> other vector output formats: PS, SVG, etc), where the output is most
> definitely not anti-aliased.
> [ Or, I'm assuming they aren't.  If Cairo is doing some sort of AA for
> PDF, etc, then that would open up a whole different discussion ]

Yeah, sorry, I did not realize that PDF and PS have this width 0 special
case for lines (Note that the PDF specification specifically
discourages the use of this feature though).

[...]
> >> Since a thickness of zero seems to draw no line with Cairo, how
> >> am I to know what the thinnest possible line can be (Esp. when
> >> accounting for different surface types!).
> > 
> > If you don't know, how should cairo know? As written above, the
> > effective resolution of a printer is not known at the time of the PDF
> > output.
> 
> So you're saying that Cairo is going to prevent me from using this
> valid PS/PDF feature? Namely, using a lineweight of zero and
> automatically getting a "as thin as possible" line?
[...]
> I just printed some (PS) lines with a lineweight of zero.  Admittedly,
> it was only to a 1200dpi laser printer, and my optical measuring tools
> aren't super-advanced, but the resulting lines are around 0.03mm
> thick - Far smaller than one point.

Frankly, I don't get what is the big deal about this. Nothing prevents
you from specifying linewidths smaller than one point. If a 0.03mm line
meets your requirements (and you don't use transformations) specify a
line width of 0.086 and you're fine (0.086 * 25.4mm / 72 = 0.03mm)
(note that the device coordinates for a PDF surface are kind of
specified in the docs for cairo_pdf_surface_create()).

For Screen renderings I usually do something like this:
  double w1, w2;
  w1 = w2 = 1.0;
  cairo_device_to_user_distance (cr, &w1, &w2);
  cairo_set_line_width (cr, MAX (w1, w2));

and any further drawing yields neat 1px lines (on screen), but nothing
prevents you to use w1 = w2 = 0.086; to get consistent 0.03mm lines (in
your PDF). Or set up a transformation matrix where you can specify the
linewidths and coordinates in mm directly:

  cairo_scale (cr, 72.0 / 25.4, 72.0 / 25.4);
  cairo_set_line_width (cr, 0.03);

or whatever. I don't get what is the benefit of "as thin as possible"
over "0.03mm", especially when you're ready to accept that the printout
quality might vary drastically depending on your output device.

*shrug*

Bye,
        Simon
-- 
              simon at budig.de              http://simon.budig.de/


More information about the cairo mailing list