Log of #ghostscript at irc.freenode.net.

Search:
 <<<Back 1 day (to 2018/03/11)20180312 
kens Hmm, well that's interesting. If I render the PDF file resulting from bug #699102 with Ghostscript, I get the same answer as rendering the original PCL file with GhostPCL. If, however, I open the PDF file in Acrobat, the display is different.11:34.55 
  MuPDF matches Ghostscript11:37.31 
  Opening the PDF in Firefox is the same as Ghostscript and MuPDF11:39.33 
  The windows download for it doesn't seem to work :-(11:41.36 
  OK fosshub seems to have a copy, god knows how old11:42.23 
  And Evince renders the same as GS et al.11:45.39 
  The odd man out is Acrobat, so I think this can be classed as a bug in Acrobat.11:45.51 
  Oh my....12:05.16 
  The problem is that we have an Encoding with a glyph named /.notdef (not this glyph is *NOT* encoded at character code 0). Acrobat is seeing the /.notdef glyph name, and directly pulling the wrong character from the font. It appears to be pulling the character encoded at position 012:06.34 
  velix, no you can't prevent the pdfwrite writing XMP metadata, at least not without modifying the source code.12:18.36 
  Ghostscript does not 'merge' PDF files, please read https://www.ghostscript.com/doc/9.22/VectorDevices.htm#Overview for an explanation of how the pdfwrite device works. It is unlikely that the low level content of the output PDF file will match in any respect whatever, the low level content of the input PDF file. However, the rsult should be visually the same.12:20.07 
  Note that a rectangle *is* a path, its just a compact way of representing the path.12:20.40 
chrisl kens: Generally Acrobat's special handling of /.notdef is to forcibly make it non-marking for non-symbolic fonts, or allow it to mark for symbolic fonts - but clearly, special stuff has precendent :-(12:31.28 
HenryStiles kens: hmm didn't I look at these regressions last release, the asian characters are very familiar?12:31.46 
kens Oops, went to lunch12:46.48 
  HenryStiles : I'm not bothered by the asian characters, just the missing text, I believe its OK but want to check12:47.09 
HenryStiles I'm just surprised to see them again.12:47.34 
kens chrisl yeah it *really* shouldn't be doing what its doing. If the glyph name i s/.notdef it shoudl use the glyph, and it clearly doesn't.12:47.46 
  HenryStiles : You mean the ones where the rectangle flips right/left ?12:48.01 
  The stroke weights are clearly a progression12:48.16 
HenryStiles kens: yeah we had a different problem with those same characters last release, not important12:50.44 
kens I can't recall what htat was12:51.10 
  brb12:51.33 
HenryStiles paulgardiner: hope you are doing okay13:42.23 
  kens, chrisl looks like there are a few regressions here, sigh.13:58.32 
kens Oh, that's unfortunate13:58.42 
  Which ones do you think need investigating ?13:58.50 
HenryStiles 614 can't be right14:01.54 
kens Let me look at that14:02.04 
  Hmm, I thought it was just text in 'no colour' now being drawn properly14:02.46 
  I haven't looked at the rendering in PCL though14:03.00 
HenryStiles 372 and 384 pdfwrite changed and the raster did not?14:03.15 
kens These are 'culled' bitmaps14:03.29 
  The comparison stops with the first device which shows a difference14:03.44 
  SO its possible you would get a diff on all devices, but it only gets displayed on the first one14:04.00 
  Or such is my understanding at least14:04.15 
HenryStiles ugh I see doing that for raster but not for pdfwrite14:04.20 
kens You'd have to check with Robin_Watts for more details14:04.36 
HenryStiles I assumed absence of a raster format indicated a pdfwrite bug, so let me check those also.14:05.49 
kens FWIW the pdfwrite output in 614 seems to match the PCL rendering of the original14:05.58 
  The white text in the reference has gone, I don't think it should have been there, so I think this is a progression14:06.35 
HenryStiles okay yup progression, nice14:07.07 
kens There's a lot of them, pdfwrite wasn't expecting to get a 'none' colour (I can't remember the PCL term) and so just used whatever was last set, leading to erroneous text14:07.55 
HenryStiles seems odd that text missing is a progression, how did you determine that, should I look at those i.e. 56014:09.47 
kens I compared the rendered output of gpcl6 with the display of the PDF file in Acrobat14:10.18 
  And of course, the reference in the dashboard14:10.40 
HenryStiles okay good for me!14:11.03 
kens The refrerence in the dashboard had white text drawn over the gray text, the rendered output from the PCL interpreter doesn't and nor (now) does the PDF file14:11.13 
HenryStiles so I think the only thing I'm not sure about is 372 and and 38414:11.50 
kens I do believe that a lot of the text differences are down to this long-standing problem. I thin kthe colour index is something like gx_no_color ?14:11.55 
  Let me look at those14:12.01 
  372 is a puzzle, I'm not sure what the right answer should be. I can't say for sure that either is 'wrong'14:12.36 
  Same with 384, though the broken tail on the fi ligature worries me somewhat14:12.59 
HenryStiles kens: so you feel confident I don't need to go through all the diffs? I will if there is any doubt, I only looked at your email.14:29.51 
kens The only ones I had any concern with are the ones in the email14:30.06 
  Are you OK with number 48 ?14:30.49 
  That's not a pdfwrite one14:30.53 
HenryStiles yup that was a fix14:32.19 
kens OK just quickly running thorgh these again14:32.29 
  662 looked to me and chris like a progression14:32.46 
  Don't knwo why, but it looks better14:32.53 
  All the other ones were missing text I think, and I beleive those are all progressions14:33.15 
  So if you're happy HenryStiles then I'm fine with the PCL diffs14:33.50 
HenryStiles ship it :-)14:34.49 
kens Nah14:34.55 
  Need to do another test14:35.00 
  Robin_Watts : fixed a regression14:35.06 
  I'm ambivalent about including the potential fix if Michael gives me a way to detect an inappropriate ICC profile for inclusion by pdfwrite too14:35.53 
  I'm inclined not to, but I think its pretty low risk, and if we're doing another test anyway....14:36.10 
HenryStiles have to say the football game was a highlight of my vacation, the spurs lost but still, what an experience, I've never been. I've never seen so many drunk people in one place14:36.30 
chrisl HenryStiles: FWIW, it's just Spurs, not "the Spurs".....14:37.30 
kens But Arsenal, on the other hand, are 'the' gunners14:38.06 
  Ther's no logic :-)14:38.14 
HenryStiles chrisl: oh okay14:38.58 
chrisl I wasn't criticising.... it's not like I actually understand football in the slightest!14:39.07 
kens chrisl I don' tknow if you want to pull that fix for PCL into the release or not. Its a relatively minor point, but it should also be exceedingly low risk, since all it does is alter a glyph name14:40.03 
HenryStiles paid a fortune for scalped tickets but worth it for a one time thing14:40.47 
chrisl kens: Yeh, I'll pull that in - it looks pretty benign14:41.59 
kens Should be yes14:42.05 
  It was a lot harder to figure out what was going on14:42.35 
  Took me a while to realise I was getting different results with GS and Acrobat14:42.48 
chrisl Because Acrobat :-(14:42.54 
kens Well I was cutting the file down and more or less arbitrareily using GS or Acrobat to view the result, and the problem kept appearing and disappearing....14:43.30 
chrisl So far I have Robin's image dropouts fix, and your PCL->pdfwrite text change pulled onto the release branch14:46.37 
  I still plan rc2 for Wednesday, but we can reassess based on the XPS issue before I go ahead with that14:48.05 
kens Frtom what Michael says, the problem is that the ICC profile is not valid in PDF files14:48.38 
  So we've *always* produced a broken PDF file14:48.50 
  It sjust that other changes have revealed that in GS when it was previously hidden14:49.05 
  Its a rare problem I'd say, but again probably a pretty reliable fix, all I need is for Michael to give me a way to determine if the ICC profile is suitable. If not we'll drop back to device space and everything will work14:49.52 
chrisl It's really a time thing - given it's not a regression, and not a crash, I don't want to hold up the release significantly. OTOH, a few days isn't going to make much difference14:51.56 
kens I wouldn't hold up the release for this. If Michael and I can put it together before Wednesday then its probably OK to include it, if not then we'll just let it slide to the next release. I really don't want to do yet another round of testing14:53.00 
Robin_Watts Sorry ray_laptop. I stepped away for a mo.16:05.27 
ray_laptop Robin_Watts: NP. I am looking at the confusing (I *hate* this style of code, but...) extra_xform.h and there seem to be some threading holes16:06.40 
Robin_Watts extra_xform.h being the chameleonic header used for generating the optimised transforms, right?16:07.20 
ray_laptop Robin_Watts: first, the memcpy from CacheIn and CacheOut looks like a hole between the two operations (or even during them memcpy)16:08.24 
Robin_Watts ray_laptop: The cache never gets updated.16:08.49 
  It's only the initial value that gets copied out repeatedly.16:08.59 
  The code that copies back is #if 0'd out :)16:09.24 
  You are right in that if we copied back there would be a threading hole.16:09.44 
HenryStiles mvrhel_laptop: you have time for a phone chat?16:10.09 
Robin_Watts Hence the comment at the end of the function, just before #if 016:10.20 
mvrhel_laptop HenryStiles: sure16:10.23 
  HenryStiles: let me reset my phone16:11.31 
  it says no service16:11.35 
HenryStiles mvrhel_laptop: yeah got your voice mail16:11.58 
mvrhel_laptop ok now I have signal16:12.25 
  my iphone does that sometimes16:12.45 
  just decides it does not want to connect to cellular16:12.59 
Robin_Watts guesses ray is heading coffeewards.16:22.45 
ray_laptop Robin_Watts: OK, I was confused by the pointers is the NO_UNPACK NO_PACK cases sprinkled in there. BTW, line 331 looks wrong (in the #if 0 code)16:23.12 
Robin_Watts 331 is the end of the file for me.16:23.41 
ray_laptop Robin_Watts: sorry, I keep looking at the wrong part of the vim status bar. line 298?16:24.02 
  copying into the CacheOut from prevIn16:24.23 
Robin_Watts ray_laptop: Yeah, that looks wrong. CacheIn instead?16:24.39 
ray_laptop yes, not that it matters to us.16:24.54 
Robin_Watts ray_laptop: If you can see a way to improve the readability of any of this, great.16:25.06 
  I couldn't see a way to get the same efficiency without working in this way (short of manually writing all the different versions)16:25.45 
ray_laptop Robin_Watts: then the other thing: // the caller guarantees us that the cache is always valid on entry -- how does the caller guarantee that ?16:30.32 
Robin_Watts ray_laptop: bear with me a mo.16:32.18 
ray_laptop suspects that he caller guarantees us that the cache is always valid on entry sets it16:32.55 
  and nobody ever resets it16:33.18 
Robin_Watts ray_laptop: Yes, I suspect it gets set initially and then never gets reset.16:35.20 
ray_laptop in cmsCreateExtendedTransform16:36.06 
Robin_Watts Yes. (Just got there myself :) )16:36.46 
ray_laptop and the second part of the comment line 227 in extra_xform.h was just part of the picture when we change the representation: if the representation is changed, the cache is reset.16:38.13 
  which is still WIP16:38.28 
Robin_Watts ray_laptop: Urm...16:39.53 
  cmsChangeBuffersFormat probably needs to reset the cache.16:40.08 
ray_laptop Yes, and more (as we discussed) such as clone the xform with new procedures16:41.37 
  :q16:41.53 
mvrhel_laptop brb16:42.42 
Robin_Watts I suspect that we're actually broken at the moment even in the way we use it.16:43.39 
  The existing code, running in single threaded mode, calls cmsChangeBufferFormat.16:44.06 
  And that should invalidate the cache16:44.17 
  but it doesn't.16:44.21 
  which makes me think that we *could* get bad results out.16:44.38 
  (very unlikely, but possible)16:44.44 
ray_laptop Robin_Watts: invalidate or update the CacheOut using CacheIn values16:45.03 
Robin_Watts ray_laptop: I should have said "revalidate".16:45.28 
  by which I meant "updated the cacheOut using cacheIn values"16:45.44 
ray_laptop but the bigger problem, of course, is that we can't share contexts with different formats in or out16:46.40 
Robin_Watts contexts?16:48.02 
  The big problem is that we can't currently allow a transform to be used in more than one thread at a time, with different formats.16:48.57 
  adding a function to clone the transform would solve that.16:49.27 
  OK, now I look at this code, I think we're OK.16:49.48 
  8 bit data is unpacked to 16 bit data.16:50.05 
  so the cache is still valid.16:50.13 
  We'd have a problem if we ever changed from (say) 16bit to float.16:50.34 
  But float transforms don't use the cache.16:50.58 
  So, still fine.16:51.06 
ray_laptop Robin_Watts: sorry cmsContext == hTRANSFORM == _cms_transform_struct16:52.20 
Robin_Watts cmsContext most definitely is NOT == hTRANSFORM.16:53.36 
ray_laptop Robin_Watts: I don't follow "8 bit data is unpacked to 16 bit data. so the cache is still valid."16:54.18 
Robin_Watts The context is a magic void * that is fed through to the allocation functions unchanged.16:54.21 
  In gs, the context is the gs_memory_t, basically.16:54.32 
  In MuPDF it's an fz_context.16:54.40 
  ray_laptop: OK, every transform function in lcms works in 3 phases.16:55.01 
  for each pixel, it 'unpacks' the pixel into either float or 16bit.16:55.21 
  then it does the transform.16:55.33 
  then it packs the result back out to the required format.16:55.47 
  The caching happens by comparing the result of the 'unpack' phase to the previous 'unpacked' results.16:56.33 
ray_laptop yes, and the "xform" bakes all of the pack..xform..unpack into a function defined in extra_xform.h16:56.48 
Robin_Watts If you give it 16 bit data, then the unpack function is basically nothing.16:56.56 
  (or a copy, rather)16:57.07 
  If you give it 8 bit data, then the unpack function is f(x) = (x<<8)|x or something like that.16:57.30 
  So swapping between 8 or 16 bit data means the cache values stay valid.16:57.53 
ray_laptop so as long as cloning a transform with a new pack or unpack (re)sets the cache in that clone, fine16:58.24 
Robin_Watts No.16:58.40 
  However you clone a transform, the cache remains valid.16:58.56 
ray_laptop because the cache is always 16-bit data16:59.31 
Robin_Watts Yes.16:59.36 
ray_laptop OK16:59.40 
Robin_Watts Took me a while to work that through in my head, but I think we're fine.16:59.56 
  When we DO add cloning, we should move the cache into the clone, cos that means we can write the cache back safely.17:00.21 
  (well, maybe)17:00.35 
  we'd have to say one clone per thread.17:00.46 
ray_laptop uh, no. we still want to share a clone among threads17:00.53 
Robin_Watts Do we though?17:01.19 
  The important bit that we want to avoid is duplicating the large inner tables.17:01.40 
ray_laptop but presuming that creating a clone of a link profile is fairly fast, then the tradeoff is in memory consumption17:01.49 
  so all of the internal tables need refcount maintained?17:02.31 
Robin_Watts Our per thread clones will basically be pack, unpack and transform pointers, with the cache entries.17:02.35 
ray_laptop (if they are not copied)17:02.41 
Robin_Watts and a pointer to a ref counted 'core'.17:02.43 
  Yes, exactly.17:02.45 
  We have some options to consider.17:03.03 
  but we're safe at the moment, which is the main thing.17:03.11 
ray_laptop OK, as long as the contents of the core are "read-only" we'd be OK17:03.16 
Robin_Watts yes.17:03.21 
ray_laptop safe at the moment because gscms_is_threadsafe returns false :-)17:03.39 
Robin_Watts If you can see a way to improve the readability of this stuff, without harming the efficiency, I'd be interested.17:03.51 
  ray_laptop: Yes.17:04.04 
mvrhel_laptop ray_laptop: so are we thread-safe in gs with lcmsart? Do we need to write the clone operation first?17:10.11 
Robin_Watts mvrhel_laptop: We need to write the clone function in order to be able to allow gscms_is_threadsafe to return true safely.17:10.59 
mvrhel_laptop ok. maybe I should do that. I want to get this thing up and running before I write the paper so that we can show some timing results17:11.23 
  I mean we could use mupdf too17:11.40 
  but here gs is nice since we can easily turn off and on multi-threaded cmm support17:12.26 
  and see what effect it has 17:12.33 
  ray_laptop: if you are not doing the clone operation, I will do it right after I wrap up this one thing for ken (which should just take a moment)17:14.08 
Robin_Watts mvrhel_laptop: Given your workload, would it make sense for me to look at that ?17:20.49 
mvrhel_laptop Robin_Watts: if you want to do it, I am fine with that17:21.12 
Robin_Watts I will have a bash.17:21.26 
mvrhel_laptop Robin_Watts: ok sounds good17:28.36 
  Robin_Watts: So I understand as I write this up. By passing the context through all these operation in lcms, we then can guarantee that the memory allocations (and deallocations) occur in each calling thread's proper memory chunk thereby avoiding issues that malloc is not safe. I don't think gs multi threading uses the base memory in gs that has the mutex if I understand it correctly. ...17:54.44 
  ... Ray may have a comment here.17:54.45 
  17:54.47 
  ray_laptop: ^^17:54.59 
Robin_Watts mvrhel_laptop: We ensure that the caller gets the ContextID back that it passed it :)17:55.34 
  mvrhel_laptop: We ensure that the caller gets the ContextID back that it passed in :)17:55.38 
  For gs, that means that every thread gets back the memory pointer that it passed in.17:56.00 
  For MuPDF, it means that the allocators are called with the correct exception stack.17:56.24 
  For other callers, it avoids the case where people call cmsDoSomeOperation(foo) , and that calls back to the registered allocation function and gets passed bar instead.17:57.17 
  More generally we are fixing the case where 2 threads try to use the same profile at the same time, and get bad results because of multiple simultaneous accesses to the cache.17:58.31 
  and we're faster.17:58.39 
  (cos of our more optimised pack/transform/unpack functions)17:59.01 
  mvrhel_laptop: Probably we can also take the opportunity to clean the API slightly.18:01.12 
mvrhel_laptop Robin_Watts: ok. So in the case of gs, the threads use different memory chunks that ensure we don't have issues. In the case of mupdf, each thread has its own exception stack that needs to be consistently used18:01.26 
Robin_Watts yes.18:01.36 
  Rather than having cmsBlahCTX and cmsBlahTHR etc, we can just standardise on cmsBlah now.18:01.55 
mvrhel_laptop Robin_Watts: I am going to need you to help in writing up the optimized pack/transform/unpack18:02.04 
Robin_Watts mvrhel_laptop: Sure.18:02.11 
mvrhel_laptop Robin_Watts: yes, I agree that we should clean that up now that we are forking18:02.30 
  I need to figure out a easy way to make a pdf file with lots of profiles for testing this. Adobe illustrator (at least my version) and Design have limited capabilities18:04.10 
  I wonder if the newer versions have improved18:04.26 
Robin_Watts mvrhel_laptop: This is why God gave us text editors :)18:04.47 
mvrhel_laptop yes. I suppose. I was thinking I could use mupdf create18:05.07 
Robin_Watts yeah.18:05.12 
mvrhel_laptop and add icc support18:05.13 
  That would probably not take too long18:05.27 
  I just want to do some rect fills and assign profiles18:05.36 
Robin_Watts Can you create a document with the content on different pages?18:05.52 
  Then editing that to roll the content onto a single page is simple.18:06.09 
mvrhel_laptop you mean page 1 has icc profile 1, page 2 has icc profile 2 etc18:06.24 
Robin_Watts Yes.18:06.27 
mvrhel_laptop yes that would be easy18:06.34 
  right18:06.36 
Robin_Watts Then we pretty much just edit the streams together.18:06.40 
mvrhel_laptop then we could just change the reference18:06.44 
Robin_Watts yeah.18:06.47 
mvrhel_laptop that would be faster...18:06.53 
Robin_Watts It builds... what did I miss? :)18:07.09 
mvrhel_laptop nice18:07.15 
  Robin_Watts: thanks for the suggestion18:07.23 
Robin_Watts and it ran.18:07.53 
mvrhel_laptop cool18:11.24 
Robin_Watts Now to figure out the /* FIXME: LOCK */ and /* FIXME: UNLOCK */ lines :)18:12.01 
mvrhel_laptop Robin_Watts: we will want to be able to add the cloned link to the cache and we will want to include if the link is 8 or 16 bit in the hash that is used for the link cache18:12.29 
  and obviously look for it in the cache18:12.44 
Robin_Watts I may come to you at that point :)18:13.02 
mvrhel_laptop ok18:13.33 
Robin_Watts Ok, so there is no central shared mutex I can use in lcms.18:13.56 
  It appears that the user can pass in a MutexPlugin to provide a mechanism for creating/destroying/locking/unlocking mutexes.18:14.55 
  but we'd have to store those somewhere.18:15.04 
  I could put a mutex in every transform.18:15.12 
  And we could lock/unlock them as the transform is used.18:15.42 
  (or cloned)18:15.52 
mvrhel_laptop so the transform should not need to be locked to be used should it?18:16.16 
Robin_Watts actually, I don't like that.18:16.20 
  Indeed, it shouldn't need to be locked to be used.18:16.31 
  Well...18:16.36 
  I now have a cmsTRANSFORM that contains a pointer to the cmsTRANSFORMCORE18:16.51 
  and the CORE is reference counted.18:16.59 
mvrhel_laptop oh I thought we were thinking of doing a copy18:17.11 
Robin_Watts I need a mutex *somewhere* to protect reference counted changes.18:17.30 
mvrhel_laptop right18:17.34 
  so during creation and destruction you will need to lock18:17.44 
Robin_Watts I thought the copy was being considered as a stepping stone to getting to the (nicer) ref counted version.18:17.56 
  but I jumped right in.18:18.04 
  yes.18:18.13 
  So I am pondering having ever cmsTRANSFORMCORE having a mutex in it.18:18.30 
mvrhel_laptop which should be fine. That will not occur too often18:18.30 
Robin_Watts (in the absence of a more global place)18:18.47 
  The attraction of having a mutex in the cmsTRANSFORM (not CORE) and locking/unlocking it during use is that that way anyone that didn't care too much could still use stuff in a threadsafe manner without thinking about it (just at the cost of some inefficiency if they got it wrong)18:19.54 
ray_laptop Robin_Watts: you mean a lock/unlock on every cmsDoTransform -- that sounds expensive18:30.04 
Robin_Watts ray_laptop: lock/unlock should be very cheap with no contention.18:30.38 
  but I'm not doing that for now.18:30.48 
mvrhel_laptop heading out for lunch. Writing this paper is a tight rope. I don't want to be too critical of the existing code but I do have to point out its shortfalls18:51.13 
Robin_Watts ray_laptop: Did you push the memento change?18:55.44 
  (the mutex)18:56.11 
ray_laptop Robin_Watts: no, I have it on my branch for gsicc changes that still give me different diffs to HEAD with NumRenderingThreads>118:56.42 
Robin_Watts ok.18:56.48 
ray_laptop Robin_Watts: I guess it would be good to push, so chrisl can (maybe) cherry-pick it for RC218:57.22 
Robin_Watts ray_laptop: While I think it would be safe to pull (after all, nothing uses memento in standard builds), let's not rock the boat for the release.18:58.38 
ray_laptop Robin_Watts: OK, pushed18:58.41 
  chrisl: can decide whether or not to cherry-pick it18:59.05 
Robin_Watts ray_laptop: Thanks.18:59.06 
  yeah.18:59.08 
  OK, my lcms2 changes are testing now.18:59.30 
  http://git.ghostscript.com/?p=user/robin/ghostpdl.git;a=commitdiff;h=e9595e7061ae807302a8ae0406cf54e8fd59f8a818:59.56 
ray_laptop Robin_Watts: with gscms_is_threadsafe changed in gsicc_lcms2art.c yet ?19:00.30 
Robin_Watts ray_laptop: No.19:00.41 
  I've changed lcms2.19:00.46 
ray_laptop Robin_Watts: oh, not gs to use it. OK19:01.00 
Robin_Watts The next step is to change the gs code that calls lcms2 to clone contexts.19:01.02 
  s/contexts/transforms/19:01.11 
  then we can try changing that setting.19:01.19 
ray_laptop Robin_Watts: sounds like what I can do as part of getting my changes in19:01.28 
Robin_Watts sure.19:01.33 
ray_laptop Robin_Watts: what is cach<E9> ?19:09.35 
velix Did you get my message from yesterday? I thought, pdfwrite would rewrite rectangles to paths or something when processing (concat PDFs etc.), but it doesn't do so. The output still had a rectangle (I checked the uncompressed PDF code).19:50.12 
ray_laptop Robin_Watts: for the next phase of change to lcms2art, once I change to using cmsCloneTransformChangingFormats should I remove cmsChangeBuffersFormat (i.e., what Marti wanted to do, but we talked him out of it) ?19:50.53 
Robin_Watts ray_laptop: I would think so.19:51.16 
ray_laptop Robin_Watts: OK, I thought that was the plan. Just checking. So lcms2mt won't have that, but will have ...Clone... which is hardly any more expensive19:52.40 
  and one we get it to really work MT, we can finally change the name :-)19:53.16 
  we might get some pulls from the Java world if they are currently using lcms2 without sharing profiles, but then again, the Java world isn't concerned about memory usage, is it?19:55.07 
  and even less about performance hits for re-creating link profiles19:55.45 
RonL_ clear22:08.21 
 Forward 1 day (to 2018/03/13)>>> 
ghostscript.com #mupdf
Search: