[cairo] Patch to allow Cairo-based software to print to laser cutters on Windows
Rick Yorgason
rick at firefang.com
Fri Oct 19 19:12:07 UTC 2018
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/20181019/da275e8b/attachment-0001.html>
More information about the cairo
mailing list