IRC Logs

Log of #ghostscript at irc.freenode.net.

Search:
 <<<Back 1 day (to 2016/02/11)20160212 
tor8 Robin_Watts: using putc for 1-byte writes instead of fwrite improves performance by 100% for writing large pgm files11:03.03 
jo0nas chrisl: thanks for the fix (to the fix to the fix) - that was fast :-D11:06.34 
chrisl jo0nas: no problem. I started down the route of doing it with that change in openjpeg.mak and realised it wasn't going to work, and clearly forgot to revisit that file11:07.46 
jo0nas nods11:09.21 
  chrisl: you may want to consider the three 100* patches here: https://anonscm.debian.org/cgit/printing/ghostscript.git/tree/debian/patches11:27.44 
  ...or do you want me to formally file a bugreport for each of them?11:28.19 
chrisl jo0nas: well, the zlib one is wrong.....11:29.41 
jo0nas oh11:30.07 
chrisl We're basically going to drop the man pages, and replace them with something that points to the html documents11:30.21 
jo0nas ahh - perhaps what I tried to solve has since been fixed by your makefile corrections on 4th11:30.46 
jo0nas will try simply drop the zlib patch and see if it compiles fine now11:31.28 
  chrisl: ...and patch 1001 (which patches not man page but html)?11:43.32 
chrisl jo0nas: I just applied that locally - I'll push it in a bit11:44.01 
jo0nas ah, sorry - I got used to your being fast :-D11:44.21 
chrisl jo0nas: would you just check over the top two commits here: http://git.ghostscript.com/?p=user/chrisl/ghostpdl.git;a=summary and make sure I haven't messed anything up, please? (note that I did make a small tweak to the inkcov one)11:47.15 
tor8 Robin_Watts: so, testing with 'mutool draw -r1200 -o out.pgm pdfref17.pdf 1'11:49.55 
  as origin/master, it takes 2.2s11:50.03 
  changing to use putc, it takes 1.1s11:50.14 
  changing to use our own buffered io with file descriptors, it takes 0.7s11:50.35 
Robin_Watts With my patch I went from 5s to 0.5s.11:50.49 
tor8 this is on linux with gnu libc11:51.07 
Robin_Watts Did you do a timing with my patch ?11:51.22 
  (I am in favour of fixing the general case, but I think I'm also in favour of optimising the png write as a I did if it gives a further benefit)11:52.02 
  s/png/pgm/11:52.14 
tor8 Robin_Watts: of course, your patch speeds things up a lot more since we won't call the whole chained mess of out->write function pointers per byte11:53.12 
  ah, actually, it speeds it up because it segfaults...11:53.29 
Robin_Watts tor8: really?11:53.57 
tor8 Program received signal SIGSEGV, Segmentation fault.11:54.14 
  0x000000000043a389 in fz_write_pnm_band (ctx=0x18d3010, out=0x1922980, w=8850, h=11100, n=2, band=0, bandheight=11100, 11:54.14 
  p=0x7ffff78d2000 "") at source/fitz/pixmap.c:61911:54.14 
  619 *o++ = *p;11:54.14 
Robin_Watts Crap. What did I break now.11:54.41 
tor8 you missed the divide when you assign l211:55.23 
  no, that's not only it11:55.50 
Robin_Watts l = len * (n-1)11:57.42 
  no, crap, even that's wrong.11:57.53 
jo0nas chrisl: looks good to me!11:58.22 
Robin_Watts tor8: will fix.11:58.37 
chrisl jo0nas: thanks - and pushed11:58.51 
jo0nas excellent!11:58.59 
tor8 Robin_Watts: if we add an unsigned char *p, *end and flush call to fz_output we can do fz_write and fz_write_byte as static inlines like fz_read_byte which will be very fast11:59.12 
  for the fz_buffer based outputs we can then poke directly into the fz_buffer, flush and get new pointers when full, etc12:00.04 
Robin_Watts tor8: so we do our own buffering ?12:00.09 
  Yes, we could do that.12:00.36 
tor8 I added a file descriptor based variant of output with our own buffering (the WIP commit is on tor/master)12:00.42 
  but I think we could go further and expose the buffering to the fz_output struct and have static inlines like fz_read_byte for max performance12:01.04 
  and then we only need to invoke the function pointer call overhead for flush12:01.30 
  though buffering for FILE* is going to make things even slower12:02.16 
  since FILE* already does a terribly slow and complicated buffering scheme of its own12:02.31 
  which is what slows down fwrite so much12:02.38 
  I tried reading the code in glibc and threw up my hands in disgust12:02.52 
Robin_Watts tor8: We moved from open to fopen a while ago. We should be working FILE's not ints.12:03.51 
tor8 Robin_Watts: the problem is, FILE's are SLOW as molasses12:04.05 
Robin_Watts tor8: Only if called 'badly'.12:04.14 
  and we can avoid calling them badly.12:04.22 
tor8 even with putc which is the fastest way to write a single byte at a time to a supposedly buffered FILE* using a macro, is much much much slower12:04.50 
chrisl jo0nas: I'm baffled by the ramfs patch you have there......12:05.33 
tor8 fz_write_byte should be fast, all it should be doing is poke a byte into a buffer and test if it needs to flush12:05.47 
  but stdio is broken if putc and fwrite are that much slower than a simple buffer and write()12:06.19 
Robin_Watts tor8: Using your char *p, *end, and flush solves that.12:06.27 
  That sounds like a good solution.12:06.31 
tor8 Robin_Watts: I guess a second layer of buffering on top of FILE will work12:06.51 
  could possibly use setvbuf to NULL and disable FILE* buffering to see if that helps12:07.10 
  I did the fd based one just to see how bad it was12:07.26 
jo0nas chrisl: intent is to rip out the code that lacked proper copyright - am I doing that wrong, or do you simply disagree that the licensing is vague?12:08.13 
Robin_Watts setvbuf sounds like it's something that'll go wrong on some system or other.12:08.20 
Runner Hello12:08.35 
ghostbot Welcome to #ghostscript, the channel for Ghostscript and MuPDF. If you have a question, please ask it, don't ask to ask it. Do be prepared to wait for a reply as devs will check the logs and reply when they come on line.12:08.35 
jo0nas s/rip out/repair linkage after having ripped out/12:08.57 
Runner Is it possible to uninstall GS silently? i am trying all kind of switches like /silent or /s for "uninstgs.exe", but it always shows a confirmation dialog12:09.24 
chrisl jo0nas: I disagree that the copyright is vague - the C file has a copyright statement in it12:09.26 
jo0nas without consent of the author, right?12:10.09 
chrisl jo0nas: the author contributed the code to Ghostscript12:10.32 
  Runner: probably not, if /S doesn't work12:10.44 
  jo0nas: what we were unable to do was to arrange for a copyright transfer to Artifex12:11.23 
jo0nas which means you did not get consent to relicense later12:11.50 
  ...as I recall12:11.57 
chrisl Relicense?12:12.08 
  We've only moved *more* restrictive instances of the GPL12:12.45 
Runner *sigh* Capital S does work though. Thanks12:12.54 
chrisl Runner: but I do wonder *why* you want to do that12:13.11 
Runner Software deployment12:13.30 
chrisl Runner: well, as long as you are adhering to the license conditions.....12:14.16 
jo0nas chrisl: http://bugs.ghostscript.com/show_bug.cgi?id=226943 predates the general relicensing to AGPL - even if the licensing back then was compatible with AGPL which I believe is up in the air and it seems Ken agrees with: http://www.ghostscript.com/irclogs/2014/05/05.html12:15.51 
Runner chrisl: Sure12:16.14 
chrisl jo0nas: Ghostscript has been distributed under some variant of the GPL since practically the very beginning12:17.44 
jo0nas I would love if that licensing issue of ramfs code could be cleaned up, as it is the only part left from Ghostscript being compatible with Debian Free Software Guidelines, as I see it12:17.49 
chrisl jo0nas: the license isn't the problem, the problem (for us) is the copyright. The is distributable under the conditions of the GPL12:18.36 
jo0nas not all forms of GPL is upwards compatible with AGPL12:18.46 
  do you still permit redistribution under GPL?!?12:19.15 
  I believe you've switched from GPL to AGPL12:19.42 
chrisl We distribute GS under the AGPL12:20.02 
Robin_Watts jo0nas: Versions of the code that were released under the GNU GPL are still usable under the GNU GPL.12:20.03 
  Versions of the code that postdate our change to the GNU AGPL are only usable under the GNU AGPL.12:20.24 
jo0nas so what is the license of ramfs code?12:20.45 
Robin_Watts We own the copyright in all the code (except possibly the ramfs code), so we can license it any way we like.12:21.06 
jo0nas I believe it predates the shift to AGPL and you are not copyright holder so cannot change license12:21.14 
chrisl It was contributed as GPL, we redistribute it as AGPL12:21.16 
Robin_Watts And certainly anyone can take GPL code and re-release it as AGPL code.12:21.26 
jo0nas if upwards compatible with AGPL, yes12:21.49 
chrisl We can legally ship under a *more* restrictive, but compatible license12:21.58 
Robin_Watts They can't take away the rights to people that had the GPL code already, but certainly there is no problem in ever shipping GPL code as part of an AGPL package.12:22.11 
  Cos AGPL is, as chrisl says, more restrictive.12:22.22 
jo0nas GPL-2 is more restrictive than GPL-2+12:22.33 
  GPL-2+ is upwards compatible with AGPL, but not GPL-2 - I believe12:22.58 
Robin_Watts GPL-3 is more restrictive than GPL-2.12:23.09 
jo0nas ...because AGPL is sort-of a sidestepping of GPL-3, not GPL-212:23.18 
Robin_Watts AGPL is more restrictive than GPL-312:23.23 
  I have no idea what "GPL-2+" is.12:23.34 
jo0nas which exact license is ramfs code?12:23.38 
  GPL-2+ is short form of saying GNU General Public License version 2 or newer12:24.06 
  "+" = "or newer"12:24.17 
Robin_Watts The implication of it being submitted to us is that it's "GPLv2 or later".12:25.21 
  hence we can certainly relicense it as GPL v3.12:25.58 
  and we can certainly include it within a package with AGPL code.12:26.18 
jo0nas how can anyone know that when they file something to your issue tracker then it is automagically licensed as "GPLv2 or later"?12:26.27 
Robin_Watts jo0nas: There is a note on our bugzilla explaining that :)12:26.52 
kens Filing something ont he bug tracker doesn't make it GPL at all, submitting a patch does, and as Robin says we do explain thast12:27.07 
  And will go back for explicit permission on anything significant12:27.21 
chrisl And why would anyone contribute unusable code12:27.29 
kens But I've tried (adn just tried again) to contact the author without success12:27.37 
chrisl Is there some shorthand to get to the earliest commit in git?12:27.56 
jo0nas How could I provide you a patch yesterday without needing to confirm licensing?12:27.59 
kens If you submitted a patch then we assume you read the note Robin mentions12:28.27 
jo0nas chrisl: perhaps the author wanted his bounty before licensing the code :-P12:28.33 
chrisl not sure there was a bug bounty back then.....12:29.00 
kens AQnd I'd love to pauy it to him, if he'd get in touch12:29.04 
chrisl jo0nas: in your case, the patches are too small to be a problem12:30.52 
jo0nas http://bugs.ghostscript.com/show_bug.cgi?id=226943 say "Keywords: bountiable"12:31.11 
jo0nas is just giving a plausable reason for not licensing up front12:31.55 
  I don't mean to say that my contribution is big enough to need licensing, but that I did file a bugreport which included a patch, and (because I recalled your requiring ownership handover in the past) looked explicitly if I was requred to confirm anything related to licensing or authorship when filing that bug12:34.20 
chrisl jo0nas: Well, you possibly didn't look hard enough: on the page for adding attachments, there is: "patch A signed Artifex Contributor License Agreement is prerequesite for patch acceptance."12:35.20 
jo0nas so where is the "signed Artifex Contributor License Agreement" from Michael Slade?12:36.08 
  you evidently did accept the patch, right? :-P12:36.40 
chrisl jo0nas: as I said, small patches we have more leeway - you cannot assert copyright over patches that small and that are obviously corrections12:38.52 
jo0nas I know you want to solve this issue - and I agree that ideal would be to get in touch with the author and get a consent to hand over ownership - but I disagree that that is not needed12:38.58 
  chrisl: as I already wrote, I agree that my patch is too small to need licensing - you are missing the point, it seems12:40.04 
chrisl We didn't have a "stock" contributor agreement back in 2006, that was a recent innovation12:40.56 
jo0nas ...or do you imply that your issue tracker is clever enough to detect threshold of needing licensing, and show requirement only for large enough patches?12:41.18 
  chrisl: right - I suspected that, but played along with your claim here that explicit consent _was_ in place - so we are back to consent lacking (back then!)12:42.02 
  so what I did yesterday is irrelevant - not because the patch was small but because I used a different interface than was in place in 200712:43.02 
chrisl No, I didn't claim that: I claimed *implicit* consent was given.12:43.23 
jo0nas my question remains: What is licensing of code contributed in 2007?12:43.29 
chrisl GPL12:44.33 
jo0nas what was the exact license of ramfs code when contributed in 2007?12:44.40 
  just "GPL" implies "GNU Public License version 1" with no upgrade path to GPL 3 and therefore no sidegrade path to AGPL 312:45.15 
  you cannot assume that "GPL" implies "or later"!12:45.56 
  sorry for being too confident: How can you assume that "GPL" imply an upgrade/sidegrade path to your current AGPL licensing?12:47.34 
chrisl The problem is, the GPL distro from back then is not in our git repo12:47.53 
jo0nas problem is you don't have explicit permission from the author of the ramfs code to relicense it, you just assume it fits your needs12:48.44 
  I am baffled that you are "baffled" that Debian interprets the status as such12:49.51 
Robin_Watts tor8: A fixed version of my commit is on robin/master. Clean cluster results.12:50.11 
chrisl I think it is reasonable to assume that code contributed to an open source project is intended to be licensed under the same open source license12:50.12 
jo0nas which open source license is that? Which license *exactly* - not just the kind of license?12:50.40 
chrisl The patch was against Ghostscript 8.54 was was licensed under the GPL version 212:50.42 
jo0nas "...or newer"? I seem to recall several chunks of code back then that lacked the "or newer" part, but I might be mistaken12:51.15 
  if without the "or newer", then that is not relicensable as AGPL12:51.45 
  ...I believe12:52.17 
  ...bu I am not a lawyer12:52.25 
  ...but I am also not out to harrass you - I really would love to help here12:52.55 
chrisl My understanding differs from yours, then.12:54.36 
jo0nas chrisl: by your understanding, which exact license was the ramfs code in 2007?12:56.11 
chrisl GPLv212:56.23 
jo0nas without "...or later"?12:56.35 
chrisl Without12:56.45 
jo0nas ok12:56.48 
  thanks12:56.50 
chrisl But, my understanding is that we can legally redistribute GPLv2 licensed code as GPLv3 (although we could not assert the extra restrictions of v3 on that specific code).12:57.55 
jo0nas that code cannot - by your understanding of the licensing of it in 2007, and the public record or its evolution since, be redistributed under the terms of the Debian Free Software Guidelines12:58.03 
chrisl So, even if it is *legal*, Debian says "no"?12:58.40 
jo0nas how can you redistribute GPLv2 code as GPLv3?12:58.40 
  I believe only "GPLv2 or later" can legally be redistributed as GPLv312:59.15 
kens thinks its time for ths conversation to end12:59.27 
chrisl Because GPLv3 only reduces the rights available, it does not extend any rights12:59.37 
jo0nas ...but we disgree on interpretation of the relevancy of "or later" fundamentally, it seems12:59.39 
kens jo0nas : we differ in our itnerpretation, you don;t intend to distribute the source, so that's OK, right ?12:59.46 
jo0nas it is fine, yes13:00.06 
kens Then I thnk we don't need to discuss it any further13:00.16 
jo0nas thanks for clarification of your interpretation13:00.20 
  I agree13:00.25 
kens We may choose to discuss it more internally13:00.29 
  And we have tried (again) to contact MIchael13:00.43 
  Maybe if he gets deluged enough he'll contact us just to shut us up13:00.58 
jo0nas chrisl: you might want to read http://www.gnu.org/licenses/gpl-faq.html#VersionThreeOrLater - but you are free to disagree also with the authors of the license that you (and according to you also Michael Slade) uses13:05.31 
kens Lawyers regularly disagree over the interpretation of laws, and often come up with interpretations which do not match those of the original creator.13:06.47 
  Now can we please end ths ? Please ?13:07.01 
jo0nas says no more13:10.06 
tor8 Robin_Watts: some more timings:14:54.26 
  origin/master 2.1s, 14:54.31 
  putc for 1-byte 0.9s, 14:54.31 
  file descriptors with own buffering 0.7s, 14:54.31 
  buffering in fz_output and static inline fz_write_byte 0.3s,14:54.31 
  your branch 0.15s 14:54.31 
  so at least we should move to putc14:55.04 
  file descriptors are not worth bothering with14:55.21 
  a 3x speed up from static inlining and buffering in fz_output14:55.41 
  might be worth going for as well14:55.47 
  but the code gets a bit messy :/14:55.51 
  I'd want to write to fz_buffer's without double buffering but then you run into a mess of when to grow etc14:56.26 
Robin_Watts OK, so my commit seems sensible anyway.14:58.18 
  The question is how far do we want to go in the search for speed otherwise...14:58.34 
tor8 if we go with buffering in fz_output, micro-optimizing the pgm output as in your patch is less necessary14:59.27 
Robin_Watts Were it not for the fact that the simple putc fix is so good, I'd be tempted to go for the complex solution with fz_output having buffering etc.15:00.13 
tor8 yeah. I'm inclined to just stick with the putc fix...15:00.37 
Robin_Watts This stuff is slap bang in the middle of the road when it comes to people like ray doing timings.15:00.53 
  and it makes the difference between us beating or being beaten by gs etc.15:01.13 
  How about we commit the putc thing, and my one now, and we can ponder on the larger solution later ?15:02.14 
tor8 Robin_Watts: sure.15:02.32 
Robin_Watts cool.15:02.38 
tor8 we can probably inline the out->write function and save one function call overhead15:02.46 
  so the fz_write is inlined into directly doing out->write15:03.06 
  or just a macro to do it15:03.14 
Robin_Watts tor8: with care, possibly, yes.15:03.37 
tor8 doing so shaves another 50ms off the time over just the putc call15:10.47 
  and it's a pretty minor change15:10.57 
  commits on tor/master15:11.59 
Robin_Watts Shouldn't fz_write still return an int ?15:16.51 
  and why manually inline that in the fz_write_int32be ?15:17.05 
  are compilers too crap to use inlines within inlines?15:17.19 
tor8 Robin_Watts: I figure for the debug builds mainly.15:17.50 
  we never use the return value; and our write either writes fully or throws an exception unlike system write()15:18.06 
  I'd be okay with taking out the manually inlined ones15:18.49 
  updated version on tor/master15:19.58 
Robin_Watts I have no strong preference.15:20.12 
  Leave it as is then. lgtm.15:20.18 
sebras Robin_Watts: ping?17:25.51 
Robin_Watts pong17:25.58 
sebras Robin_Watts: can the harfbuzz-stuff split word nodes in two?17:26.03 
  Robin_Watts: where does this take place?17:26.11 
Robin_Watts sebras: bidirectional processing can split word nodes in two.17:26.31 
  Suppose we get a word node that's ABCDedfg17:26.46 
  where ABCD is latin, and edfg is arabic.17:26.59 
  the first fragment needs to be left 2 right, the second right 2 left.17:27.19 
  We split nodes so that each fragment has just one direction.17:27.41 
  You want to know where that happens?17:27.54 
sebras Robin_Watts: right, so this happens in detect_flow_directionality()?17:28.01 
Robin_Watts Yes.17:28.24 
  detect_flow_directionality gathers a paragraphs worth of stuff up into a unicode buffer, and presents it to the UAX#9 code.17:28.59 
  That calls us back into newFragCb17:29.13 
sebras Robin_Watts: how does that callback work?17:29.43 
  Robin_Watts: e.g. what is fragment_len?17:30.05 
Robin_Watts We get called for each 'fragment' in the passed in buffer at a time.17:30.09 
  strictly in order.17:30.19 
  so if we had ABCDefg we'd get called with the pointer to A, len 4, l2r, then we'd get called with the pointer to e, len 4, r2l17:31.02 
sebras len = 1;17:31.02 
  text = " ";17:31.02 
  oops.17:31.05 
  why is there a len> fragment_len check in there?17:31.28 
  Robin_Watts: can the callback be called with a smaller fragment than the node contains?17:31.49 
Robin_Watts because len might be > fragment_len ? :)17:31.50 
  oh yes.17:31.54 
sebras why?17:32.05 
Robin_Watts Suppose our source text is "Mary had a little lamb"17:32.48 
  that has nodes: "Mary" " " "had" " " "a" " " "little" " " "lamb"17:33.05 
  we collate that into "Mary had a little lamb" and pass that to the UAX#9 code.17:33.24 
  That calls us back saying that the first fragment is "Mary had a little lamb"17:33.37 
  There, fragment_len > len.17:33.49 
  That's the opposite case to the one you were worried about?17:34.07 
sebras I think so, yes.17:34.25 
Robin_Watts For the opposite example take "ABCDefg"17:34.30 
  there we get called back with "ABCD" and then "efg"17:34.52 
sebras ok, because I'm seeing a polish text "zaj" being split into "za" and "j", which is baffling.17:35.05 
Robin_Watts so node->len > fragment_len17:35.10 
  sebras: by this code?17:35.23 
sebras it could be because I'm always setting len == 1 for soft hyphens regardless of whether these are going to be displayed or not.17:35.43 
  Robin_Watts: len should only represent the length of the characters that will actually be displayed then.17:36.10 
Robin_Watts sebras: It's possible that my code in newFragCb doesn't understand soft hyphen nodes.17:36.10 
sebras Robin_Watts: it doesn't, and I'm trying to fix that, but I'm not sure how newfragcb works.17:36.30 
sebras is slowly getting it though.17:36.42 
Robin_Watts sebras: Yeah, in newFragCb, I assume that all glue nodes hold " ", hence len 1.17:36.47 
sebras Robin_Watts: and what if I were to claim that too, but some of those glue nodes are not actually shown on screen?17:37.15 
Robin_Watts You need to alter the if (data->flow->type == FLOW_GLUE) side to set len to the number of chars within the fragment that should be skipped.17:37.30 
sebras Robin_Watts: would that mean that fragment_len is off by one somewhere that might trigger a node split?17:37.34 
Robin_Watts i.e. if you're not putting anything into the collated Unicode buffer that gets fed into the UAX#9 code, then you should set len to 0 there.17:38.04 
  Does that make sense?17:38.20 
  (In detect_flow_directionality, we put stuff into the buffer, I put " " in for glue nodes - have you changed that?)17:39.31 
  for softhypen nodes presumably you want to not put anything in.17:39.53 
sebras ah, ok.17:39.56 
Robin_Watts You need to do the matching thing in newFragCb.17:40.08 
sebras yes I have, but I probably haven't changed the callback accordingly. now I'm beginning to understan how this works.17:40.15 
  ok.17:40.18 
  thanks for the explanation.17:40.21 
  Robin_Watts: I think I _do_ want to put something in, but only if the soft hyphen has already been deemed to break the line.17:40.50 
Robin_Watts sebras: detect_flow_directionality happens BEFORE any lines are broken.17:41.40 
  The directionality of fragments is the same regardless of layout.17:41.53 
  hence we load the nodes, find the directionality, then layout.17:42.09 
  and the breaking of lines happens in layout, right?17:42.20 
sebras Robin_Watts: yes, it happens in the function below the call to fz_layout_html().17:43.42 
Robin_Watts sebras: So I think you can get away with not putting anything into the buffer. You just need to arrange to set len=0 when you meet such a node in newFragCb.17:44.42 
sebras Robin_Watts: mmm, and handle the node in the same way both during directionality detection and the callback.17:45.14 
  Robin_Watts: fixed it.17:45.57 
Robin_Watts Fab.17:46.02 
sebras Robin_Watts: thanks. :)17:46.03 
Robin_Watts no worries.17:46.06 
sebras Robin_Watts: I was introducing characters in detect directionality but setting len == 0 in the callback.17:46.39 
  not a smart move.17:46.51 
  tor8: Robin_Watts: I have something that appears to work now over at sebras/master. feel free to complain about variable names, indentation, spaces between function identifiers and the succeeding parenthesis, wording in comments. but most importantly, please review the algorithm itself.18:13.09 
Robin_Watts sebras: Why does add_flow_sbreak need to set node->w = 0; ?19:09.41 
  In layout_flow, shouldn't "start by skipping whitespace (and newline) at beginning of tags" skip sbreaks too ?19:12.47 
  likewise find_list_mark_anchor ?19:14.48 
  In detect_flow_directionality, I would have expected the FLOW_SBREAK: case to be len = 0; text=""; break; rather than broken =1;19:16.41 
  but I guess it doesn't matter particularly.19:16.52 
  In the second commit: Now you've got add_flow_break setting node->w = 0 too.19:17.49 
  If those nodes are ever being set to non-zero width in the layout phase, then you can't rely on them being set to 0 at creation time.19:18.29 
  because you might layout the same flow several times.19:18.43 
  I don't follow the need for the new algorithm, in particular the nested loop.19:22.28 
 Forward 1 day (to 2016/02/13)>>> 
ghostscript.com
Search: