IRC Logs

Log of #ghostscript at irc.freenode.net.

Search:
 <<<Back 1 day (to 2013/10/15)2013/10/16 
Robin_Watts got it.00:01.20 
  SpNg: http://git.ghostscript.com/?p=user/robin/ghostpdl.git;a=commitdiff;h=4a51eec56e083d8b704394a478e03de86cd2643a00:03.51 
  Let me know how that works out for you.00:03.58 
ray_laptop Robin_Watts: It looks like PNG supports IDAT chunks, each compressed individually00:04.17 
  Robin_Watts: " typically the chunk size will correspond to the encoder's buffer size."00:04.56 
Robin_Watts ray_laptop: They are not compressed separately.00:06.58 
  Trust me, I ran into this last month in mupdf.00:07.07 
  when I added banding there.00:07.18 
ray_laptop so, since IDAT chunks contain the compressed datastream is then the concatenation of the contents of all the IDAT chunks00:07.20 
  all that is needed is a "reset" for Flate, right ?00:07.38 
Robin_Watts ray_laptop: Ah, I see where you'te going. Yes.00:07.58 
SpNg Robin_Watts: trying it now ;-)00:13.31 
  ls00:13.51 
ray_laptop Robin_Watts: looking at some sites, I see mention of a zlib "full flush", or a way of writing "a partial deflate stream"00:16.40 
  Robin_Watts: more tomorrow. My brain has to re-tune to the old 8.72 code for cust 532. At least I'm making progress.00:19.38 
SpNg Robin_Watts: is this patch for 9.10?00:23.45 
  Robin_Watts: I can't get that compile. for some reason I keep running out of disk space when doing "make" I added a 50GB vdi to my virtual box and compiled it. used the whole drive up then terminated. any ideas?01:42.58 
Srinivasa Hi all here!06:15.40 
  is there a way to compare text+formatting of two pdf files?06:15.58 
chrisl Srinivasa: in general, looking at them is the only reliable method06:17.58 
Srinivasa chrisl, need an automated way of doing... atleast text and its style...06:18.49 
chrisl Srinivasa: you might be able to get the information to do the comparison out Ghostscript's txtwrite device - I'm not sure06:23.02 
  Srinivasa: of course, txtwrite (and the mupdf "equivalent" output) will only produce output for text that is actually "text"......06:27.07 
Srinivasa chrisl, great piece of info.... thanks! I will give it a try.....06:27.46 
chrisl Srinivasa: it really depends on the level of detail you need.06:28.31 
Srinivasa chrisl, I am actually trying to compare the extracted text out of pdf with the html converted back to pdf- ofcourse along with the style 06:30.02 
  do you think there are better ways of doing so?06:30.19 
chrisl Srinivasa: I think that's a process bound to fail regularly, unless the PDFs are *very* carefully tailored to the process06:31.35 
  Srinivasa: you should probably look at the txtwrite output options: http://ghostscript.com/doc/9.07/Devices.htm#TXT06:33.11 
Srinivasa chrisl, I am going through the url .... 06:34.42 
  Using somekind of test automation could resolve?06:35.13 
chrisl Well, I would start with -dTextFormat=0, then parse the XML and compare the data06:36.07 
sebras-work Srinivasa: so... if you already have a tool that extracts the text from the PDF and makes html for you, then why do you need to compare it?06:47.24 
Srinivasa sebras-work, extraction can miss certain spaces.... and sometimes depending on the pdf might skip formatting also...06:48.16 
chrisl Srinivasa: it might be missing "spaces" because aren't actually spaces, in which case, other text extraction systems wouldn't necessarily do any better06:50.01 
Robin_Watts Morning to7.08:30.54 
  I think there are a couple of small fixes on robin/master for your enjoyment.08:31.08 
sebras-work tor7: morning!08:34.39 
tor7 Robin_Watts: backport which fix from where? I thought we were using openjpeg 208:34.57 
Robin_Watts tor7: no. we're still on openjpeg 1.5+patches, I believe.08:35.19 
tor7 ah. is openjpeg2 in a separate repo?08:35.40 
  or on a different branch that we don't track08:35.52 
  in our git-conversion repo08:35.59 
Robin_Watts tor7: Honestly I can't remember.08:36.22 
tor7 Robin_Watts: okay. they look fine, anyway.08:36.52 
Robin_Watts Ta.08:36.59 
tor7 now I just need to look over paul's commits08:37.01 
Robin_Watts We probably should try to move to openjpeg 2.08:37.08 
  oh, wait... we are on 2.0. How come gs has changes that we don't?08:39.23 
kens SHelly ?08:40.25 
tor7 paulgardiner: (for the logs) I believe you've forgotten to check in MuDialogCreator.m (there's a .h but no .m)08:40.41 
Robin_Watts kens: right, but I thought that the standalone openjpeg module was generated from the gs one.08:41.17 
kens has no idea08:41.27 
tor7 paulgardiner: and I see you're comfortable with Interface Builder, all those .xib's :)08:41.28 
  Robin_Watts: the standalone openjpeg module is taken from upstream08:41.47 
Robin_Watts tor7: Ah!08:41.56 
tor7 it's a git-svn cron job08:42.26 
Robin_Watts Can we arrange to have a branch in that openjpeg module that is autogenerated from the gs one ?08:42.28 
tor7 Robin_Watts: I can look into it08:42.43 
Robin_Watts Otherwise we cannot get the gs fixes until they work their way upstream, and that might take a while.08:42.57 
  paulgardiner: tor7 just commented on your reviews. he thinks you missed a file?08:54.57 
paulgardiner Yeah, just checking. I think it's okay. It's a protocol so has implementations only in other classes08:56.01 
  Yeah. Checked. It's a protocol.08:57.12 
  So I guess I'm okay to push. Nothing else flagged08:58.14 
tor7 paulgardiner: yeah, go ahead.09:00.12 
paulgardiner Thanks tor7 09:00.21 
kens bbiab09:25.32 
Robin_Watts I am tempted to replace my old HP Laserjet 5L.09:38.15 
  Looking at a samsung ML 2855ND as a possibility.09:38.28 
  Has duplex, network, PS Level 3 and PCL 6.09:38.40 
sebras-work Robin_Watts: you should ask tor7 about his printer. it's a convenient Samsung, but I don't know about the feature-set...09:51.14 
Robin_Watts All the printers I can see are significantly larger than my 5L.09:51.42 
tor7 Robin_Watts: sebras-work: yeah, but mine doesn't have duplex09:52.12 
  Robin_Watts: my main printer is a samsung ML-164009:53.13 
sebras-work tor7: oh, you're right.09:53.16 
tor7 which has neither duplex nor postscript09:53.25 
  but it's small and convenient09:53.32 
sebras-work tor7: I remember using it to printout a CLA some time ago and doing the duplexing manually. :)09:53.39 
Robin_Watts I don't care about postscript really. I do care about duplex. I swore ages ago, that I'd never buy a laser printer without duplex as doing it manually drives me nuts.09:54.16 
tor7 Robin_Watts: I agree. manual duplex is enough to drive anyone insane.09:54.34 
sebras-work Robin_Watts: you have to print everything twice. :)09:54.40 
tor7 sebras-work: sometimes more, if you also forget to flip them upside down (not just printing on the same side twice)09:55.06 
  or the wrong order09:55.09 
  way too many permutations to get wrong09:55.14 
  and where do you start if you have an odd number of pages...09:55.33 
  and have to print the second batch in reverse09:55.38 
Robin_Watts or when the printer decides to feed 2 pages part way through.09:55.40 
sebras-work I recently discovered that my inkjet could do duplex-printing when I did a cups upgrade. apparently I have once tried duplex-printing because I was astonished when it suddently did duplex when I didn't ask for it. It just sucked the paper right back in!09:55.55 
  I'd like to have a color laserprinter with scanner, but when I bought mine 4 years ago there were no laser multi-function devices on the market.09:56.55 
Robin_Watts I have a scanner/fax/color inkjet thing.09:58.13 
sebras-work Robin_Watts: mm, me to, but I hate inkjet-printers with a passion. :)10:16.39 
  Robin_Watts: and I don't really need the fax-part. it seems almost as ancient to me as pagers!10:17.22 
Robin_Watts My bank will accept faxed instructions from me for foreign currency conversions.10:18.09 
  so the alternative would be post.10:18.17 
  Then again, maybe I should forgo a laser printer and get one of these instead: http://www.kickstarter.com/projects/117421627/the-peachy-printer-the-first-100-3d-printer-and-sc10:22.26 
tor7 Robin_Watts: the small printrbot looks more useful, and a fun weekend project to assemble11:36.40 
Robin_Watts Well, that has a smaller maximum build size, costs a lot more, has way more to go wrong with it, and is just 'less clever'.11:38.20 
  extrusion based things have all sorts of problems with the pressure of the extrusion. Photolithography seems much smarter, and the idea of floating the resin on salt water to get the 'Z' axis control is genius.11:39.55 
  Controlling the laser from the sound card, and measuring the drip speed by the microphone is just brilliant too.11:40.22 
tor7 Robin_Watts: yeah, the biggest issue with the peachy printer is going to be the print speed. but true, there's a lot to be said for being able to print any structures without worrying about it collapsing while printing11:59.34 
Robin_Watts tor7: AIUI the issue of support is the one that causes most failed prints, and this project solves that.12:00.15 
  Also, castAR looks really interesting.12:00.30 
tor7 Robin_Watts: yeah. it's a do-it-yourself version of what shapeways is doing with their prints12:00.52 
  re castOR, it's kind of expensive, and how is the software going to customisable (to support your newest board game)?12:01.27 
  Robin_Watts: did I mention how much I like my new toy?12:02.01 
Micha` Any reason why pdf_drop_obj allows its argument to be nil but not pdf_drop_xobject?12:03.04 
Robin_Watts Micha`: pdf_drop_xobject should cope with it being NULL. if it doesn't, it 's a bug.12:03.39 
Micha` Ah, well, there you go then :-) It refers to xobj->storable without checking if xobj is non-NULL.12:04.22 
  --- I see that pdf_keep_obj also allows for NULL object pointers, but not pdf_keep_xobject, but this seems less problematic.12:06.01 
Robin_Watts Micha`: Urm...12:26.36 
  pdf_drop_xobject calls fz_drop_storable(ctx, &xobj->storable);12:26.56 
  &xobj->storable == xobj.12:27.12 
  hence NULL is perfectly fine.12:27.17 
  fz_drop_storable checks for NULL on entry.12:27.37 
  so pdf_drop_xobject does cope with a null xobject.12:27.50 
Micha` Is it? The dereferencing of xobj is no problem here?12:27.57 
Robin_Watts We take the address of the storable field within the structure.12:28.24 
  And the storable field is deliberately the first thing in the structure.12:28.37 
  no deferencing is actually done.12:28.44 
  Likewise pdf_keep_xobject can accept NULLs.12:29.00 
Micha` Right! Boy, my C-foo is getting rotten by the years.12:29.10 
Robin_Watts foods. bbs.12:29.57 
Micha` Robin_Watts: Man, there is such an amount of rage in SO on a question about the validity of the &(obj->field) construct when obj is NULL!12:43.15 
tor7 Robin_Watts: so, I've extracted the openjpeg ghostpdl directory as a git subtree12:54.19 
  there are a grand total of 13 patches12:54.30 
  and running the job took a good 10-15 minutes of churning through commits on casper :(12:55.01 
Micha` A small typo: pdf-object.c:1119, in the message, pdf_dict_getp should read pdf_dict_putp.12:56.30 
Robin_Watts tor7: cool. Are you going to update mupdf to the new head, or should I?13:21.00 
  tor7: Have you pushed those changes into thirdparty/openjpeg.git ? I can't see them.13:23.49 
OlegS Can one fz_context be used for loading 2 different pdf files at the same time?13:31.48 
Robin_Watts OlegS: No. See docs/overview.txt13:32.32 
  Look in the "Multithreaded" section, and you will see there are 3 rules.13:32.56 
  You can make an fz_context, then clone it to get another.13:33.15 
  Then you can read 2 different pdf files using each of those two contexts.13:33.30 
  so they'll share the same store/font cache etc.13:33.45 
tor7 Robin_Watts: they're in ~tor/src/openjpeg-gs at the moment, I'll add that as a remote to thirdparty/openjpeg.git13:34.29 
Robin_Watts tor7: Ok, that explains why I couldn't see them :)13:34.51 
  The more I look at this 'post-process' thing for gs clist stuff, the more I want to do it as a new device call.13:35.49 
  I really need to discuss this with ray, I think.13:36.01 
tor7 Robin_Watts: but be careful, since the openjpeg-gs branch is not rooted in the upstream at all13:36.15 
  so you could cherry-pick but don't ever try merging or rebasing13:36.32 
Robin_Watts tor7: oh, yeah, ick.13:36.44 
sebras-hotel is intrigued to look at the irclogs because of tor7s comments about rebasing...13:36.59 
tor7 Robin_Watts: oh, hm, actually, it might have found the root!13:37.03 
  or I may have messed up13:37.11 
  sebras-hotel: nothing interesting to see. move along!13:37.23 
  sebras-hotel: using git-subtree to extract the ghostpdl.git openjpeg changes13:37.38 
sebras-hotel tor7: these are not the patches I'm interested in...13:37.45 
OlegS Robin_Watts: I tried to clone the context but I discovered a conflict between objects of different documents in the store13:42.15 
Robin_Watts OlegS: Can you give me an example, please ?13:42.34 
  actually, I think I can see why.13:45.17 
OlegS Sorry but I cannot give you example of pdf documents because it contains some private data13:46.46 
Robin_Watts OlegS: I meant, an example of an object that was being confused.13:47.21 
  but I think I can see why.13:47.25 
OlegS It's a pdf_obj object of PDF_INDIRECT kind13:48.25 
Robin_Watts I think it's a fairly simple fix.13:48.34 
  ok, yes, that's what I was thinking would be the problem.13:48.46 
tor7 Robin_Watts: okay, I've set up a script and remotes to pull the ghostpdl/openjpeg subtree into /home/git/thirdparty/openjpeg.git13:49.23 
  Robin_Watts: you can see what's there now13:49.29 
  and I have no idea how it managed to hook it up to the right spot in the history...13:49.47 
Robin_Watts OlegS: Can you try this fix out please? http://git.ghostscript.com/?p=user/robin/mupdf.git;a=commitdiff;h=70ad82df409db007ec08e66c3cb631f7e20595c613:53.06 
  tor7: looking now.13:53.11 
OlegS Robin_Watts: Issuing the compile error in line 'hash->u.i.ptr = key->doc': error C2037: left of 'doc' specifies undefined struct/union 'pdf_obj_s'13:59.26 
Robin_Watts OlegS: Damn, sorry. Will try for a new version.13:59.51 
  OlegS: Try this: http://git.ghostscript.com/?p=user/robin/mupdf.git;a=commitdiff;h=366bb0e508d25d61ac7376ce0ea56c109456ddb514:06.51 
mvrhel_laptop kens: gs_colorspace_set_icc_equivalent14:09.21 
kens mvrhel_laptop : thanks, I'll get right on it14:09.33 
mvrhel_laptop should do the job. and should work for your other case too14:09.34 
  I should have known that to begin with...14:09.45 
kens Not to worry, I thought it was going to be an easy change until I tripped over the shfill14:10.06 
OlegS Robin_Watts: It seems ok now14:14.39 
Robin_Watts Does that solve the problem?14:14.59 
OlegS Robin_Watts: I think so14:16.15 
Robin_Watts paulgardiner_: Have a good holiday!14:18.01 
paulgardiner Robin_Watts: thanks. Just trying to work out what I've forgotten to pack.14:19.09 
OlegS Robin_Watts: Thanks14:19.41 
Robin_Watts OlegS: Thanks for finding that problem.14:20.11 
Gigs- xcfxmyk no longer exists? It's mentioned in the current docs14:25.59 
chrisl Gigs-: I assume there's a typo in there somewhere14:29.13 
  Gigs-: I mean, in your question....14:29.52 
Gigs- cmyk yes14:30.15 
chrisl In my current debug build there are x11cmyk, x11cmyk2, x11cmyk4 and x11cmyk814:31.18 
Gigs- it's described as an xcf that puts the separations in as alpha channels, I'm not sure it's useful to me at all, just wondering what happened to it14:32.02 
  you are missing some other cmyks btw, you should have psdcmyk and pcxcmyk at least14:32.57 
chrisl We do have psdcmyk, and almost no one cares about pcx now14:33.54 
Gigs- no one cared about pcx when that device was made either :)14:34.07 
  pcxcmyk was a step in the development of tiffsep basically to debug 14:34.21 
  still a useful device for dumping raw sep binary data14:34.36 
chrisl It's possible that they are not considered "production quality" so don't get included in the default build14:35.41 
Gigs- ok, np I was just wondering about that xcfcmyk, no pressing need for it14:36.25 
  chrisl do you know how to read functiontype 0 streams?14:36.46 
chrisl Gigs-: not off the top of my head, I'd have to read up in the PLRM14:37.12 
Gigs- The question was: FunctionType 0 /Size [ 2 ] /Range [ 0 1 0 1 0 1 0 1 ] /Domain [ 0 1 ] (stream) 00 00 00 00 00 80 FF 00> .. in my tint transform stream, how is it ordered, like C C M M Y Y K K? If that's the case, why is K inverted?14:37.21 
  it's just a basic mapping function, Domain is input 0 to 1, Range is output CMYK14:38.15 
  it's not entirely clear from the PDF spec how the stream itself is ordered though14:38.42 
Robin_Watts hey ray_laptop 14:48.20 
  The more I get into this, the more I think it would be neater to do this by adding a new device function.14:48.57 
  Do you have time to discuss it at some point ?14:49.11 
Gigs- I just found a thread from 2002 with a comment from Peter Deutsch and someone with an erols email, blast from the past14:50.20 
chrisl Gigs-: I assume that's not the entire dictionary you pasted above?14:51.48 
Gigs- it is14:51.54 
chrisl So, it's missing entries14:52.07 
Gigs- it's a tint transform for a single separation to CMYK 14:52.11 
  I can paste the original code in its entirety on a pastebin, one second14:52.37 
chrisl Or, it's missing an entry14:52.40 
Gigs- http://paste.ubuntu.com/6224223/14:52.52 
  Yeah I did leave out a few things sorry14:53.29 
  tried to trim it down to just the relevant bits14:53.41 
chrisl BitsPerSample was the one that worried me14:54.02 
Gigs- yeah I don't know why length is done by reference there, but it seems correct14:54.44 
  the length object just contains an integer14:55.03 
chrisl Because PDF creators are lazy, and like to slow things down for no apparent reason.....14:55.17 
Gigs- heh yeah that's the truth14:55.23 
kens Functions don't care what the ordering is. You have a 1->4 function there, so it takes 1 arguement and returns 4 results. Its up to you to get the order corfrect. However, the stream data i your case ia sample 1, result 1, sample 1, result 2, saample 1, result 3, sample 1, result 4, sample 2, result 1 etc14:55.38 
Gigs- that's what I thought kens, so it's effectively inverting the K14:56.17 
kens So if that's sep to CMYK then your two end points are C=M=Y=K=0 and C=0, M=128, y=255, k=014:56.33 
  Not so much invertingk as K plays no part,m its always 014:56.49 
  Looks like a hacky RGB type conversion14:57.08 
Gigs- let me digest what you said a second14:57.23 
kens resorts to gthe PDFRM14:57.50 
Gigs- how is M=128 when it's 00 00 00 0014:57.51 
kens You r data is 00,00,00,00 then 00,80,FF,00 unless I miosread it14:58.26 
Gigs- stared at the PDFRM but failed his pdf-fu saving throw14:58.38 
Micha` Robin_Watts: When we made the change to set force a non NULL page->contents on pdf_page_write, we copied the code from pdf_create_page which defines the contents as a new dictionary. This may be why it triggers a warning (and an error in evince) on reading: a Contents should be either a stream or an array of streams, not a dict. Is it?14:59.49 
Gigs- so the lookup stream is out1-low out2-low out3-low out4-low out1-high out2-high ... etc?14:59.53 
kens I've been creating PDF functions to do linear interpolation of endpoints when I have to colour convert the tint transform of DeviceN and Separation values, so I ought to be up to spee don this15:00.01 
Micha` s/set force/force/15:00.02 
kens Gigs- : No, outlow 1, outlow 2, outlow 3, outlow 4, outhigh1, outhigh 2, outhigh 3, outhigh 415:00.36 
  But let me find the relevant doc15:00.49 
Gigs- yeah that's what I meant15:00.54 
  your help is much appreciated, it's a little hard to find where the details of all this are documented15:01.20 
Robin_Watts Micha: It's entirely possible I screwed up. it serves me right for trying to drop what I'm doing and do quick fixes for people.15:01.34 
kens Gigs I think this is it:15:02.23 
  "Sample data is represented as a stream of unsigned 8-bit bytes (integers in the range 0 to 255). The bytes constitute a continuous bit stream, with the high-order bit of each byte first. Each sample value is represented as a sequence of BitsPerSample bits. Successive values are adjacent in the bit stream; there is no padding at byte boundaries."15:02.23 
  Because you only have one input you don't need to worry about the multi-dimensional stuff15:03.07 
  "For a function with multidimensional output (more than one output value), the values are stored in the same order as Range."15:03.20 
Gigs- yeah but that doesn't tell you what you just told me, that the ordering is all the low limits first and then the high limits, for some reason I kept trying to parse it in my head as Clow Chigh Mlow...e tc15:03.23 
kens Is hte key point15:03.28 
Gigs- because range is 01 01 01 01 and not 0 0 0 0 1 1 1 1 the way I'd expect from that line in the documentation15:03.52 
Micha` Robin_Watts: Well, you went the safe way by copying existing code, though. But no stress on fixing this; I can make local changes. I guess it'd be better if I opened bug reports rather than randomly reporting them here.15:03.52 
kens Right 0 1 is the range of the first sample, then 0 1 again for the 2nd and so on15:04.16 
Robin_Watts Micha: Yeah, most of the time I can't test these quick fixes instantly.15:04.17 
  Hence if I make changes like this, it would be good if you could test them and let me know, that way I can avoid committing broken stuff to the golden repo.15:04.44 
Gigs- kens: one more question, a little higher level, this file I have defines this tint transform twice for the same separation name15:04.53 
Micha` Well it DID prevent segvs :-)15:05.05 
kens Really ? that's odd, how does it do that ?15:05.10 
Gigs- kens: single page file, etc. GS seems to ignore the first definition and use the second. 15:05.14 
kens Gigs- : can I look at the file ?15:05.26 
Gigs- kens sure15:05.29 
Robin_Watts Opening bugs is good. You can put suggested fixes on the bugs too if you have them.15:05.29 
Gigs- one sec15:05.32 
Micha` Ok, will do.15:05.45 
Gigs- kens: http://www.gigstaggart.com/pics/13100241401.pdf15:06.46 
kens one moment15:07.02 
Gigs- object 6 and 56 for Dieltblue, renders as Cyan15:07.22 
  obj 9 and 71 for Varnish15:07.37 
kens OK so where's the duplicate ?15:08.15 
  Oh 6 & 5615:08.31 
Gigs- referring objects are 7 and 5715:08.59 
kens Right so you have two colorspaces referencing the 2 functions15:09.15 
  Not too surprising15:09.21 
Gigs- deviceN spaces?15:09.28 
kens Separation spaces15:09.35 
  THey have the same name15:09.52 
Gigs- Is it valid to have two separation color spaces with the same name?15:09.56 
kens and teh same tint transform15:10.00 
  PDF defines objects by their object number, so you cna have as many definitions of a colour as you like15:10.24 
  You can in PostScript too, each new one overrides the previous15:10.37 
Gigs- when it encounters data in that color space how does it know?15:10.39 
  oh so just the last one encountered then15:10.46 
kens The colour will be set in the contents stream15:10.51 
Gigs- When Varnish for example is defined as an element in a deviceN colorspace, the Separation tint transform is not used right?15:11.47 
kens object 4 defiens page resoruces, and it hsa a ColroSpace dictionary which references object 7 as /Ap_sep_Dieltblue15:11.49 
Gigs- in that case it would go through the deviceN's transform instead?15:12.33 
kens Object 57 is used in the definition of the Colorspace named /DN_415:12.54 
  Gigs- : there are no DeviceN here, these are both separation15:13.06 
  object 16 is DeviceN15:13.19 
Gigs- yeah but Varnish is also an element in several DN colorspaces15:13.23 
kens Yes15:13.30 
Gigs- this all seems so inefficient heh15:13.42 
kens Like I said, you can have as many named color spaces as you like15:13.45 
  Inefficient is one word, certainly :-)15:13.54 
  Possibly its a collection of EPS files so there are multiple ink definitions15:14.31 
Gigs- so if I wanted to alter every occurance of "Varnish" on this page, I need to go through all the separation color space definitions, and also change it in every device N colorspace it occurs in?15:14.37 
kens I should say *was* EPS files15:14.38 
Gigs- I should hope they are not internally still using EPS, but you never know. It's an artpro file originally15:15.07 
kens I'm not sure what you are asking about the Varnish15:15.24 
  THe Varnish ink (separatin or DeviceN) might be used by any number of colour spaces15:15.42 
Gigs- if I want to alter the tint transform for Varnish globally15:15.56 
kens If you want to alter the use of Varnish, then you need to alter every colour space which uses that named ink15:15.59 
Gigs- thanks that confirms what I thought15:16.12 
kens Gigs its possible that each colour space using Varnish has a different tint transform :-)15:16.21 
Gigs- possible technically, but would make no sense from a print standpoint15:16.50 
kens The multipl eink definitions might also reflect some kind of internal layout choice of the app, like layers15:16.54 
Robin_Watts tor7: OK, moving to openjpeg 2 produces 308 diffs. I've just checked all the bmpcmps, and they are all progressions or neutral.15:16.56 
Gigs- not in separated litho world15:16.57 
Robin_Watts some of them are really noticable improvements.15:17.03 
  so all the stuff on robin/master (except for the last 2) are ready to go.15:17.18 
kens Gigs in separations, its moot, because of course the tint transfrom won't be used15:17.23 
tor7 so which version were we using?15:17.24 
Robin_Watts We were still on 1.5.0+patches I think.15:17.38 
kens heads back to the colour salt mine15:17.40 
Gigs- kens: yeah moot except for when I need a CMYK or RGB version and some artist put a 30% orange tint on the varnish so they could see it15:17.54 
  kens: hehe15:17.57 
Robin_Watts or at least, we certainly didn't have all shellys fixes.15:18.00 
  regardless, this is a step forwards.15:18.08 
Gigs- kens: so I'm looking at either using mupdf or a custom thing to alter all the tint transforms in a file in a minimally invasive way15:18.44 
kens OK15:18.51 
tor7 Robin_Watts: alright. I'm a bit worried about the state of our openjpeg thirdparty git though, which branches come from where etc15:19.21 
Gigs- I'm going to hopefully not encounter creative colorspace definitions that include stuff like PS code15:19.45 
  prepress programs almost always use functiontype0 it seems at least15:19.57 
kens Gigs PS code you shouldn't see15:20.00 
chrisl Gigs-: Eek! Send it back to the "artist" and tell them to make their PDFs better.......15:20.04 
kens Other function types are hard to sue15:20.10 
  use*15:20.20 
Gigs- I know chrisl... it's hard, some of our files are sent in and the customer always says "well your competitor doesn't have a problem with our perfect files"15:20.41 
kens and sice the tint transform is 'wrong' anyway, it doesn't matter if it doesn't look very good15:20.42 
Gigs- so that's what we call "blind exchange" :)15:21.10 
Robin_Watts tor7: I think following the gs one is a reasonable model.15:21.23 
tor7 Robin_Watts: if I read the git tree correctly, we've been using 2.0+patches for quite some time15:21.34 
Robin_Watts And we can't delete the stuff that's in there already without breaking history.15:21.52 
  tor7: Yeah, maybe it's just shellys fixes that we've pulled in.15:22.11 
  Let me update the commit message.15:22.17 
chrisl Gigs-: my worry would be "fixing" the "wrongly" and getting something not intended by the user15:22.26 
Gigs- chrisl: not much worry, since like kens said, separation color spaces on a separated device like a plate maker ignore all the tint anyway15:23.00 
  so worse case scenario, the preview is a little weird. But even then, I'm mostly just going to be doing Varnish->000015:23.32 
  it'll be rare I actually adjust a tint15:23.45 
tor7 Robin_Watts: gitk thirdparty/openjpeg shows a commit "take on zenikos OpenJPEG2 fixes", with a submodule commit at the origin/zeniko_fixes branch in thirdparty/openjpeg.git15:24.05 
Gigs- I believe the high end proofers ignore the tint transforms in the PDF too15:24.17 
tor7 which sits quite far down the line from "Import openjpeg-2.0.0.tar.gz"15:24.22 
Gigs- high end proofer pretends to support separated color space and then performs its own transforms to 8 or 9 primary color space that it supports15:24.47 
chrisl Gigs-: I'm a believer in giving the user what they ask for, and not guess what they really wanted.15:25.06 
Micha` Talking about pdf_page_write (pdf-device.c:1334)... It creates a new fz_device for a page using pdf_new_pdf_device, based on whatever Contents is in the page. But it seems that pdf_new_pdf_device expects this content to be a stream. It can however be an array (this is well treated in pdf-stream.c:pdf_open_contents_stream). Is the proper fix to always create a new stream if Contents is an array? Or is it better 15:25.40 
  to use the first stream in the array, if one exists?15:25.41 
Robin_Watts tor7: Oh, rats. I'll need to fix the android build too.15:25.42 
henrys huh emacs gud now has mouse over variable to see values gud-tooltip-mode15:25.46 
Gigs- chrisl: their warehouse manager calls you are complains that the preview on the carton label is unreadable then :)15:25.48 
tor7 and then your commit use latest openjpeg 2.0 from ghostpdl rewinds a hundred commits (reverting down past openjpeg-2.0.0.tar.gz)15:25.55 
Gigs- chrisl: you know how it is I'm sure15:26.03 
tor7 and then pulls in a *separate* GS openjpeg2 integration15:26.20 
Robin_Watts tor7: yeah. I think the gs stuff has a different directory structure.15:26.37 
tor7 Robin_Watts: which is why I suggested you do cherry-pick instead, so we can keep working off of upstream15:27.09 
Robin_Watts tor7: oh, no, I think that's a bad idea.15:27.23 
tor7 Robin_Watts: so, we want to manually merge with upstream?15:27.33 
  or fork openjpeg based on the ghostpdl?15:27.39 
Robin_Watts I think we REALLY want to be following the same version as ghostpdl.15:27.44 
tor7 because the latter is what you're proposing15:27.50 
Robin_Watts If ghostpdl moves to tracking the upstream, then we will too.15:28.03 
  but having 2 different versions of a decoder lib in the same company with all the possibilities for getting fixes out of sync is just madness, IMHO.15:28.29 
tor7 then "Update mupdf to use openjpeg 2.0 from the fork maintained in GhostPDL."15:28.48 
Gigs- you guys know openjpeg 1 is really slow right. When Second Life went open source we put in a bunch of speed improvements but I think most of that wound up in 215:28.56 
Robin_Watts see my revised commit message now.15:29.01 
chrisl Gigs-: not as slow as Jasper15:29.22 
kens Gigs- : its still better than JasPer15:29.26 
Robin_Watts Gigs-: We have been using v2 for a while.15:29.28 
Gigs- jasper is a reference implementation hacked together just so they could put something in the standard before it was ratified15:29.48 
tor7 Robin_Watts: okay. so with this I'm basically going to shut down pulling openjpeg upstream commits from git-svn.15:30.03 
Robin_Watts tor7: ok.15:30.11 
Gigs- but kakadu is like 50 times faster than openjpeg 1 15:30.12 
tor7 and let chrisl handle maintaining the gs openjpeg directory, and pull that out the same as we do for jbig2dec15:30.22 
Gigs- openjpeg 2 got a little closer to kakadu performance but still pretty far off15:30.31 
kens IIRC kakadu is commercial and C++15:30.32 
Gigs- yeah kakadu is not an option, it's just the gold standard for speed is all15:30.44 
chrisl Robin_Watts, tor7: all Shelly's fixes have been passed upstream, so if we get the memory stuff sorted out, we'll be able to track upstream easily15:31.07 
tor7 Robin_Watts: right. then I'll turn off that faucet, set a final tag on the commits we've used before so they don't disappear, and move master over to what we have from git-subtree of the ghostpdl.15:31.16 
Robin_Watts tor7: Moving master over is what my commit does.15:31.37 
tor7 I mean the master in /home/git/thirdparty/openjpeg.git15:31.50 
Gigs- from what I've heard kakadu has some highly optimized MMX code to keep it all on the chip and not blow the CPUs caches 15:31.51 
Robin_Watts tor7: oh, sorry.15:32.04 
  Gigs-: Awesomely cross platform then :)15:32.16 
kens Robin_Watts: beat me to it15:32.27 
Gigs- yeah I know15:32.31 
Robin_Watts Gigs-: We have a commercial solution using Luratech.15:32.38 
Gigs- never heard of them, are they pretty fast?15:32.51 
chrisl Gigs-: the inability to have a free encoder really limits interest in JPX15:32.52 
Robin_Watts At this point, I don't think anyone sane actually uses JPX, so it's mostly a tickbox item.15:33.02 
kens When we needed a JPX decoder for Jaws I wrote one15:33.03 
Gigs- chrisl: there's a patent there?15:33.04 
sebras-hotel Robin_Watts: how does Luratech compare to openjpeg2? significantly fast?15:33.09 
kens Gigs, lots of them15:33.11 
Gigs- oh well, at least patents are a temporary problem15:33.44 
chrisl Gigs-: for decoding the patents are "waived", but not for encoding15:33.52 
Robin_Watts sebras-hotel: I believe Luratech is MUCH better than jasper/openjpeg v1 etc.15:33.54 
kens Technically if you write a decoder you are supposed to seek a royalty-free licence from each patent holder, IIRC there are about 2015:33.54 
Gigs- heh well at least standards groups are mostly learning their lesson about allowing RAND terms15:34.41 
chrisl kens: I thought you could go through ISO, now, rather than approach each holder individually - maybe I got that wrong15:35.16 
kens chrisl that may be true, I'm going back quite a bit there15:35.29 
  I had to work with teh people in the Hall to get it to happen15:35.39 
henrys chrisl: that patch may be wrong for the 32 bit case I don't see how it would use unsigned long if USE_LARGE_COLOR_INDEX == 0. we need an "else" in msvclib.mak.15:36.13 
chrisl Gigs-: the patents may be a temporary problem, but by the time they expire, the format will probably not be relevant15:36.56 
  henrys: It might handled in genarch15:37.19 
henrys chrisl: maybe I'll check it sometime today.15:37.50 
Robin_Watts Global warming/overpopulation/energy shortages are similarly temporary problems.15:38.00 
Gigs- chrisl: Maybe that particular one, but progressive decoding will probably still be relevant. Especially for GIS type data where you want to have a massive massive image and be able to smoothly navigate and zoom15:39.07 
  or even just render a low res version quickly15:39.21 
chrisl henrys: genarch.c line 36-3815:39.24 
Robin_Watts tor7: OK, new version of the commit up there that solves android builds too.15:39.44 
henrys and you want me to read a line in ghostscript code and assume it's going to happen without testing -- Hump day humor?15:40.07 
Gigs- chrisl: I mean like my prepress preview caching system, I use GS to render at 300 DPI and then I have to use traditional scaling to produce smaller versions for different uses, that's a prime application for something that has the capabilities JPEG 2000 has15:40.20 
chrisl henrys: this isn't really ghostscript, it's just genarch15:40.55 
  Gigs-: the problem is, jpeg2000 is too big, too complicated, and badly patent encumbered - that *really* limits uptake on something like that15:41.39 
Gigs- yeah it's sad because there's a lot of "killer apps" that are being held back15:41.57 
  google maps could be a lot smoother for example15:42.08 
  instead of the stupid tile system they use15:42.32 
chrisl It's always a problem when too many vested interests get involved in a spec like that15:43.00 
Gigs- at least companies like Google have the weight to leverage a standard into being free these days15:43.53 
  I have a feeling Google leaned on Apple regarding HTMl5 canvas for example15:44.36 
  when apple started disclosing patent claims15:44.49 
Robin_Watts google holds no sway with apple.15:45.22 
  Look at VP8/Theora/WebM.15:45.33 
  The whole iOS vs Android wars etc.15:45.44 
Gigs- it depends on how bad each side wants it I guess15:45.56 
chrisl Gigs-: from a PDF point of view, a lot of the nice features in JPG2000 are of limited relevance.15:46.20 
Gigs- html5 canvas was critical for google, and Apple wants to kill Flash anyway, so they were probably a little more willing15:46.33 
  chrisl: yeah, I was just telling Robin yesterday when I was having openjpeg lib problems compiling mupdf, I wouldn't mind not linking it, it's just not that useful these days15:47.50 
  but eventually something like it will probably be a Big Deal(tm)15:48.41 
chrisl Gigs-: but 'cause it's in the spec, we have to handle it, which is a pain. I'm not convinced it will be a big deal. PDF mainly benefits from the better compression, but with disks being huge and cheap, and ubiquitous broadband, that's of lessening importance.15:50.06 
Robin_Watts Increases in compression will always be useful as resolutions rise.15:51.01 
  If H264 wasn't better at compressing than MPEG 2, HD video would be at a big disadvantage.15:51.28 
Gigs- yeah and like I said, there's applications out there that may not at first be obvious15:52.12 
Robin_Watts If you want to watch HD sport over broadband, you need a 15 Meg connection.15:52.23 
  And 4K TVs have 5 times the number of pixels.15:52.38 
chrisl Robin_Watts: yeh, but there's a huge difference between single images, and motion pictures15:52.50 
Robin_Watts chrisl: Indeed.15:52.57 
  The problem is that each generation of codec (be it video or still image) throws away the last standard and starts again.15:53.33 
Gigs- well not entirely, the multi-res and region of interest features would open up new doors in the video world too15:53.41 
Robin_Watts So patents being 'temporary' means that by the time the patent runs out, the format is obselete.15:53.54 
chrisl Gigs-: none of which is relevant to PDF.....15:54.03 
Gigs- think, CSI style zoom-and-enhance that actually looks like it does on the movies :P15:54.09 
  yeah not directly15:54.29 
chrisl I think Adobe rushed into including JPX (and JBIG2) in PDF15:55.07 
sebras-hotel chrisl: wouldn't it be possible to use jpx's multiple resolutions when rendered images in documents based on zoom-level in a viewer?15:56.00 
  chrisl: or something like that.15:56.10 
Robin_Watts Adobe did it, I suspect, because they thought they could a) drive adoption, and b) tout how well they compressed stuff.15:56.19 
  ray_laptop: Hi.15:56.21 
ray_laptop Robin_Watts: here now.15:56.22 
  Robin_Watts: Hi. Got your SMS15:56.33 
chrisl And frankly, when a reference implementation is as big a mess, incomplete and buggy as Jasper, that should be a hint that there's a problem with the spec.15:56.39 
Robin_Watts So, I have the plumbing in place to do post processing in the clist cases (both with and without threads).15:56.57 
ray_laptop Robin_Watts: OK.15:57.07 
Robin_Watts There is a commit up on my repo on casper for it.15:57.11 
  BUT, various things have become clearer to me in doing this.15:57.29 
ray_laptop I'll have a look. But what is that about needing a device function ?15:57.30 
chrisl sebras-hotel: possibly, but it would kind of break the interpreter/device independence implicit in PDF15:57.36 
ray_laptop vs. a printer_procs function that we discussed15:57.43 
sebras-hotel chrisl: true.15:58.06 
Robin_Watts right. What i have at the moment uses a printer_procs function. And I think it's a poor solution for the reasons I am about to give you.15:58.15 
  Firstly, I cannot see how to make this work for the non-clist case.15:58.41 
henrys kens: I assigned 694704 back to marcosw assuming he'd assign the rest to you, but I haven't heard from marcosw in a bit...15:59.27 
kens Hmm, I'm not convinced I have anythign to say on that bug15:59.42 
  Its not really a PDF/PS interpreter issue, and its not pdfwrite. More graphics library it seems to me16:00.15 
Robin_Watts There is no single function that gets called by the non-clist case - we'd want the post processing to happen immediately after the get_bits_rectangle call, and there are just too many get_bits_rectangle implementations in there to know which one is being called at any given time.16:00.38 
ray_laptop Robin_Watts: gdev_prn_get_bits and gdev_prn_get_lines don't suffice ?16:01.00 
henrys well somebody needs to verify if we put a halftone in Resources it works, which I thought to be language stuff kens16:01.10 
Robin_Watts The png devices don't call those functions, for example.16:01.23 
henrys kens:question 316:01.36 
ray_laptop Robin_Watts: OK.16:01.41 
kens Hmm, I can certainly put a halftone in Resources, but I'm not certain that proves much16:01.43 
  Oh proprietary halftone types ?16:01.53 
Robin_Watts The png devices (and the tiff devices, and others) all call the downscaler, which calls get_bits itself.16:02.08 
henrys kens:yes I thought a customer could put a proprietary halftone in resources and protect it. I guess that is my question.16:02.53 
Robin_Watts Which leads me to my next issue... if they use the downscaler, they can't make use of the post processor.16:02.56 
  unless we can find a way to push the downscaler into the post processor too.16:03.08 
henrys kens:maybe ray knows16:03.13 
ray_laptop Robin_Watts: actually, the downscaler _is_ a post processor16:03.24 
kens henrys I have no idea, I don't know if we support type 9 or 100 dictioanries, and we wouldn't know what to do with them anyway16:03.28 
Robin_Watts ray_laptop: Right.16:03.31 
henrys kens:I've answered question 1 and 216:03.33 
kens We don't have to saupport them to be compliant16:03.37 
ray_laptop but the downscaler can't cope with running in bands (at least when doing FS). Maybe when doing BNM16:04.20 
kens If I try to set a type 9 halftone we get a rangecheck16:04.47 
Robin_Watts ray_laptop: BUT our current scheme of having the post process function as a printer function means the downscaler can't easily replace hook itself in.16:04.51 
kens SO we don't support them it looks to me16:04.57 
henrys kens:I think you have to install one first.16:05.01 
Robin_Watts ray_laptop: So I have a plan that I like more...16:05.12 
ray_laptop listens16:05.20 
henrys and then I think it is no different than a regular halftone except the data can't be read .16:05.29 
Robin_Watts I'd like to introduce a new device function: get_processed_bits.16:05.34 
kens henrys so how ouwld this help ?16:06.02 
Robin_Watts It's essentially get_bits_rectangle, but with an additional parameter of the post_processing details.16:06.15 
kens Looks like investigating this will be a lot of effort16:06.22 
Robin_Watts We can implement it as a default that calls get_bits_rectangle then does the post processing.16:06.49 
henrys kens:I believe the customer wants to install a halftone that can't be read.16:06.52 
kens henrys I don't think so, uinless I'm misreading this16:07.08 
ray_laptop Robin_Watts: so get_processed_bits gets the callback function ?16:07.20 
Robin_Watts get_processed_bits does the get_bits and then post processes it.16:07.40 
kens The customer produces contaone and post-processes it to halftone, so they don;t need a hjalftone dictioanry at all16:07.45 
Robin_Watts For clist, we implement get_processed_bits directly.16:08.03 
ray_laptop Robin_Watts: OK. Fine for post processing that is single threaded16:08.17 
Robin_Watts (it's easy - it's just the current code with an extra param pushed through everywhere)16:08.42 
  For everything else, we just do a fallback that calls 'get_bits' and then calls the post processor.16:09.01 
  If anyone calls clist_get_bits_rectangle, we can just implement that as a call to clist_get_processed_bits with the new param blank.16:09.41 
ray_laptop Robin_Watts: so how does this get us post processing in the rendering threads16:10.01 
Robin_Watts That way the multi-threaded version does the work on the threads in the clist case.16:10.08 
  because the rendering threads have the parameter passed into them.16:10.23 
ray_laptop Robin_Watts: OK. So how does the downscaler hook in ?16:10.29 
Robin_Watts Just a mo.16:10.54 
  So this scheme should nicely unify the clist-single threaded/clist-multithreaded/non-clist cases.16:11.19 
  and it's backwardly compatible etc.16:11.32 
ray_laptop Robin_Watts: because some post processors will be thread safe, and some not (the current FS downscaler is the latter)16:11.37 
Robin_Watts OK, so the downscaler.16:11.50 
  currently the way the downscaler works is that the devices call a 'downscaler_get_bits' function.16:12.09 
  which does get_bits and then downscales.16:12.31 
  We'd offer a new downscaler_get_processed_bits call.16:12.53 
ray_laptop Robin_Watts: right. So that doesn't really change. Since it needs the bits in order anyway16:12.55 
Robin_Watts ray_laptop: Right. Ignore the error diffusion case for now, as that's a blocker however we slice it.16:13.30 
ray_laptop downscaler_get_bits *are* processed, aren't they ?16:13.37 
henrys kens:trust me, he doesn't want anybody to see the halftone… but it's fairly clear from PLRM what 9 and 100 are.16:13.54 
kens henrys I can define a type 9 halfvtone as a resuorce, but as soon as I try ot use it I get an 'undefined' error16:14.06 
Robin_Watts downscaler_get_bits does a get_bits and then downscales them.16:14.16 
henrys kens:and it seems like we should support it.16:14.18 
Robin_Watts downscaler_get_processed_bits would be a request to get_bits, downscale, then post process.16:14.35 
ray_laptop so what is different about downscaler_get_processed_bits ?16:14.41 
Robin_Watts so, say we were doing a PNG output device where we wanted to use the post process stage to do the compression.16:15.18 
kens henrys I don't understnad the requirement, since the halftoning is post-rendering, it doesn't matter a jot what the PostScript says the halftone is16:15.29 
ray_laptop kens: halftoning is not post rendering16:15.50 
kens And why should we support type 9 halftones ? What do we expect the to do ?16:15.51 
ray_laptop halftone is part of the rendering16:15.59 
kens ray_laptop : I thought this customer case was16:16.01 
  "(Note that we have our own proprietary halftoning engine so we use our contone device instead which outputs an excellent RLE-compressed proprietary display list for further processing.) "16:16.17 
henrys kens:a postscript program can print out the values in your halftone which some folks would like to keep private for reasons legitimate and otherwise.16:16.23 
ray_laptop kens: I was talking PS spec16:16.24 
kens ray_laptop : and I'm talking customer-specific bug report16:16.37 
ray_laptop kens: sorry.16:16.45 
kens henrys why does it matter what's in the PS halftone ? If they aren't using it anyway16:16.58 
henrys kens:I was assuming he would associate type 3 with his halftone and do something else if requested.16:17.51 
Robin_Watts ray_laptop: So in order for us to usefully do downscaler_get_processed_bits, we want to push both the downscale and the user requested post process back onto the rendering threads.16:17.54 
henrys kens:type 916:18.04 
Robin_Watts ray_laptop: Are you with me?16:18.14 
ray_laptop Robin_Watts: but we can't do downscale in threads, can we ?16:18.29 
kens OK so since he isn't using the halftone, let him set it up as something else, and it does not matter if someone reads it, its not relevant to what they do16:18.33 
  My feeling was they wanted to set type 9 because they hoped that GS would 'do nothing' then and the crash would go away16:18.52 
Robin_Watts ray_laptop: Currently the code doesn't do that. But there is no reason why we can't (in the non-error diffused cases anyway).16:19.07 
ray_laptop Robin_Watts: we _could_ do idempotent downscale in threads IFF the band contains the correct multiple of the lines, and there is no halftoning or if there is, it is BNM or something16:19.57 
Robin_Watts the user would call downscaler_get_processed_bits and would pass in it's post process function A.16:20.05 
henrys kens:I read it that he would like to have a type 9 dictionary like there is on most modern printers that is default and proprietary, that will represent his halftone, then the customer may request something else.16:20.06 
kens Well, we differ in opinion, maybe someone should ask16:20.38 
ray_laptop Robin_Watts: OK. So I we are talking about MT and an idempotent downscale case16:20.44 
henrys kens:that is the way my color and mono printer work.16:20.47 
kens All that type 9 means on modern prtiners is that its a halftoning technique that 'not PostScript'16:20.55 
ray_laptop (if idempotent is the right word)16:21.06 
Robin_Watts the downscaler would then make a function B that "did the downscale and then called A", and would pass that into get_processed_bits.16:21.10 
ray_laptop Robin_Watts: so the post processing gets 'chained'16:21.35 
kens henrys : it doesn't mean anything at all, and the inability to read it just means its 'not PostScript' so it doesn't make sense16:21.35 
Robin_Watts For the downscaler to be post processable, we'd need the bandheight to be a multiple of the required downscale size.16:21.54 
  ray_laptop: Right.16:21.59 
kens Naturally all our halftone code is written in PostScript :-(16:22.02 
henrys kens:I'm reading 7.4.7 in PLRM is that what you are reading?16:22.19 
Robin_Watts Now, such chaining, to me, really says we shouldn't be doing it with a printer proc entry.16:22.20 
  (not to mention the nasty hernias that produces in casting from clist_device to prn_device).16:22.49 
ray_laptop Robin_Watts: so how does it get determined if the post processing can be done out of order ?16:22.51 
kens henrys yes16:22.51 
Robin_Watts ray_laptop: The downscaler can determine that for itself.16:23.05 
henrys It says: If present, they will usually be the device’s default halftone dictionary; consequently, any printing that a PostScript program does will automatically take advantage of them (unless the program performs its own sethalftone call).16:23.13 
kens henrys yes, that's what I'm saying16:23.33 
  THey are 'non-PostScript' screenign technuiques16:23.45 
ray_laptop Robin_Watts: but, in the thread, how do we know whether or not to do the post processing, and which post processing16:23.55 
kens A|s such you *can't* read them because they are not PostScript16:23.57 
Robin_Watts ray_laptop: In the thread, if you are given a post processing function, you call it.16:24.13 
ray_laptop Robin_Watts: so the downscaler_get_processed_bits decides whether to call get_bits(_rectangle) or get_processed_bits(_rectangle) ???16:25.10 
mvrhel_laptop whew. what a morning. wife was in the front of a 4 car collision. luckily she ended up with just a scratch since the first 3 absorbed the majority of the kinetic energy16:25.51 
ray_laptop Robin_Watts: I still don't follow how the thread gets "given the post processing function" ?16:25.56 
henrys kens:there is nothing wrong with defining a type 9 threshold array or regular halftone which could be read and should be treated as proprietary.16:25.59 
Robin_Watts The downscaler_get_processed_bits will always call get_processed_bits - just it might choose to pass in a null post process function, in which case it will call it single threaded later.16:26.06 
ray_laptop mvrhel_laptop: so she's OK ?16:26.15 
mvrhel_laptop yes16:26.20 
kens henrys you *cannot* define a type 9 halftone in PostScript16:26.20 
Robin_Watts mvrhel_laptop: Ouch. Watch for whiplash :(16:26.36 
ray_laptop mvrhel_laptop: was it her that ended up with just a scratch, or just her car ?16:26.41 
kens All you can do is interrogate a device and discover that its current (or default) halftone is type 9, and therefore 'not PostScript'16:26.45 
henrys kens:at compile time by the developer16:26.58 
kens The bottom line is we don't support it16:27.09 
Robin_Watts ray_laptop: Currently the threads are all called from within clist_get_bits_rectangle16:27.09 
mvrhel_laptop the car. she has no injuries. woman who started collison was texting and plowed into stopped cars16:27.12 
kens As far as I can tell16:27.20 
Robin_Watts We'd be changing that so that all the threads were called from within clist_get_processed_bits16:27.42 
henrys kens:I understand that we should support it.16:27.44 
mvrhel_laptop looks like I am missing a good conversation. reading logs16:27.51 
ray_laptop After I dropped my 7 yr old off, a BIG fire truck pulled up to the school, and as I was driving away, an ambulance came in (lit up and sirens) and another big fire truck.16:27.56 
kens Big project. By the way, there's nothing to stop a PostScript program reading a type 9 halftone dictionary16:28.09 
  "Any such optional entries are strictly private: although they are visible to16:28.21 
  PostScript programs in the dictionary returned by the currenthalftone operator,16:28.21 
  there is no way for a program to know what they control or what their permissible16:28.21 
  values are."16:28.21 
mvrhel_laptop ray_laptop: wow16:28.48 
ray_laptop I haven't called the school yet to see what was going on. I figure I'll wait until things calm down16:29.06 
chrisl How would we "support" proprietary screening? It needs support in the rendering code, or in the device16:29.13 
kens chrisl that's the point I'm trying to make16:29.26 
henrys kens:yes that is not a problem, the issue is dumpling the actual data that comprises the threshold array, that will be of concern to this customer and printer customers in general.16:29.40 
chrisl kens: just rephrasing the point slightly16:29.55 
ray_laptop Robin_Watts: the threads are "started" in clist_get_bits_rectangle_mt16:30.02 
kens henrys since its 'not PostScript' you can't dump it, its not relevant because its not PostScript16:30.09 
Robin_Watts ray_laptop: Yes. Which is called via clist_get_bits or clist_get_bits_rectangle.16:30.31 
kens henrys it mattrers not at all how the developer defines their sacreening, since tis not PostScript there is nothgin we *can* return16:30.36 
  The only use for a type 9 or 100 halftone dictionary is for currenthalftone to be given somethign whihc says ' yeah we're screening'16:31.07 
  There is no realistic way for sethalftone to 'set' a type 9 or 100 haftone16:31.35 
ray_laptop Robin_Watts: OK, if a function calls clist_get_bits_rectangle_mt it does no post processing, but if it calls clist_get_processed_bits then the post processing is done in the threads ?16:31.49 
kens So I'm not sure what it is you want to support16:31.50 
chrisl If they are that worried about people seeing a threshold array, they could just redefine currenthalftone to return nonsense (as several laser printers seem to do)16:32.09 
Robin_Watts ray_laptop: We'd rename clist_get_bits_rectangle_mt to clist_get_processed_bits_mt and add the extra param.16:32.31 
kens chrisl since they aren't using PS halftoning, the values returned by currenthalftone will be 'nonsensse' ( ie not what's being used) anyway16:32.52 
ray_laptop Robin_Watts: and a post process get_processed_bits function that needs data in order calls clist_get_bit_rectangle16:32.54 
henrys chrisl:and why not just do type9?16:32.59 
kens henrsy why bother ?16:33.06 
Robin_Watts yes.16:33.07 
kens henrys^^16:33.11 
henrys kens:because that is what other printer manufacturers do and it is a documented way of presenting a proprietary halftone.16:33.55 
kens Implementing a type 9 halftone *return* (we can't set one) is effort, whereas just leaving the default halftone is no effort. Since they are not using the default halftone, nothing is exposed16:34.09 
chrisl henrys: the problem is, when we call the device to retrieve the current halftone, what we do with it? It's not going to be something any of our interpreters understand16:34.23 
  henrys: also, it's not what all printer manufacturers do16:35.01 
ray_laptop Robin_Watts: OK, so now in the threaded case, where do the threads put the results?16:35.40 
Robin_Watts ray_laptop: OK. Previously, I was suggesting that the post process stuff got to work directly on the buffer device, right?16:36.17 
ray_laptop Robin_Watts: yes, and I *really* don't like that16:36.44 
Robin_Watts Now, I'm thinking that the post process stuff should get fed the results from the 'get_bits'.16:36.53 
henrys chrisl: they get the generic entries of the halftone type and they get the number "9" presumably they can write postscript programs that are conditioned on the type being 916:37.04 
Robin_Watts That way, the caller has specified the formats they can accept already in the get_bits options fields.16:37.21 
ray_laptop Robin_Watts: threads don't have a get_bits16:37.25 
henrys I'll just ask him but to me it is fairly clear what he wants.16:37.32 
kens You can write a PostScript program conditional on any value you like, but it won't be portable16:37.33 
Robin_Watts We can arrange for the options to be passed into the threads.16:37.40 
chrisl henrys: that would be very, very bad Postscript.16:37.42 
henrys kens:he doesn't care about that in the startup code for his device.16:37.57 
ray_laptop Robin_Watts: reading from the buffer device is fine. Writing the results back into the buffer is what I don't like16:37.59 
kens henrys if you really want this it will not be any time soon16:38.03 
  henrys why does he care about the halftone type in the strtup code for his device at all ? He *knows* the halftone is not PostScript16:38.39 
henrys I don't want it the paying customer wants it.16:38.41 
kens henrys I'm not convinced he does16:38.50 
mvrhel_laptop It would seem to me that if they (customer 885) are going to be doing something proprietary with their halftone then they will need to wrap that functionality up in their device. I suppose we should/could have a demo device for this. 16:38.52 
kens Nor that he neds it16:38.55 
chrisl mvrhel_laptop: that's what the "scaled" devices do16:39.25 
ray_laptop Robin_Watts: BTW, get_processed_bits needs to return the size of the buffer that it filled (in case it's doing compression)16:39.32 
Robin_Watts ray_laptop: get_bits can be called with different options, to say whether the data should be put in a buffer provided by the caller, or whether pointers to the buffer are OK.16:39.35 
kens henrys if you are going to ask him whether he needs a type 9 halftone, ask him as well to explain *why* he needs it16:40.01 
mvrhel_laptop chrisl: you mean doing the halftone after the rendering to contone16:40.02 
  I don't know why you would really fool with the type 9 stuff then16:40.19 
henrys kens:you are welcome to follow up if you like.16:40.22 
chrisl mvrhel_laptop: using a custom halftone algorithm16:40.25 
mvrhel_laptop yes16:40.29 
ray_laptop Robin_Watts: so how does clist_get_processed_bits_mt know what size buffer each thread needs for its results ?16:40.30 
Robin_Watts If the caller asks for the data to be put into a supplied buffer, then the post process phase can work in place.16:40.44 
kens henrys probably better not be me, I'm cross with it already16:40.45 
henrys kens:I can tell you why I would like one if I were making a product.16:40.47 
chrisl mvrhel_laptop: although, it might be nice to have a simpler example - when we've got plenty of spare time!16:41.05 
ray_laptop Robin_Watts: because the get_processed_bits call doesn't know what size the band is 16:41.10 
kens henrsy it looks to me like he just hopes that not setting a halftone will buy him some time16:41.49 
ray_laptop Robin_Watts: but we really want a thread to be able to post_process and entire band that it can then return16:41.52 
kens reduced processing time.16:41.55 
chrisl There's no support in the graphics library for anything other than Type 1 and Type 4 halftones, if I'm reading it right.16:42.05 
kens The amoutn of work I'll have to put in to avoid doing that probably costs as much as the one off halftone building16:42.16 
chrisl Oops, I mean Type 1 and 216:42.23 
henrys if somebody dumps out the halftone and they see type 9 they go look in the PS manual and there you go, they understand this is a proprietary thing, not the normal PS mechanism, seems perfectly reasonable thing to do.16:42.28 
kens especially since we can't prevent the PostScript calling sethalftone16:42.34 
  henrys right, and ?16:42.44 
Robin_Watts If the caller asks for the data to be given as pointers to the data that the buffer is storing, and we don't want to allow the post process phase to fiddle with that stored data, then the post processor is going to need to allocate it's own buffer and work into that.16:42.57 
mvrhel_laptop perhaps when we encounter a type 9, it should be unpickled by the device and then applied in the standard manner or as a after rendering to contone in a sample device16:43.06 
kens There are almost no users who can interrogate a PostScript device anyway16:43.23 
  Most are doing well to be able to post an error message16:43.36 
chrisl mvrhel_laptop: a type 9/100 halftone would come from the device, you can't define it in PS16:43.42 
kens WE CANNOT SET A TYPE 9 HALFTONE16:43.58 
Robin_Watts and the buffers that get allocated can be passed back from the post processor to the device in any device specific way they like.16:43.59 
kens The only thing that would be possible would be to pass a name (if on even exists, its optional!) to the device.16:44.34 
henrys kens:well than you should write adobe and tell them to deprecate the feature and when they pull it out we can tell people they don't need it anymore ;-)16:44.38 
mvrhel_laptop kens: yes. that is what I am saying16:44.50 
kens mvrhel_laptop : type 9 halftones don't usually have names even, just a type16:45.08 
  THey are effectuvely read only16:45.14 
mvrhel_laptop but you have a chunck of data16:45.20 
chrisl Which raises a fundamental problem: the halftone is part of the graphics state, we don't reference the device for gs_currentscreen()16:45.21 
kens henrys plenty of stuff in the PLRM that's useless16:45.26 
mvrhel_laptop and the device would know what to do with it16:45.29 
kens mvrhel_laptop : Here is a valid type 9 halftone "<</HalftoneType 9>>" sethalftone16:45.53 
  Not really much you can do with that.16:46.08 
  In general type 9 halftones are returned by devices which ahve proprietary non-PostScript screening and are not to be altered.16:46.38 
mvrhel_laptop oh I see16:46.48 
Robin_Watts kens: Suppose I was a device implementer, could I do: "<</HalftoneType 9 /MySpecialSauce/Gumbo>>" sethalftone ?16:47.10 
henrys I don't see any requirement they be non-postscript - maybe I just want to hide my postscript screen16:47.14 
kens Robin_Watts : no16:47.17 
mvrhel_laptop so you would not supply such a type in a PS file16:47.23 
kens You could do it with a type 10016:47.24 
  henrys it doesn't matter if trhey are not PostScript, though they generally are.16:47.42 
Robin_Watts kens: Suppose I was a device implementer, could I do: "<</HalftoneType 100 /MySpecialSauce/Gumbo>>" sethalftone ? :)16:47.46 
kens The point is that you cannot set them16:47.48 
  Robin_Watts : yes16:47.54 
  Hence why I keep saying type 916:48.02 
henrys kens:right or read them. You have no way in postscript of installing a postscript screen that cannot be read correct?16:48.34 
  s/postscript/ghostscript16:48.44 
kens But such PostScript is decidedly non-portable, it is totally device-specific, and a PostScript consumer is quite entitled to say 'error' if you do that16:48.48 
  henrys, not in PostScript, no, but its easy enough to have a device which does screening totally divorced from teh PS setup16:49.25 
  OK I have to go16:49.33 
Robin_Watts will bring popcorn to watch this discussion continue tomorrow :)16:49.55 
kens henrys if I set up a GS device which does stochastic screening, that too is not threshold array driven16:50.24 
  Or any other kind of screening you like which is not threshold arrays16:50.38 
  In that case its not PostScript screening so you can't read it back16:50.51 
Robin_Watts ray_laptop: Sorry, I got distracted by the fireworks.16:51.10 
kens THe only real purpose of a type 9 halftone is to say 'I'm screenning and you can't understand how I'm doing it'16:51.29 
  Which is really pretty pointless16:51.38 
mvrhel_laptop I think kens should answer 316:51.39 
henrys kens:I don't know how that relates to what I said: I am a customer that would like to install a plain postscript halftone and have in unreadable how do I do that?16:51.43 
kens mvrhel_laptop : That is what we are yelling about16:51.49 
mvrhel_laptop I know16:51.59 
kens henrys, you don't and you can't16:52.00 
  Not even with a type 9 halftone16:52.09 
Robin_Watts kens: presumably you can't have it unreadable, but you can have it so that it's hard for anyone else to make any sense out of it?16:52.26 
kens You can hjave a device which does threshold screening and doesn't want to tell thbe world, but that's just the same as doing non-threshold screening and not telling the worldx16:52.40 
  The screening technology is not relevant16:52.55 
henrys kens:and I argue I can put that in a type 9 dictionary and have the postscript language protect it. 16:52.57 
kens henrys that is not the point, it does nont protect it. You cannot set such a screen in PostScript16:53.26 
chrisl Robin_Watts: the two printers I've encountered have currenthalftone return, in one case, a null object, and in the other, a "valid" but garbage halftone dict.16:53.46 
henrys kens:it's the default screen16:53.48 
kens You can have it be a threshold array, but its not relevant. You can still leave the default screen in place, after all, you are going to ignore it anyway16:53.51 
Robin_Watts ray_laptop: The problem of what buffers to use/how to communicate those buffers back to the device is the same whether we use a device function or a printer_function.16:54.09 
kens henrys if you aren't going to use the PostScript screening, then it does not matter what type of technology you set up. If you are going to use PostScript screening then you cannot protect it16:55.09 
  ANd with that I really must go and cook16:55.17 
Robin_Watts chrisl: If I was a device manufacturer and I wanted to be able to have people read the current halftone setting, and then reset that again later, I could presumably read the halftone setting out as a dictionary with all the values in, and then allow that to be set again later (but not as a type 9).16:55.21 
chrisl Robin_Watts: a lot of printer manufacturers lock the screens (even Postscript ones) so they can't be changed anyway16:56.02 
Robin_Watts chrisl: Right, but if I wanted to allow the screens to be set.16:56.23 
chrisl Then you can't really protect the screens, because they must PS screens16:56.48 
henrys chrisl: why can't you protect the screens? They simply can't be accessed.16:57.26 
chrisl henrys: if you want to read, and *set* the screen, the screen must be readable in PS16:57.56 
Robin_Watts I will not get drawn into this. I will not get drawn into this....16:57.58 
  ray_laptop: You still here?16:58.05 
henrys chrisl: I think this is exactly what type 9 gets at you can set the screen but you can't see it.16:58.31 
ray_laptop Robin_Watts: agreed, but I still want to map it out. Particularly for at least a simple example post_process function e.g. 16:58.34 
Robin_Watts ray_laptop: Right, sure.16:58.43 
  but you're not completely offended by what I've described so far ?16:59.11 
ray_laptop Robin_Watts: sorry. was on the phone. One kid at school was having trouble breathing. They scrambled everything but jets.16:59.17 
chrisl henrys: I've never seen a printer that let you set a Type 9 screen, and have it do anything - I've see a few that completely sethalftone.....16:59.23 
Robin_Watts ray_laptop: not your kid though?16:59.29 
henrys that's my read of type 9 in the manual: (LanguageLevel 3) Defines a single halftone screen whose data is proprietary. The halftone dictionary may contain only the standard entries defined by Adobe.16:59.30 
ray_laptop Robin_Watts: no offense 16:59.31 
  Robin_Watts: no, when I was walking to my car after dropping my son off was when the first fire truck got there.17:00.16 
henrys chrisl: anyway I asked the customer.17:00.32 
ray_laptop so they had been called some time prior17:00.33 
chrisl henrys: if it can only contain standard entries, where do you put your proprietary data?17:00.36 
Robin_Watts right.17:00.37 
  ray_laptop: OK, so one possibility is that we only allow post_process functions to work in the case where the get_bits has been done to a caller supplied buffer.17:01.21 
chrisl henrys: FWIW, I think this was poorly thought out in PS - the halftone should be a device param, not a graphics state entry.17:01.25 
Robin_Watts The post process functions can safely write updated values back into that buffer.17:01.52 
ray_laptop Robin_Watts: but the main thread that calls get_processed_bits starts several threads, but only provides a single buffer17:02.24 
Robin_Watts each of which writes into a non-overlapping sub area of that buffer.17:02.45 
chrisl henrys: I think we'd take a performance hit to support this stuff, not sure how 17:02.56 
  much though17:03.03 
Robin_Watts so each of the post process functions would work within the same non-overlapping sub area of that buffer.17:03.05 
  Imagine that my post-process function was to apply a gamma or something.17:03.23 
ray_laptop Robin_Watts: OK. so how does the main thread caller decide how big a buffer to use ?17:03.33 
Robin_Watts ray_laptop: The buffer sized required for a get_bits operation is well defined.17:03.52 
henrys chrisl: I assume most devices put the data in the Thresholds entry and if you try and query that and the dictionary is type 9 it won't read it.17:04.20 
Robin_Watts When you call get_bits with OPTION_COPY (or whatever it is) you provide a buffer large enough for the required rectangles bits.17:04.37 
ray_laptop Robin_Watts: but recall that the main thread caller doesn't know how many threads will be used, and what the band size is (at least without clist invasion)17:04.45 
henrys ray_laptop: did you do type 9's halftones at calcomp?17:04.49 
  we had them at QMS but I never knew the details.17:05.17 
ray_laptop henrys: we did default HT with BNM's using a hack, and allowed a PS program to override the HT with sethalftone. 17:05.59 
  henrys: the hack was a ThresholdArray that was of a known funky dimension 1x14 (CalCompDefault)17:06.50 
Robin_Watts ray_laptop: The caller says "here is a buffer, get me this rectangle into this buffer, and apply this post process operation on it".17:07.10 
  The implementation may choose to break that down so that several threads are used to get different parts of that rectangle.17:07.39 
henrys chrisl: anyway we'll see what the customer says and hopefully we can drop all this.17:07.57 
ray_laptop Robin_Watts: fine. For a single thread. And I assume that the buffer size is passed as well as its address17:08.01 
ray_laptop is still not happy with that17:08.22 
Robin_Watts No, what have I said that isn't true for multiple threads?17:08.25 
ray_laptop Most devices call get_bits line by line. I'd like a mechanism for MT post processing to be able to have automagic optimal sized results buffer per thread17:09.50 
chrisl henrys: I think the big problem supporting this would be as I mentioned above: the halftone is part of the graphics state, so there is no generic mechanism for communicating halftone settings to and from the device. And then there could be problems with exactly what needs communicated to/from the device in the general case.17:11.04 
ray_laptop so how about a callback into the post processor that will at least tell me what (worst case) size buffer is needed for a particular band size ?17:11.09 
Robin_Watts Urgh, hold on.17:11.27 
henrys chrisl, ray_laptop:there is some discussion about 532 using our fonts - and I got to thinking - would it be possible to do a compatibility comparison of glyphs like we did with CPSI using their simulator?17:11.51 
ray_laptop is "Urgh" the IRC code for throwing up into the trashcan by your desk ?17:12.06 
Robin_Watts I've been trying to cast this into a revised 'get_bits' form, whereby the post processing is done at the level of the rectangles requested by get_bits.17:12.35 
ray_laptop henrys: They use UFST, so we don't really need to use the simulator do we ?17:12.46 
henrys ray_laptop:I think having there exact configuration would be desirable.17:13.33 
Robin_Watts You seem to be saying that we should be working purely at the band level. And I can see that that is another level at which we could be working.17:13.38 
ray_laptop Robin_Watts: and I am at least as concerned about getting optimal performance out of MT rendering + post processing as simply as possible for the caller17:13.42 
henrys configuring the ufst really sucks and getting the exact same thing in gs might not be easy, chrisl?17:13.59 
Robin_Watts but I cannot see how to square the idea of working at the band level with the idea of working in non-clist modes.17:14.14 
chrisl henrys: we use essentially the same code for "our" gs and customer 532's, the only difference is where we get the FCO data from17:14.56 
ray_laptop henrys: their simulator has an option to write PPM's, but it hasn't been worked on and has bit-rotted (crashes). I haven't invsetigated their proprietary format.17:15.17 
chrisl henrys: but they have a bunch of non-standard fonts in there, over the 136 PS3 ones, so that might be a problem17:15.35 
Robin_Watts Maybe we can't get something that works in non-clist modes. Maybe we need to abandon that idea, and just do this for clist only devices.17:15.43 
ray_laptop Robin_Watts: If a post process function provides a function that we can interrogate to give us the buffer size, then the MT thread startup can allocate the buffers (and free them on teardown)17:16.41 
Robin_Watts ray_laptop: What sort of buffers are you thinking of?17:17.17 
chrisl henrys: in fact, cust 532 use the UFST we supply, unless they've changed things a *lot*17:18.01 
henrys chrisl:I was thinking of just seeing which glyphs we are missing using a postscript program which wouldn't print anything - console print type stuff.17:18.08 
Robin_Watts Are you back to thinking of (say) a PNG device that compresses each bands as a post-process phase?17:18.16 
henrys not on paper17:18.19 
chrisl henrys: That wouldn't work because to do that you need access to the Postscript dictionaries, and the MT fonts fonts don't have PS dictionaries17:18.55 
henrys chrisl: but I don't know if there PS interpreter will do that like ghostscript17:18.55 
ray_laptop Robin_Watts: so a tiffsep type device wants halftoned data with HT done in the threads. If the band is N lines of contone, then the post processed buffer is 1/8th the size of the contone17:19.01 
Robin_Watts ray_laptop: OK, that seems like a fair example.17:19.30 
chrisl henrys: I believe their PS does similar things to us, and uses a "dummy" font dictionary, with just enough in it to fool inquisitive PS programs17:20.03 
henrys chrisl:do they don't have any dictionaries associated with the fonts?17:20.08 
ray_laptop so if we can get a function to call to get the size, then the MT startup can allocate a proper sized results buffer per thread17:20.12 
henrys chrisl: I see17:20.31 
  darn17:20.38 
Robin_Watts Why does it have to be the MT startup that allocates the buffer?17:20.40 
ray_laptop Robin_Watts: and similarly for PNG or JPEG or whatever post processing that we want to tackle17:20.44 
chrisl henrys: we also couldn't compare metrics in the same way I did with the URW and Adobe fonts17:21.05 
ray_laptop Robin_Watts: who else knows the number of threads and the band size ? 17:21.09 
Robin_Watts with PNG or JPEG, we have no idea what the size of the buffer might be.17:21.14 
  and it's likely not a single buffer.17:21.25 
henrys chrisl: true the customer was just asking for a coverage comparison though17:21.37 
ray_laptop Robin_Watts: that's where we allocate the buffer for the rendered data for the thread (mem device buffer)17:21.46 
henrys and I thought that would be a fast way but sigh...17:21.52 
ray_laptop Robin_Watts: not a single buffer ? 17:22.04 
Robin_Watts ray_laptop: Right, *that* makes perfect sense.17:22.06 
  The rendered buffer is a single, predictable block of data.17:22.29 
henrys chrisl: the customer told me they were configured for 80 fonts but that might be incorrect17:22.32 
ray_laptop Robin_Watts: and the results for a post process has a predictable *worst case* size17:22.52 
Robin_Watts In some cases. But it's not necessarily a single buffer.17:23.10 
chrisl henrys: Oh, well, I was told it was the PCL/PS3 font FCO they were using, but again, that may have changed.17:23.20 
ray_laptop Robin_Watts: if it's not a single buffer (example, please) then the post process function is required to divvy it up17:23.44 
Robin_Watts suppose my post processing involves pulling the data out and compressing the 4 planes separately ?17:24.01 
chrisl henrys: they easiest solution would be to see if we could borrow their FCO data, then I could to a little hacking in the FAPI code to gather the stats17:24.07 
Robin_Watts ray_laptop: but anyway, I've got sidetracked again. I have larger concerns than "who allocates the buffers".17:24.40 
henrys chrisl: isn't that in the simulator?17:24.46 
ray_laptop Robin_Watts: so the get_processed_bits only gets passed a single destination buffer. How does it do it in the normal case ?17:24.51 
chrisl henrys: the FCO data is obfuscated, and hidden behind custom APIs17:25.21 
Robin_Watts Forget get_processed_bits for now, let's follow your one through.17:25.42 
chrisl henrys: let me have a look tomorrow, I might be able to fiddle with the simulator code to get at least a first pass17:26.21 
henrys chrisl:I'm a little nervous asking for that.17:26.25 
  chrisl: okay thanks17:26.49 
Robin_Watts ray_laptop: So the typical use case, you've said is that someone will call 'get_bits' for a single line.17:26.50 
  And the clist threads will get kicked off, rendering each band in turn.17:27.09 
chrisl henrys: I assume it's just the "base" 35 fonts we're talking about?17:27.35 
Robin_Watts and after each band is rendered, you'll do the post processing phase, from the rendered bits into this new buffer of yours.17:27.38 
ray_laptop Robin_Watts: right. And if the post process is compressing, then the threads will compress a band. So how do we return a single line ??? oops17:27.45 
Robin_Watts right.17:28.06 
henrys chrisl: I think that's a start but we really should know where we stand with 80 and 135 configurations, don't you think?17:28.51 
Robin_Watts What the customer has done is to 'rewrite' the contents of the buffer device, so that the getbits results they get back can be used to get the munged data out.17:29.08 
henrys chrisl: if it is something we are short on URW can fix it.17:29.22 
chrisl henrys: the 80 is PCL, no idea how we'd get that done quickly17:29.41 
ray_laptop Robin_Watts: right. And that works (I guess) because they are halftoning the data (so it's smaller than the original) ?17:30.02 
Robin_Watts ray_laptop: Right.17:30.08 
chrisl henrys: for the 135 fonts set we need to get to the bottom of the remaining name mapping issues, first17:30.30 
ray_laptop or downscaling by a factor of 217:30.31 
henrys chrisl: I don't think so I have clj right here and if I print out the postscript fonts I get 80… I think the customer is setup the same, ray_laptop might know17:30.43 
Robin_Watts Now, either we need to do the same kind of thing (somehow have the results come out via the get_bits call)...17:30.58 
henrys clj = Color LaserJet17:30.59 
Robin_Watts ...or we're defining a completely new mechanism for getting the results out, and the get_bits call becomes just a way to kick the render threads off.17:31.39 
ray_laptop Robin_Watts: plus the data they return is still fixed length per line. So compression in multiple threads is a problem unless we have a call to get_processed_band that tells us how much data comes back, and how many lines per band.17:32.00 
chrisl henrys: Postscript generally has 35 for LL2, and 136 for LL3 - of course, the font sets are not actually stipulated in the language definition17:32.23 
Robin_Watts My method was to try and use get_processed_bits to give us the updated buffers, but I see now that this will fall down horribly when we're not getting whole bands at once :(17:32.44 
henrys chrisl: yeah I was surprised he told me 80.17:32.52 
ray_laptop Robin_Watts: a get_processed_band _could_ be given a maximum number of lines it can take so the compression can be "split" at that (even if the threads buffers are bigger)17:32.55 
Robin_Watts ray_laptop: For some of the use cases we are talking about, returning "lines" isn't an option.17:34.07 
henrys chrisl: I just double checked the PS font list on my HP and I got 8017:34.07 
Robin_Watts If we're compressing whole bands for PNG for example.17:34.21 
ray_laptop but post processing (for a lot of the filters) for line by line call may not work17:34.24 
chrisl henrys: I suspect what they've got is the LL2 + PCL font set combined, and it's more hassle that it's worth to hide some from each interpreter.17:34.49 
  Anyway, got to go, my ride just showed up17:35.02 
ray_laptop Robin_Watts: right. But the potential benefit from MT compression is so tempting to just toss it out. So we just do it for some common formats (JPEG, PNG) and have them work in bands17:35.44 
  and maybe TIFF (cust 531)17:36.03 
Robin_Watts ray_laptop: Adding hacks in is bad. We need a nice way to expose this.17:36.28 
ray_laptop Robin_Watts: I agree. sigh.17:36.43 
Robin_Watts Suppose we forget about get_bits etc entirely.17:36.48 
  and we add a new device function 'process_page'.17:37.10 
ray_laptop Robin_Watts: OK. And get_processed_bits.17:37.15 
Robin_Watts Yes, forget get_processed_bits.17:37.25 
ray_laptop listens again.17:37.47 
Robin_Watts All process_page would do is trigger the page (or clist) rendering.17:37.50 
  and call post_process on the result of each band in turn.17:38.05 
  (or in the page case, the whole page).17:38.10 
ray_laptop Robin_Watts: where does the page go ?17:38.37 
Robin_Watts What does a device do with the data it gets?17:39.00 
ray_laptop Robin_Watts: Highly variable.17:39.10 
Robin_Watts That's my point.17:39.19 
  Currently the flow goes something like:17:39.25 
  foreach line { get_bits the line; process the line; }17:39.46 
  and processing the line might be writing it to a file, or sending it to a print engine, or whatever.17:40.12 
ray_laptop Robin_Watts: process_page could get a callback to feed some data in (filter paradigm) the filter *consumes* it (fwrite or whatever) and tells the processing how much it consumed17:40.20 
Robin_Watts Exactly!17:40.29 
  SOrry, I should have given the argument list of process page :)17:40.41 
ray_laptop Robin_Watts: s'ok. I read between the lines17:41.05 
Robin_Watts process_page(dev, post_process_fn, format options) or something17:41.12 
  that way, post_process_fn has to cope with being called with the parts of the page, possibly out of order, in whatever size bands gs happens to want.17:41.59 
ray_laptop Robin_Watts: so a post_process_page implementation for a clist with MT can be as "smart" as it wants17:42.07 
Robin_Watts ray_laptop: A process_page implementation for page mode would just 'get_bits' the whole lot, then call the process function on it.17:42.46 
ray_laptop Robin_Watts: I don't agree that to the "possibly out of order". That should be hidden17:42.51 
Robin_Watts A process_page implementation for clist mode would call the existing clist_get_bits stuff, but with some voodoo to ensure that we got whole bands at a time.17:43.28 
ray_laptop if threads are used to post process, then the buffering of the data per thread, etc. s/b automagic17:43.55 
Robin_Watts ray_laptop: I was trying to just use the current rendering threads.17:44.35 
  by processing in whole bands at a time, we can just call the post_process function on each thread, much as the client code does now.17:45.11 
  but that leads to the 'out of order' requirement that I mentioned earlier.17:45.25 
ray_laptop Robin_Watts: wait. The post_process_fn is the processing. We also need a fn to send the data to that gets it in order.17:45.40 
Robin_Watts ray_laptop: We don't *need* that.17:46.14 
  The processing functions (not really "post processing" now) can be responsible for sorting that out too.17:46.44 
ray_laptop Robin_Watts: so how does that get us post processing done in the threads, then ?17:46.49 
Robin_Watts is clearly not being clear :(17:47.28 
  The customer has added code in the clist_render_threads so that after every render, just before the thread closes down, it does some processing, right?17:48.15 
ray_laptop needs more coffee (or liquor) :-(17:48.29 
Robin_Watts I'm proposing that when we're calling "process_page" the net effect would be that at exactly that same point, we'd call the user supplied process function with that band.17:49.06 
  So the work is done on the threads.17:49.36 
ray_laptop we've now just bubbled it up to the print_page layer, but I don't see any advantage yet17:49.36 
mvrhel_laptop Robin_Watts: quick question. so can a fz_page be shared amongst threads? I was just worried a bit about a thumbnail rendering and the full res in a certain case.17:49.49 
Robin_Watts mvrhel_laptop: No.17:50.52 
mvrhel_laptop ok. that is what I thought17:51.01 
  just the ctx17:51.07 
  i need to drill that in my head17:51.19 
Robin_Watts ray_laptop: What advantage were you looking for?17:51.28 
  Driving the thing via get_bits doesn't work really, unless you want to 'get_bits' and then ignore the values you get back and only get the data out of the post_process function.17:52.34 
  So rather than doing that, I'm suggesting that we use a 'process_page' routine that just renders the bands and then 'post_process'es them.17:53.41 
  It's explicit that way that the post_process function is responsible for absorbing the data and dealing with it.17:54.13 
ray_laptop Robin_Watts: Ok. So we still can't do compression post processing, can we? Because a process_fn that gets called out out order won't know what other threads have run17:54.15 
Robin_Watts ray_laptop: We can't do compression post processing where one band depends on the previous one.17:54.57 
ray_laptop unless the MT code provides a 'wait for band N' that stalls a thread until it can run17:55.11 
Robin_Watts I suggested that the other day, and you were dead set against it, on the grounds that that would destroy the benefits of parallelism.17:55.43 
ray_laptop Robin_Watts: writing the data (e.g., to a file) will always need to be in order, even if we can compress in parallel17:55.46 
Robin_Watts ray_laptop: Yes. But there is no reason why we can't compress each band and store the compressed version in a queue until it can be written out in order.17:56.32 
ray_laptop Robin_Watts: so the 'wait' is done AFTER the CPU intensive processing, unlike yesterday's17:56.46 
Robin_Watts ray_laptop: Eh?17:57.19 
ray_laptop Robin_Watts: yesterday I thought you proposed delivering the bands to the post process fn *in order*17:57.56 
  which means single thread post processing17:58.22 
Robin_Watts If you want to have bands whose compression depends upon the previous bands compression then we always need to wait until the previous band has finished before we can start the next bands compression17:58.23 
  which means the post processing will end up being only done on a single thread at a time yes.17:58.52 
ray_laptop Robin_Watts: yes, for something like FS, but compression is not necessarily dependent on previous band17:59.13 
Robin_Watts If the compression is much slower than the rendering, then that will limit our benefits.17:59.19 
  If you want to (say) do PNG compression where you flate each band with a reset so bands don't depend on each other, then they can run out of order.17:59.52 
ray_laptop The compression (PNG, JPEG) is often much slower than rendering17:59.53 
henrys ray_laptop:sorry to bother you but you do have an open question from 801 - I don't know if you saw it, the thread is getting very complicated with interleaving topics.18:00.14 
Robin_Watts but you need to get 'in order' before you can write to the file.18:00.15 
Robin_Watts pauses to allow henrys to ask ray questions...18:00.32 
ray_laptop Robin_Watts: right. And a processing_fn that _does_ depend on previous bands doesn't do the processing in threads18:00.33 
  henrys: sorry. Missed that. 18:00.58 
  I haven't broken away to finish processing email yet18:01.21 
Robin_Watts ray_laptop: How about: process_page(dev, process_fn, process_fn_arg, int gb_options, int in_order)18:02.14 
ray_laptop henrys: I see the one from Masuda-san. I'll respond today (before they wake up)18:02.15 
Robin_Watts That way, the caller can choose whether the processing needs to be done in order or not.18:03.10 
  ray_laptop: How long do the rendered buffers last at the end of each thread?18:03.48 
ray_laptop Robin_Watts: until they are grabbed by the 'main' thread and that thread restarted. clist_get_band_from_thread18:04.45 
Robin_Watts ray_laptop: So we *could* decouple the post processing of the buffers from the thread that renders them.18:05.32 
ray_laptop Robin_Watts: so a thread finishes (signalling its sema and status to DONE) and then exits18:05.37 
Robin_Watts If we have n threads, do we have a maximum of n buffers?18:06.51 
ray_laptop Robin_Watts: so a post_process function that is capable of running "out of order" would be passed to the thread, but if not, then the main thread does it18:07.02 
  Robin_Watts: yes18:07.09 
henrys ray_laptop: yes that's the one18:07.45 
ray_laptop each thread (and the main thread) has a memory device buffer.18:07.50 
  henrys: OK. Will respond to them (and cc support, of course)18:08.07 
Robin_Watts ray_laptop: Either that, or we could always pass the post_process function to the thread, and in the 'in_order' cases, have a 'wait my turn' call in there.18:08.15 
ray_laptop Robin_Watts: to avoid copying the data, we "swap" buffers with the thread, but otherwise it's basic18:08.47 
  Robin_Watts: don't really see the advantage to the latter18:09.17 
Robin_Watts ray_laptop: Possibly simpler code? (only 1 place where we call post_process?)18:09.43 
ray_laptop Robin_Watts: OK, so for compression... We want to do the compression part in the thread, but the writing in_order. How's that work ?18:10.40 
Robin_Watts Might it be the case that some post_process things could be split into stuff that can run out of order, and stuff that must be run in_order?18:10.53 
  ray_laptop: OK, for compression... If I was implementing such a post_process function, I'd compress the data, and then send the buffer pointer/length to the device.18:12.01 
ray_laptop Robin_Watts: "send" ?18:12.22 
Robin_Watts yeah, conceptually "send". Pass the ownership over to another function in my device.18:12.52 
ray_laptop That's what I was proposing. An output filter to send it to18:12.59 
Robin_Watts that function would have a queue of completed pieces.18:13.06 
ray_laptop the process page gets two fn's the process_fn and the output_fn18:13.35 
SpNg Robin_Watts: did you see my comment from last night about compiling the patch for downSampling?18:14.15 
Robin_Watts I was thinking that this would be an internal mechanism. We don't *need* to expose that to the device.18:14.16 
ray_laptop the output_fn can have 'in_order' requirements that even if the process_fn does not18:14.17 
Robin_Watts s/to the device/to the world/.18:14.48 
  SpNg: I did.18:14.56 
SpNg Robin_Watts: I don't know if you responded, my buffer is gone for this chat ;-(18:15.16 
Robin_Watts SpNg: I didn't respond as you'd gone.18:15.27 
ray_laptop SpNg: it's searchable in the logs on the website18:15.35 
  (we often respond with "for the logs")18:15.54 
Robin_Watts The change has now made it into our repo, and our testing showed no problems.18:15.55 
  You were complaining that your compilation was filling your harddisc, right?18:16.16 
SpNg Robin_Watts: makes sense ;-) Do I need 50 GB+ to compile from source on that repo?18:16.19 
Robin_Watts No way.18:16.25 
SpNg correct. That's what I thought. Seems strange. I followed the ReadMe.txt ./autoconfig.sh ./configure make18:16.59 
  CentOS x86_64. I will give it another run today.18:17.38 
Robin_Watts SpNg: git clone ... ghostpdl.git && cd ghostpdl.git/gs && ./autogen.sh && make18:18.04 
  ray_laptop: I'm not hugely keen on the idea of having the output_fn and the process_fn both exposed.18:18.56 
  I think I'd rather leave it to the device.18:19.04 
ray_laptop Robin_Watts: All devices will have one, won't they ? 18:20.09 
Robin_Watts You're proposing that the process_fn should complete with a buffer pointer/size and that would be queued until the output_fn was ready for it?18:20.11 
ray_laptop Robin_Watts: if the output_fn says "in_order", yes it waits (most probably will)18:21.02 
Robin_Watts What if my process_fn produces more than one pointer/size ?18:21.29 
  I guess that can be coped with.18:21.51 
ray_laptop or we could just define the output_fn as ALWAYS in_order, main thread. Then if NULL, that particular process_fn has to take care of the data18:22.04 
Robin_Watts Right.18:22.15 
SpNg Robin_Watts: I was doing it form the root. I will do it form gs/ dir18:22.31 
Robin_Watts I'm not against the idea. I just might not have jumped straight in and done it in the first version.18:22.34 
  ray_laptop: I'm sure I've asked this before and been told no, but....18:23.59 
  is there any way a device can influence the bandheight that is chosen?18:24.12 
  In particular, I could imagine that a device might really want a bandheight that's a multiple of a given size.18:24.42 
  8 or 16 for jpeg for example, or 3 if the downscaler is being used with a factor of 3.18:25.19 
ray_laptop Robin_Watts: a clst_device (gx_device_printer) has "space_params" where the BandHeight can be specified. If 0, we choose the default given the BufferSpace, otherwise we use the value given18:26.41 
Robin_Watts ray_laptop: Right, so it's all or nothing.18:27.35 
  A lot of the time I can imagine people wanting to say "You pick the size, but make it a multiple of n"18:28.01 
ray_laptop Robin_Watts: no, because there is a printer_procs callout to get_space_params 18:28.11 
  in gdev_prn_allocate " give the dev-specific driver a chance to adjust them."18:28.58 
Robin_Watts So, you're saying that I could hook that and "adjust" the value. ?18:30.04 
  or by "adjust" do you mean "set" ?18:30.24 
ray_laptop Robin_Watts: I think so. I haven't looked to see if there is enough info18:30.35 
  Robin_Watts: you are passed a space_params struct (by address) that has been copied from the dev->space_params. Then the fn can modify them.18:31.34 
Robin_Watts ray_laptop: OK. so I could just & ~7 and be sorted.18:33.03 
  ray_laptop: So are you happy about where we've ended up with this process_page stuff?18:34.13 
  It seems much more sensible this way than trying to force it through get_bits.18:34.40 
  I'll have a crack at it tomorrow, and I'm sure I'll have more to bother you with by the time you arrive :)18:35.22 
  Thanks for the discussion. I feel much happier now.18:36.24 
mvrhel_laptop bbiaw18:40.26 
ray_laptop henrys: reply sent to customer 80120:39.36 
henrys Robin_Watts: at git.ghostscript.com if I select "raw" at commitdiff is that the format compatible with git apply?20:56.49 
Gigs- I'm getting that problem again where files segfault at 300dpi but render at any other res21:16.34 
  I don't see it in buzilla because I think a git pull fixed the particular files in question last time, but I guess what it really did was shift the buffer overflow to a different memory offset or something21:17.08 
  this is going to be a hard bug to deal with because every snapshot seems to change what files it affects21:17.52 
  even a slightly different build environment probably changes it21:18.13 
  I do have high level statistics for the bug though, it happens 0.8% of the time :)21:20.55 
  http://bugs.ghostscript.com/show_bug.cgi?id=69471421:40.30 
  heh you can't render anything at 1dpi, serious bug there :P21:43.25 
  I guess in theory you should be able to, but I'm not going to file that one21:43.46 
Micha` Gigs-: 0.8% of the time... :) Wooh, that's a nice bug you've got there! Good luck with that :)21:44.26 
Gigs- yeah it's not going to be fun21:44.50 
  I doubt it's reproducible by normal means21:45.08 
Micha` Depends on the perspective. I surely will have fun looking at the final patch :)21:45.24 
Gigs- the final patch will probably be something silly like an off by one fix21:45.43 
  the thing is even if I make a debug build I'll have to run hundreds of files to find a new broken one21:47.22 
Micha` I'd expect that. But the craziness of this 299/300/301 thing is quite promising for the spectator crowd.21:47.46 
Gigs- yeah right now I'm running one of them that breaks at 300 from 0 to 30021:48.05 
  so far it's been ok21:48.15 
  It would actually be nice if it broke on more resolutions21:48.28 
  if it only breaks on 300 then that means it's probably not anything file specific per-se21:48.54 
Micha` This. Is. SP... ecial. Quite special.21:48.54 
Gigs- it's on 206 now21:49.46 
Micha` Well then, the Sparta reference is then out. 206 is the name of a French car though.21:53.01 
Robin_Watts henrys: I believe so, yes.22:08.39 
henrys Robin_Watts: thanks22:08.54 
marcosw Gigs-: I'd like to take a look at http://bugs.ghostscript.com/show_bug.cgi?id=694714 Can you send me the test file and/or attach it to the bug (if you do the latter let me know and I'll mark it as private so it's only visible to Artifex staff). My email is marcos.woehrmann@artifex.com 22:24.15 
  Gigs-: also, have you tried running valgrind? I've had good luck using it to isolate hard to reproduce seg faults.22:25.16 
Gigs- marcosw: I will attach a file but I don't have much hope22:29.58 
  I haven't used valgrind in years but I can try tomorrow22:31.56 
  marcosw: ok attachment upload please mark private22:32.07 
marcosw Gigs-: done. If I get anywhere I'll update the bug report.22:33.49 
Gigs- good luck thanks, I'll try to get some more debugging time in tomorrow22:34.08 
marcosw Gigs-: the good news is that I'm able to reproduce the seg fault @ 300 dpi (and not at 299 or 301 dpi).22:36.49 
Micha` Robin_Watts: I opened a few bug reports based on our discussions here. For http://bugs.ghostscript.com/show_bug.cgi?id=694713 , I have a patch ready but I noticed the warning "A signed Artifex Contributor License Agreement is prerequesite for patch acceptance." For such a small contribution, is it really needed?22:52.12 
Robin_Watts Micha`: Probably not.23:04.49 
ray_laptop marcosw: I snagged bug 694714 -- pretty clearly clist mis-behavior, but if you (or Robin_Watts) *know* that it's from his code vs. general problems, feel free to take it back.23:57.19 
  cust 532 is happy (waiting for a minor enhancement that is almost done), so I can look at this while testing their stuff23:58.12 
 Forward 1 day (to 2013/10/17)>>> 
ghostscript.com
Search: