Package org.jwildfire.create.tina.io

Source Code of org.jwildfire.create.tina.io.Flam3GradientReader

/*
  JWildfire - an image and animation processor written in Java
  Copyright (C) 1995-2011 Andreas Maschke

  This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
  General Public License as published by the Free Software Foundation; either version 2.1 of the
  License, or (at your option) any later version.
  This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License along with this software;
  if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.create.tina.io;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jwildfire.base.Tools;
import org.jwildfire.create.tina.palette.RGBPalette;

public class Flam3GradientReader implements RGBPaletteReader {

  @Override
  public List<RGBPalette> readPalettes(InputStream pInputStream) {
    try {
      String palettesXML;
      {
        StringBuffer content = new StringBuffer();
        String lineFeed = System.getProperty("line.separator");
        String line;
        Reader r = new InputStreamReader(pInputStream, "utf-8");
        BufferedReader in = new BufferedReader(r);
        while ((line = in.readLine()) != null) {
          content.append(line).append(lineFeed);
        }
        in.close();
        palettesXML = content.toString();
      }
      return readPalettesFromXML(palettesXML);
    }
    catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

  public List<RGBPalette> readPalettes(String pFilename) {
    try {
      String flamesXML = Tools.readUTF8Textfile(pFilename);
      return readPalettesFromXML(flamesXML);
    }
    catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

  private Map<String, String> parseAttributes(String pXML) {
    Map<String, String> res = new HashMap<String, String>();
    int p = 0;
    while (true) {
      int ps = pXML.indexOf("=\"", p + 1);
      if (ps < 0)
        break;
      int pe = pXML.indexOf("\"", ps + 2);
      String name = pXML.substring(p, ps).trim();
      String value;
      try {
        value = pXML.substring(ps + 2, pe);
        //      System.out.println("#" + name + "#" + value + "#");
      }
      catch (Throwable ex) {
        throw new RuntimeException("Error parsing attribute \"" + name + "\" (" + pXML + ")", ex);
      }
      res.put(name, value);
      p = pe + 2;
    }
    return res;
  }

  private static final String ATTR_NUMBER = "number";
  private static final String ATTR_NAME = "name";
  private static final String ATTR_DATA = "data";

  private void parsePaletteAttributes(RGBPalette pPalette, String pXML) {
    Map<String, String> atts = parseAttributes(pXML);
    String hs;
    if ((hs = atts.get(ATTR_NUMBER)) != null) {
      pPalette.setFlam3Number(hs.trim());
    }
    if ((hs = atts.get(ATTR_NAME)) != null) {
      pPalette.setFlam3Name(hs.trim());
    }
    if ((hs = atts.get(ATTR_DATA)) != null) {
      hs = hs.trim().replaceAll("\\s", "");
      int index = 0;
      for (int i = 0; i < hs.length(); i += 8) {
        int r = Integer.parseInt(hs.substring(i + 2, i + 4), 16);
        int g = Integer.parseInt(hs.substring(i + 4, i + 6), 16);
        int b = Integer.parseInt(hs.substring(i + 6, i + 8), 16);
        pPalette.setColor(index++, r, g, b);
      }
    }
  }

  public List<RGBPalette> readPalettesFromXML(String pXML) {
    List<RGBPalette> res = new ArrayList<RGBPalette>();
    int pPalettes = 0;
    while (true) {
      String paletteXML;
      {
        int ps = pXML.indexOf("<palette ", pPalettes);
        if (ps < 0)
          break;
        int pe = pXML.indexOf("/>", ps + 1);
        if (pe < 0)
          break;
        pPalettes = pe + 2;
        paletteXML = pXML.substring(ps, pPalettes);
      }

      RGBPalette palette = new RGBPalette();
      res.add(palette);
      {
        int ps = paletteXML.indexOf("<flame ");
        int pe = -1;
        boolean qt = false;
        for (int i = ps + 1; i < paletteXML.length(); i++) {
          if (paletteXML.charAt(i) == '\"') {
            qt = !qt;
          }
          else if (!qt && paletteXML.charAt(i) == '>') {
            pe = i;
            break;
          }
        }
        String hs = paletteXML.substring(ps + 7, pe);
        parsePaletteAttributes(palette, hs);
      }
    }
    return res;
  }

}
TOP

Related Classes of org.jwildfire.create.tina.io.Flam3GradientReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.