<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5413263485792241</id><updated>2012-01-22T23:13:49.306Z</updated><category term='new drop'/><category term='Requeriments'/><category term='speed'/><category term='release date'/><category term='welcome'/><category term='call for papers'/><category term='documentation'/><category term='regression tests'/><category term='schedule'/><category term='bugs'/><category term='color'/><category term='icc'/><category term='Threads'/><category term='precision'/><category term='release'/><category term='plugins'/><category term='profiling'/><title type='text'>LittleCMS 2</title><subtitle type='html'>This small blog is supposed to be a way to drop my thoughts, findings, errors and caveats about the development of version two of the littlecms color management engine. 
http://www.littlecms.com</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7956276606505919060</id><published>2011-12-16T09:54:00.000Z</published><updated>2011-12-16T09:54:34.366Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>LittleCMS 2.3 released</title><content type='html'>I am glad to the announce the release 2.3 of the LittleCMS open source color engine.&lt;br /&gt;&lt;br /&gt;Version 2.3 is a maintenance release which adresses several minor issues and increases compatibility. It fully implements the recently released ICC 4.3 standard. &lt;br /&gt;&lt;br /&gt;See the changelog for further details.&lt;br /&gt;&lt;a href="http://www.littlecms.com/download.html"&gt;http://www.littlecms.com/download.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7956276606505919060?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7956276606505919060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/12/littlecms-23-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7956276606505919060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7956276606505919060'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/12/littlecms-23-released.html' title='LittleCMS 2.3 released'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Girona, Spain</georss:featurename><georss:point>41.9817957 2.823699900000065</georss:point><georss:box>41.9364987 2.7661259000000653 42.0270927 2.881273900000065</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-8540734113426742339</id><published>2011-11-02T12:55:00.002Z</published><updated>2011-11-02T12:55:48.094Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'></title><content type='html'>&lt;span style="font-family: Verdana; font-size: x-small;"&gt;I've uploaded a tarball with lcms2-2.3 release candidate: &lt;br itxtnodeid="135" /&gt;&lt;/span&gt;&lt;a href="http://www.mail2web.com/cgi-bin/redir.asp?lid=0&amp;amp;newsite=http%3A%2F%2Fwww%2Elittlecms%2Ecom%2Flcms2%2D2%2E3rc2%2Etar%2Egz" itxtbad="1" itxtnodeid="133" target="_blank"&gt;&lt;span style="font-family: Verdana; font-size: x-small;"&gt;http://www.littlecms.com/lcms2-2.3rc2.tar.gz&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana; font-size: x-small;"&gt; &lt;br itxtnodeid="132" /&gt;&lt;br itxtnodeid="131" /&gt;It is basically a maintenance release,  with a number of bugs fixed. &lt;br itxtnodeid="130" /&gt;If no issues are found, I plan  to release it in a week. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-8540734113426742339?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/8540734113426742339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/11/ive-uploaded-tarball-with-lcms2-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8540734113426742339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8540734113426742339'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/11/ive-uploaded-tarball-with-lcms2-2.html' title=''/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7457744723728275392</id><published>2011-06-10T10:49:00.000+01:00</published><updated>2011-06-10T10:49:37.384+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>LittleCMS 2.2 released</title><content type='html'>I am glad to the announce the release 2.2 of the LittleCMS open source color engine.&lt;br /&gt;&lt;br /&gt;Version 2.2 adds stability, fixes all know bugs, and adds support for dictionary&amp;nbsp; metatag. Pascal unit now compiles under FPK Pascal as well as Delphi. &lt;br /&gt;&lt;br /&gt;See the changelog for further details.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.littlecms.com/download.html"&gt;http://www.littlecms.com/download.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7457744723728275392?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7457744723728275392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/06/littlecms-22-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7457744723728275392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7457744723728275392'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/06/littlecms-22-released.html' title='LittleCMS 2.2 released'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Barcelona, España</georss:featurename><georss:point>41.387917 2.1699187000000393</georss:point><georss:box>41.3137835 2.0830957000000394 41.462050500000004 2.256741700000039</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-6029357603182693467</id><published>2011-06-02T15:49:00.000+01:00</published><updated>2011-06-02T15:49:59.367+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Updated browser check images</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.littlecms.com/check_lut.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://www.littlecms.com/check_lut.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.littlecms.com/check_full.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://www.littlecms.com/check_full.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Still, Firefox does not work. But oh, surprise... check IE9!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-6029357603182693467?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/6029357603182693467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/06/updated-browser-check-images.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6029357603182693467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6029357603182693467'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/06/updated-browser-check-images.html' title='Updated browser check images'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7492671601040184042</id><published>2011-05-30T14:56:00.001+01:00</published><updated>2011-05-31T19:02:34.376+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>lcms 2.2 release candidate</title><content type='html'>&lt;span style="font-family: Consolas; font-size: x-small;"&gt;&lt;span style="font-family: Consolas; font-size: x-small;"&gt;&lt;span style="font-family: Times New Roman; font-size: small;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Consolas; font-size: x-small;"&gt;&lt;span style="font-family: Consolas; font-size: x-small;"&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10pt;"&gt;I have setup a release candidate for lcms 2.2, which includes support for dictionary metatag and fixes all know issues. I am now removing all copyrighted profiles and&amp;nbsp; including RTF for the documentation, in order to fulfill Debian requirements.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Times New Roman; font-size: small;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10pt;"&gt;See here the release candidate:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Times New Roman; font-size: small;"&gt;  &lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10pt; mso-ansi-language: EN-US; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"&gt;&lt;br /&gt;&lt;a href="http://www.littlecms.com/lcms2-2.2rc1.tar.gz" target="_blank"&gt;&lt;span style="color: blue;"&gt;http://www.littlecms.com/lcms2-2.2rc1.tar.gz&lt;/span&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;or in the GIT repository, tagged as lcms2-2.2rc &lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/mm2/Little-CMS" target="_blank"&gt;&lt;span style="color: blue;"&gt;http://github.com/mm2/Little-CMS&lt;/span&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Any feedback is very welcome &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7492671601040184042?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7492671601040184042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/05/lcms-22-release-candidate.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7492671601040184042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7492671601040184042'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/05/lcms-22-release-candidate.html' title='lcms 2.2 release candidate'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-6652338673247661798</id><published>2011-03-10T11:12:00.001Z</published><updated>2011-03-10T11:16:00.042Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='call for papers'/><title type='text'>ICC/HP Digital Print Day</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-TIrMEuhkPos/TXixrAkgVcI/AAAAAAAAAE4/t4IS1QyMq0I/s1600/dp11-logos.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" q6="true" src="https://lh5.googleusercontent.com/-TIrMEuhkPos/TXixrAkgVcI/AAAAAAAAAE4/t4IS1QyMq0I/s320/dp11-logos.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;15 June 2011 &lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Co-sponsored by the Society for Imaging Science and Technology &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;The International Color Consortium, in association with HP Spain, is holding a Digital Print Day at HP's Sant Cugat facility. This will be an opportunity to review and discuss recent work on digital print, focusing primarily on colour management but also encompassing screening, workflow and other related topics. &lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Papers will be published on-line after the event on the ICC web site &lt;a href="http://www.color.org/"&gt;http://www.color.org/&lt;/a&gt; &lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;Abstracts should be submitted to &lt;a href="mailto:pj.green@lcc.arts.ac.uk"&gt;mailto:pj.green@lcc.arts.ac.uk&lt;/a&gt;by April 18 2011. Abstracts will be reviewed by a program committee and notification of acceptance sent by May 11 2011 &lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;Papers from students of print and color are especially welcome. ICC will provide a stipend of €100 to all students presenting. A prize of €500 sponsored by HP will be awarded for the best student paper, to be decided by a panel of expert judges. &lt;br /&gt;﻿&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-6652338673247661798?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/6652338673247661798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/03/icchp-digital-print-day.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6652338673247661798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6652338673247661798'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/03/icchp-digital-print-day.html' title='ICC/HP Digital Print Day'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-TIrMEuhkPos/TXixrAkgVcI/AAAAAAAAAE4/t4IS1QyMq0I/s72-c/dp11-logos.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5486176830901220329</id><published>2011-01-10T14:04:00.000Z</published><updated>2011-01-10T14:04:06.656Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><title type='text'></title><content type='html'>Happy new 2011!&lt;br /&gt;&lt;br /&gt;I would like to begin this year with a&amp;nbsp;comment for a recurrent question:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Can I use LittleCMS to create a profile for my camera/printer/scanner/etc?&lt;/blockquote&gt;&lt;br /&gt;Color management, at least ICC color management, is a two step process. &lt;br /&gt;&lt;br /&gt;You need both, ICC profiles for each device you want to integrate in the workflow and a piece of software, called "&lt;a href="http://www2.chromix.com/ColorSmarts/smartNote.cxsa?snid=27&amp;amp;-session=SessID:0FCBA96902b030EB96PnW1A3BCDC"&gt;CMM&lt;/a&gt;" that uses those profiles for doing color management. &lt;br /&gt;&lt;br /&gt;ICC color management requires all "smarts" of gamut mapping to be placed in the profiles. Then actually, building a profile involves a lot of &lt;strong&gt;&lt;u&gt;art&lt;/u&gt;.&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;LittleCMS is a CMM. It can use those profiles to perform color management.&amp;nbsp; It does NOT create profiles. It can be used to create the physical files that contains the color mappings, but it does not compute the maps. I can tell you that creating good profiles is a very difficult task, and takes teams of color scientists to define algoriths and settings, taking into account things like memory colors, skin tones, primary preservation and so. &lt;br /&gt;&lt;br /&gt;So, littlecms is useless for you if you need to create profiles from the end user point of view. As useless as it would be photoshop, which cannot create profiles neither, it only uses yet-exiting profiles. &lt;br /&gt;&lt;br /&gt;For the programmer point of view, lcms can be used to create the files that contain the colormaps, and many people are using it in such way. That would be, lcms is the canvas artists may use to do their creations. lcms would take care of all details of the profile specification. &lt;br /&gt;&lt;br /&gt;Having said that, please take a look on &lt;a href="http://www.argyllcms.com/"&gt;ArgyllCMS&lt;/a&gt;, a package that can create v2 profiles. Profiles created by Argyll can be used by LittleCMS without any problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5486176830901220329?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5486176830901220329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2011/01/happy-new-2011-i-would-like-to-begin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5486176830901220329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5486176830901220329'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2011/01/happy-new-2011-i-would-like-to-begin.html' title=''/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-9193201873070787878</id><published>2010-12-17T15:37:00.002Z</published><updated>2010-12-29T11:30:43.735Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><title type='text'>Multithreading question</title><content type='html'>Question: Do I need a rocket science degree to deal with lcms2 in multithreading mode? What are ContextID and THR functions?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Actually it is a lot more simple. ContexID is nothing else that a void pointer that user can associate to profiles and/or transforms. It has no meaning. Is just a sort of used defined cargo that you can use on your convenience. lcms does nothing with that . It has no relationship with threads, but can be used to store information about the thread. Obviously you can ignore it if wish so. Then, by default this void pointer is set to NULL when creating the transform or opening the profiles. Additionally, if the programmer wish, there are functions which end with THR that can set the this to values other than NULL. In this way the threads, processes or wathever that are using the profiles and transforms can retrieve the value. It is just a way to store a 32 bit value along the handles.&lt;br /&gt;&lt;br /&gt;On the other hand we have the 1-pixel cache. This is very convenient on slow interpolation methods when most of the pixels in the image are similar. Obviously, caching means the transform should store the result of last processed pixel, then in the case two threads are using the same transform at the same time, memory read/write operations on this value may clash and therefore you need some sort of semaphore. Ok, you can use a semaphore (the pthreads) or just get rid of the cache enterely. Please note that in some situations the cache is not used at all, i.e., on matrix-shaper to matrix-shaper 8 bit, it is actually faster to do always the computations, so the cache schema is discarded on this case. On CMYK trilinear, cache is being used as interpolation tends to be slow.&lt;br /&gt;&lt;br /&gt;So, to answer your questions: If you use redundant transforms, you need not to worry about anything as each transform is using different cache. May be fast, but this is big a waste of memory. If you share the same transform on several threads, which is very efficient, you have either to disable the cache or to enable pthreads. I would reccomend to disable the cache, the performance gain when using multiple threads is huge, the performance gain when using cache is&amp;nbsp; small. If you need more performance, just add more threads. You have not to use cmsCreateTransformTHR, this is just a way to add a user-defined variable to the handle, and finally cmsDoTransform does not have any ContexID, the error reports the ContextID associated with the transform being used. As a hint, ContexID are more useful when you want write a memory management plug-in to specialize memory mangement for multithreading, as the memory management pluging does recive ContextID when a memory operation is requested. The testebed application does use this feature to check memory consistency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-9193201873070787878?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/9193201873070787878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/12/multithreading-question.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/9193201873070787878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/9193201873070787878'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/12/multithreading-question.html' title='Multithreading question'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5157311789080032509</id><published>2010-12-10T15:02:00.004Z</published><updated>2010-12-10T19:26:09.439Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>Absolute colorimetric intent</title><content type='html'>Kai-Uwe Behrmann has found a nasty bug in 2.1 on absolute colorimetric intent when display profiles are involved. :-( The issue is solved in GIT, but not in the 2.1 distribution. Too bad. Well, It is not so terrible because it only affects the combination of abs. colorimetric &lt;strong&gt;&lt;u&gt;and&lt;/u&gt;&lt;/strong&gt; display profiles, but anyway ...&lt;br /&gt;&lt;br /&gt;The specs on ICC V4 are pretty messed out when regarding to absolute colorimetric intent. There is now something called "ICC absolute", which is same that relative on display profiles and preserves paper white on output profiles. Basically the observer is assumed to be fully adapted to whatever illuminant being used to create the profile, this has severe implications on monitor profiles, and no effect on printer profiles measured under D50. So right now we have the v2 absolute, wich says nothing about the observer adaptation state and v4 absolute which assumes full adaptation.&lt;br /&gt;&lt;br /&gt;I tried to do my best in supporting all modes (v2 and v4) by implementing what the white paper below describes, a knob to adjust the degree of chromatic adaptation, a feature that may be useful for match-to-screen applications. See &lt;strong&gt;cmsSetAdaptationState()&lt;/strong&gt; on the manuals.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.color.org/ICC_white_paper_6_v2_and_v4_display_profile_differences.pdf"&gt;http://www.color.org/ICC_white_paper_6_v2_and_v4_display_profile_differences.pdf&lt;/a&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;Many thanks Kai-Uwe for catching the bug!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5157311789080032509?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5157311789080032509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/12/absolute-colorimetric-intent.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5157311789080032509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5157311789080032509'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/12/absolute-colorimetric-intent.html' title='Absolute colorimetric intent'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7950389179546239419</id><published>2010-12-01T17:03:00.000Z</published><updated>2010-12-01T17:03:15.832Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>LittleCMS 2.1 released</title><content type='html'>Ok, so finally here is the release. It adds Delphi support, which is not a limited set like in lcms 1.x but a complete wrapper. Every single function in the lcms&amp;nbsp;API is now accesible&amp;nbsp;from Delphi. &lt;br /&gt;&lt;br /&gt;lcms 2.1 fixes a number of bugs, adds support for duotone (thanks to a contributor who wants to remain anonimous),&amp;nbsp;resurrects&amp;nbsp;cmsChangeBufferFormat and some features like&amp;nbsp;2-channels formatters. See the changelog for a complete list of fixes and additions.&lt;br /&gt;.&lt;br /&gt;One important thing about 2.1 is that it has been reviewed for vulnerabilities(Thanks Chris!) so it may be a good idea to upgrade from 2.0 whatever possible. The transition should be smooth as 2.1 is backwards compatible with 2.0.&lt;br /&gt;&lt;br /&gt;Now I'm ready for 2.2 :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7950389179546239419?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7950389179546239419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/12/littlecms-21-released.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7950389179546239419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7950389179546239419'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/12/littlecms-21-released.html' title='LittleCMS 2.1 released'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-40430885110848337</id><published>2010-11-03T21:57:00.000Z</published><updated>2010-11-03T21:57:49.351Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='release date'/><title type='text'>Release candidate for 2.1</title><content type='html'>CIC18 is coming and I wish to have some fresh release to introduce at that time, so here are two packages as tarball and zip&amp;nbsp;holding the GIT code and some minor additions. Should solve all known glitches up to date. If all is ok, I will do the official release on monday, nov-8. I know, this is a short notice, but the release mostly contains GIT code that&amp;nbsp;has been available for a while.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.littlecms.com/lcms2-2.1.tar.gz"&gt;http://www.littlecms.com/lcms2-2.1.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.littlecms.com/lcms2-2.1.zip"&gt;http://www.littlecms.com/lcms2-2.1.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-40430885110848337?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/40430885110848337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/11/release-candidate-for-21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/40430885110848337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/40430885110848337'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/11/release-candidate-for-21.html' title='Release candidate for 2.1'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-4841299825851334532</id><published>2010-09-18T19:12:00.002+01:00</published><updated>2010-09-19T16:58:22.222+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><category scheme='http://www.blogger.com/atom/ns#' term='schedule'/><title type='text'>2.1 schedule</title><content type='html'>It has been a long time since I posted the first littlecms 2 release. To my astonishment it has been reasonably stable and reliable. Sure, there have been bugs, any software has bugs, that is a fact that software developers already knows very well. But I have not been forced to do a quick release due to a killer bug, so I am happy on how is going all that lcms2 stuff.&lt;br /&gt;&lt;br /&gt;Since the&amp;nbsp;old days of lcms1.0,&amp;nbsp;a fresh release of the engine has been available each&amp;nbsp;6 months, more or less. So now it is time to prepare&amp;nbsp;the coming of 2.1. I plan to do it on November-2010. Then, I am presenting a paper on &lt;a href="http://www.imaging.org/ist/conferences/cic/CIC18%20Preliminary%20Program.pdf"&gt;CIC18&lt;/a&gt;&amp;nbsp;which relates with lcms2 and its unbounded mode, so the new release would be available at that time. This will be a maintenance release, with the addition of Delphi wrapper, the Matlab wrapper and some minor tweaks. BTW, this is already on the git, the release woould only qualify this code and mark it as in the "stable side".&lt;br /&gt;&lt;br /&gt;If anybody is interested, I will be also giving a talk in &lt;a href="http://www.color.org/DevCon/devcon10.xalter"&gt;ICC DevCon&lt;/a&gt;, this time about on how to build a minimal V2 compliant ICC engine. I will be glad to discuss any questions you have, or just have a beer with you!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.color.org/DevCon/devcon10.xalter"&gt;&lt;img border="0" qx="true" src="http://1.bp.blogspot.com/_kLEwhjORzt8/TJT_YpRYdqI/AAAAAAAAAEk/g-XgbZHBJ90/s320/devcon10-logo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-4841299825851334532?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/4841299825851334532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/09/21-schedule.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4841299825851334532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4841299825851334532'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/09/21-schedule.html' title='2.1 schedule'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kLEwhjORzt8/TJT_YpRYdqI/AAAAAAAAAEk/g-XgbZHBJ90/s72-c/devcon10-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5309340145581360806</id><published>2010-07-17T20:09:00.000+01:00</published><updated>2010-07-17T20:09:23.197+01:00</updated><title type='text'>Delphi wrapper is here!</title><content type='html'>Now from &lt;a href="http://www.embarcadero.com/"&gt;Embarcadero&lt;/a&gt;. I didn't code in Delphi since five or more years ago. Found interesting changes, like the unicode thing (all strings in Delphi 10 are unicode). &lt;br /&gt;&lt;br /&gt;Otherwise I got some fun creating the wrapper unit. It encapsulates *all* LittleCMS 2 API, so probably this is a great improvement for Delphi folks.&lt;br /&gt;&lt;br /&gt;See here the DLL, the unit and a small&amp;nbsp;demo. &lt;br /&gt;&lt;a href="http://www.littlecms.com/lcms2_delphi10.zip"&gt;http://www.littlecms.com/lcms2_delphi10.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Delphi wrapper will be officially included in lcms distribution in version 2.1, which is scheduled for November 2010. But you can already use this (unsupported) unit.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5309340145581360806?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5309340145581360806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/07/delphi-wrapper-is-here.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5309340145581360806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5309340145581360806'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/07/delphi-wrapper-is-here.html' title='Delphi wrapper is here!'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-8414933538514580049</id><published>2010-06-26T18:17:00.001+01:00</published><updated>2010-06-26T18:17:51.903+01:00</updated><title type='text'>Reusing same transform on different pixel types</title><content type='html'>I got this question twice, so here are some comments.&lt;br /&gt;&lt;br /&gt;cmsChangeBuffersFormat() is gone in 2.0&lt;br /&gt;&lt;br /&gt;There is a good reason to do that: &lt;b&gt;optimization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When you create a transform, you supply the profiles and the expected buffer format. Then, the engine, on depending on things like number of channels and bit depth can choose to implement such transform in different ways. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;Let's take an example. If you create a AdobeRGB to&amp;nbsp; sRGB transform using TYPE_RGB_8 for both input and output, the engine can guess that the maximum precision you would require is 8 bits, and then simplify the curve and matrix handling to, for example 1.14 fixed point. &lt;br /&gt;&lt;br /&gt;This precision is enough for 8 bits but not for 16 bits, so if you change the format after creating the transform to TYPE_RGB_16, you would end either with artifacts or throughput loss.&lt;br /&gt;&lt;br /&gt;Remember lcms 2 allows you to close the profiles after creating the transform. This is very convenient feature but prevents to recalculate the transform by reading the profile again. And there are situations, MPE for example when different precision means different tags.&lt;br /&gt;&lt;br /&gt;Overall I think the balancing of losing "change format" versus optimization and early profile closing is good. Otherwise you can always create a new transform for each format. Since you can close the profiles after creation, the amount of&amp;nbsp; allocated resources should remain low.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-8414933538514580049?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/8414933538514580049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/06/i-got-this-question-twice-so-here-are.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8414933538514580049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8414933538514580049'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/06/i-got-this-question-twice-so-here-are.html' title='Reusing same transform on different pixel types'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7397949577178516316</id><published>2010-05-29T17:09:00.004+01:00</published><updated>2010-05-29T17:17:12.128+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Web color management</title><content type='html'>Please take a look to this small toy I've been&amp;nbsp;working on:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://www.littlecms.com/images/test1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" gu="true" src="http://www.littlecms.com/images/test1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;What do you read? Ok, maybe you can read dark text as well, but I mean the brighter one.&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;If you have access to different web browsers, give a try to&amp;nbsp;Internet explorer, Safari and Firefox for example. &lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;I was suspicious about Firefox from a while ago, now that has confirmed my theory.&amp;nbsp; Oh, you can save the JPEG file and open it with photoshop to see the "good" result if you care. hint: Little CMS also works as expected.&amp;nbsp; I will go deeper on this stuff in incoming posts.&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7397949577178516316?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7397949577178516316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/05/web-color-management.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7397949577178516316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7397949577178516316'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/05/web-color-management.html' title='Web color management'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7349236198467023678</id><published>2010-05-22T10:19:00.001+01:00</published><updated>2010-05-22T10:21:31.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='precision'/><category scheme='http://www.blogger.com/atom/ns#' term='schedule'/><title type='text'>Interpolation wars</title><content type='html'>15 days after the release, one issue in the packaging and some glitches on linkicc. Still no big bugs. At least the reported&amp;nbsp; ones are not such big to need a 2.1 release... yet.&lt;br /&gt;&lt;br /&gt;Little CMS releases have been historically dropped each 6 months, so 2.1 should come on October-November more or less. I have a talk on the ICC DevCon on November, so it would be nice to have 2.1 released to at that time.&lt;br /&gt;&lt;br /&gt;Otherwise the git is alive and I'm periodically committing&amp;nbsp; fixes to it. If you are using Little CMS code and don't have dependencies on linux distributions, I would recommend to use git code if possible.&lt;br /&gt;&lt;br /&gt;One of those small glitches found is a weird error that was reported by a HP folk days ago. He was seeing&lt;br /&gt;small differences on a CMYK profile when upgrading from 1.19 to 2.0&lt;br /&gt;&lt;br /&gt;So, after investigation, I found the reason of those differences: &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=6&amp;amp;ved=0CDYQFjAF&amp;amp;url=http%3A%2F%2Flink.aip.org%2Flink%2F%3FPSISDG%2F1909%2F127%2F1&amp;amp;rct=j&amp;amp;q=Tetrahedral+interpolation&amp;amp;ei=DJ33S5i4OIHaNuT4sYQI&amp;amp;usg=AFQjCNG1DvyPFqhmMg3SCb34tuinOK6gHA&amp;amp;sig2=vdNS_F2rasun7cKOvNQiKQ"&gt;Tetrahedral interpolation&lt;/a&gt; being used in 2.0 and &lt;a href="http://en.wikipedia.org/wiki/Trilinear_interpolation"&gt;Trilinear interpolation&lt;/a&gt; in 1.19. Tetrahedral was &lt;a href="http://www.freepatentsonline.com/5581376.html"&gt;patented&lt;/a&gt; time ago, but now the patent has expired.&lt;br /&gt;&lt;br /&gt;In fact, I did see such issue many years ago. On LUT elements being indexed by Lab colorspace, Tetrahedral does &lt;b&gt;not&lt;/b&gt; work well. I suspect that's because Luma is uncentered (L is on one axis)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.mathworks.com/images/steve/96/tetrahedral_interpolation_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://blogs.mathworks.com/images/steve/96/tetrahedral_interpolation_02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;First thing to discard was a code bug. So I tried Max Derhak's SampleICC. To my astonishment, SampleICC is also using trilinear by default. Tried to modify Max code to do the interpolation as tetrahedral and... bingo! the same "bad" results as Little CMS. Up to four decimals. So here we go, the "bug" is in the interpolation algorithm. I checked PhotoShop CS4. It seems to be also using trilinear as well.&lt;br /&gt;&lt;br /&gt;Now I have committed those changes to git. Note however, that your are not going to notice any difference but in very few profiles, and even in this case, maximum difference is about 2-3 digital counts (0.5 dE)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7349236198467023678?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7349236198467023678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/05/interpolation-wars.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7349236198467023678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7349236198467023678'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/05/interpolation-wars.html' title='Interpolation wars'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-2700039194238863278</id><published>2010-05-08T19:16:00.000+01:00</published><updated>2010-05-08T19:16:58.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'></title><content type='html'>&amp;nbsp;I am pleased to the announce the release 2.0 of the LittleCMS open source color engine.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;Version 2.0 is an important milestone, among other improvements, it delivers:&amp;nbsp;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Full implementation of the ICC standard&amp;nbsp;&lt;/li&gt;&lt;li&gt;Improved documentation&amp;nbsp;&lt;/li&gt;&lt;li&gt;Better portability&amp;nbsp;&lt;/li&gt;&lt;li&gt;Easier extensibility&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Migration to 2.x branch is highly encouraged.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Little CMS intends to be a small-footprint color management engine, with special focus on accuracy and performance. It uses the International Color Consortium standard (ICC), which is the modern standard when regarding to color management. The ICC specification is widely used and is referred to in many International and other de-facto standards.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For more information, please take a look on:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Main site:&amp;nbsp;&lt;/div&gt;&lt;a href="http://www.littlecms.com/"&gt;http://www.littlecms.com/&lt;/a&gt;&lt;br /&gt;Downloads:&lt;br /&gt;&lt;a href="http://www.littlecms.com/download.html"&gt;http://www.littlecms.com/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-2700039194238863278?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/2700039194238863278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/05/am-pleased-to-announce-release-2.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2700039194238863278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2700039194238863278'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/05/am-pleased-to-announce-release-2.html' title=''/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-4386513551085983485</id><published>2010-04-20T11:46:00.000+01:00</published><updated>2010-04-20T11:46:23.212+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release date'/><title type='text'>LittleCMS 2.0 release date</title><content type='html'>Beta 3 seems stable enough, so now I can set a final release date for lcms2.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;LittleCMS 2.0 will hopefully be released on Saturday, May-8-2010&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;So, if you have found a bug, inconsistency, etc. Please let me know ASAP. Code is now frozen and I will start the final qualification phase. All change requests will be studied before commit, just to minimize risk.&amp;nbsp; Thanks again to all people that has contributed to this project!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-4386513551085983485?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/4386513551085983485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/04/littlecms-20-release-date.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4386513551085983485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4386513551085983485'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/04/littlecms-20-release-date.html' title='LittleCMS 2.0 release date'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5393126945429313760</id><published>2010-04-07T09:51:00.000+01:00</published><updated>2010-04-07T09:51:38.322+01:00</updated><title type='text'>Beta3 and release candidate</title><content type='html'>Here is beta3. We are almost done, so this is the release candidate.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All known bugs are fixed. &lt;/li&gt;&lt;li&gt;There are some improvements in CMYK interpolation, it is about 20% faster&amp;nbsp;&lt;/li&gt;&lt;li&gt;jpgicc can now apply devicelinks without chrashing&lt;/li&gt;&lt;li&gt;Matlab support is there!&lt;/li&gt;&lt;/ul&gt;Final release will follow in a month, so if you want to check the CMM in your application, now is a good time to do so. The code seems stable enough,&amp;nbsp; and you will catch small issues .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5393126945429313760?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5393126945429313760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/04/beta3-and-release-candidate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5393126945429313760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5393126945429313760'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/04/beta3-and-release-candidate.html' title='Beta3 and release candidate'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5553693353401338403</id><published>2010-03-04T16:45:00.000Z</published><updated>2010-03-04T16:45:15.258Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>Beta 2 is ready</title><content type='html'>Time for a new beta. First one was very successful and several important bugs were found and fixed.&lt;br /&gt;&lt;br /&gt;Beta2 will focus on quality and documentation, and will rest for a month.&lt;br /&gt;&lt;br /&gt;I will give frequent updates on the status of the beta. You can download it from the link on the right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5553693353401338403?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5553693353401338403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/03/beta-2-is-ready.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5553693353401338403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5553693353401338403'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/03/beta-2-is-ready.html' title='Beta 2 is ready'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-4857299523236894607</id><published>2010-03-01T16:59:00.001Z</published><updated>2010-03-01T17:03:16.955Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>xput comparative 1.19 vs. 2.0</title><content type='html'>&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;Here is the comparative for the code in git. I will publish beta2 in a couple of days. As you can see the xput improvements are considerable.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1.19&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;-----&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on CLUT profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.6667 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on CLUT profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 9.75015 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3.8638 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on SAME Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.28495 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on Matrix-Shaper profiles (AbsCol)&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.4507 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3.92349 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on SAME Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3.96924 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on Matrix-Shaper profiles (AbsCol)&amp;nbsp;&amp;nbsp; : 10.6667 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on curves&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.33839 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on curves&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.3944 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.09626 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 3.96924 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 24.3902 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on SAME gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 24.3902 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2.0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;----&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on CLUT profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.1394 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on CLUT profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.6667 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 26.2726 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on SAME Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 30.1318 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on Matrix-Shaper profiles (AbsCol)&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.5541 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 10.2433 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on SAME Matrix-Shaper profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 9.84615 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on Matrix-Shaper profiles (AbsCol)&amp;nbsp;&amp;nbsp; : 10.6667 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on curves&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 30.0752 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on curves&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 35.3201 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.19727 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.26667 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 40.9207 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on SAME gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 40.9207 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.3573 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;16 bits on CMYK profiles&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4.55192 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 39.312 MPixel/sec.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8 bits on SAME gray-to-gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 40.9207 MPixel/sec.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-4857299523236894607?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/4857299523236894607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/03/xput-comparative-119-vs-20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4857299523236894607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4857299523236894607'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/03/xput-comparative-119-vs-20.html' title='xput comparative 1.19 vs. 2.0'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-4829421150043073883</id><published>2010-02-15T17:31:00.001Z</published><updated>2010-02-15T17:33:57.042Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><title type='text'>Speed measurements</title><content type='html'>Here are some performance numbers, measured on my laptop. This is a pretty old compaq nc6400, &lt;span class="width490" style="font-size: 12px; line-height: 20px;"&gt;&lt;span id="intelliTxt" name="intelliTxt"&gt;Dual core T2300E (1.66GHZ)&lt;/span&gt;&lt;/span&gt; so it should rock in a modern machines. Note how fast transforms go when both profiles are implemented as matrix shaper. The measurements are using the code on git.&lt;br /&gt;&lt;br /&gt;16 bits on CLUT profiles.. 5.95238 Mpixel/sec.&lt;br /&gt;8 bits on CLUT profiles...10.5541 Mpixels/sec.&lt;br /&gt;8 bits on Matrix-Shaper profiles..27.6817 Mpixels/sec.&lt;br /&gt;8 bits on SAME Matrix-Shaper profiles...36.5297 Mpixels/sec.&lt;br /&gt;8 bits on curves... 29.2505 Mpixels/sec.&lt;br /&gt;8 bits on Matrix-Shaper profiles (AbsCol)...27.6817 Mpixels/sec.&lt;br /&gt;16 bits on curves... 37.9147 Mpixel/sec.&lt;br /&gt;8 bits on CMYK profiles... 8.90373 Mpixels/sec.&lt;br /&gt;16 bits on CMYK profiles...4.45186 Mpixel/sec.&lt;br /&gt;8 bits on gray-to-gray conversions.. 32.9897 Mpixels/sec.&lt;br /&gt;8 bits on same gray-to-gray conversions ...39.312 Mpixels/sec.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-4829421150043073883?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/4829421150043073883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/02/speed-measurements.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4829421150043073883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4829421150043073883'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/02/speed-measurements.html' title='Speed measurements'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-3852293185360972049</id><published>2010-02-14T18:24:00.000Z</published><updated>2010-02-14T18:24:52.862Z</updated><title type='text'>Fixes on github</title><content type='html'>Ok, that seems to be working. I have received a couple of bug reports. Very helpful .There are now two nasty bugs less in the code base. Gray profiles were broken. That didn't work at all. I wonder how that passed the regression tests... ok, there was no regression tests for gray profiles. Now that is fixed as well. I still have to review documentation for some typos, but I think this can wait.&lt;br /&gt;&lt;br /&gt;The latest (fixed) code is in the git. Or you can wait for beta2, which will be available on March.&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1266171481571"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/mm2/Little-CMS"&gt;http://github.com/mm2/Little-CMS&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-3852293185360972049?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/3852293185360972049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/02/fixes-on-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3852293185360972049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3852293185360972049'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/02/fixes-on-github.html' title='Fixes on github'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-3689795259361404797</id><published>2010-02-12T12:05:00.001Z</published><updated>2010-02-12T12:07:13.504Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>LittleCMS 2 on github</title><content type='html'>So here you go:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/mm2/Little-CMS"&gt;http://github.com/mm2/Little-CMS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can review all files in a nice web page and also that makes fair easy to send patches. Many thanks to Richard Hughes for this nice idea!&lt;br /&gt;&lt;br /&gt;You can also review the documentation in such way. It is located on 'doc' folder. The tutorial is a good starting point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-3689795259361404797?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/3689795259361404797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/02/littlecms-2-on-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3689795259361404797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3689795259361404797'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/02/littlecms-2-on-github.html' title='LittleCMS 2 on github'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-3595462723584689724</id><published>2010-02-05T19:22:00.000Z</published><updated>2010-02-05T19:22:09.840Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>Little CMS 2.0 beta 1 is available!</title><content type='html'>Yes, that is. After so much time, all code, documentation, testbed, utilities... all is in the box, and all is working!&lt;br /&gt;&lt;br /&gt;In one day or two I will announce the beta availability to the lcms mailing list, but meanwhile, you can be the very first to try it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.littlecms.com/lcms2-2.0beta1.tar.gz"&gt;http://www.littlecms.com/lcms2-2.0beta1.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-3595462723584689724?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/3595462723584689724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2010/02/little-cms-20-beta-1-is-available.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3595462723584689724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3595462723584689724'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2010/02/little-cms-20-beta-1-is-available.html' title='Little CMS 2.0 beta 1 is available!'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-724605846992569493</id><published>2009-12-10T10:26:00.002Z</published><updated>2009-12-10T10:27:08.398Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><title type='text'>Include files</title><content type='html'>Any application using LittleCMS 2 has to include just one header. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#include “lcms2.h”&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The header has been renamed to lcms2.h in order to improve the adoption of version 2. In fact, both Little CMS 1.x and 2.0 can coexist installed in same machine. This is very important on platforms like linux, where LittleCMS is nested deep in the dependency tree. Little CMS 2 no longer relies on icc34.h or any file coming from ICC. All costants are now prefixed by “cms” and there is one license for all package. &lt;br /&gt;&lt;br /&gt;Lcms2.h does expose the API, and only the API. Unlike 1.xx series, all internal functions are no longer accesible for client applications.&lt;br /&gt;&lt;br /&gt;A special case are the LittleCMS plug-ins. Those constructs can access more functions that the API, just because they are supposed to access Little CMS internals to add new functionality. There is a specialized include file for that:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#include “lcms2_plugin.h”&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This file should only be included when defining plug-ins. It defines some additional functions and is described in the LittleCMS2.0 Plugin API document.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-724605846992569493?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/724605846992569493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/12/include-files.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/724605846992569493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/724605846992569493'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/12/include-files.html' title='Include files'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5677026190663761475</id><published>2009-12-05T16:56:00.000Z</published><updated>2009-12-05T16:56:18.726Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Requeriments'/><title type='text'>Requeriments</title><content type='html'>In order to improve portability and minimize code complexity, LittleCMS 2.0 requires a C99 compliant compiler. This requirement has been relexed on Microsoft’s Visual Studio because its wide adoption by industry (VC is not fully C99 compliant). Borland C 5.5 (available for free) has been tested and found to work Ok. gcc and the Intel compiler does work ok.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5677026190663761475?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5677026190663761475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/12/requeriments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5677026190663761475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5677026190663761475'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/12/requeriments.html' title='Requeriments'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-95360273610562884</id><published>2009-11-30T19:01:00.000Z</published><updated>2009-11-30T19:01:36.051Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Backwards compatibility</title><content type='html'>Little CMS 2 is almost a full rewrite of 1.x series, so there is no guarantee of backwards compatibility. Having said this, if your application doesn’t make use of advanced features, probably all what you need to do is to change the include file from lcms.h to lcms2.h and maybe to do some minor tweaks on your code. Profile opening and transform creation functions are kept the same, but there are some changes in the flags.&amp;nbsp; Little CMS 2 does offer more ways to access profiles, so it is certainly possible your code will get simplified.&amp;nbsp; The basic parts where Little CMS 2 differs from 1.x series are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform flags&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Error handling&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Textual information retrieval &lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; New non-ICC intents&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Floating point modes&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Pipelines&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;On internal advanced functions, the underlying implementation has changed significantly. You still can do all what lcms1 did, but in some cases by using a different approach. There are no longer gamma curves or matrix-shaper functions. Even the LUT functions are gone. All that has been superseded by:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Gamma functions -&amp;gt; Tone curves&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; Matrix Shaper, LUT -&amp;gt; Pipelines&lt;/li&gt;&lt;li&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp; LUT resampling -&amp;gt; Optimization engine&lt;/li&gt;&lt;/ul&gt;There is no one-to-one correspondence between old and new functions, but most old functionality can be implemented with new functions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-95360273610562884?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/95360273610562884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/11/backwards-compatibility.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/95360273610562884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/95360273610562884'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/11/backwards-compatibility.html' title='Backwards compatibility'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5325087359241318214</id><published>2009-11-29T17:25:00.000Z</published><updated>2009-11-29T17:25:58.632Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><title type='text'>What is new from lcms 1.x</title><content type='html'>First obvious question is “why should I upgrade to Little CMS 2.0”. Here are some clues:&lt;br /&gt;&lt;br /&gt;Little CMS 2.0 is a full v4 CMM, which can accept v2 profiles. Little CMS 1.xx was a v2 CMM which can deal with (some) V4 profiles. The difference is important, as 2.0 handling of PCS is different, definitively better and far more accurate. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;It does accept and understand floating point profiles (MPE) with DToBxx tags. (Yes, it works!) It has 32 bits precision. (lcms 1.xx was 16 bits)&lt;/li&gt;&lt;li&gt;It handles float and double formats directly. MPE profiles are evaluated in floating point with no precision loss.&lt;/li&gt;&lt;li&gt;It has plug-in architecture that allows you to change interpolation, add new proprietary tags, add new “smart CMM” intents, etc.&lt;/li&gt;&lt;li&gt;Is faster. In some combinations, has a x 6 throughput boost.&lt;/li&gt;&lt;li&gt;Some new algorithms, incomplete state of adaptation, Jan Morovic’s segment maxima gamut boundary descriptor, better K preservation…&lt;/li&gt;&lt;li&gt;Historic issues, like faulty icc34.h, freeing profiles after creating transform, etc. All is solved.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5325087359241318214?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5325087359241318214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/11/what-is-new-from-lcms-1x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5325087359241318214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5325087359241318214'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/11/what-is-new-from-lcms-1x.html' title='What is new from lcms 1.x'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-1678946435937101417</id><published>2009-11-28T19:05:00.000Z</published><updated>2009-11-28T19:05:00.222Z</updated><title type='text'>Documentation strategy</title><content type='html'>Little CMS documentation is hold in three different papers. First one is the tutorial. Its goal is to introduce the engine and to guide you in its basic usage. It does not, however, give details on all available functionality. For that purpose, you can use the API reference, which gives information on all the constants, structures and functions in the engine. The third document is the plug-in documentation. It details how to extend the engine to fit your particular purposes. You need some experience in the core API to write plug-ins, therefore, the plug-in API reference is somehow more advanced that the remaining two.&lt;br /&gt;&lt;br /&gt;Aside documentation, there are sample programs that you can explore. Those are located in the “utils” folder. Those programs are also handy in isolation. This is the list of utilities, each one is documented elsewere.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;TiffICC&lt;/li&gt;&lt;li&gt;&amp;nbsp;JpegICC&lt;/li&gt;&lt;li&gt;&amp;nbsp;TransICC&lt;/li&gt;&lt;li&gt;&amp;nbsp;LinkICC&lt;/li&gt;&lt;li&gt;&amp;nbsp;TiffDiff&lt;/li&gt;&lt;li&gt;psicc&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-1678946435937101417?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/1678946435937101417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/11/documentation-strategy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1678946435937101417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1678946435937101417'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/11/documentation-strategy.html' title='Documentation strategy'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-9188816490995324530</id><published>2009-10-23T16:45:00.001+01:00</published><updated>2009-10-23T17:04:00.546+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>Documentation!</title><content type='html'>Back from vacation. Lots of fun and some time devoted to LittleCMS. As a result, we have now some incipient documentation. There is a tutorial you can read to explore the differences between LittleCMS 1 and 2. The plug-in API is also documented, but the documentation lacks some explanations and is mostly unfinished. The API reference is a work in progress...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-9188816490995324530?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/9188816490995324530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/10/documentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/9188816490995324530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/9188816490995324530'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/10/documentation.html' title='Documentation!'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5835036549580547701</id><published>2009-09-19T17:22:00.002+01:00</published><updated>2009-09-20T10:53:53.925+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='precision'/><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Unbounded CMM</title><content type='html'>With the drop I'm posting right now (September 19) most of the utilities are now&amp;nbsp;working. You have a tifficc applier, a transicc calculator and a linkicc devicelink generator. As you can see, some names have changed. This is because icclink was clashing with Graeme Gill's &lt;a href="http://www.argyllcms.com/"&gt;icclink from Argyll&lt;/a&gt;. This latter&amp;nbsp;is an outstanding utility,&amp;nbsp;and many users may want to have both installed, so I changed the name and get an extra consistency bonus (now all lcms utility names&amp;nbsp;are "whatever-icc")&lt;br /&gt;Now you have transicc (former icctrans) and therefore you can check one of the new features of lcms2. That's what is called "unbounded CMM mode"&lt;br /&gt;&lt;br /&gt;What is that? Well, with lcms2 you can use floating point values. That means,&amp;nbsp; you are no longer limited to 0..255 on 8 bits or 0...65535 on 16 bits, but on some profiles you can get out of those bounds and the CMM still works. &lt;br /&gt;&lt;br /&gt;Not all profiles does accept that. You need profiles that are implemented using enterly math expressions. Some&amp;nbsp;very simple profiles&amp;nbsp;works in such way, for example AdobeRGB. The sRGB profile does not work because it has curves implemented as tables, but the built-in sRGB does work as instead of tables it uses parametric curves. Also some advanced profiles for digital cameras using multiprocessing elements may work in unbounded mode. Right now it is hard to find any of those, as &lt;a href="http://www.color.org/ICCSpecRevision_02_11_06_Float.pdf"&gt;they are described in an addendum to the ICC spec&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Let's check this feature. Using AdobeRGB to the built-in&amp;nbsp; Lab in transicc:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;C:\lcms-2.0\bin&amp;gt;transicc -i AdobeRGB1998.icc -o *Lab&lt;br /&gt;LittleCMS ColorSpace conversion calculator - 4.0 [LittleCMS 2.00]&lt;br /&gt;Enter values, 'q' to quit&lt;br /&gt;&lt;br /&gt;R? 10&lt;br /&gt;G? 10&lt;br /&gt;B? 10&lt;br /&gt;L*=0.7287 a*=0.0000 b*=-0.0000&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Nothing special, but let's try this one&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;R? 300&lt;br /&gt;G? 300&lt;br /&gt;B? 300&lt;br /&gt;&lt;br /&gt;L*=114.6770 a*=0.0006 b*=-0.0005&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Do you see where I'm going? 300 is above 8 bits, and L*=114.6 is a highlight, so here you have an example of what can be accomplised with this mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5835036549580547701?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5835036549580547701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/09/unbounded-cmm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5835036549580547701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5835036549580547701'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/09/unbounded-cmm.html' title='Unbounded CMM'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-2881020132135910267</id><published>2009-09-02T19:43:00.006+01:00</published><updated>2009-09-02T19:54:52.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><title type='text'>New drop</title><content type='html'>Ok, so here is the september drop. That's functionality complete, that means all the functionality is already there and now it remains debugging and stabilizing. I am still in good shape for the schedule, so hopefully the first beta will be available on mid october.&lt;br /&gt;&lt;br /&gt;New in this drop:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;error logging supersedes error plug-in, which is no longer available (it was a bad idead, indeed)&lt;/li&gt;&lt;li&gt;black preservation intents are working&lt;/li&gt;&lt;li&gt;TAC detection is working.&lt;/li&gt;&lt;li&gt;All tags and tag types are correcly read/written&lt;/li&gt;&lt;li&gt;Gray/RGB/CMYK/Lab/XYZ &lt;/li&gt;&lt;li&gt;Info fns with localization, unicode&lt;/li&gt;&lt;li&gt;Segment maxima gamut boundary descriptor&lt;/li&gt;&lt;/ul&gt;... And now back to the documentation, that's what is taken most of my time. First documentation draft will be available on next drop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-2881020132135910267?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/2881020132135910267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/09/new-drop.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2881020132135910267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2881020132135910267'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/09/new-drop.html' title='New drop'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7607883022137525764</id><published>2009-08-14T17:18:00.014+01:00</published><updated>2009-08-14T18:18:37.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Black is black (II)</title><content type='html'>The second black thing has nothing to do with black point compensation, but is still black-fashioned. That are the&lt;span style="font-style: italic; font-weight: bold;"&gt; bl&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;ack&lt;/span&gt; preserving intents&lt;/span&gt;. No, this does not belong to normal ICC &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;workflow&lt;/span&gt;. ICC has tried to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;address&lt;/span&gt; such need but still there is nothing in the spec.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kLEwhjORzt8/SoWVFn7VTrI/AAAAAAAAAC0/8KW6v4a2T9g/s1600-h/fogra2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 242px; height: 294px;" src="http://3.bp.blogspot.com/_kLEwhjORzt8/SoWVFn7VTrI/AAAAAAAAAC0/8KW6v4a2T9g/s320/fogra2.jpg" alt="" id="BLOGGER_PHOTO_ID_5369862054558912178" border="0" /&gt;&lt;/a&gt;Let's see what the issue is. Suppose we work in press. Press are very tied to standards, US press uses &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SWOP&lt;/span&gt; and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;European&lt;/span&gt; folks are more toward &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;FOGRA&lt;/span&gt;. Japanese people uses other standards like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;TOYO&lt;/span&gt;, for example. Each standard is very well detailed and presses are setup to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;faithfully&lt;/span&gt; emulate any of these standards.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Ok&lt;/span&gt;, let's imagine you got an image ad, looking like that. This is a very usual flier, now just imagine instead of getting it in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;PDF&lt;/span&gt;, you get it as a raster file. Say in a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;CMYK&lt;/span&gt; TIFF, ready for a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;SWOP&lt;/span&gt; press. And you want to print in on a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;FOGRA&lt;/span&gt;27!!&lt;br /&gt;&lt;br /&gt;Maybe you see no issue over here, but take a look on this:&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;LittleCMS&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;ColorSpace&lt;/span&gt; conversion calculator - 4.0 [&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;LittleCMS&lt;/span&gt; 2.00]&lt;br /&gt;&lt;br /&gt;Enter values, 'q' to quit&lt;br /&gt;C (0..100)? 0&lt;br /&gt;M (0..100)? 0&lt;br /&gt;Y (0..100)? 0&lt;br /&gt;K (0..100)? 50&lt;br /&gt;&lt;br /&gt;C=48.21 M=38.71 Y=34.53 K=1.09&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That means, if I convert from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;SWOP&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;FOGRA&lt;/span&gt;27, the ICC profiles totally mess up the K channel, so a portion of the picture that originally is using only black ink, after the conversion, gets Cyan, Magenta, Yellow and well, a little bit of black as well. Now please realize what happens on all the text in the Flier.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kLEwhjORzt8/SoWVbctudtI/AAAAAAAAAC8/brjxj0tieqM/s1600-h/fogra3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 179px; height: 140px;" src="http://3.bp.blogspot.com/_kLEwhjORzt8/SoWVbctudtI/AAAAAAAAAC8/brjxj0tieqM/s320/fogra3.jpg" alt="" id="BLOGGER_PHOTO_ID_5369862429506172626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ugly. I guess the vendor who pays the bill will not be very pleased, right?&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;&lt;/span&gt; So I've added two different modes to deal with that: Black-ink-only preservation and black-plane preservation. The first is simple and effective: do all the colorimetric transforms but keep only K (preserving L*) where the source image is only black. The second mode is fair more complex ans tries to preserve the WHOLE K plane. I'm still checking this latter. If you want to give it a try, please download the new snapshot and build the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;TIFFICC&lt;/span&gt; utility. It already implements those new intents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7607883022137525764?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7607883022137525764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/08/black-is-black-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7607883022137525764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7607883022137525764'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/08/black-is-black-ii.html' title='Black is black (II)'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kLEwhjORzt8/SoWVFn7VTrI/AAAAAAAAAC0/8KW6v4a2T9g/s72-c/fogra2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5339226579678648837</id><published>2009-08-12T19:28:00.004+01:00</published><updated>2009-08-12T20:04:32.626+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Back in black</title><content type='html'>I've been lately working hard in two black thingies. Namely, black point compensation and black preserving intents. Black preserving intents are worth of a post, and still there are some subtle bugs, so let's go fot the black point compensation first. BPC has been implemented in lcms for years. It works. So if ain't broken don't fix it. Well, not really. It seemed to me lcms2 would be a good chance to implement &lt;a href="http://www.color.org/AdobeBPC.pdf"&gt;Adobe's BPC&lt;/a&gt;... oh,  that's a nice story.&lt;br /&gt;&lt;br /&gt;BPC is a sort of "poor man's" gamut mapping. It basically adjust contrast of images in a way that darkest tone of source device gets mapped to darkest tone of destination device. If you have an image that is adjusted to be displayed on a monitor, and want to print it on a large format printer, you should realize printer can render black significantly darker that the screen. So BPC can do the adjustment for you. It only makes sense on relative colorimetric intent. Perceptual and saturation does have an implicit BPC .&lt;br /&gt;&lt;br /&gt;Works like magic but it is quite simple: just a plain linear scaling in XYZ space.&lt;br /&gt;&lt;br /&gt;What turns out the real problem: It is easy to implement BPC as long as you can figure out what the black point is. The black point tag doesn't help. There is such quantity of bogus profiles that ICC has &lt;a href="http://www.color.org/ICCSpecRevision_07_11_07_BlackPointTag_Deletion.pdf"&gt;deprecated the tag in a recent addendum&lt;/a&gt;. It is up to the poor CMM to figure out what the black point is.&lt;br /&gt;&lt;br /&gt;And it is a hard task tough. Ok, you may argue, just use the relative colorimetric in the input direction, feed RGB=(0, 0, 0) and ... wait, what about CMYK? Ok, CMY=(255, 255, 255,255)... Hum.. CMYK devices are ink limited, that is, the maximum amout of ink that a given paper can accept is limited (else ink will spread all over) so this doesn't work either. What lcms do, is to use perceptual intent to convert Lab of zero to CMYK and then this CMYK to Lab using rel. colorimetric. This works fine on all but some broken profiles. Well, Adobe's paper target those profiles.&lt;br /&gt;&lt;br /&gt;The funny part is the complexity of Adobe's algorith. &lt;em&gt;The perceptual trick is used as a seed on certain profiles, then black axis of a round-trip on L* is examined. If the difference is greater than 4, then a least-squares fitting of the curve to a quadratic curve should be done. The black point is the vertex.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;In fact it is more complex as I'm ommiting constants depending on the intent and other gory details. Such complex. After the 6th time you read the paper, it begins to make sense.&lt;br /&gt;&lt;br /&gt;But unfortunately it doesn't work to me. And unfortunately, it doesn't work for the ICC reference implementation CMM. We both get the same bad guess of L* = 625 for a given profile. And guess what? I've tried Photoshop CS4, and the reported black point does exactly match with my humble, perceptual to rel.col. algorith, so I will keep this one for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5339226579678648837?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5339226579678648837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/08/back-in-black.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5339226579678648837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5339226579678648837'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/08/back-in-black.html' title='Back in black'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5065396439610508602</id><published>2009-08-04T17:47:00.002+01:00</published><updated>2009-08-04T17:49:52.596+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new drop'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>New drop available</title><content type='html'>August drop is here. Working features are CMYK, black point compensation,  all profile I/O ...&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5065396439610508602?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5065396439610508602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/08/new-drop-available.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5065396439610508602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5065396439610508602'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/08/new-drop-available.html' title='New drop available'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-1639460756465487037</id><published>2009-08-01T10:16:00.011+01:00</published><updated>2009-08-01T11:13:55.952+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='precision'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Sleep your bugs</title><content type='html'>It hurts. Its a sort of burning... when you figure out where is the bug, you experience an urgent necessity of fixing it, NOW! &lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Big mistake.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is &lt;a href="http://hans.gerwitz.com/2004/08/12/premature-optimization-is-the-root-of-all-evil.html"&gt;not clear&lt;/a&gt; if was &lt;a href="http://en.wikipedia.org/wiki/Donald_Knuth"&gt;Knuth &lt;/a&gt;or &lt;a href="http://en.wikipedia.org/wiki/C._A._R._Hoare"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Hoare&lt;/span&gt; &lt;/a&gt;who coined the phrase:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It is indeed very true. I would like to add a humble &lt;a href="http://en.wikipedia.org/wiki/Corollary"&gt;corollary&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;premature &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;bugfixing&lt;/span&gt; is lame too. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So, here is my advice: &lt;span style="font-weight: bold;"&gt;Sleep your bugs&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I am not talking about typos. You know, misspelling&lt;span style="font-family:courier new;"&gt; 'l'&lt;/span&gt; and&lt;span style="font-family:courier new;"&gt; '1'&lt;/span&gt; for example (nobody should use&lt;span style="font-family:courier new;"&gt; '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;le&lt;/span&gt;0'&lt;/span&gt; as var name, &lt;span style="font-family:courier new;"&gt;'1e0'&lt;/span&gt; is still a valid number) or failing to include a range check (last time I forget to place an 'if' I got a &lt;a href="http://pwnie-awards.org/2009/nominees.html#bestclientbug"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Pwnie&lt;/span&gt; nomination&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I am talking about logic bugs. Something wrong with the algorithm or the true logic of the program. Adding inconsistent features  is another example.&lt;br /&gt;&lt;br /&gt;Sleep those kind of bugs. Take good note of them, and wait a day or two in fixing. Probably you will find a neat way to deal with the issue without changing those hundreds of lines. Maybe not, but even in this case the solution is worth of the wait.&lt;br /&gt;&lt;br /&gt;In my case the bug was &lt;a href="http://www.color.org/AdobeBPC.pdf"&gt;black point detection&lt;/a&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;lcms&lt;/span&gt;2 is now an unbounded &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;CMM&lt;/span&gt; that operates on floats. So the black point detection code was using floating point to do the calculations. Yep, it seems a nice feature: far more precision, etc. On the other hand, inks on floating point are represented as %, so the effective range is 0..100%, that is how &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Photoshop&lt;/span&gt; and others do work and I thought it makes sense to keep the feature in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;lcms&lt;/span&gt;2 as well.&lt;br /&gt;&lt;br /&gt;Put both features together and you have a nice logic bug: extra code is needed on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;BP&lt;/span&gt; detection to deal with different ranges.&lt;br /&gt;&lt;br /&gt;If you happen to be a professional programmer, you surely realize that my advice of postpone bug fixing goes against the schedule, the program manager and the planner. Sure, but that's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;lcms&lt;/span&gt;2, my pet project which has unlimited resources on time. Would be a dream for a commercial project, but this project is not commercial and therefore is not subjected to schedule &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;tyranny&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;By the way, a new drop of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;lcms&lt;/span&gt;2 is in the way and will be available in a day or two.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-1639460756465487037?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/1639460756465487037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/08/sleep-your-bugs.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1639460756465487037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1639460756465487037'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/08/sleep-your-bugs.html' title='Sleep your bugs'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-3359471303518618608</id><published>2009-07-27T19:53:00.006+01:00</published><updated>2009-07-27T21:38:57.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='precision'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Less is more</title><content type='html'>If you have devoted some time to review the new API, maybe you have discovered an odd thing: there are some functions missing. Ok, you can blame me for remove *that* function doing exactly what you need. Of course that may be my mistake. But please consider perhaps I have good reasons to do that.&lt;br /&gt;&lt;br /&gt;Let's take one example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#003300;"&gt;&lt;strong&gt;cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This function no longer exists in lcms 2.0 API.&lt;br /&gt;&lt;br /&gt;Well, many people were using this function to retrieve primaries of a profile. So, for example, if you want to know which are the AdobeRGB primaries, just call the function with the right profile and here you go.&lt;br /&gt;&lt;br /&gt;Seems easy, and useful, but trust me, it is not. The real reason d'être of this function is somehow surprising. Not because it is handy but because is precise. Please consider this piece of pseudo-code:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#003300;"&gt;&lt;strong&gt;cmsXYZTRIPLE Result;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#003300;"&gt;&lt;strong&gt;hXYZ = cmsCreateXYZProfile()&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#003300;"&gt;&lt;strong&gt;xform = cmsCreateTransform(hProfile, TYPE_RGB_DBL, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLRIMETRIC, 0)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#003300;"&gt;&lt;strong&gt;cmsDoTransform(xform, {{ 1, 0, 0}, {0, 1, 0}, {0,0,1}}, &amp;amp;Result, 3)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do you follow it? I create a transform from the profile (in RGB) to XYZ. Then I convert max of R, and B to XYZ. I am obtaining the primaries! Despite it seems more complex, this method is much better because is guaranteed to work in *any* profile, not only on matrix-shaper ones.&lt;br /&gt;&lt;br /&gt;So, what is the point of having the old function? Easy: lcms 1.x was precission-limited to 16 bits, so you cannot obtain primaries with enough precision with the method described above. But that does not apply with lcms2, where you have an outstanding 64-bit double precission. Less is more in this particular case!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-3359471303518618608?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/3359471303518618608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/less-is-more.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3359471303518618608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3359471303518618608'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/less-is-more.html' title='Less is more'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-1596528677618234309</id><published>2009-07-23T19:50:00.002+01:00</published><updated>2009-07-23T20:08:45.644+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>Linking tags</title><content type='html'>Implementing the tag link feature has been easier than I originally thought, but there are some caveats.&lt;br /&gt;&lt;br /&gt;lcms2 does support some new features on read/writting profiles. You can use cmsReadTag/cmsWriteTag to read/write lcms objects like LUTs, tone curves and so. You can also use cmsReadRawTag/cmsWriteRawTag to read or write whatever you want, but poor library does not do any checking or understanding on whats going on.&lt;br /&gt;&lt;br /&gt;You can also link tags to items created by any of those two methods.  So far so good.&lt;br /&gt;&lt;br /&gt;But wait, you can also write plug-ins to add more "understood" objects in cmsReadTag/cmsWriteTag and also you can write plug-ins to add new types for those objects.&lt;br /&gt;&lt;br /&gt;In addition to all that, there is a brand new structure added as an addedum to ICC spec 4.2, that is the MPE or multi profile elements. This is worth of several comments in this blog. Basically that may make photographers and precission yonkies very happy as it includes *true* floating point numbers, among other things. There is a plug-in type devoted to MPEs. More to come.&lt;br /&gt;&lt;br /&gt;So, if you consider all all those acess methods should be consistent, we have a nice mess. The good news are it seems to work, the bad news, we need more testing. But overall I see progress.&lt;br /&gt;&lt;br /&gt;Fear not!, maybe I will even accomplish the schedule and realease the whole thing on November.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-1596528677618234309?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/1596528677618234309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/linking-tags.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1596528677618234309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/1596528677618234309'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/linking-tags.html' title='Linking tags'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-6515823068419562375</id><published>2009-07-22T20:18:00.006+01:00</published><updated>2009-07-23T09:55:16.030+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>ZOO Doppelgänger and the Link feature</title><content type='html'>To some extent, old'n'good lcms allowed profile editing. That was a "dangerous" feature in the sense people may abuse of it to grab copyrighted material. That is, you may open your favourite profile to remove the copyright tag, and here you go. Obviously preventing that by the hard way  is just like killing the messanger, so this feature is working in lcms and is up to you to use -or abuse- it.&lt;br /&gt;&lt;br /&gt;But reviewing the previous entry about the zoo, I had a wild idea: if the zoo test reads every single tag, what if then I try to rewrite all those tags? that would create a &lt;a href="http://es.wikipedia.org/wiki/Doppelg%C3%A4nger"&gt;Doppelgänger&lt;/a&gt; version of every profile in the zoo, but not necesarely with same organization and size.&lt;br /&gt;&lt;br /&gt;The test code was written in few minutes, and after I run it, poor lcms2 get into hyperspace and crashed badly.&lt;br /&gt;&lt;br /&gt;Ok, five bugs ahead, I got the writting/copying feature working. But this also has unveiled how profile vendors abuse of the link feature. That is, since a tag is described by some block in the file, I can put two or more different entries in the tag directory pointing to the same location. Humm.. I have to add some code to deal with this case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-6515823068419562375?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/6515823068419562375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/zoo-doppelganger-and-link-feature.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6515823068419562375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6515823068419562375'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/zoo-doppelganger-and-link-feature.html' title='ZOO Doppelgänger and the Link feature'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-6272891512252963269</id><published>2009-07-17T19:00:00.006+01:00</published><updated>2009-07-17T19:26:13.040+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>Profile ZOO</title><content type='html'>The serialization part is now complete. That is, lcms2 should be able to read all tags it understands on all profiles in the wide world. Since it understands all tags that are, or have been part of any ICC spec, present or past, &lt;em&gt;a lot&lt;/em&gt; of profiles should be readed by current code.&lt;br /&gt;&lt;br /&gt;I have been lately worried about stability and qualification. If lcms2 want any success, it should be tolerant with ill-formed profiles. I say tolerant, not permissive, because crafted profiles may be used by the bad guys to introduce exploits. We don't want wargames again, right?&lt;br /&gt;&lt;br /&gt;I have compiled along the +10 years of lcms life, a "Zoo" of profiles. This collection includes actually about 1500 assorted profiles, going from the widely distributed v2 sRGB to rare corner cases, like devicelinks holding 12-ink separations. Not to be very common.&lt;br /&gt;&lt;br /&gt;Some of those profiles are broken. Well, not &lt;em&gt;completely &lt;/em&gt;broken. They have slightly malformed tags, like colorants using a bad type, descriptions with wrong char count, bad sizes in the header...&lt;br /&gt;&lt;br /&gt;To check how well lcms2 may deal with that, I wrote a small program that runs across every single profile in the Zoo and then reads every tag in the profile. The code should reject the unuseable tags and behave nicely if some information can be recovered. It cannot in anycase segfault or leak resources.&lt;br /&gt;&lt;br /&gt;So, keeping my fingers crossed, I executed the program and ... almost! one segmentation fault. Ok, it was a bug, fixed. Run it again and .. success! no memory leaks, lots of tags discarded and a cool "all is ok" printf'd at the end. Pfew!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-6272891512252963269?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/6272891512252963269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/profile-zoo.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6272891512252963269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/6272891512252963269'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/profile-zoo.html' title='Profile ZOO'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-8312668070894877258</id><published>2009-07-14T19:39:00.005+01:00</published><updated>2009-07-14T19:54:37.688+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Same profile on both sides</title><content type='html'>It is very convenient to detect whatever the source and destination profiles are same to instruct the CMM to do nothing. Seems quite simple but it is certaily complex.&lt;br /&gt;&lt;br /&gt;The issue is on embedded profiles. You can't do a binary compare because embedded profiles may have changed attributes. That is, some fields in the profile header are different to reflect the preference on intent and the fact the profile is being used embedded.&lt;br /&gt;&lt;br /&gt;V4 offersProfileID, which is an MD5 checksum of the profile avoiding those conflicting fields. Which is a good thing: if both source and destination profiles does have same ProfileID AND the intent is same on both profiles, then you can get rid of the whole transform as it is basically a no-op.&lt;br /&gt;&lt;br /&gt;But sometimes (most of times, currently) you get AdobeRGB or sRGB embedded, which are v2 profiles. No Profile ID, and a very common case.&lt;br /&gt;&lt;br /&gt;So, let's try to do some optimization. If both profiles are matrix-shaper, you can detect if the obtained matrix is an identity, and then if the curves are cancelling.  We have room for improvement in 3 cases:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All different&lt;/li&gt;&lt;li&gt;Same primaries but different gamma&lt;/li&gt;&lt;li&gt;Same primaries and equal tone curves&lt;/li&gt;&lt;/ul&gt;Last case is a no-op, but is pretty frequent: untagged images assumed to be sRGB and uncalibrated monitor assumed to be sRGB. Handling this case separately is a big plus if you care about speed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-8312668070894877258?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/8312668070894877258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/same-profile-on-both-sides.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8312668070894877258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/8312668070894877258'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/same-profile-on-both-sides.html' title='Same profile on both sides'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-4482661584403321485</id><published>2009-07-11T17:27:00.005+01:00</published><updated>2009-07-11T20:26:54.925+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><title type='text'>More on speed</title><content type='html'>As promised, &lt;a href="http://www.littlecms.com/lcms-2.0-july-11.tar.gz"&gt;I have updated the snapshot&lt;/a&gt;. The performance numbers on matrix-shaper to matrix shaper should be close to what lcms2 is going to deliver when released. If you want to run the testbed, you would need to copy those profiles from Photoshop distribution, as I'm not allowed to redistribute that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AdobeRGB1998.icc&lt;/li&gt;&lt;li&gt;CoatedFOGRA27.icc&lt;br /&gt;&lt;/li&gt;&lt;li&gt;UncoatedFOGRA29.icc&lt;/li&gt;&lt;li&gt;USWebCoatedSWOP.icc&lt;/li&gt;&lt;li&gt;USWebUncoated.icc&lt;/li&gt;&lt;/ul&gt;Put them on the "testbed" folder. Ok, now just type &lt;span style="FONT-WEIGHT: bold; COLOR: rgb(0,102,0)"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(0,102,0)"&gt;&lt;br /&gt;./configure; make; make check&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Then take a look on the numbers at the end of the testbed execution.&lt;br /&gt;&lt;br /&gt;tifficc utility should also work to some extent, but there is a 1-pixel caché that may give bad performance. I have to turn caché off for such profiles as the caché code takes more than the transform itself.&lt;br /&gt;&lt;br /&gt;It is funny to note that this is pure "C" code, and in some situations outperforms SSE2 hand-written assembly. That was the case when using the Intel compiler.&lt;br /&gt;&lt;br /&gt;64-bits hardware is pretty untested, so if you manage to make it work on such architectures, please drop me a note, thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-4482661584403321485?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/4482661584403321485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/more-on-speed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4482661584403321485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/4482661584403321485'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/more-on-speed.html' title='More on speed'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-783076588005668205</id><published>2009-07-09T15:01:00.003+01:00</published><updated>2009-07-09T17:08:05.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><title type='text'>about speed</title><content type='html'>I'm getting outstanding results with lcms2 and matrix-shaper profiles. It is still not on the public preview, so you have to trust me, but here are some numbers. That's tested on my laptop which is an old 2GHz 2-core CPU:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;strong&gt;lcms 2.0:&lt;br /&gt;&lt;/strong&gt;8 bits on Matrix-Shaper profiles...done.&lt;br /&gt;[625 tics, 0.625 sec, 25.6 Mpixels/sec.]&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;strong&gt;lcms 1.18:&lt;/strong&gt;&lt;br /&gt;lcms is transforming full spectrum in 8 bits...done.&lt;br /&gt;[3984 tics, 3.984 sec, 4.01606 Mpixels/sec.]&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Thats a boost of about X 6.3. Please note that applies only to 8 bit matrix-shaper to matrix-shaper transforms, so RGB only!  When primaries of both profiles are same, the performance is even better, it reaches about 30 Megapixel/second.  I will put all this code available this weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-783076588005668205?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/783076588005668205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/about-speed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/783076588005668205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/783076588005668205'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/about-speed.html' title='about speed'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-7211159266320739413</id><published>2009-07-06T13:32:00.004+01:00</published><updated>2009-07-06T17:35:58.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><title type='text'>Tag plug-in</title><content type='html'>Related with &lt;span style="font-weight: bold;"&gt;cmsReadTag,&lt;/span&gt; here comes one of the easier plug-ins to write: the tag plug-in.&lt;br /&gt;&lt;br /&gt;Imagine you are a printer vendor and want to include in your profiles a private tag for storing the ink consumption. So, you register a private tag with ICC, and you get  signature "inkc".&lt;br /&gt;&lt;br /&gt;Ok, now you want to store this tag as a &lt;span style="font-weight: bold;"&gt;Lut16Type&lt;/span&gt;, so it will be driven by PCS and return one channel giving the relative ink consumption by color.&lt;br /&gt;&lt;br /&gt;Writing a plugin in lcms2 will allow cmsReadTag and cmsWriteTag to deal with you new data exactly as any other standard tag.&lt;br /&gt;&lt;br /&gt;To do so, you have to fill a &lt;span style="font-weight: bold;"&gt;cmsPluginTag &lt;/span&gt;structure to declare the plugin. This structure is formed by a base, which is common to all plug-ins.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;plugin.base.Magic = cmsPluginMagicNumber;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;plugin.base.ExpectedVersion  = 2.0;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;plugin.base.Type =  cmsPluginTagSig;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That latter identifies your plug-in as "tag type". Now we need to define the tag signature&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;plugin.signature = 'inkc';&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;And some additional info about the type used by your tag:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How many instances of the type the tag is going to hold (usually one) &lt;/li&gt;&lt;li&gt;in how many different types the tag may come (again, usually one) &lt;/li&gt;&lt;li&gt;and then the needed type(s). &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  plugin.descriptor. ElemCount = 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  plugin.descriptor. nSupportedTypes = 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;  plugin.descriptor.SupportedTypes[0] = cmsSigLut16Type;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote style="color: rgb(0, 102, 0); font-weight: bold;"&gt;&lt;/blockquote&gt;&lt;br /&gt;That is all. You can setup the new functionality by calling&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;cmsPlugin(&amp;amp;plugin);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Advanced tag plug-ins may use polymorphic types, depending on the version of the profile for example. Instead of one type, you can declare several. Then the read tag logic will search for all supported types to find the suitable one. &lt;span style="font-weight: bold;"&gt;cmsSigLut16Type &lt;/span&gt;for v2 and &lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cmsSigLutBtoAType &lt;/span&gt;for v4 for example. There is an optional callback function to decide which type  to use when writing the tag.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;    cmsTagTypeSignature  DecideType(double ICCVersion, const void *Data);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This plugin is most useful when combined with the tag type plugin, which will be discussed soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-7211159266320739413?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/7211159266320739413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/tag-plug-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7211159266320739413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/7211159266320739413'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/tag-plug-in.html' title='Tag plug-in'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-3818397065692147270</id><published>2009-07-04T17:40:00.002+01:00</published><updated>2009-07-04T17:54:14.387+01:00</updated><title type='text'>cmsReadRawTag</title><content type='html'>Today I've finished the cmsReadRawTag/cmsWriteRawTag interface. It may seem a poor accomplishment, but in reality that means the serialization engine is now complete.&lt;br /&gt;In lcms2 you can read a tag from an open profile by doing&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;tag = cmsReadTag(hProfile, TagSignature)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And lcms will return (if found) a pointer to a structure holding the tag. Simple, but not simpler as the structure is not the contents of the tag, but the result of &lt;span style="font-style: italic;"&gt;parsing &lt;/span&gt;the tag. For example, reading a cmsSigAToB0 tag results as a LUT structure ready to be used by all the cmsLUT functions. The memory belongs to the profile and is set free on closing the profile. In this way there are no memory duplicates and you can safely re-use the same tag. Writing tags is almost same, you just specify a pointer to structure and the tag name and lcms2 does all serialization for you. Process under the hood may be very complex, if you realize v2 and v4 of the ICC spec are using different representations of structures.&lt;br /&gt;&lt;br /&gt;Anyway, you may decide all that is useless and your want just to write/read bytes to   the profile, in this case the Raw variants are for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-3818397065692147270?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/3818397065692147270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/cmsreadrawtag.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3818397065692147270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/3818397065692147270'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/cmsreadrawtag.html' title='cmsReadRawTag'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-486933408941356478</id><published>2009-07-03T10:02:00.004+01:00</published><updated>2009-07-03T10:22:45.752+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><title type='text'>Plug-ins</title><content type='html'>One of the main improvements of lcms2 is the plug-in architecture. Plug-ins means you can use the normal API to access customized functionality. Licensing are another compelling reason, you can move all your IP into a proprietary plug-in and still be able to upgrade core revisions in open source. There are 10 types of plug-ins currently supported.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Memory management&lt;/li&gt;&lt;li&gt;Error management&lt;/li&gt;&lt;li&gt;Interpolation&lt;/li&gt;&lt;li&gt;Tone curve types&lt;/li&gt;&lt;li&gt;Formatters&lt;/li&gt;&lt;li&gt;Tag types&lt;/li&gt;&lt;li&gt;Tags&lt;/li&gt;&lt;li&gt;Rendering intents&lt;/li&gt;&lt;li&gt;Multi processing elements&lt;/li&gt;&lt;li&gt;Optimizations&lt;/li&gt;&lt;/ul&gt;I will discuss each type in incoming posts. Plug-ins are declared to lcms by a single function&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;cmsBool   cmsPlugin(void* Plugin);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the "Plugin" parameter may represent one or several plug-ins, as defined by the plug-in developer.   To write plug-ins, there is an additional include file lcms2_plugin.h, which declares functions which are not in the public API but may be useful to this task. For example I/O access, matrix manipulation, and all the types needed to populate the plug-in structures. Those functions begins with "_cms" to denote those are extended functionality and should not be called the application by rather by the plug-in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-486933408941356478?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/486933408941356478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/plug-ins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/486933408941356478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/486933408941356478'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/plug-ins.html' title='Plug-ins'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5520947954387129195</id><published>2009-07-02T13:40:00.005+01:00</published><updated>2009-07-02T14:19:24.020+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='color'/><category scheme='http://www.blogger.com/atom/ns#' term='icc'/><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>The probe profile</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;"Jimmy Volatile" a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Lcms&lt;/span&gt; user, suggested to incorporate test plots for the regression tests. In this way external apps using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;lcms&lt;/span&gt; could check if all is working as expected. I think this is a good idea, and maybe it is also feasible (all depends on the schedule).&lt;br /&gt;&lt;br /&gt;An interesting check would be to use the ICC probe profile. This comes from the ICC site:&lt;br /&gt;&lt;br /&gt;"The 'probe profile' (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Probev&lt;/span&gt;1_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;ICCv&lt;/span&gt;2.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;icc&lt;/span&gt;) is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;syntactically&lt;/span&gt; a v2 ICC output  device ('&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;prtr&lt;/span&gt;') profile, and can be used in a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;workflow&lt;/span&gt; wherever such a profile  is required. The color space of this profile is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;CMYK&lt;/span&gt;, and its PCS is Lab.  &lt;/span&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Colors processed via this profile are &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;deliberately&lt;/span&gt; distorted in a systematic  way, to enable visual &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;determination&lt;/span&gt; of the rendering intent used when rendering  ("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;BToA&lt;/span&gt;" or PCS to device transforms) and when proofing ("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;AToB&lt;/span&gt;" or device to PCS  transforms). This is useful, in cases when color-management-aware software does  not document the behavior."&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://www.color.org/probeprofile_examples.xalter"&gt;&lt;span style="font-size:100%;"&gt;Here are some examples&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://www.color.org/probeprofile_examples.xalter"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5520947954387129195?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5520947954387129195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/07/probe-profile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5520947954387129195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5520947954387129195'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/07/probe-profile.html' title='The probe profile'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-2785108736800191419</id><published>2009-06-30T10:30:00.004+01:00</published><updated>2009-06-30T10:42:54.789+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regression tests'/><title type='text'>Regression tests</title><content type='html'>Right now it is pretty clear lcms2 would need an exhaustive test bed if we want some sort of robustness in the code. I'm spending a lot of time with this program. It began as a small one and now it is a huge file of 5600 lines. Maybe I should split it in several modules...&lt;br /&gt;&lt;br /&gt;My intent is to have a test on every single feature. Since this is close to impossible, the actual test is focused on usual cases. Now the question, what are usual cases? Sure, sRGB to screen and aRGB to printer output are pretty common, but there are people over there using lcms1 to do multi-ink separations on 12 channels. Why I should not check this case as well? Another big area that deserves careful testing are plug-ins. How should the code base react to a wrong plugin? is a segfault admissible in this particular case?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-2785108736800191419?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/2785108736800191419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/06/regression-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2785108736800191419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2785108736800191419'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/06/regression-tests.html' title='Regression tests'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5445035180152481976</id><published>2009-06-29T14:03:00.006+01:00</published><updated>2009-06-29T14:35:58.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><title type='text'>When/where to clip?</title><content type='html'>An interesting effect I've found, you can reproduce it with Photoshop CS4 as well. Set the working space as sRGB, intent relative colorimetric, no BPC. Then using color picker enter this Lab value:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;0, -120, 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the obtained RGB values are&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt; 0, 0, 0&lt;/span&gt;. So far so good. Or not? Try this other Lab value:&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;0, 0, -120&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kLEwhjORzt8/SkjBIQXIBhI/AAAAAAAAACs/rEEOEidWFXk/s1600-h/labissue.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 217px;" src="http://4.bp.blogspot.com/_kLEwhjORzt8/SkjBIQXIBhI/AAAAAAAAACs/rEEOEidWFXk/s320/labissue.jpg" alt="" id="BLOGGER_PHOTO_ID_5352740504704910866" border="0" /&gt;&lt;/a&gt;Oops! now we got &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;0, 27, 182&lt;/span&gt;! What's happening? The answer, as far as I can tell, is clipping. If you take the work (I did) of implementing Lab -&gt; XYZ and then XYZ -&gt; sRGB by using entirely floating point formulas, the second value of 0, 0, -120 getting converted to some color with lots of L* is just a consequence of the math. From where it comes all this L*?&lt;br /&gt;&lt;br /&gt;lcms does clip negative XYZ numbers, so in both you will obtain &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;0, 0, 0&lt;/span&gt;. What makes me wonder is &lt;span style="font-weight: bold; font-style: italic;"&gt;why&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;photoshop does clip one axis (a) and does not clip the other (b) in the same fashion?&lt;br /&gt;&lt;br /&gt;Maybe is just clipping XYZ negative numbers? Ok. lcms2 gives &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;0, 48, 0&lt;/span&gt; for a Lab of &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;0, 0, -120&lt;/span&gt;. This is the result of not clipping anything at middle stages and letting XYZ negative numbers as well. Clipping happens only on the last stage or when is absolutely required (indexing LUTs, for example). I guess more experimentation is needed in this part...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5445035180152481976?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5445035180152481976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/06/whenwhere-to-clip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5445035180152481976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5445035180152481976'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/06/whenwhere-to-clip.html' title='When/where to clip?'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kLEwhjORzt8/SkjBIQXIBhI/AAAAAAAAACs/rEEOEidWFXk/s72-c/labissue.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-5333889382799286192</id><published>2009-06-27T15:15:00.006+01:00</published><updated>2009-06-27T15:45:58.965+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><title type='text'>Threads and cmsThreadID</title><content type='html'>One of the things &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;lcms&lt;/span&gt; 2 is different to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;lcms&lt;/span&gt; is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;multithreading&lt;/span&gt; support. That is, indeed, a difficult feature. One may argue that just avoiding global variables should be enough to support multiple threads, but I think this is not necessarily true.  Sometimes some global settings have to apply to all threads.  On the other hand, it would be desirable for error handling and memory allocation to have some clues on which are the thread currently active or the environment where the current operation takes place.&lt;br /&gt;&lt;br /&gt;So the solution I've found is the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;cmsThreadID&lt;/span&gt; type. That is just a void pointer.&lt;br /&gt;&lt;br /&gt;Most of the high-level functions in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;lcms&lt;/span&gt;2 does have two forms. The first one is defaulting the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ThreadID&lt;/span&gt; parameter to zero, which means "user don't care about threads". The second form allows to specify the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ThreadID&lt;/span&gt;. This ID will be passed to memory allocation, error handler and plug-ins, so the user code may be smart enough to react differently on different threads. One example is to use different memory pools, which is useful, among others, when a given thread crashes and you want to recover gracefully.&lt;br /&gt;&lt;br /&gt;Related functions :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;font-size:78%;" &gt;cmsThreadID   cmsGetProfileThreadID()&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;font-size:78%;" &gt;cmsThreadID   cmsGetTransformThreadID()&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;And all functions with THR ending the function name, for example:&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;font-size:78%;" &gt;cmsHPROFILE   cmsCreateRGBProfileTHR(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;font-size:78%;" &gt;);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-5333889382799286192?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/5333889382799286192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/06/threads-and-cmsthreadid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5333889382799286192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/5333889382799286192'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/06/threads-and-cmsthreadid.html' title='Threads and cmsThreadID'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5413263485792241.post-2823277174432485657</id><published>2009-06-27T12:47:00.003+01:00</published><updated>2009-06-27T13:39:42.544+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><title type='text'>Hello, World!</title><content type='html'>Howdy and welcome. This is an informal blog dealing with color management stuff. More precisely, this blog will discuss all the gory details I am facing when writting the version two of littlecms. I think people over here would already know what am I talking about, but if it not your case, see here &lt;a href="http://www.littlecms.com/LittleCMSAbstract.pdf"&gt;an abstract&lt;/a&gt;.&lt;br /&gt;So what is the blog about? Mainly software architecture.  I would like to discuss the reasons I'm designing the API in such way or why that specific limitation. To what extent this would be a good idea, time will tell... stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5413263485792241-2823277174432485657?l=littlecms2.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://littlecms2.blogspot.com/feeds/2823277174432485657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://littlecms2.blogspot.com/2009/06/hello-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2823277174432485657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5413263485792241/posts/default/2823277174432485657'/><link rel='alternate' type='text/html' href='http://littlecms2.blogspot.com/2009/06/hello-world.html' title='Hello, World!'/><author><name>Marti Maria</name><uri>http://www.blogger.com/profile/06043898000962120199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
