[cairo] Patch to allow Cairo-based software to print to laser cutters on Windows

Rick Yorgason rick at firefang.com
Mon Oct 29 20:29:14 UTC 2018


I think it makes sense to do both, but if we're only going to have one 
check, it should be the CTM, like i originally had.

If we only test the device unit, then we run into weird scenarios. Let's 
say 1 device pixel is 0.3 CTM units. That means anything from [0-0.3] 
units *will* draw as a hairline, but anything from (0.3-1) will get 
rounded to 0 and won't draw at all. (Remember, ExtCreatePen takes the 
pen width as an integer.) So 0.3 and 1.0 draw, but 0.5 doesn't.

-Rick-


On 2018-10-29 10:12, Bill Spitzak wrote:
> Seems like it would be better to consistently use one device unit 
> rather than the maximum of one device unit and one unit in the CTM.
>
> The zero stuff is a real pain but I suspect trying to fix this in 
> Cairo (and also support hairlines on other output devices) will be a 
> lot of work.
>
> On Fri, Oct 26, 2018 at 7:10 PM Rick Yorgason <rick at firefang.com 
> <mailto:rick at firefang.com>> wrote:
>
>     Apologies for the delay. Here's the promised updated patch.
>
>     The difference is now it considers the minimum size of both the
>     canvas and the printer instead of just the canvas, zero-width
>     strokes count as hairlines (although Cairo still seems to be
>     culling strokes from getting to this function — that's a separate
>     bug) and the documentation was updated for clarity.
>
>     Cheers,
>
>     -Rick-
>
>
>     On 2018-10-19 12:12, Rick Yorgason wrote:
>>     That shouldn't be. See page 675 of the Postscript Language
>>     Reference:
>>     https://www.adobe.com/content/dam/acom/en/devnet/actionscript/articles/PLRM.pdf
>>
>>>     A line width of 0 is acceptable, and is interpreted as the
>>>     thinnest line that can be rendered at device resolution—1 device
>>>     pixel wide. However, some devices cannot reproduce 1-pixel
>>>     lines, and on high-resolution devices, they are nearly invisible.
>>
>>     -Rick-
>>
>>
>>     On 2018-10-19 09:27, Bill Spitzak wrote:
>>>     Hairlines are not always 1 pixel wide. For Postscript setting
>>>     the line width to 0.0 gives you a hairline that seems to be
>>>     about 1/150" which is quite a few pixels on modern printers, and
>>>     was > 1 even on the first Apple Laserwriter.
>>>
>>>     On Fri, Oct 19, 2018 at 6:21 AM Rick Yorgason <rick at firefang.com
>>>     <mailto:rick at firefang.com>> wrote:
>>>
>>>         It looks like you're right about the device units. In cases
>>>         where the
>>>         canvas DPI is lower than the device DPI, the "smallest
>>>         printable line"
>>>         is 1, as in my original patch (because ExtCreatePen only
>>>         accepts
>>>         integral pen widths), but when the canvas DPI is higher, the
>>>         "smallest
>>>         printable line" is
>>>         `_cairo_matrix_transformed_circle_major_axis(stroke_ctm_inverse,
>>>         1.0)`.
>>>
>>>         I haven't looked any further into what's culling zero-width
>>>         lines yet.
>>>         For now, I'm focusing on the "use PS_COSMETIC for smallest
>>>         printable
>>>         lines" patch, which I believe should be separate from the
>>>         "allow
>>>         printing zero-width lines" patch.
>>>
>>>         Tomorrow I'll post a new patch based on the feedback I've
>>>         received so far.
>>>
>>>         -Rick-
>>>
>>>
>>>         On 2018-10-19 00:56, Adrian Johnson wrote:
>>>         > There were some patches to fix the culling on narrow lines
>>>         on vector
>>>         > surfaces:
>>>         >
>>>         >
>>>         https://gitlab.freedesktop.org/cairo/cairo/commit/b1192beac7c5b56a8ff356d20af5ebfb65404109
>>>         >
>>>         >
>>>         https://gitlab.freedesktop.org/cairo/cairo/commit/bec8c7508ebc0f69266f9aebe9903539391c519b
>>>         >
>>>         > Those patches should allow zero width lines. I'm not sure
>>>         what else
>>>         > could be preventing zero width lines from getting through
>>>         to the win32
>>>         > print surface.
>>>         >
>>>         > You code that sets the cosmetic flag is not checking the
>>>         line width in
>>>         > device units. The StrokePath() is called in user
>>>         coordinates so that the
>>>         > line width will be in user coordinates. The reason
>>>         emitting the path in
>>>         > device space and stroking in user space is demonstrated here
>>>         > https://cairographics.org/tutorial/#L2linewidth
>>>         >
>>>         > To check if the line width is < 1 device unit you would
>>>         need to do
>>>         > something line in the second commit above to find the line
>>>         width in user
>>>         > space.
>>>         >
>>>         >
>>>         > On 19/10/18 07:32, Rick Yorgason wrote:
>>>         >> Sure enough, Cairo seems to be culling zero-width lines
>>>         somewhere, so it
>>>         >> doesn't matter whether or not I check for zero here.
>>>         >>
>>>         >> For now, I propose that I get rid of the zero-check in my
>>>         patch, so
>>>         >> anything <= 1 device unit is drawn with a PS_COSMETIC
>>>         pen. This value
>>>         >> gets rounded to an integer, so this approach is
>>>         consistent with the
>>>         >> definition of a hairline being the smallest thing a
>>>         printer can print.
>>>         >>
>>>         >> In the long run, it would be nice to track down where
>>>         Cairo is culling
>>>         >> zero-width lines and allow them through, as I believe
>>>         postscript and pdf
>>>         >> both treat zero-width lines as hairlines.
>>>         >>
>>>         >> -Rick-
>>>         >>
>>>         >>
>>>         >> On 2018-10-18 12:09, Bill Spitzak wrote:
>>>         >>> I suspect there is code in Cairo that assumes zero-width
>>>         strokes are
>>>         >>> invisible, so it may be difficult to fix it for only
>>>         this device.
>>>         >>>
>>>         >>> The main reason for using zero rather than any other
>>>         number is that it
>>>         >>> survives scaling, which is pretty important for a magic
>>>         value.
>>>         >>>
>>>         >>> On Thu, Oct 18, 2018 at 11:12 AM Rick Yorgason
>>>         <rick at firefang.com <mailto:rick at firefang.com>
>>>         >>> <mailto:rick at firefang.com <mailto:rick at firefang.com>>>
>>>         wrote:
>>>         >>>
>>>         >>>      Including zero-width strokes makes sense to me.
>>>         After all, true
>>>         >>>      hairlines are supposed to act as though they're
>>>         zero-width.
>>>         >>>
>>>         >>>      The reason I implemented it this way it's because I
>>>         was worried
>>>         >>>      about two use cases:
>>>         >>>
>>>         >>>      1) Some applications might rely on zero-width lines
>>>         being
>>>         >>>      invisible. (Imagine an artist who selects all the
>>>         lines he wants
>>>         >>>      to hide and changes their line width to zero.)
>>>         >>>
>>>         >>>      2) Maybe some CNC machines rely on zero-width
>>>         lines? PS_COSMETIC
>>>         >>>      lines are always 1 unit wide, so there would be no
>>>         way to send
>>>         >>>      zero-width lines to the printer any more. This
>>>         seems unlikely to
>>>         >>>      be a problem, but it's possible.
>>>         >>>
>>>         >>>      (1) can be fixed by the calling application, and
>>>         (2) isn't likely
>>>         >>>      a real problem, and if we include zero-width
>>>         strokes it would make
>>>         >>>      it easier for developers to make true zero-width
>>>         hairlines (since
>>>         >>>      they don't need to know the target device's minimum
>>>         unit size), so
>>>         >>>      I'm down for it.
>>>         >>>
>>>         >>>      -Rick-
>>>         >>>
>>>         >>>      On October 18, 2018 9:10:07 AM PDT, Carl Worth
>>>         <cworth at cworth.org <mailto:cworth at cworth.org>
>>>         >>>      <mailto:cworth at cworth.org
>>>         <mailto:cworth at cworth.org>>> wrote:
>>>         >>>
>>>         >>>          On Wed, Oct 17 2018, Rick Yorgason wrote:
>>>         >>>
>>>         >>>              With this patch, I can use Inkscape to set
>>>         my stroke width
>>>         >>>              to 0.001" and it will cut through the
>>>         material as expected.
>>>         >>>
>>>         >>>
>>>         >>>          If we're going to have a magic value here, I
>>>         think I'd be much happier
>>>         >>>          to have 0 be the magic value.
>>>         >>>
>>>         >>>          (I know that your code isn't actually making
>>>         0.001" be magic, but a
>>>         >>>          whole range of values. I think I would really
>>>         prefer to have that range
>>>         >>>          include rather then exclude 0.0.)
>>>         >>>
>>>         >>>          Does anyone see any reason why a stroke width
>>>         of 0 shouldn't be treated
>>>         >>>          this way?
>>>         >>>
>>>         >>>          I think that would make a much better way to be
>>>         able to document
>>>         >>>          this. ("Use a value of 0 to get a PS_COSMETIC
>>>         pen which is useful when
>>>         >>>          targeting devices such as laser cutters".)
>>>         >>>
>>>         >>>          And speaking of documentation, it seems this
>>>         patch should also be
>>>         >>>          touching up the documentation, such as in
>>>         cairo_set_line_width?
>>>         >>>
>>>         >>>          I know the code is specific to the Windows
>>>         backend, but I think it's
>>>         >>>          reasonable to put a backend-specific note into
>>>         the general documentation
>>>         >>>          in a case like this.
>>>         >>>
>>>         >>>          -Carl
>>>         >>>
>>>         >>>
>>>         >>>      --
>>>         >>>      Sent from my Android device with K-9 Mail. Please
>>>         excuse my brevity.
>>>         >>>      --
>>>         >>>      cairo mailing list
>>>         >>> cairo at cairographics.org <mailto:cairo at cairographics.org>
>>>         <mailto:cairo at cairographics.org
>>>         <mailto:cairo at cairographics.org>>
>>>         >>> https://lists.cairographics.org/mailman/listinfo/cairo
>>>         >>>
>>>         >>
>>>         >>
>>>
>>>         -- 
>>>         cairo mailing list
>>>         cairo at cairographics.org <mailto:cairo at cairographics.org>
>>>         https://lists.cairographics.org/mailman/listinfo/cairo
>>>
>>
>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo/attachments/20181029/3663a1ca/attachment-0001.html>


More information about the cairo mailing list