summaryrefslogtreecommitdiffstats
path: root/turtle2d/src/jogamp/graph/font
diff options
context:
space:
mode:
Diffstat (limited to 'turtle2d/src/jogamp/graph/font')
-rw-r--r--turtle2d/src/jogamp/graph/font/FontConstructor.java34
-rw-r--r--turtle2d/src/jogamp/graph/font/FontInt.java50
-rw-r--r--turtle2d/src/jogamp/graph/font/JavaFontLoader.java129
-rw-r--r--turtle2d/src/jogamp/graph/font/UbuntuFontLoader.java132
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/CONTRIBUTING.txt21
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/FONTLOG.txt211
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE-FAQ.txt177
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE.txt96
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/README.txt15
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/TRADEMARKS.txt4
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-B.ttfbin0 -> 339320 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-BI.ttfbin0 -> 362784 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-L.ttfbin0 -> 421172 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-LI.ttfbin0 -> 415424 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-M.ttfbin0 -> 346940 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-MI.ttfbin0 -> 372728 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttfbin0 -> 359668 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-RI.ttfbin0 -> 389744 bytes
-rw-r--r--turtle2d/src/jogamp/graph/font/fonts/ubuntu/copyright.txt5
-rw-r--r--turtle2d/src/jogamp/graph/font/typecast/TypecastFont.java268
-rw-r--r--turtle2d/src/jogamp/graph/font/typecast/TypecastFontConstructor.java53
-rw-r--r--turtle2d/src/jogamp/graph/font/typecast/TypecastGlyph.java232
-rw-r--r--turtle2d/src/jogamp/graph/font/typecast/TypecastHMetrics.java83
-rw-r--r--turtle2d/src/jogamp/graph/font/typecast/TypecastRenderer.java163
24 files changed, 1673 insertions, 0 deletions
diff --git a/turtle2d/src/jogamp/graph/font/FontConstructor.java b/turtle2d/src/jogamp/graph/font/FontConstructor.java
new file mode 100644
index 000000000..a382d292e
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/FontConstructor.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font;
+
+import com.jogamp.graph.font.Font;
+
+public interface FontConstructor {
+ Font create(String name);
+}
diff --git a/turtle2d/src/jogamp/graph/font/FontInt.java b/turtle2d/src/jogamp/graph/font/FontInt.java
new file mode 100644
index 000000000..4d9390da2
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/FontInt.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font;
+
+import jogamp.graph.geom.plane.AffineTransform;
+import jogamp.graph.geom.plane.Path2D;
+
+import com.jogamp.graph.font.Font;
+
+public interface FontInt extends Font {
+
+ public interface Glyph extends Font.Glyph {
+ // reserved special glyph IDs
+ // http://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter08#ba57949e
+ public static final int ID_UNKNOWN = 0;
+ public static final int ID_CR = 2;
+ public static final int ID_SPACE = 3;
+
+ public Path2D getPath(); // unscaled path
+ public Path2D getPath(float pixelSize);
+ }
+
+ public void getOutline(String string, float pixelSize,
+ AffineTransform transform, Path2D[] result);
+}
diff --git a/turtle2d/src/jogamp/graph/font/JavaFontLoader.java b/turtle2d/src/jogamp/graph/font/JavaFontLoader.java
new file mode 100644
index 000000000..33505e797
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/JavaFontLoader.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font;
+
+import com.jogamp.common.util.IntObjectHashMap;
+import com.jogamp.graph.font.Font;
+import com.jogamp.graph.font.FontSet;
+import com.jogamp.graph.font.FontFactory;
+
+public class JavaFontLoader implements FontSet {
+
+ final static FontSet fontLoader = new JavaFontLoader();
+
+ public static FontSet get() {
+ return fontLoader;
+ }
+
+ final static String availableFontFileNames[] =
+ {
+ /* 00 */ "LucidaBrightRegular.ttf",
+ /* 01 */ "LucidaBrightItalic.ttf",
+ /* 02 */ "LucidaBrightDemiBold.ttf",
+ /* 03 */ "LucidaBrightDemiItalic.ttf",
+ /* 04 */ "LucidaSansRegular.ttf",
+ /* 05 */ "LucidaSansDemiBold.ttf",
+ /* 06 */ "LucidaTypewriterRegular.ttf",
+ /* 07 */ "LucidaTypewriterBold.ttf",
+ };
+
+ final String javaFontPath;
+
+ private JavaFontLoader() {
+ javaFontPath = System.getProperty("java.home") + "/lib/fonts/";
+ }
+
+ // FIXME: Add cache size to limit memory usage
+ static final IntObjectHashMap fontMap = new IntObjectHashMap();
+
+ static boolean is(int bits, int bit) {
+ return 0 != ( bits & bit ) ;
+ }
+
+ public Font getDefault() {
+ return get(FAMILY_REGULAR, 0) ; // Sans Serif Regular
+ }
+
+ public Font get(int family, int style) {
+ Font font = (Font)fontMap.get( ( family << 8 ) | style );
+ if (font != null) {
+ return font;
+ }
+
+ // 1st process Sans Serif (2 fonts)
+ if( is(style, STYLE_SERIF) ) {
+ if( is(style, STYLE_BOLD) ) {
+ font = abspath(availableFontFileNames[5], family, style);
+ } else {
+ font = abspath(availableFontFileNames[4], family, style);
+ }
+ fontMap.put( ( family << 8 ) | style, font );
+ return font;
+ }
+
+ // Serif Fonts ..
+ switch (family) {
+ case FAMILY_LIGHT:
+ case FAMILY_MEDIUM:
+ case FAMILY_CONDENSED:
+ case FAMILY_REGULAR:
+ if( is(style, STYLE_BOLD) ) {
+ if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[3], family, style);
+ } else {
+ font = abspath(availableFontFileNames[2], family, style);
+ }
+ } else if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[1], family, style);
+ } else {
+ font = abspath(availableFontFileNames[0], family, style);
+ }
+ break;
+
+ case FAMILY_MONOSPACED:
+ if( is(style, STYLE_BOLD) ) {
+ font = abspath(availableFontFileNames[7], family, style);
+ } else {
+ font = abspath(availableFontFileNames[6], family, style);
+ }
+ break;
+ }
+
+ return font;
+ }
+
+ Font abspath(String fname, int family, int style) {
+ final Font f = FontFactory.getFontConstr().create(javaFontPath+fname);
+ if(null != f) {
+ fontMap.put( ( family << 8 ) | style, f );
+ }
+ return f;
+
+ }
+
+}
diff --git a/turtle2d/src/jogamp/graph/font/UbuntuFontLoader.java b/turtle2d/src/jogamp/graph/font/UbuntuFontLoader.java
new file mode 100644
index 000000000..e09ea85e5
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/UbuntuFontLoader.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font;
+
+import com.jogamp.common.util.IntObjectHashMap;
+import com.jogamp.graph.font.Font;
+import com.jogamp.graph.font.FontSet;
+import com.jogamp.graph.font.FontFactory;
+import com.jogamp.opengl.util.Locator;
+
+public class UbuntuFontLoader implements FontSet {
+
+ final static FontSet fontLoader = new UbuntuFontLoader();
+
+ public static FontSet get() {
+ return fontLoader;
+ }
+
+ final static String availableFontFileNames[] =
+ {
+ /* 00 */ "Ubuntu-R.ttf", // regular
+ /* 01 */ "Ubuntu-RI.ttf", // regular italic
+ /* 02 */ "Ubuntu-B.ttf", // bold
+ /* 03 */ "Ubuntu-BI.ttf", // bold italic
+ /* 04 */ "Ubuntu-L.ttf", // light
+ /* 05 */ "Ubuntu-LI.ttf", // light italic
+ /* 06 */ "Ubuntu-M.ttf", // medium
+ /* 07 */ "Ubuntu-MI.ttf", // medium italic
+
+ };
+
+ final static String relPath = "fonts/ubuntu/" ;
+
+ private UbuntuFontLoader() {
+ }
+
+ // FIXME: Add cache size to limit memory usage
+ static final IntObjectHashMap fontMap = new IntObjectHashMap();
+
+ static boolean is(int bits, int bit) {
+ return 0 != ( bits & bit ) ;
+ }
+
+ public Font getDefault() {
+ return get(FAMILY_REGULAR, 0) ; // Sans Serif Regular
+ }
+
+ public Font get(int family, int style)
+ {
+ Font font = (Font)fontMap.get( ( family << 8 ) | style );
+ if (font != null) {
+ return font;
+ }
+
+ switch (family) {
+ case FAMILY_MONOSPACED:
+ case FAMILY_CONDENSED:
+ case FAMILY_REGULAR:
+ if( is(style, STYLE_BOLD) ) {
+ if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[3], family, style);
+ } else {
+ font = abspath(availableFontFileNames[2], family, style);
+ }
+ } else if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[1], family, style);
+ } else {
+ font = abspath(availableFontFileNames[0], family, style);
+ }
+ break;
+
+ case FAMILY_LIGHT:
+ if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[5], family, style);
+ } else {
+ font = abspath(availableFontFileNames[4], family, style);
+ }
+ break;
+
+ case FAMILY_MEDIUM:
+ if( is(style, STYLE_ITALIC) ) {
+ font = abspath(availableFontFileNames[6], family, style);
+ } else {
+ font = abspath(availableFontFileNames[7], family, style);
+ }
+ break;
+ }
+
+ return font;
+ }
+
+ Font abspath(String fname) {
+ return FontFactory.getFontConstr().create(
+ Locator.getResource(UbuntuFontLoader.class, relPath+fname).getPath() );
+ }
+
+ Font abspath(String fname, int family, int style) {
+ final Font f = FontFactory.getFontConstr().create(
+ Locator.getResource(UbuntuFontLoader.class, relPath+fname).getPath() );
+ if(null != f) {
+ fontMap.put( ( family << 8 ) | style, f );
+ }
+ return f;
+ }
+
+
+}
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/CONTRIBUTING.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/CONTRIBUTING.txt
new file mode 100644
index 000000000..15bdc0c0b
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/CONTRIBUTING.txt
@@ -0,0 +1,21 @@
+The Ubuntu Font Family is very long-term endeavour, and the first time
+that a professionally-designed font has been funded specifically with
+the intent of being an on-going community expanded project:
+
+ http://font.ubuntu.com/
+
+Development of the Ubuntu Font Family is undertaken on Launchpad:
+
+ http://launchpad.net/ubuntu-font-family/
+
+and this is where milestones, bug management and releases are handled.
+
+Contributions are welcomed. Your work will be used on millions of
+computers every single day! Following the initial bootstrapping of
+Latin, Cyrillic, Greek, Arabic and Hebrew expansion will be undertaken
+by font designers from the font design and Ubuntu communities.
+
+To ensure that the Ubuntu Font Family can be re-licensed to future
+widely-used libre font licences, copyright assignment is being required:
+
+ https://launchpad.net/~uff-contributors
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/FONTLOG.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/FONTLOG.txt
new file mode 100644
index 000000000..cf0e4c111
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/FONTLOG.txt
@@ -0,0 +1,211 @@
+This is the FONTLOG file for the Ubuntu Font Family and attempts to follow
+the recommendations at: http://scripts.sil.org/OFL-FAQ_web#43cecb44
+
+
+Overview
+
+The new Ubuntu Font Family was started to enable the personality of
+Ubuntu to be seen and felt in every menu, button and dialog.
+The typeface is sans-serif, uses OpenType features and is manually
+hinted for clarity on desktop and mobile computing screens.
+
+The scope of the Ubuntu Font Family includes all the languages used by
+the various Ubuntu users around the world in tune with Ubuntu's
+philosophy which states that every user should be able to use their
+software in the language of their choice. So the Ubuntu Font Family
+project will be extended to cover many more written languages.
+
+
+History
+
+The Ubuntu Font Family has been creating during 2010. As of December 2010
+coverage is provided for Latin, Cyrillic and Greek across Regular, Italic,
+Bold and Bold-Italic.
+
+
+ChangeLog
+
+2010-03-08 (Paul Sladen) Ubuntu Font Family version 0.71.2
+
+ * (Production) Adjust Medium WeightClass to 500 (Md, MdIt) (LP: #730912)
+
+2010-03-07 (Paul Sladen) Ubuntu Font Family version 0.71.1
+
+ * (Design) Add Capitalised version of glyphs and kern. (Lt, LtIt,
+ Md, MdIt) DM (LP: #677446)
+ * (Design) Re-space and tighen Regular and Italic by amount specified
+ by Mark Shuttleworth (minus 4 FUnits). (Rg, It) (LP: #677149)
+ * (Design) Design: Latin (U+0192) made straight more like l/c f with
+ tail (LP: #670768)
+ * (Design) (U+01B3) should have hook on right, as the lowercase
+ (U+01B4) (LP: #681026)
+ * (Design) Tail of Light Italic germandbls, longs and lowercase 'f'
+ to match Italic/BoldItalic (LP: #623925)
+ * (Production) Update <case> feature (Lt, LtIt, Md, MdIt). DM
+ (LP: #676538, #676539)
+ * (Production) Remove Bulgarian locl feature for Italics. (LP: #708578)
+ * (Production) Update Description information with new string:
+ "The Ubuntu Font Family are libre fonts funded by Canonical Ltd
+ on behalf of the Ubuntu project. The font design work and
+ technical implementation is being undertaken by Dalton Maag. The
+ typeface is sans-serif, uses OpenType features and is manually
+ hinted for clarity on desktop and mobile computing screens. The
+ scope of the Ubuntu Font Family includes all the languages used
+ by the various Ubuntu users around the world in tune with
+ Ubuntu's philosophy which states that every user should be able
+ to use their software in the language of their choice. The
+ project is ongoing, and we expect the family will be extended to
+ cover many written languages in the coming years."
+ (Rg, It, Bd, BdIt, Lt, LtIt, Md, MdIt) (LP: #690590)
+ * (Production) Pixel per em indicator added at U+F000 (Lt, LtIt, Md,
+ MdIt) (LP: #615787)
+ * (Production) Version number indicator added at U+EFFD (Lt, LtIt, Md,
+ MdIt) (LP: #640623)
+ * (Production) fstype bit set to 0 - Editable (Lt, LtIt, Md, MdIt)
+ (LP: #648406)
+ * (Production) Localisation of name table has been removed because
+ of problems with Mac OS/X interpretation of localisation. DM
+ (LP: #730785)
+ * (Hinting) Regular '?' dot non-circular (has incorrect control
+ value). (LP: #654336)
+ * (Hinting) Too much space after latin capital 'G' in 13pt
+ regular. Now reduced. (LP: #683437)
+ * (Hinting) Balance Indian Rupee at 18,19pt (LP: #662177)
+ * (Hinting) Make Regular '£' less ambiguous at 13-15 ppm (LP: #685562)
+ * (Hinting) Regular capital 'W' made symmetrical at 31 ppem (LP: #686168)
+
+2010-12-14 (Paul Sladen) Ubuntu Font Family version 0.70.1
+
+ Packaging, rebuilt from '2010-12-08 UbuntuFontsSourceFiles_070.zip':
+ * (Midstream) Fstype bit != 0 (LP: #648406)
+ * (Midstream) Add unit test to validate fstype bits (LP: #648406)
+ * (Midstream) Add unit test to validate licence
+
+2010-12-14 (Paul Sladen) Ubuntu Font Family version 0.70
+
+ Release notes 0.70:
+ * (Design) Add Capitalised version of glyphs and kern. (Rg, It, Bd,
+ BdIt) DM (LP: #676538, #677446)
+ * (Design) Give acute and grave a slight upright move to more match
+ the Hungarian double acute angle. (Rg, It, Bd, BdIt) (LP: #656647)
+ * (Design) Shift Bold Italic accent glyphs to be consistent with the
+ Italic. (BdIt only) DM (LP: #677449)
+ * (Design) Check spacing and kerning of dcaron, lcaron and
+ tcaron. (Rg, It, Bd, BdIt) (LP: #664722)
+ * (Design) Add positive kerning to () {} [] to open out the
+ combinations so they are less like a closed box. (Rg, It, Bd,
+ BdIt) (LP: #671228)
+ * (Design) Change design of acute.asc and check highest points (Bd
+ and BdIt only) DM
+ * (Production) Update <case> feature. DM (LP: #676538, #676539)
+ * (Production) Remove Romanian locl feature. (Rg, It, Bd, BdIt)
+ (LP: #635615)
+ * (Production) Update Copyright information with new
+ strings. "Copyright 2010 Canonical Ltd. Licensed under the Ubuntu
+ Font Licence 1.0" Trademark string "Ubuntu and Canonical are
+ registered trademarks of Canonical Ltd." (Rg, It, Bd, BdIt) DM
+ (LP: #677450)
+ * (Design) Check aligning of hyphen, math signs em, en, check braces
+ and other brackets. 16/11 (LP: #676465)
+ * (Production) Pixel per em indicator added at U+F000 (Rg, It, Bd,
+ BdIt) (LP: #615787)
+ * (Production) Version number indicator added at U+EFFD (Rg, It, Bd,
+ BdIt) (LP: #640623)
+ * (Production) fstype bit set to 0 - Editable (Rg, It, Bd, BdIt)
+ (LP: #648406)
+
+2010-10-05 (Paul Sladen) Ubuntu Font Family version 0.69
+
+ [Dalton Maag]
+ * Italic,
+ - Hinting on lowercase Italic l amended 19ppm (LP: #632451)
+ - Hinting on lowercase Italic u amended 12ppm (LP: #626376)
+
+ * Regular, Italic, Bold, BoldItalic
+ - New Rupee Sign added @ U+20B9 (LP: #645987)
+ - Ubuntu Roundel added @ U+E0FF (LP: #651606)
+
+ [Paul Sladen]
+ * All
+ - Removed "!ubu" GSUB.calt ligature for U+E0FF (LP: #651606)
+
+
+Acknowledgements
+
+If you make modifications be sure to add your name (N), email (E),
+web-address (if you have one) (W) and description (D). This list is in
+alphabetical order.
+
+N: Amélie Bonet
+W: http://ameliebonet.com/
+D: Type design with Dalton Maag, particularly Ubuntu Mono
+
+N: Ron Carpenter
+N: Vincent Connare
+N: Lukas Paltram
+W: http://www.daltonmaag.com/
+D: Type design and engineering with Dalton Maag
+
+N: Dave Crossland
+W: http://understandingfonts.com/
+D: Documentation and libre licensing guidance
+
+N: Iain Farrell
+W: http://www.flickr.com/photos/iain
+D: Ubuntu Font Family delivery for the Ubuntu UX team
+
+N: Shiraaz Gabru
+W: http://www.daltonmaag.com/
+D: Ubuntu Font Family project management at Dalton Maag
+
+N: Marcus Haslam
+W: http://design.canonical.com/author/marcus-haslam/
+D: Creative inspiration
+
+N: Ben Laenen
+D: Inspiration behind the pixels-per-em (PPEM) readout debugging glyph at U+F000
+ (for this font the concept was re-implemented from scratch by Dalton-Maag)
+
+N: Bruno Maag
+W: http://www.daltonmaag.com/
+D: Stylistic direction of the Ubuntu Font Family, as head of Dalton Maag
+
+N: Ivanka Majic
+W: http://www.ivankamajic.com/
+D: Guiding the UX team and Cyrillic feedback
+
+N: David Marshall
+N: Malcolm Wooden
+W: http://www.daltonmaag.com/
+D: Font Engineering and technical direction
+
+N: Rodrigo Rivas
+D: Indian Rupee Sign glyph
+
+N: Mark Shuttleworth
+W: http://www.markshuttleworth.com/
+D: Executive quality-control and funding
+
+N: Paul Sladen
+W: http://www.paul.sladen.org/
+D: Bug triaging, packaging
+
+N: Nicolas Spalinger
+W: http://planet.open-fonts.org
+D: Continuous guidance on libre/open font licensing, best practises in source
+ tree layout, release and packaging (pkg-fonts Debian team)
+
+N: Kenneth Wimer
+D: Initial PPA packaging
+
+* Canonical Ltd is the primary commercial sponsor of the Ubuntu and
+ Kubuntu operating systems
+* Dalton Maag are a custom type foundry headed by Bruno Maag
+
+For further documentation, information on contributors, source code
+downloads and those involved with the Ubuntu Font Family, visit:
+
+ http://font.ubuntu.com/
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE-FAQ.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE-FAQ.txt
new file mode 100644
index 000000000..776a25edf
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE-FAQ.txt
@@ -0,0 +1,177 @@
+ Ubuntu Font Family Licensing FAQ
+
+ Stylistic Foundations
+
+ The Ubuntu Font Family is the first time that a libre typeface has been
+ designed professionally and explicitly with the intent of developing a
+ public and long-term community-based development process.
+
+ When developing an open project, it is generally necessary to have firm
+ foundations: a font needs to maintain harmony within itself even across
+ many type designers and writing systems. For the [1]Ubuntu Font Family,
+ the process has been guided with the type foundry Dalton Maag setting
+ the project up with firm stylistic foundation covering several
+ left-to-right scripts: Latin, Greek and Cyrillic; and right-to-left
+ scripts: Arabic and Hebrew (due in 2011).
+
+ With this starting point the community will, under the supervision of
+ [2]Canonical and [3]Dalton Maag, be able to build on the existing font
+ sources to expand their character coverage. Ultimately everybody will
+ be able to use the Ubuntu Font Family in their own written languages
+ across the whole of Unicode (and this will take some time!).
+
+ Licensing
+
+ The licence chosen by any free software project is one of the
+ foundational decisions that sets out how derivatives and contributions
+ can occur, and in turn what kind of community will form around the
+ project.
+
+ Using a licence that is compatible with other popular licences is a
+ powerful constraint because of the [4]network effects: the freedom to
+ share improvements between projects allows free software to reach
+ high-quality over time. Licence-proliferation leads to many
+ incompatible licences, undermining the network effect, the freedom to
+ share and ultimately making the libre movement that Ubuntu is a part of
+ less effective. For all kinds of software, writing a new licence is not
+ to be taken lightly and is a choice that needs to be thoroughly
+ justified if this path is taken.
+
+ Today it is not clear to Canonical what the best licence for a font
+ project like the Ubuntu Font Family is: one that starts life designed
+ by professionals and continues with the full range of community
+ development, from highly commercial work in new directions to curious
+ beginners' experimental contributions. The fast and steady pace of the
+ Ubuntu release cycle means that an interim libre licence has been
+ necessary to enable the consideration of the font family as part of
+ Ubuntu 10.10 operating system release.
+
+ Before taking any decision on licensing, Canonical as sponsor and
+ backer of the project has reviewed the many existing licenses used for
+ libre/open fonts and engaged the stewards of the most popular licenses
+ in detailed discussions. The current interim licence is the first step
+ in progressing the state-of-the-art in licensing for libre/open font
+ development.
+
+ The public discussion must now involve everyone in the (comparatively
+ new) area of the libre/open font community; including font users,
+ software freedom advocates, open source supporters and existing libre
+ font developers. Most importantly, the minds and wishes of professional
+ type designers considering entering the free software business
+ community must be taken on board.
+
+ Conversations and discussion has taken place, privately, with
+ individuals from the following groups (generally speaking personally on
+ behalf of themselves, rather than their affiliations):
+ * [5]SIL International
+ * [6]Open Font Library
+ * [7]Software Freedom Law Center
+ * [8]Google Font API
+
+ Document embedding
+
+ One issue highlighted early on in the survey of existing font licences
+ is that of document embedding. Almost all font licences, both free and
+ unfree, permit embedding a font into a document to a certain degree.
+ Embedding a font with other works that make up a document creates a
+ "combined work" and copyleft would normally require the whole document
+ to be distributed under the terms of the font licence. As beautiful as
+ the font might be, such a licence makes a font too restrictive for
+ useful general purpose digital publishing.
+
+ The situation is not entirely unique to fonts and is encountered also
+ with tools such as GNU Bison: a vanilla GNU GPL licence would require
+ anything generated with Bison to be made available under the terms of
+ the GPL as well. To avoid this, Bison is [9]published with an
+ additional permission to the GPL which allows the output of Bison to be
+ made available under any licence.
+
+ The conflict between licensing of fonts and licensing of documents, is
+ addressed in two popular libre font licences, the SIL OFL and GNU GPL:
+ * [10]SIL Open Font Licence: When OFL fonts are embedded in a
+ document, the OFL's terms do not apply to that document. (See
+ [11]OFL-FAQ for details.
+ * [12]GPL Font Exception: The situation is resolved by granting an
+ additional permission to allow documents to not be covered by the
+ GPL. (The exception is being reviewed).
+
+ The Ubuntu Font Family must also resolve this conflict, ensuring that
+ if the font is embedded and then extracted it is once again clearly
+ under the terms of its libre licence.
+
+ Long-term licensing
+
+ Those individuals involved, especially from Ubuntu and Canonical, are
+ interested in finding a long-term libre licence that finds broad favour
+ across the whole libre/open font community. The deliberation during the
+ past months has been on how to licence the Ubuntu Font Family in the
+ short-term, while knowingly encouraging everyone to pursue a long-term
+ goal.
+ * [13]Copyright assignment will be required so that the Ubuntu Font
+ Family's licensing can be progressively expanded to one (or more)
+ licences, as best practice continues to evolve within the
+ libre/open font community.
+ * Canonical will support and fund legal work on libre font licensing.
+ It is recognised that the cost and time commitments required are
+ likely to be significant. We invite other capable parties to join
+ in supporting this activity.
+
+ The GPL version 3 (GPLv3) will be used for Ubuntu Font Family build
+ scripts and the CC-BY-SA for associated documentation and non-font
+ content: all items which do not end up embedded in general works and
+ documents.
+
+Ubuntu Font Licence
+
+ For the short-term only, the initial licence is the [14]Ubuntu Font
+ License (UFL). This is loosely inspired from the work on the SIL
+ OFL 1.1, and seeks to clarify the issues that arose during discussions
+ and legal review, from the perspective of the backers, Canonical Ltd.
+ Those already using established licensing models such as the GPL, OFL
+ or Creative Commons licensing should have no worries about continuing
+ to use them. The Ubuntu Font Licence (UFL) and the SIL Open Font
+ Licence (SIL OFL) are not identical and should not be confused with
+ each other. Please read the terms precisely. The UFL is only intended
+ as an interim license, and the overriding aim is to support the
+ creation of a more suitable and generic libre font licence. As soon as
+ such a licence is developed, the Ubuntu Font Family will migrate to
+ it—made possible by copyright assignment in the interium. Between the
+ OFL 1.1, and the UFL 1.0, the following changes are made to produce the
+ Ubuntu Font Licence:
+ * Clarification:
+
+ 1. Document embedding (see [15]embedding section above).
+ 2. Apply at point of distribution, instead of receipt
+ 3. Author vs. copyright holder disambiguation (type designers are
+ authors, with the copyright holder normally being the funder)
+ 4. Define "Propagate" (for internationalisation, similar to the GPLv3)
+ 5. Define "Substantially Changed"
+ 6. Trademarks are explicitly not transferred
+ 7. Refine renaming requirement
+
+ Streamlining:
+ 8. Remove "not to be sold separately" clause
+ 9. Remove "Reserved Font Name(s)" declaration
+
+ A visual demonstration of how these points were implemented can be
+ found in the accompanying coloured diff between SIL OFL 1.1 and the
+ Ubuntu Font Licence 1.0: [16]ofl-1.1-ufl-1.0.diff.html
+
+References
+
+ 1. http://font.ubuntu.com/
+ 2. http://www.canonical.com/
+ 3. http://www.daltonmaag.com/
+ 4. http://en.wikipedia.org/wiki/Network_effect
+ 5. http://scripts.sil.org/
+ 6. http://openfontlibrary.org/
+ 7. http://www.softwarefreedom.org/
+ 8. http://code.google.com/webfonts
+ 9. http://www.gnu.org/licenses/gpl-faq.html#CanIUseGPLToolsForNF
+ 10. http://scripts.sil.org/OFL_web
+ 11. http://scripts.sil.org/OFL-FAQ_web
+ 12. http://www.gnu.org/licenses/gpl-faq.html#FontException
+ 13. https://launchpad.net/~uff-contributors
+ 14. http://font.ubuntu.com/ufl/ubuntu-font-licence-1.0.txt
+ 15. http://font.ubuntu.com/ufl/FAQ.html#embedding
+ 16. http://font.ubuntu.com/ufl/ofl-1.1-ufl-1.0.diff.html
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE.txt
new file mode 100644
index 000000000..ae78a8f94
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/LICENCE.txt
@@ -0,0 +1,96 @@
+-------------------------------
+UBUNTU FONT LICENCE Version 1.0
+-------------------------------
+
+PREAMBLE
+This licence allows the licensed fonts to be used, studied, modified and
+redistributed freely. The fonts, including any derivative works, can be
+bundled, embedded, and redistributed provided the terms of this licence
+are met. The fonts and derivatives, however, cannot be released under
+any other licence. The requirement for fonts to remain under this
+licence does not require any document created using the fonts or their
+derivatives to be published under this licence, as long as the primary
+purpose of the document is not to be a vehicle for the distribution of
+the fonts.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this licence and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Original Version" refers to the collection of Font Software components
+as received under this licence.
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to
+a new environment.
+
+"Copyright Holder(s)" refers to all individuals and companies who have a
+copyright ownership of the Font Software.
+
+"Substantially Changed" refers to Modified Versions which can be easily
+identified as dissimilar to the Font Software by users of the Font
+Software comparing the Original Version with the Modified Version.
+
+To "Propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification and with or without charging
+a redistribution fee), making available to the public, and in some
+countries other activities as well.
+
+PERMISSION & CONDITIONS
+This licence does not grant any rights under trademark law and all such
+rights are reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of the Font Software, to propagate the Font Software, subject to
+the below conditions:
+
+1) Each copy of the Font Software must contain the above copyright
+notice and this licence. These can be included either as stand-alone
+text files, human-readable headers or in the appropriate machine-
+readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+2) The font name complies with the following:
+(a) The Original Version must retain its name, unmodified.
+(b) Modified Versions which are Substantially Changed must be renamed to
+avoid use of the name of the Original Version or similar names entirely.
+(c) Modified Versions which are not Substantially Changed must be
+renamed to both (i) retain the name of the Original Version and (ii) add
+additional naming elements to distinguish the Modified Version from the
+Original Version. The name of such Modified Versions must be the name of
+the Original Version, with "derivative X" where X represents the name of
+the new work, appended to that name.
+
+3) The name(s) of the Copyright Holder(s) and any contributor to the
+Font Software shall not be used to promote, endorse or advertise any
+Modified Version, except (i) as required by this licence, (ii) to
+acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
+their explicit written permission.
+
+4) The Font Software, modified or unmodified, in part or in whole, must
+be distributed entirely under this licence, and must not be distributed
+under any other licence. The requirement for fonts to remain under this
+licence does not affect any document created using the Font Software,
+except any version of the Font Software extracted from a document
+created using the Font Software may only be distributed under this
+licence.
+
+TERMINATION
+This licence becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
+DEALINGS IN THE FONT SOFTWARE.
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/README.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/README.txt
new file mode 100644
index 000000000..292d4ade6
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/README.txt
@@ -0,0 +1,15 @@
+ ----------------------
+ Ubuntu Font Family
+ ======================
+
+The Ubuntu Font Family are a set of matching new libre/open fonts in
+development during 2010--2011. The development is being funded by
+Canonical Ltd on behalf the wider Free Software community and the
+Ubuntu project. The technical font design work and implementation is
+being undertaken by Dalton Maag.
+
+Both the final font Truetype/OpenType files and the design files used
+to produce the font family are distributed under an open licence and
+you are expressly encouraged to experiment, modify, share and improve.
+
+ http://font.ubuntu.com/
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/TRADEMARKS.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/TRADEMARKS.txt
new file mode 100644
index 000000000..d34265bc8
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/TRADEMARKS.txt
@@ -0,0 +1,4 @@
+Ubuntu and Canonical are registered trademarks of Canonical Ltd.
+
+The licence accompanying these works does not grant any rights
+under trademark law and all such rights are reserved.
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-B.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-B.ttf
new file mode 100644
index 000000000..7639344e7
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-B.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-BI.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-BI.ttf
new file mode 100644
index 000000000..337b8a88b
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-BI.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-L.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-L.ttf
new file mode 100644
index 000000000..c3b0fa46d
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-L.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-LI.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-LI.ttf
new file mode 100644
index 000000000..d65e8eab3
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-LI.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-M.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-M.ttf
new file mode 100644
index 000000000..387ef03fc
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-M.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-MI.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-MI.ttf
new file mode 100644
index 000000000..5b92fcb5d
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-MI.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttf
new file mode 100644
index 000000000..a46446440
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-RI.ttf b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-RI.ttf
new file mode 100644
index 000000000..0e0955918
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/Ubuntu-RI.ttf
Binary files differ
diff --git a/turtle2d/src/jogamp/graph/font/fonts/ubuntu/copyright.txt b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/copyright.txt
new file mode 100644
index 000000000..3a45d712e
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/fonts/ubuntu/copyright.txt
@@ -0,0 +1,5 @@
+Copyright 2010 Canonical Ltd.
+
+This Font Software is licensed under the Ubuntu Font Licence, Version
+1.0. https://launchpad.net/ubuntu-font-licence
+
diff --git a/turtle2d/src/jogamp/graph/font/typecast/TypecastFont.java b/turtle2d/src/jogamp/graph/font/typecast/TypecastFont.java
new file mode 100644
index 000000000..0d018a314
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/typecast/TypecastFont.java
@@ -0,0 +1,268 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font.typecast;
+
+import jogamp.graph.font.FontInt;
+import jogamp.graph.geom.plane.AffineTransform;
+import jogamp.graph.geom.plane.Path2D;
+import net.java.dev.typecast.ot.OTFont;
+import net.java.dev.typecast.ot.OTFontCollection;
+import net.java.dev.typecast.ot.table.CmapFormat;
+import net.java.dev.typecast.ot.table.CmapIndexEntry;
+import net.java.dev.typecast.ot.table.CmapTable;
+import net.java.dev.typecast.ot.table.HdmxTable;
+import net.java.dev.typecast.ot.table.ID;
+
+import com.jogamp.common.util.IntObjectHashMap;
+import com.jogamp.graph.geom.AABBox;
+
+class TypecastFont implements FontInt {
+ static final boolean DEBUG = false;
+
+ final OTFontCollection fontset;
+ final OTFont font;
+ TypecastHMetrics metrics;
+ final CmapFormat cmapFormat;
+ int cmapentries;
+
+ // FIXME: Add cache size to limit memory usage ??
+ IntObjectHashMap char2Glyph;
+
+ public TypecastFont(OTFontCollection fontset) {
+ this.fontset = fontset;
+ this.font = fontset.getFont(0);
+
+ // FIXME: Generic attempt to find the best CmapTable,
+ // which is assumed to be the one with the most entries (stupid 'eh?)
+ CmapTable cmapTable = font.getCmapTable();
+ CmapFormat[] _cmapFormatP = { null, null, null, null };
+ int platform = -1;
+ int platformLength = -1;
+ int encoding = -1;
+ for(int i=0; i<cmapTable.getNumTables(); i++) {
+ CmapIndexEntry cmapIdxEntry = cmapTable.getCmapIndexEntry(i);
+ int pidx = cmapIdxEntry.getPlatformId();
+ CmapFormat cf = cmapIdxEntry.getFormat();
+ if(DEBUG) {
+ System.err.println("CmapFormat["+i+"]: platform " + pidx +
+ ", encoding "+cmapIdxEntry.getEncodingId() + ": "+cf);
+ }
+ if( _cmapFormatP[pidx] == null ||
+ _cmapFormatP[pidx].getLength() < cf.getLength() ) {
+ _cmapFormatP[pidx] = cf;
+ if( cf.getLength() > platformLength ) {
+ platformLength = cf.getLength() ;
+ platform = pidx;
+ encoding = cmapIdxEntry.getEncodingId();
+ }
+ }
+ }
+ if(0 <= platform) {
+ cmapFormat = _cmapFormatP[platform];
+ if(DEBUG) {
+ System.err.println("Selected CmapFormat: platform " + platform +
+ ", encoding "+encoding + ": "+cmapFormat);
+ }
+ } else {
+ CmapFormat _cmapFormat = null;
+ /*if(null == _cmapFormat) {
+ platform = ID.platformMacintosh;
+ encoding = ID.encodingASCII;
+ _cmapFormat = cmapTable.getCmapFormat(platform, encoding);
+ } */
+ if(null == _cmapFormat) {
+ // default unicode
+ platform = ID.platformMicrosoft;
+ encoding = ID.encodingUnicode;
+ _cmapFormat = cmapTable.getCmapFormat((short)platform, (short)encoding);
+ }
+ if(null == _cmapFormat) {
+ // maybe a symbol font ?
+ platform = ID.platformMicrosoft;
+ encoding = ID.encodingSymbol;
+ _cmapFormat = cmapTable.getCmapFormat((short)platform, (short)encoding);
+ }
+ if(null == _cmapFormat) {
+ throw new RuntimeException("Cannot find a suitable cmap table for font "+font);
+ }
+ cmapFormat = _cmapFormat;
+ if(DEBUG) {
+ System.err.println("Selected CmapFormat (2): platform " + platform + ", encoding "+encoding + ": "+cmapFormat);
+ }
+ }
+
+ cmapentries = 0;
+ for (int i = 0; i < cmapFormat.getRangeCount(); ++i) {
+ CmapFormat.Range range = cmapFormat.getRange(i);
+ cmapentries += range.getEndCode() - range.getStartCode() + 1; // end included
+ }
+ if(DEBUG) {
+ System.err.println("num glyphs: "+font.getNumGlyphs());
+ System.err.println("num cmap entries: "+cmapentries);
+ System.err.println("num cmap ranges: "+cmapFormat.getRangeCount());
+
+ for (int i = 0; i < cmapFormat.getRangeCount(); ++i) {
+ CmapFormat.Range range = cmapFormat.getRange(i);
+ for (int j = range.getStartCode(); j <= range.getEndCode(); ++j) {
+ final int code = cmapFormat.mapCharCode(j);
+ if(code < 15) {
+ System.err.println(" char: " + (int)j + " ( " + (char)j +" ) -> " + code);
+ }
+ }
+ }
+ }
+ char2Glyph = new IntObjectHashMap(cmapentries + cmapentries/4);
+ }
+
+ public String getName() {
+ return fontset.getFileName();
+ }
+
+ public Metrics getMetrics() {
+ if (metrics == null) {
+ metrics = new TypecastHMetrics(this);
+ }
+ return metrics;
+ }
+
+ public Glyph getGlyph(char symbol) {
+ TypecastGlyph result = (TypecastGlyph) char2Glyph.get(symbol);
+ if (null == result) {
+ // final short code = (short) char2Code.get(symbol);
+ short code = (short) cmapFormat.mapCharCode(symbol);
+ if(0 == code && 0 != symbol) {
+ // reserved special glyph IDs by convention
+ switch(symbol) {
+ case ' ': code = Glyph.ID_SPACE; break;
+ case '\n': code = Glyph.ID_CR; break;
+ default: code = Glyph.ID_UNKNOWN;
+ }
+ }
+
+ net.java.dev.typecast.ot.OTGlyph glyph = font.getGlyph(code);
+ if(null == glyph) {
+ glyph = font.getGlyph(Glyph.ID_UNKNOWN);
+ }
+ if(null == glyph) {
+ throw new RuntimeException("Could not retrieve glyph for symbol: <"+symbol+"> "+(int)symbol+" -> glyph id "+code);
+ }
+ Path2D path = TypecastRenderer.buildPath(glyph);
+ result = new TypecastGlyph(this, symbol, code, glyph.getBBox(), glyph.getAdvanceWidth(), path);
+ if(DEBUG) {
+ System.err.println("New glyph: " + (int)symbol + " ( " + (char)symbol +" ) -> " + code + ", contours " + glyph.getPointCount() + ": " + path);
+ }
+ final HdmxTable hdmx = font.getHdmxTable();
+ if (null!= result && null != hdmx) {
+ /*if(DEBUG) {
+ System.err.println("hdmx "+hdmx);
+ }*/
+ for (int i=0; i<hdmx.getNumberOfRecords(); i++)
+ {
+ final HdmxTable.DeviceRecord dr = hdmx.getRecord(i);
+ result.addAdvance(dr.getWidth(code), dr.getPixelSize());
+ if(DEBUG) {
+ System.err.println("hdmx advance : pixelsize = "+dr.getWidth(code)+" : "+ dr.getPixelSize());
+ }
+ }
+ }
+ char2Glyph.put(symbol, result);
+ }
+ return result;
+ }
+
+ public void getOutline(String string, float pixelSize, AffineTransform transform, Path2D[] result) {
+ TypecastRenderer.getOutline(this, string, pixelSize, transform, result);
+ }
+
+ public float getStringWidth(String string, float pixelSize) {
+ float width = 0;
+ final int len = string.length();
+ for (int i=0; i< len; i++)
+ {
+ char character = string.charAt(i);
+ if (character == '\n') {
+ width = 0;
+ } else {
+ Glyph glyph = getGlyph(character);
+ width += glyph.getAdvance(pixelSize, false);
+ }
+ }
+
+ return (int)(width + 0.5f);
+ }
+
+ public float getStringHeight(String string, float pixelSize) {
+ int height = 0;
+
+ for (int i=0; i<string.length(); i++)
+ {
+ char character = string.charAt(i);
+ if (character != ' ')
+ {
+ Glyph glyph = getGlyph(character);
+ AABBox bbox = glyph.getBBox(pixelSize);
+ height = (int)Math.ceil(Math.max(bbox.getHeight(), height));
+ }
+ }
+ return height;
+ }
+
+ public AABBox getStringBounds(CharSequence string, float pixelSize) {
+ if (string == null) {
+ return new AABBox();
+ }
+ final Metrics metrics = getMetrics();
+ final float lineGap = metrics.getLineGap(pixelSize);
+ final float ascent = metrics.getAscent(pixelSize);
+ final float descent = metrics.getDescent(pixelSize);
+ final float advanceY = lineGap - descent + ascent;
+ float totalHeight = 0;
+ float totalWidth = 0;
+ float curLineWidth = 0;
+ for (int i=0; i<string.length(); i++) {
+ char character = string.charAt(i);
+ if (character == '\n') {
+ totalWidth = Math.max(curLineWidth, totalWidth);
+ curLineWidth = 0;
+ totalHeight -= advanceY;
+ continue;
+ }
+ Glyph glyph = getGlyph(character);
+ curLineWidth += glyph.getAdvance(pixelSize, true);
+ }
+ if (curLineWidth > 0) {
+ totalHeight -= advanceY;
+ totalWidth = Math.max(curLineWidth, totalWidth);
+ }
+ return new AABBox(0, 0, 0, totalWidth, totalHeight,0);
+ }
+
+ final public int getNumGlyphs() {
+ return font.getNumGlyphs();
+ }
+} \ No newline at end of file
diff --git a/turtle2d/src/jogamp/graph/font/typecast/TypecastFontConstructor.java b/turtle2d/src/jogamp/graph/font/typecast/TypecastFontConstructor.java
new file mode 100644
index 000000000..5fb9d32f7
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/typecast/TypecastFontConstructor.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font.typecast;
+
+import java.io.File;
+import java.io.IOException;
+
+import jogamp.graph.font.FontConstructor;
+
+import net.java.dev.typecast.ot.OTFontCollection;
+
+import com.jogamp.graph.font.Font;
+
+
+public class TypecastFontConstructor implements FontConstructor {
+
+ public Font create(String path) {
+ OTFontCollection fontset;
+ try {
+ fontset = OTFontCollection.create(new File(path));
+ return new TypecastFont(fontset);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/turtle2d/src/jogamp/graph/font/typecast/TypecastGlyph.java b/turtle2d/src/jogamp/graph/font/typecast/TypecastGlyph.java
new file mode 100644
index 000000000..88d865f9c
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/typecast/TypecastGlyph.java
@@ -0,0 +1,232 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font.typecast;
+
+import java.util.HashMap;
+
+import jogamp.graph.font.FontInt;
+import jogamp.graph.geom.plane.AffineTransform;
+import jogamp.graph.geom.plane.Path2D;
+
+import com.jogamp.graph.font.Font;
+import com.jogamp.graph.geom.AABBox;
+
+public class TypecastGlyph implements FontInt.Glyph {
+ public class Advance
+ {
+ final Font font;
+ final float advance;
+ HashMap<Float, Float> size2advance = new HashMap<Float, Float>();
+
+ public Advance(Font font, float advance)
+ {
+ this.font = font;
+ this.advance = advance;
+ }
+
+ public void reset() {
+ size2advance.clear();
+ }
+
+ public float getScale(float pixelSize)
+ {
+ return this.font.getMetrics().getScale(pixelSize);
+ }
+
+ public void add(float advance, float size)
+ {
+ size2advance.put(size, advance);
+ }
+
+ public float get(float size, boolean useFrationalMetrics)
+ {
+ Float fo = size2advance.get(size);
+ if(null == fo) {
+ float value = (this.advance * getScale(size));
+ if (useFrationalMetrics == false) {
+ //value = (float)Math.ceil(value);
+ // value = (int)value;
+ value = (int) ( value + 0.5f ) ; // TODO: check
+ }
+ size2advance.put(size, value);
+ return value;
+ }
+ return fo.floatValue();
+ }
+
+ public String toString()
+ {
+ return "\nAdvance:"+
+ "\n advance: "+this.advance+
+ "\n advances: \n"+size2advance;
+ }
+ }
+
+ public class Metrics
+ {
+ AABBox bbox;
+ Advance advance;
+
+ public Metrics(Font font, AABBox bbox, float advance)
+ {
+ this.bbox = bbox;
+ this.advance = new Advance(font, advance);
+ }
+
+ public void reset() {
+ advance.reset();
+ }
+
+ public float getScale(float pixelSize)
+ {
+ return this.advance.getScale(pixelSize);
+ }
+
+ public AABBox getBBox()
+ {
+ return this.bbox;
+ }
+
+ public void addAdvance(float advance, float size)
+ {
+ this.advance.add(advance, size);
+ }
+
+ public float getAdvance(float size, boolean useFrationalMetrics)
+ {
+ return this.advance.get(size, useFrationalMetrics);
+ }
+
+ public String toString()
+ {
+ return "\nMetrics:"+
+ "\n bbox: "+this.bbox+
+ this.advance;
+ }
+ }
+
+ public static final short INVALID_ID = (short)((1 << 16) - 1);
+ public static final short MAX_ID = (short)((1 << 16) - 2);
+
+ private final Font font;
+
+ char symbol;
+ short id;
+ int advance;
+ Metrics metrics;
+
+ protected Path2D path; // in EM units
+ protected Path2D pathSized;
+ protected float numberSized;
+
+ protected TypecastGlyph(Font font, char symbol) {
+ this.font = font;
+ this.symbol = symbol;
+ }
+
+ protected TypecastGlyph(Font font,
+ char symbol, short id, AABBox bbox, int advance, Path2D path) {
+ this.font = font;
+ this.symbol = symbol;
+ this.advance = advance;
+
+ init(id, bbox, advance);
+
+ this.path = path;
+ this.pathSized = null;
+ this.numberSized = 0.0f;
+ }
+
+ void init(short id, AABBox bbox, int advance) {
+ this.id = id;
+ this.advance = advance;
+ this.metrics = new Metrics(this.font, bbox, this.advance);
+ }
+
+ public void reset(Path2D path) {
+ this.path = path;
+ this.metrics.reset();
+ }
+
+ public Font getFont() {
+ return this.font;
+ }
+
+ public char getSymbol() {
+ return this.symbol;
+ }
+
+ AABBox getBBoxUnsized() {
+ return this.metrics.getBBox();
+ }
+
+ public AABBox getBBox() {
+ return this.metrics.getBBox();
+ }
+
+ public Metrics getMetrics() {
+ return this.metrics;
+ }
+
+ public short getID() {
+ return this.id;
+ }
+
+ public float getScale(float pixelSize) {
+ return this.metrics.getScale(pixelSize);
+ }
+
+ public AABBox getBBox(float pixelSize) {
+ final float size = getScale(pixelSize);
+ AABBox newBox = getBBox().clone();
+ newBox.scale(size);
+ return newBox;
+ }
+
+ protected void addAdvance(float advance, float size) {
+ this.metrics.addAdvance(advance, size);
+ }
+
+ public float getAdvance(float pixelSize, boolean useFrationalMetrics) {
+ return this.metrics.getAdvance(pixelSize, useFrationalMetrics);
+ }
+
+ public Path2D getPath() {
+ return this.path;
+ }
+
+ public Path2D getPath(float pixelSize) {
+ final float size = getScale(pixelSize);
+
+ if (this.numberSized != size) {
+ this.numberSized = size;
+ this.pathSized = AffineTransform.getScaleInstance(null, size, size).createTransformedShape(getPath());
+ }
+ return this.pathSized;
+ }
+}
diff --git a/turtle2d/src/jogamp/graph/font/typecast/TypecastHMetrics.java b/turtle2d/src/jogamp/graph/font/typecast/TypecastHMetrics.java
new file mode 100644
index 000000000..cd8595498
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/typecast/TypecastHMetrics.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font.typecast;
+
+import net.java.dev.typecast.ot.table.HeadTable;
+import net.java.dev.typecast.ot.table.HheaTable;
+import com.jogamp.graph.font.Font.Metrics;
+import com.jogamp.graph.geom.AABBox;
+
+class TypecastHMetrics implements Metrics {
+ private final TypecastFont fontImpl;
+
+ // HeadTable
+ private final HeadTable headTable;
+ private final float unitsPerEM_Inv;
+ private final AABBox bbox;
+ // HheaTable
+ private final HheaTable hheaTable;
+ // VheaTable (for horizontal fonts)
+ // private final VheaTable vheaTable;
+
+ public TypecastHMetrics(TypecastFont fontImpl) {
+ this.fontImpl = fontImpl;
+ headTable = this.fontImpl.font.getHeadTable();
+ hheaTable = this.fontImpl.font.getHheaTable();
+ // vheaTable = this.fontImpl.font.getVheaTable();
+ unitsPerEM_Inv = 1.0f / ( (float) headTable.getUnitsPerEm() );
+
+ int maxWidth = headTable.getXMax() - headTable.getXMin();
+ int maxHeight = headTable.getYMax() - headTable.getYMin();
+ float lowx= headTable.getXMin();
+ float lowy = -(headTable.getYMin()+maxHeight);
+ float highx = lowx + maxWidth;
+ float highy = lowy + maxHeight;
+ bbox = new AABBox(lowx, lowy, 0, highx, highy, 0); // invert
+ }
+
+ public final float getAscent(float pixelSize) {
+ return getScale(pixelSize) * -hheaTable.getAscender(); // invert
+ }
+ public final float getDescent(float pixelSize) {
+ return getScale(pixelSize) * -hheaTable.getDescender(); // invert
+ }
+ public final float getLineGap(float pixelSize) {
+ return getScale(pixelSize) * -hheaTable.getLineGap(); // invert
+ }
+ public final float getMaxExtend(float pixelSize) {
+ return getScale(pixelSize) * hheaTable.getXMaxExtent();
+ }
+ public final float getScale(float pixelSize) {
+ return pixelSize * unitsPerEM_Inv;
+ }
+ public final AABBox getBBox(float pixelSize) {
+ AABBox res = new AABBox(bbox.getLow(), bbox.getHigh());
+ res.scale(getScale(pixelSize));
+ return res;
+ }
+} \ No newline at end of file
diff --git a/turtle2d/src/jogamp/graph/font/typecast/TypecastRenderer.java b/turtle2d/src/jogamp/graph/font/typecast/TypecastRenderer.java
new file mode 100644
index 000000000..410f5b73a
--- /dev/null
+++ b/turtle2d/src/jogamp/graph/font/typecast/TypecastRenderer.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package jogamp.graph.font.typecast;
+
+import jogamp.graph.geom.plane.AffineTransform;
+import jogamp.graph.geom.plane.Path2D;
+
+import com.jogamp.graph.font.Font;
+import net.java.dev.typecast.ot.Point;
+import net.java.dev.typecast.ot.OTGlyph;
+
+/**
+ * Factory to build a {@link com.jogamp.graph.geom.Path2D Path2D} from
+ * {@link net.java.dev.typecast.ot.OTGlyph Glyph}s.
+ */
+public class TypecastRenderer {
+
+ public static void getOutline(TypecastFont font,
+ String string, float pixelSize, AffineTransform transform, Path2D[] p)
+ {
+ if (string == null) {
+ return;
+ }
+ Font.Metrics metrics = font.getMetrics();
+ float advanceTotal = 0;
+ float lineGap = metrics.getLineGap(pixelSize) ;
+ float ascent = metrics.getAscent(pixelSize) ;
+ float descent = metrics.getDescent(pixelSize) ;
+ if (transform == null) {
+ transform = new AffineTransform();
+ }
+ AffineTransform t = new AffineTransform();
+
+ float advanceY = lineGap - descent + ascent;
+ float y = 0;
+ for (int i=0; i<string.length(); i++)
+ {
+ p[i] = new Path2D();
+ p[i].reset();
+ t.setTransform(transform);
+ char character = string.charAt(i);
+ if (character == '\n') {
+ y -= advanceY;
+ advanceTotal = 0;
+ continue;
+ } else if (character == ' ') {
+ advanceTotal += font.font.getHmtxTable().getAdvanceWidth(TypecastGlyph.ID_SPACE) * metrics.getScale(pixelSize);
+ continue;
+ }
+ TypecastGlyph glyph = (TypecastGlyph) font.getGlyph(character);
+ Path2D gp = glyph.getPath();
+ float scale = metrics.getScale(pixelSize);
+ t.translate(advanceTotal, y);
+ t.scale(scale, scale);
+ p[i].append(gp.iterator(t), false);
+ advanceTotal += glyph.getAdvance(pixelSize, true);
+ }
+ }
+
+ /**
+ * Build a {@link com.jogamp.graph.geom.Path2D Path2D} from a
+ * {@link net.java.dev.typecast.ot.OTGlyph Glyph}. This glyph path can then
+ * be transformed and rendered.
+ */
+ public static Path2D buildPath(OTGlyph glyph) {
+
+ if (glyph == null) {
+ return null;
+ }
+
+ Path2D glyphPath = new Path2D();
+
+ // Iterate through all of the points in the glyph. Each time we find a
+ // contour end point, add the point range to the path.
+ int firstIndex = 0;
+ int count = 0;
+ for (int i = 0; i < glyph.getPointCount(); i++) {
+ count++;
+ if (glyph.getPoint(i).endOfContour) {
+ addContourToPath(glyphPath, glyph, firstIndex, count);
+ firstIndex = i + 1;
+ count = 0;
+ }
+ }
+ return glyphPath;
+ }
+
+ private static void addContourToPath(Path2D gp, OTGlyph glyph, int startIndex, int count) {
+ int offset = 0;
+ while (offset < count) {
+ Point point = glyph.getPoint(startIndex + offset%count);
+ Point point_plus1 = glyph.getPoint(startIndex + (offset+1)%count);
+ Point point_plus2 = glyph.getPoint(startIndex + (offset+2)%count);
+ if(offset == 0)
+ {
+ gp.moveTo(point.x, -point.y);
+ }
+
+ if (point.onCurve) {
+ if (point_plus1.onCurve) {
+ // s = new Line2D.Float(point.x, -point.y, point_plus1.x, -point_plus1.y);
+ gp.lineTo( point_plus1.x, -point_plus1.y );
+ offset++;
+ } else {
+ if (point_plus2.onCurve) {
+ // s = new QuadCurve2D.Float( point.x, -point.y, point_plus1.x, -point_plus1.y, point_plus2.x, -point_plus2.y);
+ gp.quadTo(point_plus1.x, -point_plus1.y, point_plus2.x, -point_plus2.y);
+ offset+=2;
+ } else {
+ // s = new QuadCurve2D.Float(point.x,-point.y,point_plus1.x,-point_plus1.y,
+ // midValue(point_plus1.x, point_plus2.x), -midValue(point_plus1.y, point_plus2.y));
+ gp.quadTo(point_plus1.x, -point_plus1.y, midValue(point_plus1.x, point_plus2.x), -midValue(point_plus1.y, point_plus2.y));
+ offset+=2;
+ }
+ }
+ } else {
+ if (point_plus1.onCurve) {
+ // s = new QuadCurve2D.Float(midValue(point_minus1.x, point.x), -midValue(point_minus1.y, point.y),
+ // point.x, -point.y, point_plus1.x, -point_plus1.y);
+ //gp.curve3(point_plus1.x, -point_plus1.y, point.x, -point.y);
+ gp.quadTo(point.x, -point.y, point_plus1.x, -point_plus1.y);
+ offset++;
+
+ } else {
+ // s = new QuadCurve2D.Float(midValue(point_minus1.x, point.x), -midValue(point_minus1.y, point.y), point.x, -point.y,
+ // midValue(point.x, point_plus1.x), -midValue(point.y, point_plus1.y));
+ //gp.curve3(midValue(point.x, point_plus1.x), -midValue(point.y, point_plus1.y), point.x, -point.y);
+ gp.quadTo(point.x, -point.y, midValue(point.x, point_plus1.x), -midValue(point.y, point_plus1.y));
+ offset++;
+ }
+ }
+ }
+ }
+
+ private static int midValue(int a, int b) {
+ return a + (b - a)/2;
+ }
+}