Author: Diego Barrios Romero <eldr...@eldruin.com>
Date:   Wed Mar 28 11:46:49 2012 +0200

Improved GPL format support, bugs corrected

---

 synfig-core/src/synfig/palette.cpp |   80 +++++++++++++++++++++---------------
 1 files changed, 47 insertions(+), 33 deletions(-)

diff --git a/synfig-core/src/synfig/palette.cpp 
b/synfig-core/src/synfig/palette.cpp
index 533cf3f..50dae43 100644
--- a/synfig-core/src/synfig/palette.cpp
+++ b/synfig-core/src/synfig/palette.cpp
@@ -36,6 +36,7 @@
 #include "general.h"
 #include <fstream>
 #include <iostream>
+#include <sstream>
 
 #endif
 
@@ -366,56 +367,69 @@ Palette::load_from_file(const synfig::String& filename)
                file format: GPL (GIMP Palette) file should have the following 
layout:
                GIMP Palette
                Name: <palette name>
-               <more header text> ...
-               #
-               # comments
-               #
+               [Columns: <number>]
+               [#]
+               [# Optional comments]
+               [#]
                <value R> <value G> <value B> <swatch name>
                <value R> <value G> <value B> <swatch name>
                ... ...
-               <new line>
+               [<new line>]
                */
 
-               // drops empty first header lines in malformed files
-               while (!file.eof() && line=="")
+               do {
                        getline(file,line);
+               } while (!file.eof() && line != PALETTE_GIMP_FILE_COOKIE);
 
-               if (line!=PALETTE_GIMP_FILE_COOKIE)
+               if (line != PALETTE_GIMP_FILE_COOKIE)
                        throw strprintf(_("%s does not appear to be a valid %s 
palette file"),filename.c_str(),"GIMP");
 
-               getline(file,line);
-               // drops 6 first chars from line (ie 'Name: ')
-               ret.name_ = String(line.substr(6));
-
-               getline(file,line);
-               // drops remaining header lines
-               while (!file.eof() && line.substr(0,1)!="#")
-                       getline(file,line);
-
-               // drops comments
-               while (!file.eof() && line.substr(0,1)=="#")
-                       getline(file,line);
-
-               // line contains the first color so we put it back in
-               for (int i = line.length(); i; i--) file.unget();
+                       
+               bool has_color = false;
+
+               do
+               {                       
+                       getline(file, line);
+                       
+                       if (!line.empty() && line.substr(0,5) == "Name:")
+                               ret.name_ = String(line.substr(6));
+                       else if (!line.empty() && line.substr(0,8) == 
"Columns:")
+                               ; // Ignore columns
+                       else if (!line.empty() && line.substr(0,1) == "#")
+                               ; // Ignore comments
+                       else if (!line.empty())
+                       {
+                               // not empty line not part of the header => 
color
+                               has_color = true;
+                               // line contains the first color so we put it 
back in (including \n)
+                               for (int i = line.length()+1; i; i--)
+                                       file.unget();
+                       }
+               } while (!file.eof() && !has_color);
 
-               while(!file.eof())
+               while(!file.eof() && has_color)
                {
                        PaletteItem item;
                        float r, g, b;
 
-                       file >> r >> g >> b;
-                       getline(file, item.name);
+                       stringstream ss;
+                       getline (file, line);
 
-                       item.color.set_r(pow(r/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
-                       item.color.set_g(pow(g/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
-                       item.color.set_b(pow(b/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
-                       // Alpha is 1 by default
-                       item.color.set_a(1);
+                       if (!line.empty())
+                       {
+                               ss << line;
+                               
+                               ss >> r >> g >> b;
+                               getline(ss, item.name);
+
+                               item.color.set_r(pow(r/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
+                               item.color.set_g(pow(g/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
+                               item.color.set_b(pow(b/255, 
GAMMA_CORRECTION_FACTOR_GPL2SPAL));
+                               // Alpha is 1 by default
+                               item.color.set_a(1);
 
-                       // file ends in new line
-                       if(!file.eof())
                                ret.push_back(item);
+                       }
                }
        }
        else


------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to