Re: Patch to allow Cairo-based software to print to laser cutters on Windows
Bill Spitzak <[email protected]> Mon, 29 Oct 2018 10:12:20 -0700
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <CAL-8oAjhZzV2220cqNeEPYsp9PszxPLBdXpm0yAWpKTyodLh7Q@mail.gmail.com> |
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 <[email protected]> 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 <[email protected]> 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 <[email protected] >> >>> <mailto:[email protected]>> 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 < >> [email protected] >> >>> <mailto:[email protected]>> 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 >> >>> [email protected] <mailto:[email protected]> >> >>> https://lists.cairographics.org/mailman/listinfo/cairo >> >>> >> >> >> >> >> >> -- >> cairo mailing list >> [email protected] >> https://lists.cairographics.org/mailman/listinfo/cairo > > > > > > -- cairo mailing list [email protected] https://lists.cairographics.org/mailman/listinfo/cairo