[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