Hello community,

here is the log from the commit of package babl for openSUSE:Factory checked in 
at 2018-01-02 16:33:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/babl (Old)
 and      /work/SRC/openSUSE:Factory/.babl.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "babl"

Tue Jan  2 16:33:12 2018 rev:35 rq:560826 version:0.1.38

Changes:
--------
--- /work/SRC/openSUSE:Factory/babl/babl.changes        2017-11-14 
14:46:01.088651201 +0100
+++ /work/SRC/openSUSE:Factory/.babl.new/babl.changes   2018-01-02 
16:33:13.839630738 +0100
@@ -1,0 +2,20 @@
+Sun Dec 31 01:49:35 UTC 2017 - [email protected]
+
+- Fix RPM groups. Drop comment about author extraction (not used
+  for specfiles in general anymore).
+
+-------------------------------------------------------------------
+Thu Dec 28 09:33:28 UTC 2017 - [email protected]
+
+- Update to version 0.1.38:
+  + Added format "CIE L float", a couple of protections against
+    division by 0.0.
+- Changes from version 0.1.36:
+  + Optimized customized primary aware code paths for CIE
+    Lab<->RGB conversions, improved accuracy of gamma
+    approximations.
+  + New API babl_format_exists() for checking validity of babl
+    format name, crash proofing of cache handling and use of
+    environment variables.
+
+-------------------------------------------------------------------

Old:
----
  babl-0.1.34.tar.bz2

New:
----
  babl-0.1.38.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ babl.spec ++++++
--- /var/tmp/diff_new_pack.DLlgSp/_old  2018-01-02 16:33:14.399444058 +0100
+++ /var/tmp/diff_new_pack.DLlgSp/_new  2018-01-02 16:33:14.403442725 +0100
@@ -17,11 +17,11 @@
 
 
 Name:           babl
-Version:        0.1.34
+Version:        0.1.38
 Release:        0
 Summary:        Dynamic Pixel Format Translation Library
 License:        LGPL-3.0+
-Group:          System/Libraries
+Group:          Development/Libraries/C and C++
 Url:            http://gegl.org/babl/
 Source:         http://ftp.gtk.org/pub/babl/0.1/%{name}-%{version}.tar.bz2
 BuildRequires:  pkg-config
@@ -29,8 +29,6 @@
 %define debug_package_requires libbabl-0_1-0 = %{version}-%{release}
 # None of these is needed for standard build:
 #BuildRequires:  inkscape ruby w3m
-# To list AUTHORS:
-# sed -n 's/  <dt>//p' <AUTHORS  | sed 's/<em>/</;s/<\/em>/>/;s/ at 
/@/;s/<\/dt>//'
 
 %description
 babl is a dynamic, any to any, pixel format translation library.

++++++ babl-0.1.34.tar.bz2 -> babl-0.1.38.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/INSTALL new/babl-0.1.38/INSTALL
--- old/babl-0.1.34/INSTALL     2017-10-06 15:05:59.000000000 +0200
+++ new/babl-0.1.38/INSTALL     2017-11-15 23:15:51.000000000 +0100
@@ -1,5 +1,5 @@
 
-babl 0.1.34
+babl 0.1.38
 
     Dynamic; any to any, pixel format conversion library.
 
@@ -12,10 +12,10 @@
 installation (or a variation on this theme):
 
      ------------------------------------------------------------
-     foo$ wget ftp://ftp.gtk.org/pub/babl/0.1/babl-0.1.34.tar.bz2
-     foo$ tar jxf babl-0.1.34.tar.gz
-     foo$ cd babl-0.1.34
-     foo/babl-0.1.34$ ./configure && make && sudo make install
+     foo$ wget ftp://ftp.gtk.org/pub/babl/0.1/babl-0.1.38.tar.bz2
+     foo$ tar jxf babl-0.1.38.tar.gz
+     foo$ cd babl-0.1.38
+     foo/babl-0.1.38$ ./configure && make && sudo make install
      ------------------------------------------------------------
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/NEWS new/babl-0.1.38/NEWS
--- old/babl-0.1.34/NEWS        2017-10-06 15:05:49.000000000 +0200
+++ new/babl-0.1.38/NEWS        2017-11-15 23:15:14.000000000 +0100
@@ -1,9 +1,17 @@
                                                                  <dl><dt><!--
 The NEWS file in the babl source tree is the source location for
 the news section both in the README and the webpage.
-
-
                                                                           -->
+
+2017-11-15 babl-0.1.38                                              </dt><dd>
+Added format "CIE L float", a couple of protections against division by 0.0
+                                                                    </dd><dt>
+2017-11-10 babl-0.1.36                                              </dt><dd>
+Optimized customized primary aware code paths for CIE Lab<->RGB conversions,
+improved accuracy of gamma approximations. New API babl_format_exists() for
+checking validity of babl format name, crash proofing of cache handling and use
+of environment variables.
+                                                                    </dd><dt>
 2017-10-06 babl-0.1.34                                              </dt><dd>
 Brown paper bag release, Fix indexed / custom primaries conflict, and re-export
 a symbol used by old GEGL/GIMPs.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/README new/babl-0.1.38/README
--- old/babl-0.1.34/README      2017-10-06 15:06:29.000000000 +0200
+++ new/babl-0.1.38/README      2017-11-15 23:16:18.000000000 +0100
@@ -1,4 +1,4 @@
-Babl-0.1.34
+Babl-0.1.38
 
 Contents
 
@@ -64,6 +64,14 @@
 release is done a babl release is most often put out just prior to the
 GEGL release.
 
+2017-11-15 babl-0.1.38
+    Added format "CIE L float", a couple of protections against
+    division by 0.0
+2017-11-10 babl-0.1.36
+    Optimized customized primary aware code paths for CIE Lab<->RGB
+    conversions, improved accuracy of gamma approximations. New API
+    babl_format_exists() for checking validity of babl format name,
+    crash proofing of cache handling and use of environment variables.
 2017-10-06 babl-0.1.34
     Brown paper bag release, Fix indexed / custom primaries conflict,
     and re-export a symbol used by old GEGL/GIMPs.
@@ -1691,6 +1699,16 @@
     float CIE b
     float A
 
+CIE L float
+
+bytes/pixel
+    4
+model
+    CIE Lab
+components
+
+    float CIE L
+
 CIE L alpha float
 
 bytes/pixel
@@ -2186,4 +2204,4 @@
 Ell
     fast paths
 
-/babl-0.1.34
+/babl-0.1.38
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-cache.c 
new/babl-0.1.38/babl/babl-cache.c
--- old/babl-0.1.34/babl/babl-cache.c   2017-10-01 01:25:25.000000000 +0200
+++ new/babl-0.1.38/babl/babl-cache.c   2017-11-11 14:07:53.000000000 +0100
@@ -37,6 +37,7 @@
 {
   char copy[4096];
   strncpy (copy, path, 4096);
+  copy[sizeof (copy) - 1] = '\0';
   if (strrchr (copy, '/'))
     {
       *strrchr (copy, '/') = '\0';
@@ -63,6 +64,7 @@
 {
   char copy[4096];
   strncpy (copy, path, 4096);
+  copy[sizeof (copy) - 1] = '\0';
 #ifdef _WIN32
   for (char *c = copy; *c; c++)
     if (*c == '\\')
@@ -77,18 +79,19 @@
   static char path[4096];
 
   strncpy (path, FALLBACK_CACHE_PATH, 4096);
+  path[sizeof (path) - 1] = '\0';
 #ifndef _WIN32
   if (getenv ("XDG_CACHE_HOME"))
-    sprintf (path, "%s/babl/babl-fishes", getenv("XDG_CACHE_HOME"));
+    snprintf (path, sizeof (path), "%s/babl/babl-fishes", 
getenv("XDG_CACHE_HOME"));
   else if (getenv ("HOME"))
-    sprintf (path, "%s/.cache/babl/babl-fishes", getenv("HOME"));
+    snprintf (path, sizeof (path), "%s/.cache/babl/babl-fishes", 
getenv("HOME"));
 #else
 {
   char win32path[4096];
   if (SHGetFolderPathA (NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, 
win32path) == S_OK)
-    sprintf (path, "%s\\%s\\babl-fishes.txt", win32path, BABL_LIBRARY);
+    snprintf (path, sizeof (path), "%s\\%s\\babl-fishes.txt", win32path, 
BABL_LIBRARY);
   else if (getenv ("TEMP"))
-    sprintf (path, "%s\\babl-fishes.txt", getenv("TEMP"));
+    snprintf (path, sizeof (path), "%s\\babl-fishes.txt", getenv("TEMP"));
 }
 #endif
 
@@ -150,13 +153,13 @@
 {
   static char buf[2048];
   if (strchr (BABL_GIT_VERSION, ' ')) // we must be building from tarball
-    sprintf (buf, "#%i.%i.%i BABL_PATH_LENGTH=%d BABL_TOLERANCE=%f",
+    snprintf (buf, sizeof (buf),
+             "#%i.%i.%i BABL_PATH_LENGTH=%d BABL_TOLERANCE=%f",
              BABL_MAJOR_VERSION, BABL_MINOR_VERSION, BABL_MICRO_VERSION,
              _babl_max_path_len (), _babl_legal_error ());
   else
-    sprintf (buf, "#%s BABL_PATH_LENGTH=%d BABL_TOLERANCE=%f",
-             BABL_GIT_VERSION,
-             _babl_max_path_len (), _babl_legal_error ());
+    snprintf (buf, sizeof (buf), "#%s BABL_PATH_LENGTH=%d BABL_TOLERANCE=%f",
+             BABL_GIT_VERSION, _babl_max_path_len (), _babl_legal_error ());
   return buf;
 }
 
@@ -167,10 +170,15 @@
   char *tmpp = calloc(8000,1);
   FILE *dbfile;
 
-  sprintf (tmpp, "%s~", fish_cache_path ());
+  if (!tmpp)
+    return;
+  snprintf (tmpp, 8000, "%s~", fish_cache_path ());
   dbfile  = fopen (tmpp, "w");
   if (!dbfile)
+  {
+    free (tmpp);
     return;
+  }
   fprintf (dbfile, "%s\n", cache_header ());
 
   /* sort the list of fishes by usage, making next run more efficient -
@@ -270,6 +278,7 @@
             {
               fprintf (stderr, "%s:%i: loading of cache failed\n",
                               __FUNCTION__, __LINE__);
+              free (contents);
               return;
             }
 
@@ -312,6 +321,7 @@
             Babl *conv = (void*)babl_db_find(babl_conversion_db(), &token[1]);
             if (!conv)
             {
+              free (contents);
               return;
             }
             else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-conversion.c 
new/babl-0.1.38/babl/babl-conversion.c
--- old/babl-0.1.34/babl/babl-conversion.c      2017-10-04 16:11:23.000000000 
+0200
+++ new/babl-0.1.38/babl/babl-conversion.c      2017-10-25 16:48:41.000000000 
+0200
@@ -154,7 +154,7 @@
 {
   if (babl_extender ())
     {
-      snprintf (buf, 512 - 1, "%s %i: %s%s to %s",
+      snprintf (buf, sizeof (buf), "%s %i: %s%s to %s",
                 BABL (babl_extender ())->instance.name,
                 collisions,
                 type == BABL_CONVERSION_LINEAR ? "" :
@@ -162,18 +162,16 @@
                 type == BABL_CONVERSION_PLANAR ? "planar " : "Eeeek! ",
                 source->instance.name,
                 destination->instance.name);
-      buf[511] = '\0';
     }
   else
     {
-      snprintf (buf, 512 - 1, "%s %s to %s %i",
+      snprintf (buf, sizeof (buf), "%s %s to %s %i",
                 type == BABL_CONVERSION_LINEAR ? "" :
                 type == BABL_CONVERSION_PLANE ? "plane " :
                 type == BABL_CONVERSION_PLANAR ? "planar " : "Eeeek! ",
                 source->instance.name,
                 destination->instance.name,
                 collisions);
-      buf[511] = '\0';
     }
   return buf;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-format.c 
new/babl-0.1.38/babl/babl-format.c
--- old/babl-0.1.34/babl/babl-format.c  2017-10-04 16:17:13.000000000 +0200
+++ new/babl-0.1.38/babl/babl-format.c  2017-10-31 20:46:54.000000000 +0100
@@ -135,8 +135,8 @@
 {
   Babl *ret;
   char new_name[256];
-  sprintf (new_name, "%s-%s", babl_get_name ((void*)format),
-                              babl_get_name ((void*)space));
+  snprintf (new_name, sizeof (new_name), "%s-%s", babl_get_name 
((void*)format),
+                                                  babl_get_name 
((void*)space));
   ret = babl_db_find (babl_format_db(), new_name);
   if (ret)
     return ret;
@@ -161,6 +161,7 @@
 {
   char            buf[512] = "";
   char           *p = &buf[0];
+  ssize_t         left;
   int             i;
   int             same_types = 1;
   const BablType**t          = type;
@@ -168,9 +169,11 @@
   BablComponent **c1         = component;
   BablComponent **c2         = model->component;
 
-
-  sprintf (p, "%s ", model->instance.name);
+  left = 512;
+  snprintf (p, left, "%s ", model->instance.name);
   p += strlen (model->instance.name) + 1;
+  left -= strlen (model->instance.name) + 1;
+  babl_assert (left >= 0);
 
   i = components;
   while (i--)
@@ -202,7 +205,7 @@
 
   if (same_types)
     {
-      sprintf (p, "%s", first_type->instance.name);
+      snprintf (p, left, "%s", first_type->instance.name);
       return babl_strdup (buf);
     }
 
@@ -210,11 +213,14 @@
 
   while (i--)
     {
-      sprintf (p, "(%s as %s) ",
+      snprintf (p, left, "(%s as %s) ",
                (*component)->instance.name,
                (*type)->instance.name);
       p += strlen ((*component)->instance.name) +
            strlen ((*type)->instance.name) + strlen ("( as ) ");
+      left -= strlen ((*component)->instance.name) +
+              strlen ((*type)->instance.name) + strlen ("( as ) ");
+      babl_assert (left >= 0);
       component++;
       type++;
     }
@@ -226,7 +232,7 @@
                          int         components)
 {
   char buf[512];
-  sprintf (buf, "%s[%i] ", type->instance.name, components);
+  snprintf (buf, sizeof (buf), "%s[%i] ", type->instance.name, components);
   return babl_strdup (buf);
 }
 
@@ -742,4 +748,13 @@
   return ret;
 }
 
+int
+babl_format_exists (const char *name)
+{
+  if (babl_db_exist_by_name (db, name))
+    return 1;
+  return 0;
+}
+
+
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-icc.c 
new/babl-0.1.38/babl/babl-icc.c
--- old/babl-0.1.34/babl/babl-icc.c     2017-10-03 17:05:49.000000000 +0200
+++ new/babl-0.1.38/babl/babl-icc.c     2017-10-25 16:48:41.000000000 +0200
@@ -973,7 +973,7 @@
   {
     char tag[5];
     int val = icc_read (u32, 64);
-    sprintf (tag, "%i", val);
+    snprintf (tag, sizeof (tag), "%i", val);
     return strdup (tag);
   } else if (!strcmp (key, "tags"))
   {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-internal.c 
new/babl-0.1.38/babl/babl-internal.c
--- old/babl-0.1.34/babl/babl-internal.c        2017-09-28 17:48:58.000000000 
+0200
+++ new/babl-0.1.38/babl/babl-internal.c        2017-10-25 16:48:41.000000000 
+0200
@@ -65,7 +65,7 @@
 {
   char buf[512];
 
-  sprintf (buf, "echo bt>/tmp/babl.gdb;"
+  snprintf (buf, sizeof (buf), "echo bt>/tmp/babl.gdb;"
            "gdb -q --batch -x /tmp/babl.gdb --pid=%i | grep 'in ''babl_die' 
-A40", getpid ());
   return system (buf);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-memory.c 
new/babl-0.1.38/babl/babl-memory.c
--- old/babl-0.1.34/babl/babl-memory.c  2017-09-21 21:06:11.000000000 +0200
+++ new/babl-0.1.38/babl/babl-memory.c  2017-10-25 16:48:41.000000000 +0200
@@ -71,7 +71,7 @@
 {
   static char buf[128];
 
-  sprintf (buf, "mallocs:%i callocs:%i strdups:%i dups:%i allocs:%i frees:%i 
reallocs:%i\t|",
+  snprintf (buf, sizeof (buf), "mallocs:%i callocs:%i strdups:%i dups:%i 
allocs:%i frees:%i reallocs:%i\t|",
            mallocs, callocs, strdups, dups, mallocs + callocs + strdups + 
dups, frees, reallocs);
   return buf;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-palette.c 
new/babl-0.1.38/babl/babl-palette.c
--- old/babl-0.1.34/babl/babl-palette.c 2017-10-04 15:39:24.000000000 +0200
+++ new/babl-0.1.38/babl/babl-palette.c 2017-11-15 20:22:01.000000000 +0100
@@ -483,7 +483,7 @@
   if (!name)
     {
       static int cnt = 0;
-      sprintf (cname, "_babl-int-%i", cnt++);
+      snprintf (cname, sizeof (cname), "_babl-int-%i", cnt++);
       name = cname;
     }
   else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-space.c 
new/babl-0.1.38/babl/babl-space.c
--- old/babl-0.1.34/babl/babl-space.c   2017-10-04 16:15:45.000000000 +0200
+++ new/babl-0.1.38/babl/babl-space.c   2017-10-25 16:48:41.000000000 +0200
@@ -285,9 +285,9 @@
   space_db[i]=space;
   space_db[i].instance.name = space_db[i].name;
   if (name)
-    sprintf (space_db[i].name, "%s", name);
+    snprintf (space_db[i].name, sizeof (space_db[i].name), "%s", name);
   else
-    sprintf (space_db[i].name, 
"space-%.4f,%.4f_%.4f,%.4f_%.4f_%.4f,%.4f_%.4f,%.4f_%s,%s,%s",
+    snprintf (space_db[i].name, sizeof (space_db[i].name), 
"space-%.4f,%.4f_%.4f,%.4f_%.4f_%.4f,%.4f_%.4f,%.4f_%s,%s,%s",
                        rx, gx, bx,
                        ry, gy, by,
                        rz, gz, bz,
@@ -348,10 +348,11 @@
   space_db[i]=space;
   space_db[i].instance.name = space_db[i].name;
   if (name)
-    sprintf (space_db[i].name, "%s", name);
+    snprintf (space_db[i].name, sizeof (space_db[i].name), "%s", name);
   else
           /* XXX: this can get longer than 256bytes ! */
-    sprintf (space_db[i].name, 
"space-%.4f,%.4f_%.4f,%.4f_%.4f,%.4f_%.4f,%.4f_%s,%s,%s",
+    snprintf (space_db[i].name, sizeof (space_db[i].name),
+             "space-%.4f,%.4f_%.4f,%.4f_%.4f,%.4f_%.4f,%.4f_%s,%s,%s",
              wx,wy,rx,ry,bx,by,gx,gy,babl_get_name (space.trc[0]),
              babl_get_name(space.trc[1]), babl_get_name(space.trc[2]));
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-trc.c 
new/babl-0.1.38/babl/babl-trc.c
--- old/babl-0.1.34/babl/babl-trc.c     2017-10-03 15:54:25.000000000 +0200
+++ new/babl-0.1.38/babl/babl-trc.c     2017-10-25 16:48:41.000000000 +0200
@@ -292,11 +292,11 @@
   trc_db[i]=trc;
   trc_db[i].instance.name = trc_db[i].name;
   if (name)
-    sprintf (trc_db[i].name, "%s", name);
+    snprintf (trc_db[i].name, sizeof (trc_db[i].name), "%s", name);
   else if (n_lut)
-    sprintf (trc_db[i].name, "lut-trc");
+    snprintf (trc_db[i].name, sizeof (trc_db[i].name), "lut-trc");
   else
-    sprintf (trc_db[i].name, "trc-%i-%f", type, gamma);
+    snprintf (trc_db[i].name, sizeof (trc_db[i].name), "trc-%i-%f", type, 
gamma);
 
   if (n_lut)
   {
@@ -430,7 +430,7 @@
       fabs (c - (-3417))  < 0.01)
     return babl_trc ("sRGB");
 
-  sprintf (name, "%.6f %.6f %.4f %.4f %.4f", g, a, b, c, d);
+  snprintf (name, sizeof (name), "%.6f %.6f %.4f %.4f %.4f", g, a, b, c, d);
   for (i = 0; name[i]; i++)
     if (name[i] == ',') name[i] = '.';
   while (name[strlen(name)-1]=='0')
@@ -446,7 +446,7 @@
   if (fabs (gamma - 1.0) < 0.01)
      return babl_trc_new ("linear", BABL_TRC_LINEAR, 1.0, 0, NULL);
 
-  sprintf (name, "%.6f", gamma);
+  snprintf (name, sizeof (name), "%.6f", gamma);
   for (i = 0; name[i]; i++)
     if (name[i] == ',') name[i] = '.';
   while (name[strlen(name)-1]=='0')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-util.c 
new/babl-0.1.38/babl/babl-util.c
--- old/babl-0.1.34/babl/babl-util.c    2017-10-01 01:25:25.000000000 +0200
+++ new/babl-0.1.38/babl/babl-util.c    2017-10-24 14:11:01.000000000 +0200
@@ -116,10 +116,18 @@
   if (!file)
     return -1;
 
-  fseek (file, 0, SEEK_END);
-  size = ftell (file);
+  if (fseek (file, 0, SEEK_END) == -1 || (size = ftell (file)) == -1)
+    {
+      fclose (file);
+      return -1;
+    }
   if (length) *length = size;
   rewind (file);
+  if ((size_t) size > SIZE_MAX - 8)
+    {
+      fclose (file);
+      return -1;
+    }
   buffer = calloc(size + 8, 1);
 
   if (!buffer)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl-version.h 
new/babl-0.1.38/babl/babl-version.h
--- old/babl-0.1.34/babl/babl-version.h 2017-10-06 15:05:59.000000000 +0200
+++ new/babl-0.1.38/babl/babl-version.h 2017-11-15 23:15:51.000000000 +0100
@@ -34,7 +34,7 @@
 
 #define BABL_MAJOR_VERSION 0
 #define BABL_MINOR_VERSION 1
-#define BABL_MICRO_VERSION 34
+#define BABL_MICRO_VERSION 38
 
 /** Get the version information on the babl library */
 void   babl_get_version (int *major,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/babl.h new/babl-0.1.38/babl/babl.h
--- old/babl-0.1.34/babl/babl.h 2017-10-03 17:04:26.000000000 +0200
+++ new/babl-0.1.38/babl/babl.h 2017-10-31 20:48:12.000000000 +0100
@@ -157,6 +157,15 @@
 const Babl * babl_format            (const char *name);
 
 /**
+ * babl_format_exists:
+ *
+ * Returns 1 if the provided format name is known by babl or 0 if it is
+ * not. Can also be used to verify that specific extension formats are
+ * available (though this can also be inferred from the version of babl).
+ */
+int babl_format_exists              (const char *name);
+
+/**
  * babl_format_with_space:
  *
  * Returns the babl object representing the color format given by
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/base/pow-24.c 
new/babl-0.1.38/babl/base/pow-24.c
--- old/babl-0.1.34/babl/base/pow-24.c  2017-09-21 21:06:11.000000000 +0200
+++ new/babl-0.1.38/babl/base/pow-24.c  2017-11-14 12:29:03.000000000 +0100
@@ -48,8 +48,13 @@
 double
 babl_pow_24 (double x)
 {
-  double y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
+  double y;
   int i;
+  if (x > 16.0) {
+    /* for large values, fall back to a slower but more accurate version */
+    return exp (log (x) * 2.4);
+  }
+  y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
   for (i = 0; i < 3; i++)
     y = (1.+1./5)*y - ((1./5)*x*(y*y))*((y*y)*(y*y));
   x *= y;
@@ -61,9 +66,14 @@
 double
 babl_pow_1_24 (double x)
 {
-  double y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
+  double y;
   int i;
   double z;
+  if (x > 1024.0) {
+    /* for large values, fall back to a slower but more accurate version */
+    return exp (log (x) * (1.0 / 2.4));
+  }
+  y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
   x = sqrt (x);
   /* newton's method for x^(-1/6) */
   z = (1./6.) * x;
@@ -102,10 +112,15 @@
 float
 babl_pow_24f (float x)
 {
-  float y = init_newtonf (x, -1.f/5, 0.9953189663f, 0.9594345146f, 
0.6742970332f);
+  float y;
   int i;
+  if (x > 16.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return expf (logf (x) * 2.4f);
+  }
+  y = init_newtonf (x, -1.f/5, 0.9953189663f, 0.9594345146f, 0.6742970332f);
   for (i = 0; i < 3; i++)
-    y = (1.f+1.f/5)*y - ((1./5)*x*(y*y))*((y*y)*(y*y));
+    y = (1.f+1.f/5)*y - ((1.f/5)*x*(y*y))*((y*y)*(y*y));
   x *= y;
   return x*x*x;
 }
@@ -115,9 +130,14 @@
 float
 babl_pow_1_24f (float x)
 {
-  float y = init_newtonf (x, -1.f/12, 0.9976800269f, 0.9885126933f, 
0.5908575383f);
+  float y;
   int i;
   float z;
+  if (x > 1024.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return expf (logf (x) * (1.0f / 2.4f));
+  }
+  y = init_newtonf (x, -1.f/12, 0.9976800269f, 0.9885126933f, 0.5908575383f);
   x = sqrtf (x);
   /* newton's method for x^(-1/6) */
   z = (1.f/6.f) * x;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/babl/base/pow-24.h 
new/babl-0.1.38/babl/base/pow-24.h
--- old/babl-0.1.34/babl/base/pow-24.h  2017-09-28 17:48:58.000000000 +0200
+++ new/babl-0.1.38/babl/base/pow-24.h  2017-11-14 12:29:03.000000000 +0100
@@ -54,8 +54,13 @@
 static inline double
 babl_pow_24 (double x)
 {
-  double y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
+  double y;
   int i;
+  if (x > 16.0) {
+    /* for large values, fall back to a slower but more accurate version */
+    return exp (log (x) * 2.4);
+  }
+  y = init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
   for (i = 0; i < 3; i++)
     y = (1.+1./5)*y - ((1./5)*x*(y*y))*((y*y)*(y*y));
   x *= y;
@@ -67,9 +72,14 @@
 static inline double
 babl_pow_1_24 (double x)
 {
-  double y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
+  double y;
   int i;
   double z;
+  if (x > 1024.0) {
+    /* for large values, fall back to a slower but more accurate version */
+    return exp (log (x) * (1.0 / 2.4));
+  }
+  y = init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
   x = sqrt (x);
   /* newton's method for x^(-1/6) */
   z = (1./6.) * x;
@@ -133,10 +143,15 @@
 static inline float
 babl_pow_24f (float x)
 {
-  float y = init_newtonf (x, -1.f/5, 0.9953189663f, 0.9594345146f, 
0.6742970332f);
+  float y;
   int i;
+  if (x > 16.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return expf (logf (x) * 2.4f);
+  }
+  y = init_newtonf (x, -1.f/5, 0.9953189663f, 0.9594345146f, 0.6742970332f);
   for (i = 0; i < 3; i++)
-    y = (1.f+1.f/5)*y - ((1./5)*x*(y*y))*((y*y)*(y*y));
+    y = (1.f+1.f/5)*y - ((1.f/5)*x*(y*y))*((y*y)*(y*y));
   x *= y;
   return x*x*x;
 }
@@ -146,9 +161,14 @@
 static inline float
 babl_pow_1_24f (float x)
 {
-  float y = init_newtonf (x, -1.f/12, 0.9976800269f, 0.9885126933f, 
0.5908575383f);
+  float y;
   int i;
   float z;
+  if (x > 1024.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return expf (logf (x) * (1.0f / 2.4f));
+  }
+  y = init_newtonf (x, -1.f/12, 0.9976800269f, 0.9885126933f, 0.5908575383f);
   x = sqrtf (x);
   /* newton's method for x^(-1/6) */
   z = (1.f/6.f) * x;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/configure new/babl-0.1.38/configure
--- old/babl-0.1.34/configure   2017-10-06 15:05:54.000000000 +0200
+++ new/babl-0.1.38/configure   2017-11-15 23:15:46.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for babl 0.1.34.
+# Generated by GNU Autoconf 2.69 for babl 0.1.38.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -587,8 +587,8 @@
 # Identity of this package.
 PACKAGE_NAME='babl'
 PACKAGE_TARNAME='babl'
-PACKAGE_VERSION='0.1.34'
-PACKAGE_STRING='babl 0.1.34'
+PACKAGE_VERSION='0.1.38'
+PACKAGE_STRING='babl 0.1.38'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1381,7 +1381,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures babl 0.1.34 to adapt to many kinds of systems.
+\`configure' configures babl 0.1.38 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1453,7 +1453,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of babl 0.1.34:";;
+     short | recursive ) echo "Configuration of babl 0.1.38:";;
    esac
   cat <<\_ACEOF
 
@@ -1573,7 +1573,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-babl configure 0.1.34
+babl configure 0.1.38
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1938,7 +1938,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by babl $as_me 0.1.34, which was
+It was created by babl $as_me 0.1.38, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2294,11 +2294,11 @@
 
 BABL_MAJOR_VERSION=0
 BABL_MINOR_VERSION=1
-BABL_MICRO_VERSION=34
+BABL_MICRO_VERSION=38
 BABL_INTERFACE_AGE=1
-BABL_BINARY_AGE=134
-BABL_VERSION=0.1.34
-BABL_REAL_VERSION=0.1.34
+BABL_BINARY_AGE=138
+BABL_VERSION=0.1.38
+BABL_REAL_VERSION=0.1.38
 BABL_API_VERSION=0.1
 
 
@@ -2333,7 +2333,7 @@
 
 
 
-BABL_LIBRARY_VERSION="133:1:133"
+BABL_LIBRARY_VERSION="137:1:137"
 BABL_CURRENT_MINUS_AGE=0
 
 
@@ -2965,7 +2965,7 @@
 
 # Define the identity of the package.
  PACKAGE='babl'
- VERSION='0.1.34'
+ VERSION='0.1.38'
 
 
 # Some tools Automake needs.
@@ -14864,7 +14864,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by babl $as_me 0.1.34, which was
+This file was extended by babl $as_me 0.1.38, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -14930,7 +14930,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-babl config.status 0.1.34
+babl config.status 0.1.38
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/configure.ac new/babl-0.1.38/configure.ac
--- old/babl-0.1.34/configure.ac        2017-10-06 15:04:38.000000000 +0200
+++ new/babl-0.1.38/configure.ac        2017-11-15 23:15:41.000000000 +0100
@@ -14,7 +14,7 @@
 
 m4_define([babl_major_version], [0])
 m4_define([babl_minor_version], [1])
-m4_define([babl_micro_version], [34])
+m4_define([babl_micro_version], [38])
 m4_define([babl_real_version],
           [babl_major_version.babl_minor_version.babl_micro_version])
 m4_define([babl_version], [babl_real_version])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/export-symbols 
new/babl-0.1.38/export-symbols
--- old/babl-0.1.34/export-symbols      2017-10-05 23:12:28.000000000 +0200
+++ new/babl-0.1.38/export-symbols      2017-10-31 20:50:32.000000000 +0100
@@ -8,6 +8,7 @@
 babl_fast_fish
 babl_fish
 babl_format
+babl_format_exists
 babl_format_get_bytes_per_pixel
 babl_format_get_model
 babl_format_get_n_components
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/extensions/CIE.c 
new/babl-0.1.38/extensions/CIE.c
--- old/babl-0.1.34/extensions/CIE.c    2017-10-03 16:37:07.000000000 +0200
+++ new/babl-0.1.38/extensions/CIE.c    2017-11-13 15:34:02.000000000 +0100
@@ -2,6 +2,7 @@
  * Copyright (C) 2005, 2014 Øyvind Kolås.
  * Copyright (C) 2009, Martin Nordholts
  * Copyright (C) 2014, Elle Stone
+ * Copyright (C) 2017, Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -168,13 +169,13 @@
   double y_r = Y / D50_WHITE_REF_Y;
   double z_r = Z / D50_WHITE_REF_Z;
 
-  if (x_r > LAB_EPSILON) f_x = pow(x_r, 1.0 / 3.0);
+  if (x_r > LAB_EPSILON) f_x = cbrt(x_r);
   else ( f_x = ((LAB_KAPPA * x_r) + 16) / 116.0 );
 
-  if (y_r > LAB_EPSILON) f_y = pow(y_r, 1.0 / 3.0);
+  if (y_r > LAB_EPSILON) f_y = cbrt(y_r);
   else ( f_y = ((LAB_KAPPA * y_r) + 16) / 116.0 );
 
-  if (z_r > LAB_EPSILON) f_z = pow(z_r, 1.0 / 3.0);
+  if (z_r > LAB_EPSILON) f_z = cbrt(z_r);
   else ( f_z = ((LAB_KAPPA * z_r) + 16) / 116.0 );
 
   *to_L = (116.0 * f_y) - 16.0;
@@ -592,6 +593,44 @@
 }
 
 static void
+Yf_to_Lf (const Babl *conversion,float *src,
+          float *dst,
+          long   samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      float yr = src[0];
+      float L  = yr > LAB_EPSILON ? 116.0f * _cbrtf (yr) - 16 : LAB_KAPPA * yr;
+
+      dst[0] = L;
+
+      src++;
+      dst++;
+    }
+}
+
+static void
+Yaf_to_Lf (const Babl *conversion,float *src,
+           float *dst,
+           long   samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      float yr = src[0];
+      float L  = yr > LAB_EPSILON ? 116.0f * _cbrtf (yr) - 16 : LAB_KAPPA * yr;
+
+      dst[0] = L;
+
+      src += 2;
+      dst += 1;
+    }
+}
+
+static void
 Yaf_to_Laf (const Babl *conversion,float *src,
             float *dst,
             long   samples)
@@ -617,6 +656,16 @@
               float *dst,
               long   samples)
 {
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
   long n = samples;
 
   while (n--)
@@ -625,9 +674,9 @@
       float g = src[1];
       float b = src[2];
 
-      float xr = 0.43603516f / D50_WHITE_REF_X * r + 0.38511658f / 
D50_WHITE_REF_X * g + 0.14305115f / D50_WHITE_REF_X * b;
-      float yr = 0.22248840f / D50_WHITE_REF_Y * r + 0.71690369f / 
D50_WHITE_REF_Y * g + 0.06060791f / D50_WHITE_REF_Y * b;
-      float zr = 0.01391602f / D50_WHITE_REF_Z * r + 0.09706116f / 
D50_WHITE_REF_Z * g + 0.71392822f / D50_WHITE_REF_Z * b;
+      float xr = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+      float yr = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+      float zr = m_2_0 * r + m_2_1 * g + m_2_2 * b;
 
       float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 
116.0f;
       float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 
116.0f;
@@ -647,10 +696,94 @@
 }
 
 static void
+rgbaf_to_Lf (const Babl *conversion,float *src,
+             float *dst,
+             long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  long n = samples;
+
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+
+      float yr = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+
+      float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 
116.0f;
+
+      float L = 116.0f * fy - 16.0f;
+
+      dst[0] = L;
+
+      src += 4;
+      dst += 1;
+    }
+}
+
+static void
+rgbaf_to_Labf (const Babl *conversion,float *src,
+               float *dst,
+               long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+      float r = src[0];
+      float g = src[1];
+      float b = src[2];
+
+      float xr = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+      float yr = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+      float zr = m_2_0 * r + m_2_1 * g + m_2_2 * b;
+
+      float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 
116.0f;
+      float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 
116.0f;
+      float fz = zr > LAB_EPSILON ? _cbrtf (zr) : (LAB_KAPPA * zr + 16.0f) / 
116.0f;
+
+      float L = 116.0f * fy - 16.0f;
+      float A = 500.0f * (fx - fy);
+      float B = 200.0f * (fy - fz);
+
+      dst[0] = L;
+      dst[1] = A;
+      dst[2] = B;
+
+      src += 4;
+      dst += 3;
+    }
+}
+
+static void
 rgbaf_to_Labaf (const Babl *conversion,float *src,
                 float *dst,
                 long   samples)
 {
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
   long n = samples;
 
   while (n--)
@@ -660,9 +793,9 @@
       float b = src[2];
       float a = src[3];
 
-      float xr = 0.43603516f / D50_WHITE_REF_X * r + 0.38511658f / 
D50_WHITE_REF_X * g + 0.14305115f / D50_WHITE_REF_X * b;
-      float yr = 0.22248840f / D50_WHITE_REF_Y * r + 0.71690369f / 
D50_WHITE_REF_Y * g + 0.06060791f / D50_WHITE_REF_Y * b;
-      float zr = 0.01391602f / D50_WHITE_REF_Z * r + 0.09706116f / 
D50_WHITE_REF_Z * g + 0.71392822f / D50_WHITE_REF_Z * b;
+      float xr = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+      float yr = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+      float zr = m_2_0 * r + m_2_1 * g + m_2_2 * b;
 
       float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 
116.0f;
       float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 
116.0f;
@@ -683,10 +816,52 @@
 }
 
 static void
+Labf_to_Lf (const Babl *conversion,float *src,
+            float *dst,
+            long   samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      dst[0] = src[0];
+
+      src += 3;
+      dst += 1;
+    }
+}
+
+static void
+Labaf_to_Lf (const Babl *conversion,float *src,
+             float *dst,
+             long   samples)
+{
+  long n = samples;
+
+  while (n--)
+    {
+      dst[0] = src[0];
+
+      src += 4;
+      dst += 1;
+    }
+}
+
+static void
 Labf_to_rgbf (const Babl *conversion,float *src,
                 float *dst,
                 long   samples)
 {
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X;
+  float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y;
+  float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z;
+  float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X;
+  float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y;
+  float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z;
+  float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X;
+  float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y;
+  float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z;
   long n = samples;
 
   while (n--)
@@ -703,9 +878,9 @@
       float xr = cubef (fx) > LAB_EPSILON ? cubef (fx) : (fx * 116.0f - 16.0f) 
/ LAB_KAPPA;
       float zr = cubef (fz) > LAB_EPSILON ? cubef (fz) : (fz * 116.0f - 16.0f) 
/ LAB_KAPPA;
 
-      float r =  3.134274799724f * D50_WHITE_REF_X * xr -1.617275708956f * 
D50_WHITE_REF_Y * yr -0.490724283042f * D50_WHITE_REF_Z * zr;
-      float g = -0.978795575994f * D50_WHITE_REF_X * xr +1.916161689117f * 
D50_WHITE_REF_Y * yr +0.033453331711f * D50_WHITE_REF_Z * zr;
-      float b =  0.071976988401f * D50_WHITE_REF_X * xr -0.228984974402f * 
D50_WHITE_REF_Y * yr +1.405718224383f * D50_WHITE_REF_Z * zr;
+      float r = m_0_0 * xr + m_0_1 * yr + m_0_2 * zr;
+      float g = m_1_0 * xr + m_1_1 * yr + m_1_2 * zr;
+      float b = m_2_0 * xr + m_2_1 * yr + m_2_2 * zr;
 
       dst[0] = r;
       dst[1] = g;
@@ -721,6 +896,16 @@
                 float *dst,
                 long   samples)
 {
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X;
+  float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y;
+  float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z;
+  float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X;
+  float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y;
+  float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z;
+  float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X;
+  float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y;
+  float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z;
   long n = samples;
 
   while (n--)
@@ -738,9 +923,9 @@
       float xr = cubef (fx) > LAB_EPSILON ? cubef (fx) : (fx * 116.0f - 16.0f) 
/ LAB_KAPPA;
       float zr = cubef (fz) > LAB_EPSILON ? cubef (fz) : (fz * 116.0f - 16.0f) 
/ LAB_KAPPA;
 
-      float r =  3.134274799724f * D50_WHITE_REF_X * xr -1.617275708956f * 
D50_WHITE_REF_Y * yr -0.490724283042f * D50_WHITE_REF_Z * zr;
-      float g = -0.978795575994f * D50_WHITE_REF_X * xr +1.916161689117f * 
D50_WHITE_REF_Y * yr +0.033453331711f * D50_WHITE_REF_Z * zr;
-      float b =  0.071976988401f * D50_WHITE_REF_X * xr -0.228984974402f * 
D50_WHITE_REF_Y * yr +1.405718224383f * D50_WHITE_REF_Z * zr;
+      float r = m_0_0 * xr + m_0_1 * yr + m_0_2 * zr;
+      float g = m_1_0 * xr + m_1_1 * yr + m_1_2 * zr;
+      float b = m_2_0 * xr + m_2_1 * yr + m_2_2 * zr;
 
       dst[0] = r;
       dst[1] = g;
@@ -905,6 +1090,12 @@
   );
   babl_conversion_new (
     babl_format ("RGBA float"),
+    babl_format ("CIE Lab float"),
+    "linear", rgbaf_to_Labf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("RGBA float"),
     babl_format ("CIE Lab alpha float"),
     "linear", rgbaf_to_Labaf,
     NULL
@@ -916,12 +1107,42 @@
     NULL
   );
   babl_conversion_new (
+    babl_format ("Y float"),
+    babl_format ("CIE L float"),
+    "linear", Yf_to_Lf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("YA float"),
+    babl_format ("CIE L float"),
+    "linear", Yaf_to_Lf,
+    NULL
+  );
+  babl_conversion_new (
     babl_format ("YA float"),
     babl_format ("CIE L alpha float"),
     "linear", Yaf_to_Laf,
     NULL
   );
   babl_conversion_new (
+    babl_format ("RGBA float"),
+    babl_format ("CIE L float"),
+    "linear", rgbaf_to_Lf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("CIE Lab float"),
+    babl_format ("CIE L float"),
+    "linear", Labf_to_Lf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("CIE Lab alpha float"),
+    babl_format ("CIE L float"),
+    "linear", Labaf_to_Lf,
+    NULL
+  );
+  babl_conversion_new (
     babl_model ("RGBA"),
     babl_model ("CIE LCH(ab)"),
     "linear", rgba_to_lchab,
@@ -1020,6 +1241,13 @@
     NULL);
 
   babl_format_new (
+    "name", "CIE L float",
+    babl_model ("CIE Lab"),
+    babl_type ("float"),
+    babl_component ("CIE L"),
+    NULL);
+
+  babl_format_new (
     "name", "CIE L alpha float",
     babl_model ("CIE Lab alpha"),
     babl_type ("float"),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/extensions/gggl-lies.c 
new/babl-0.1.38/extensions/gggl-lies.c
--- old/babl-0.1.34/extensions/gggl-lies.c      2017-09-29 00:30:45.000000000 
+0200
+++ new/babl-0.1.38/extensions/gggl-lies.c      2017-11-10 10:33:42.000000000 
+0100
@@ -356,7 +356,10 @@
     {
       float alpha = (*(float *) (src + 4));
 
-      *(float *) dst = ((*(float *) src) / alpha);
+      if (alpha == 0.0f)
+        *(float *) dst = 0.0f;
+      else
+        *(float *) dst = ((*(float *) src) / alpha);
       dst           += 4;
       src           += 4;
       *(float *) dst = alpha;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/extensions/gggl.c 
new/babl-0.1.38/extensions/gggl.c
--- old/babl-0.1.34/extensions/gggl.c   2017-09-29 00:30:45.000000000 +0200
+++ new/babl-0.1.38/extensions/gggl.c   2017-11-10 10:39:23.000000000 +0100
@@ -373,7 +373,10 @@
     {
       float alpha = (*(float *) (src + 4));
 
-      *(float *) dst = ((*(float *) src) / alpha);
+      if (alpha == 0.0f)
+        *(float *) dst = 0.0f;
+      else
+        *(float *) dst = ((*(float *) src) / alpha);
       dst           += 4;
       src           += 4;
       *(float *) dst = alpha;
@@ -557,10 +560,16 @@
     {
       float alpha = (((unsigned short *) src)[3]) / 65535.0;
       int   c;
+      float recip_alpha;
+
+      if (alpha == 0.0f)
+        recip_alpha = 10000.0;
+      else
+        recip_alpha = 1.0/alpha;
 
       for (c = 0; c < 3; c++)
         {
-          (*(float *) dst) = (*(unsigned short *) src / 65535.0) / alpha;
+          (*(float *) dst) = (*(unsigned short *) src / 65535.0) * recip_alpha;
           dst             += 4;
           src             += 2;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/babl-0.1.34/extensions/sse2-float.c 
new/babl-0.1.38/extensions/sse2-float.c
--- old/babl-0.1.34/extensions/sse2-float.c     2017-09-29 00:30:45.000000000 
+0200
+++ new/babl-0.1.38/extensions/sse2-float.c     2017-11-08 22:50:29.000000000 
+0100
@@ -237,6 +237,22 @@
 #define FLT_ONE 0x3f800000 // ((union {float f; int i;}){1.0f}).i
 #define FLT_MANTISSA (1<<23)
 
+static inline float
+sse_max_component (__v4sf x) {
+  __v4sf s;
+  __v4sf m;
+
+  /* m = [max (x[3], x[1]), max (x[2], x[0])] */
+  s = (__v4sf) _mm_shuffle_epi32 ((__m128i) x, _MM_SHUFFLE(0, 0, 3, 2));
+  m = _mm_max_ps (x, s);
+
+  /* m = [max (m[1], m[0])] = [max (max (x[3], x[1]), max (x[2], x[0]))] */
+  s = (__v4sf) _mm_shuffle_epi32 ((__m128i) m, _MM_SHUFFLE(0, 0, 0, 1));
+  m = _mm_max_ps (m, s);
+
+  return m[0];
+}
+
 static inline __v4sf
 sse_init_newton (__v4sf x, double exponent, double c0, double c1, double c2)
 {
@@ -249,6 +265,13 @@
 sse_pow_1_24 (__v4sf x)
 {
   __v4sf y, z;
+  if (sse_max_component (x) > 1024.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return _mm_set_ps (expf (logf (x[3]) * (1.0f / 2.4f)),
+                       expf (logf (x[2]) * (1.0f / 2.4f)),
+                       expf (logf (x[1]) * (1.0f / 2.4f)),
+                       expf (logf (x[0]) * (1.0f / 2.4f)));
+  }
   y = sse_init_newton (x, -1./12, 0.9976800269, 0.9885126933, 0.5908575383);
   x = _mm_sqrt_ps (x);
   /* newton's method for x^(-1/6) */
@@ -262,6 +285,13 @@
 sse_pow_24 (__v4sf x)
 {
   __v4sf y, z;
+  if (sse_max_component (x) > 16.0f) {
+    /* for large values, fall back to a slower but more accurate version */
+    return _mm_set_ps (expf (logf (x[3]) * 2.4f),
+                       expf (logf (x[2]) * 2.4f),
+                       expf (logf (x[1]) * 2.4f),
+                       expf (logf (x[0]) * 2.4f));
+  }
   y = sse_init_newton (x, -1./5, 0.9953189663, 0.9594345146, 0.6742970332);
   /* newton's method for x^(-1/5) */
   z = splat4f (1.f/5.f) * x;


Reply via email to