/* * $Copyright: copyright (c) 2003-2008, e.e d3si9n $ * $License: * This source code is part of DoubleType. * DoubleType is a graphical typeface designer. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This Program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, e.e d3si9n gives permission to * link the code of this program with any Java Platform that is available * to public with free of charge, including but not limited to * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), * and distribute linked combinations including the two. * You must obey the GNU General Public License in all respects for all * of the code used other than Java Platform. If you modify this file, * you may extend this exception to your version of the file, but you are not * obligated to do so. If you do not wish to do so, delete this exception * statement from your version. * $ */ package org.doubletype.ossa.module; import java.awt.Point; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.doubletype.ossa.adapter.EContour; import org.doubletype.ossa.adapter.EContourPoint; import org.doubletype.ossa.truetype.TTGlyph; import org.doubletype.ossa.truetype.TTUnicodeRange; /** * @author e.e */ public class GlyphFile { private long m_unicode; private String m_author; private String m_copyrightYear; private Date m_creationDate = new Date(); private Date m_modificationDate = m_creationDate; private String m_license; private Integer m_advanceWidth = null; private List<EContour> m_contours = new ArrayList<>(); // -------------------------------------------------------------- protected long m_modifiedTime = 0; protected long m_savedTime = 0; private final int k_halfWidth = 512; private final int k_fullWidth = 1024; // -------------------------------------------------------------- /** * creates new file */ public GlyphFile(File a_dir, long a_unicode) { super(); init(); setUnicode(a_unicode); setAdvanceWidth(k_fullWidth); } /** * creates new file * * @param a_dir parent dir */ public GlyphFile(File a_dir) { super(); init(); } private void init() { m_savedTime = m_modifiedTime; } /** * initialize .notdef */ public void initNotDef(int a_advanceWidth) { setAdvanceWidth(a_advanceWidth); EContour contour = new EContour(); contour.setType(EContour.k_cubic); contour.addContourPoint(new EContourPoint(0.0, 0.0, true)); contour.addContourPoint(new EContourPoint(438.0, 0.0, true)); contour.addContourPoint(new EContourPoint(438.0, 683.0, true)); contour.addContourPoint(new EContourPoint(0.0, 683.0, true)); addContour(contour); contour = new EContour(); contour.setType(EContour.k_cubic); contour.addContourPoint(new EContourPoint(365.0, 73.0, true)); contour.addContourPoint(new EContourPoint(73.0, 73.0, true)); contour.addContourPoint(new EContourPoint(73.0, 610.0, true)); contour.addContourPoint(new EContourPoint(365.0, 610.0, true)); addContour(contour); } public void initNullGlyph() { setAdvanceWidth(0); } public void initSpace(int a_advanceWidth) { setAdvanceWidth(a_advanceWidth); } public void beforePush() { } // -------------------------------------------------------------- public boolean hasUnsavedChange() { return (m_savedTime != m_modifiedTime); } public void setAuthor(String a_value) { m_author = a_value; } public String getAuthor() { return m_author; } public void setCopyrightYear(String a_value) { m_copyrightYear = a_value; } public String getCopyrightYear() { return m_copyrightYear; } public void setCreationDate(Date a_value) { m_creationDate = a_value; } public Date getCreationDate() { return m_creationDate; } public void setModificationDate(Date a_value) { m_modificationDate = a_value; } public Date getModificationDate() { return m_modificationDate; } public void setAdvanceWidth(int a_width) { m_advanceWidth = a_width; } public int getAdvanceWidth() { if (m_advanceWidth == null) { return k_halfWidth; } return m_advanceWidth; } // -------------------------------------------------------------- public static final int k_defaultPixelSize = 16; //PPM // -------------------------------------------------------------- /** * Generates array of XContour from local contours and modules. * Used for TTF building. */ private EContour[] toContours() { EContour[] retval; ArrayList<EContour> list = new ArrayList<>(); for (EContour contour : m_contours) { list.add(contour.toQuadratic()); } if (list.size() == 0) { return null; } retval = new EContour[list.size()]; for (int i = 0; i < list.size(); i++) { retval[i] = list.get(i); } return retval; } // -------------------------------------------------------------- /** * add contour from clipboard or ContourAction * * @param a_contour */ public void addContour(EContour a_contour) { m_contours.add(a_contour); } // -------------------------------------------------------------- public long getUnicode() { return m_unicode; } protected void setUnicode(long a_unicode) { m_unicode = a_unicode; } public boolean isSimple() { return true; } public boolean isWhiteSpace() { long unicode = getUnicode(); if (unicode == 0x0020 || unicode == 0x00a0 || unicode == 0x200b || unicode == 0x2060 || unicode == 0x3000 || unicode == 0xfeff) { return true; } return false; } public void setLicense(String a_value) { m_license = a_value; } public String getLicense() { return m_license; } public boolean isRequiredGlyph() { long unicode = getUnicode(); return (unicode == TTUnicodeRange.k_notDef || unicode == TTUnicodeRange.k_null || unicode == TTUnicodeRange.k_cr || unicode == TTUnicodeRange.k_space); } public TTGlyph toSimpleGlyph() { // convert the file into array of contours EContour[] contours = toContours(); if ((contours == null) && (!isRequiredGlyph())) { return null; } TTGlyph retval = new TTGlyph(); retval.setSimple(true); retval.setAdvanceWidth(getAdvanceWidth()); if (contours == null) { return retval; } ArrayList<EContourPoint> points = new ArrayList<>(); for (int i = 0; i < contours.length; i++) { EContour contour = contours[i]; ArrayList<EContourPoint> contourPoints = contour.getContourPoints(); for (int j = 0; j < contourPoints.size(); j++) { points.add((EContourPoint) contourPoints.get(j)); } // for j retval.addEndPoint(points.size() - 1); } for (EContourPoint point : points) { loadContourPoint(retval, point); } // for point return retval; } private void loadContourPoint(TTGlyph a_glyph, EContourPoint a_point) { double x = a_point.getX(); double y = a_point.getY(); Point p = new Point((int) x, (int) y); int flag = 0; if (a_point.isOn()) { flag = TTGlyph.k_onCurve; } a_glyph.addPoint(p); a_glyph.addFlag(flag); } }