/* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * - Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistribution 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. * * Neither the name of Sun Microsystems, Inc. or the names of * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed or intended for use * in the design, construction, operation or maintenance of any nuclear * facility. * * Sun gratefully acknowledges that this software was originally authored * and developed by Kenneth Bradley Russell and Christopher John Kline. */ package com.sun.opengl.util; class GLUTStrokeRoman { /* GENERATED FILE -- DO NOT MODIFY */ /* char: 33 '!' */ static final CoordRec char33_stroke0[] = { new CoordRec((float) 13.3819, (float) 100), new CoordRec((float) 13.3819, (float) 33.3333), }; static final CoordRec char33_stroke1[] = { new CoordRec((float) 13.3819, (float) 9.5238), new CoordRec((float) 8.62, (float) 4.7619), new CoordRec((float) 13.3819, (float) 0), new CoordRec((float) 18.1438, (float) 4.7619), new CoordRec((float) 13.3819, (float) 9.5238), }; static final StrokeRec char33[] = { new StrokeRec(2, char33_stroke0), new StrokeRec(5, char33_stroke1), }; /* char: 34 '"' */ static final CoordRec char34_stroke0[] = { new CoordRec((float) 4.02, (float) 100), new CoordRec((float) 4.02, (float) 66.6667), }; static final CoordRec char34_stroke1[] = { new CoordRec((float) 42.1152, (float) 100), new CoordRec((float) 42.1152, (float) 66.6667), }; static final StrokeRec char34[] = { new StrokeRec(2, char34_stroke0), new StrokeRec(2, char34_stroke1), }; /* char: 35 '#' */ static final CoordRec char35_stroke0[] = { new CoordRec((float) 41.2952, (float) 119.048), new CoordRec((float) 7.9619, (float) -33.3333), }; static final CoordRec char35_stroke1[] = { new CoordRec((float) 69.8667, (float) 119.048), new CoordRec((float) 36.5333, (float) -33.3333), }; static final CoordRec char35_stroke2[] = { new CoordRec((float) 7.9619, (float) 57.1429), new CoordRec((float) 74.6286, (float) 57.1429), }; static final CoordRec char35_stroke3[] = { new CoordRec((float) 3.2, (float) 28.5714), new CoordRec((float) 69.8667, (float) 28.5714), }; static final StrokeRec char35[] = { new StrokeRec(2, char35_stroke0), new StrokeRec(2, char35_stroke1), new StrokeRec(2, char35_stroke2), new StrokeRec(2, char35_stroke3), }; /* char: 36 '$' */ static final CoordRec char36_stroke0[] = { new CoordRec((float) 28.6295, (float) 119.048), new CoordRec((float) 28.6295, (float) -19.0476), }; static final CoordRec char36_stroke1[] = { new CoordRec((float) 47.6771, (float) 119.048), new CoordRec((float) 47.6771, (float) -19.0476), }; static final CoordRec char36_stroke2[] = { new CoordRec((float) 71.4867, (float) 85.7143), new CoordRec((float) 61.9629, (float) 95.2381), new CoordRec((float) 47.6771, (float) 100), new CoordRec((float) 28.6295, (float) 100), new CoordRec((float) 14.3438, (float) 95.2381), new CoordRec((float) 4.82, (float) 85.7143), new CoordRec((float) 4.82, (float) 76.1905), new CoordRec((float) 9.5819, (float) 66.6667), new CoordRec((float) 14.3438, (float) 61.9048), new CoordRec((float) 23.8676, (float) 57.1429), new CoordRec((float) 52.439, (float) 47.619), new CoordRec((float) 61.9629, (float) 42.8571), new CoordRec((float) 66.7248, (float) 38.0952), new CoordRec((float) 71.4867, (float) 28.5714), new CoordRec((float) 71.4867, (float) 14.2857), new CoordRec((float) 61.9629, (float) 4.7619), new CoordRec((float) 47.6771, (float) 0), new CoordRec((float) 28.6295, (float) 0), new CoordRec((float) 14.3438, (float) 4.7619), new CoordRec((float) 4.82, (float) 14.2857), }; static final StrokeRec char36[] = { new StrokeRec(2, char36_stroke0), new StrokeRec(2, char36_stroke1), new StrokeRec(20, char36_stroke2), }; /* char: 37 '%' */ static final CoordRec char37_stroke0[] = { new CoordRec((float) 92.0743, (float) 100), new CoordRec((float) 6.36, (float) 0), }; static final CoordRec char37_stroke1[] = { new CoordRec((float) 30.1695, (float) 100), new CoordRec((float) 39.6933, (float) 90.4762), new CoordRec((float) 39.6933, (float) 80.9524), new CoordRec((float) 34.9314, (float) 71.4286), new CoordRec((float) 25.4076, (float) 66.6667), new CoordRec((float) 15.8838, (float) 66.6667), new CoordRec((float) 6.36, (float) 76.1905), new CoordRec((float) 6.36, (float) 85.7143), new CoordRec((float) 11.1219, (float) 95.2381), new CoordRec((float) 20.6457, (float) 100), new CoordRec((float) 30.1695, (float) 100), new CoordRec((float) 39.6933, (float) 95.2381), new CoordRec((float) 53.979, (float) 90.4762), new CoordRec((float) 68.2648, (float) 90.4762), new CoordRec((float) 82.5505, (float) 95.2381), new CoordRec((float) 92.0743, (float) 100), }; static final CoordRec char37_stroke2[] = { new CoordRec((float) 73.0267, (float) 33.3333), new CoordRec((float) 63.5029, (float) 28.5714), new CoordRec((float) 58.741, (float) 19.0476), new CoordRec((float) 58.741, (float) 9.5238), new CoordRec((float) 68.2648, (float) 0), new CoordRec((float) 77.7886, (float) 0), new CoordRec((float) 87.3124, (float) 4.7619), new CoordRec((float) 92.0743, (float) 14.2857), new CoordRec((float) 92.0743, (float) 23.8095), new CoordRec((float) 82.5505, (float) 33.3333), new CoordRec((float) 73.0267, (float) 33.3333), }; static final StrokeRec char37[] = { new StrokeRec(2, char37_stroke0), new StrokeRec(16, char37_stroke1), new StrokeRec(11, char37_stroke2), }; /* char: 38 '&' */ static final CoordRec char38_stroke0[] = { new CoordRec((float) 101.218, (float) 57.1429), new CoordRec((float) 101.218, (float) 61.9048), new CoordRec((float) 96.4562, (float) 66.6667), new CoordRec((float) 91.6943, (float) 66.6667), new CoordRec((float) 86.9324, (float) 61.9048), new CoordRec((float) 82.1705, (float) 52.381), new CoordRec((float) 72.6467, (float) 28.5714), new CoordRec((float) 63.1229, (float) 14.2857), new CoordRec((float) 53.599, (float) 4.7619), new CoordRec((float) 44.0752, (float) 0), new CoordRec((float) 25.0276, (float) 0), new CoordRec((float) 15.5038, (float) 4.7619), new CoordRec((float) 10.7419, (float) 9.5238), new CoordRec((float) 5.98, (float) 19.0476), new CoordRec((float) 5.98, (float) 28.5714), new CoordRec((float) 10.7419, (float) 38.0952), new CoordRec((float) 15.5038, (float) 42.8571), new CoordRec((float) 48.8371, (float) 61.9048), new CoordRec((float) 53.599, (float) 66.6667), new CoordRec((float) 58.361, (float) 76.1905), new CoordRec((float) 58.361, (float) 85.7143), new CoordRec((float) 53.599, (float) 95.2381), new CoordRec((float) 44.0752, (float) 100), new CoordRec((float) 34.5514, (float) 95.2381), new CoordRec((float) 29.7895, (float) 85.7143), new CoordRec((float) 29.7895, (float) 76.1905), new CoordRec((float) 34.5514, (float) 61.9048), new CoordRec((float) 44.0752, (float) 47.619), new CoordRec((float) 67.8848, (float) 14.2857), new CoordRec((float) 77.4086, (float) 4.7619), new CoordRec((float) 86.9324, (float) 0), new CoordRec((float) 96.4562, (float) 0), new CoordRec((float) 101.218, (float) 4.7619), new CoordRec((float) 101.218, (float) 9.5238), }; static final StrokeRec char38[] = { new StrokeRec(34, char38_stroke0), }; /* char: 39 ''' */ static final CoordRec char39_stroke0[] = { new CoordRec((float) 4.44, (float) 100), new CoordRec((float) 4.44, (float) 66.6667), }; static final StrokeRec char39[] = { new StrokeRec(2, char39_stroke0), }; /* char: 40 '(' */ static final CoordRec char40_stroke0[] = { new CoordRec((float) 40.9133, (float) 119.048), new CoordRec((float) 31.3895, (float) 109.524), new CoordRec((float) 21.8657, (float) 95.2381), new CoordRec((float) 12.3419, (float) 76.1905), new CoordRec((float) 7.58, (float) 52.381), new CoordRec((float) 7.58, (float) 33.3333), new CoordRec((float) 12.3419, (float) 9.5238), new CoordRec((float) 21.8657, (float) -9.5238), new CoordRec((float) 31.3895, (float) -23.8095), new CoordRec((float) 40.9133, (float) -33.3333), }; static final StrokeRec char40[] = { new StrokeRec(10, char40_stroke0), }; /* char: 41 ')' */ static final CoordRec char41_stroke0[] = { new CoordRec((float) 5.28, (float) 119.048), new CoordRec((float) 14.8038, (float) 109.524), new CoordRec((float) 24.3276, (float) 95.2381), new CoordRec((float) 33.8514, (float) 76.1905), new CoordRec((float) 38.6133, (float) 52.381), new CoordRec((float) 38.6133, (float) 33.3333), new CoordRec((float) 33.8514, (float) 9.5238), new CoordRec((float) 24.3276, (float) -9.5238), new CoordRec((float) 14.8038, (float) -23.8095), new CoordRec((float) 5.28, (float) -33.3333), }; static final StrokeRec char41[] = { new StrokeRec(10, char41_stroke0), }; /* char: 42 '*' */ static final CoordRec char42_stroke0[] = { new CoordRec((float) 30.7695, (float) 71.4286), new CoordRec((float) 30.7695, (float) 14.2857), }; static final CoordRec char42_stroke1[] = { new CoordRec((float) 6.96, (float) 57.1429), new CoordRec((float) 54.579, (float) 28.5714), }; static final CoordRec char42_stroke2[] = { new CoordRec((float) 54.579, (float) 57.1429), new CoordRec((float) 6.96, (float) 28.5714), }; static final StrokeRec char42[] = { new StrokeRec(2, char42_stroke0), new StrokeRec(2, char42_stroke1), new StrokeRec(2, char42_stroke2), }; /* char: 43 '+' */ static final CoordRec char43_stroke0[] = { new CoordRec((float) 48.8371, (float) 85.7143), new CoordRec((float) 48.8371, (float) 0), }; static final CoordRec char43_stroke1[] = { new CoordRec((float) 5.98, (float) 42.8571), new CoordRec((float) 91.6943, (float) 42.8571), }; static final StrokeRec char43[] = { new StrokeRec(2, char43_stroke0), new StrokeRec(2, char43_stroke1), }; /* char: 44 ',' */ static final CoordRec char44_stroke0[] = { new CoordRec((float) 18.2838, (float) 4.7619), new CoordRec((float) 13.5219, (float) 0), new CoordRec((float) 8.76, (float) 4.7619), new CoordRec((float) 13.5219, (float) 9.5238), new CoordRec((float) 18.2838, (float) 4.7619), new CoordRec((float) 18.2838, (float) -4.7619), new CoordRec((float) 13.5219, (float) -14.2857), new CoordRec((float) 8.76, (float) -19.0476), }; static final StrokeRec char44[] = { new StrokeRec(8, char44_stroke0), }; /* char: 45 '-' */ static final CoordRec char45_stroke0[] = { new CoordRec((float) 7.38, (float) 42.8571), new CoordRec((float) 93.0943, (float) 42.8571), }; static final StrokeRec char45[] = { new StrokeRec(2, char45_stroke0), }; /* char: 46 '.' */ static final CoordRec char46_stroke0[] = { new CoordRec((float) 13.1019, (float) 9.5238), new CoordRec((float) 8.34, (float) 4.7619), new CoordRec((float) 13.1019, (float) 0), new CoordRec((float) 17.8638, (float) 4.7619), new CoordRec((float) 13.1019, (float) 9.5238), }; static final StrokeRec char46[] = { new StrokeRec(5, char46_stroke0), }; /* char: 47 '/' */ static final CoordRec char47_stroke0[] = { new CoordRec((float) 7.24, (float) -14.2857), new CoordRec((float) 73.9067, (float) 100), }; static final StrokeRec char47[] = { new StrokeRec(2, char47_stroke0), }; /* char: 48 '0' */ static final CoordRec char48_stroke0[] = { new CoordRec((float) 33.5514, (float) 100), new CoordRec((float) 19.2657, (float) 95.2381), new CoordRec((float) 9.7419, (float) 80.9524), new CoordRec((float) 4.98, (float) 57.1429), new CoordRec((float) 4.98, (float) 42.8571), new CoordRec((float) 9.7419, (float) 19.0476), new CoordRec((float) 19.2657, (float) 4.7619), new CoordRec((float) 33.5514, (float) 0), new CoordRec((float) 43.0752, (float) 0), new CoordRec((float) 57.361, (float) 4.7619), new CoordRec((float) 66.8848, (float) 19.0476), new CoordRec((float) 71.6467, (float) 42.8571), new CoordRec((float) 71.6467, (float) 57.1429), new CoordRec((float) 66.8848, (float) 80.9524), new CoordRec((float) 57.361, (float) 95.2381), new CoordRec((float) 43.0752, (float) 100), new CoordRec((float) 33.5514, (float) 100), }; static final StrokeRec char48[] = { new StrokeRec(17, char48_stroke0), }; /* char: 49 '1' */ static final CoordRec char49_stroke0[] = { new CoordRec((float) 11.82, (float) 80.9524), new CoordRec((float) 21.3438, (float) 85.7143), new CoordRec((float) 35.6295, (float) 100), new CoordRec((float) 35.6295, (float) 0), }; static final StrokeRec char49[] = { new StrokeRec(4, char49_stroke0), }; /* char: 50 '2' */ static final CoordRec char50_stroke0[] = { new CoordRec((float) 10.1819, (float) 76.1905), new CoordRec((float) 10.1819, (float) 80.9524), new CoordRec((float) 14.9438, (float) 90.4762), new CoordRec((float) 19.7057, (float) 95.2381), new CoordRec((float) 29.2295, (float) 100), new CoordRec((float) 48.2771, (float) 100), new CoordRec((float) 57.801, (float) 95.2381), new CoordRec((float) 62.5629, (float) 90.4762), new CoordRec((float) 67.3248, (float) 80.9524), new CoordRec((float) 67.3248, (float) 71.4286), new CoordRec((float) 62.5629, (float) 61.9048), new CoordRec((float) 53.039, (float) 47.619), new CoordRec((float) 5.42, (float) 0), new CoordRec((float) 72.0867, (float) 0), }; static final StrokeRec char50[] = { new StrokeRec(14, char50_stroke0), }; /* char: 51 '3' */ static final CoordRec char51_stroke0[] = { new CoordRec((float) 14.5238, (float) 100), new CoordRec((float) 66.9048, (float) 100), new CoordRec((float) 38.3333, (float) 61.9048), new CoordRec((float) 52.619, (float) 61.9048), new CoordRec((float) 62.1429, (float) 57.1429), new CoordRec((float) 66.9048, (float) 52.381), new CoordRec((float) 71.6667, (float) 38.0952), new CoordRec((float) 71.6667, (float) 28.5714), new CoordRec((float) 66.9048, (float) 14.2857), new CoordRec((float) 57.381, (float) 4.7619), new CoordRec((float) 43.0952, (float) 0), new CoordRec((float) 28.8095, (float) 0), new CoordRec((float) 14.5238, (float) 4.7619), new CoordRec((float) 9.7619, (float) 9.5238), new CoordRec((float) 5, (float) 19.0476), }; static final StrokeRec char51[] = { new StrokeRec(15, char51_stroke0), }; /* char: 52 '4' */ static final CoordRec char52_stroke0[] = { new CoordRec((float) 51.499, (float) 100), new CoordRec((float) 3.88, (float) 33.3333), new CoordRec((float) 75.3086, (float) 33.3333), }; static final CoordRec char52_stroke1[] = { new CoordRec((float) 51.499, (float) 100), new CoordRec((float) 51.499, (float) 0), }; static final StrokeRec char52[] = { new StrokeRec(3, char52_stroke0), new StrokeRec(2, char52_stroke1), }; /* char: 53 '5' */ static final CoordRec char53_stroke0[] = { new CoordRec((float) 62.0029, (float) 100), new CoordRec((float) 14.3838, (float) 100), new CoordRec((float) 9.6219, (float) 57.1429), new CoordRec((float) 14.3838, (float) 61.9048), new CoordRec((float) 28.6695, (float) 66.6667), new CoordRec((float) 42.9552, (float) 66.6667), new CoordRec((float) 57.241, (float) 61.9048), new CoordRec((float) 66.7648, (float) 52.381), new CoordRec((float) 71.5267, (float) 38.0952), new CoordRec((float) 71.5267, (float) 28.5714), new CoordRec((float) 66.7648, (float) 14.2857), new CoordRec((float) 57.241, (float) 4.7619), new CoordRec((float) 42.9552, (float) 0), new CoordRec((float) 28.6695, (float) 0), new CoordRec((float) 14.3838, (float) 4.7619), new CoordRec((float) 9.6219, (float) 9.5238), new CoordRec((float) 4.86, (float) 19.0476), }; static final StrokeRec char53[] = { new StrokeRec(17, char53_stroke0), }; /* char: 54 '6' */ static final CoordRec char54_stroke0[] = { new CoordRec((float) 62.7229, (float) 85.7143), new CoordRec((float) 57.961, (float) 95.2381), new CoordRec((float) 43.6752, (float) 100), new CoordRec((float) 34.1514, (float) 100), new CoordRec((float) 19.8657, (float) 95.2381), new CoordRec((float) 10.3419, (float) 80.9524), new CoordRec((float) 5.58, (float) 57.1429), new CoordRec((float) 5.58, (float) 33.3333), new CoordRec((float) 10.3419, (float) 14.2857), new CoordRec((float) 19.8657, (float) 4.7619), new CoordRec((float) 34.1514, (float) 0), new CoordRec((float) 38.9133, (float) 0), new CoordRec((float) 53.199, (float) 4.7619), new CoordRec((float) 62.7229, (float) 14.2857), new CoordRec((float) 67.4848, (float) 28.5714), new CoordRec((float) 67.4848, (float) 33.3333), new CoordRec((float) 62.7229, (float) 47.619), new CoordRec((float) 53.199, (float) 57.1429), new CoordRec((float) 38.9133, (float) 61.9048), new CoordRec((float) 34.1514, (float) 61.9048), new CoordRec((float) 19.8657, (float) 57.1429), new CoordRec((float) 10.3419, (float) 47.619), new CoordRec((float) 5.58, (float) 33.3333), }; static final StrokeRec char54[] = { new StrokeRec(23, char54_stroke0), }; /* char: 55 '7' */ static final CoordRec char55_stroke0[] = { new CoordRec((float) 72.2267, (float) 100), new CoordRec((float) 24.6076, (float) 0), }; static final CoordRec char55_stroke1[] = { new CoordRec((float) 5.56, (float) 100), new CoordRec((float) 72.2267, (float) 100), }; static final StrokeRec char55[] = { new StrokeRec(2, char55_stroke0), new StrokeRec(2, char55_stroke1), }; /* char: 56 '8' */ static final CoordRec char56_stroke0[] = { new CoordRec((float) 29.4095, (float) 100), new CoordRec((float) 15.1238, (float) 95.2381), new CoordRec((float) 10.3619, (float) 85.7143), new CoordRec((float) 10.3619, (float) 76.1905), new CoordRec((float) 15.1238, (float) 66.6667), new CoordRec((float) 24.6476, (float) 61.9048), new CoordRec((float) 43.6952, (float) 57.1429), new CoordRec((float) 57.981, (float) 52.381), new CoordRec((float) 67.5048, (float) 42.8571), new CoordRec((float) 72.2667, (float) 33.3333), new CoordRec((float) 72.2667, (float) 19.0476), new CoordRec((float) 67.5048, (float) 9.5238), new CoordRec((float) 62.7429, (float) 4.7619), new CoordRec((float) 48.4571, (float) 0), new CoordRec((float) 29.4095, (float) 0), new CoordRec((float) 15.1238, (float) 4.7619), new CoordRec((float) 10.3619, (float) 9.5238), new CoordRec((float) 5.6, (float) 19.0476), new CoordRec((float) 5.6, (float) 33.3333), new CoordRec((float) 10.3619, (float) 42.8571), new CoordRec((float) 19.8857, (float) 52.381), new CoordRec((float) 34.1714, (float) 57.1429), new CoordRec((float) 53.219, (float) 61.9048), new CoordRec((float) 62.7429, (float) 66.6667), new CoordRec((float) 67.5048, (float) 76.1905), new CoordRec((float) 67.5048, (float) 85.7143), new CoordRec((float) 62.7429, (float) 95.2381), new CoordRec((float) 48.4571, (float) 100), new CoordRec((float) 29.4095, (float) 100), }; static final StrokeRec char56[] = { new StrokeRec(29, char56_stroke0), }; /* char: 57 '9' */ static final CoordRec char57_stroke0[] = { new CoordRec((float) 68.5048, (float) 66.6667), new CoordRec((float) 63.7429, (float) 52.381), new CoordRec((float) 54.219, (float) 42.8571), new CoordRec((float) 39.9333, (float) 38.0952), new CoordRec((float) 35.1714, (float) 38.0952), new CoordRec((float) 20.8857, (float) 42.8571), new CoordRec((float) 11.3619, (float) 52.381), new CoordRec((float) 6.6, (float) 66.6667), new CoordRec((float) 6.6, (float) 71.4286), new CoordRec((float) 11.3619, (float) 85.7143), new CoordRec((float) 20.8857, (float) 95.2381), new CoordRec((float) 35.1714, (float) 100), new CoordRec((float) 39.9333, (float) 100), new CoordRec((float) 54.219, (float) 95.2381), new CoordRec((float) 63.7429, (float) 85.7143), new CoordRec((float) 68.5048, (float) 66.6667), new CoordRec((float) 68.5048, (float) 42.8571), new CoordRec((float) 63.7429, (float) 19.0476), new CoordRec((float) 54.219, (float) 4.7619), new CoordRec((float) 39.9333, (float) 0), new CoordRec((float) 30.4095, (float) 0), new CoordRec((float) 16.1238, (float) 4.7619), new CoordRec((float) 11.3619, (float) 14.2857), }; static final StrokeRec char57[] = { new StrokeRec(23, char57_stroke0), }; /* char: 58 ':' */ static final CoordRec char58_stroke0[] = { new CoordRec((float) 14.0819, (float) 66.6667), new CoordRec((float) 9.32, (float) 61.9048), new CoordRec((float) 14.0819, (float) 57.1429), new CoordRec((float) 18.8438, (float) 61.9048), new CoordRec((float) 14.0819, (float) 66.6667), }; static final CoordRec char58_stroke1[] = { new CoordRec((float) 14.0819, (float) 9.5238), new CoordRec((float) 9.32, (float) 4.7619), new CoordRec((float) 14.0819, (float) 0), new CoordRec((float) 18.8438, (float) 4.7619), new CoordRec((float) 14.0819, (float) 9.5238), }; static final StrokeRec char58[] = { new StrokeRec(5, char58_stroke0), new StrokeRec(5, char58_stroke1), }; /* char: 59 ';' */ static final CoordRec char59_stroke0[] = { new CoordRec((float) 12.9619, (float) 66.6667), new CoordRec((float) 8.2, (float) 61.9048), new CoordRec((float) 12.9619, (float) 57.1429), new CoordRec((float) 17.7238, (float) 61.9048), new CoordRec((float) 12.9619, (float) 66.6667), }; static final CoordRec char59_stroke1[] = { new CoordRec((float) 17.7238, (float) 4.7619), new CoordRec((float) 12.9619, (float) 0), new CoordRec((float) 8.2, (float) 4.7619), new CoordRec((float) 12.9619, (float) 9.5238), new CoordRec((float) 17.7238, (float) 4.7619), new CoordRec((float) 17.7238, (float) -4.7619), new CoordRec((float) 12.9619, (float) -14.2857), new CoordRec((float) 8.2, (float) -19.0476), }; static final StrokeRec char59[] = { new StrokeRec(5, char59_stroke0), new StrokeRec(8, char59_stroke1), }; /* char: 60 '<' */ static final CoordRec char60_stroke0[] = { new CoordRec((float) 79.2505, (float) 85.7143), new CoordRec((float) 3.06, (float) 42.8571), new CoordRec((float) 79.2505, (float) 0), }; static final StrokeRec char60[] = { new StrokeRec(3, char60_stroke0), }; /* char: 61 '=' */ static final CoordRec char61_stroke0[] = { new CoordRec((float) 5.7, (float) 57.1429), new CoordRec((float) 91.4143, (float) 57.1429), }; static final CoordRec char61_stroke1[] = { new CoordRec((float) 5.7, (float) 28.5714), new CoordRec((float) 91.4143, (float) 28.5714), }; static final StrokeRec char61[] = { new StrokeRec(2, char61_stroke0), new StrokeRec(2, char61_stroke1), }; /* char: 62 '>' */ static final CoordRec char62_stroke0[] = { new CoordRec((float) 2.78, (float) 85.7143), new CoordRec((float) 78.9705, (float) 42.8571), new CoordRec((float) 2.78, (float) 0), }; static final StrokeRec char62[] = { new StrokeRec(3, char62_stroke0), }; /* char: 63 '?' */ static final CoordRec char63_stroke0[] = { new CoordRec((float) 8.42, (float) 76.1905), new CoordRec((float) 8.42, (float) 80.9524), new CoordRec((float) 13.1819, (float) 90.4762), new CoordRec((float) 17.9438, (float) 95.2381), new CoordRec((float) 27.4676, (float) 100), new CoordRec((float) 46.5152, (float) 100), new CoordRec((float) 56.039, (float) 95.2381), new CoordRec((float) 60.801, (float) 90.4762), new CoordRec((float) 65.5629, (float) 80.9524), new CoordRec((float) 65.5629, (float) 71.4286), new CoordRec((float) 60.801, (float) 61.9048), new CoordRec((float) 56.039, (float) 57.1429), new CoordRec((float) 36.9914, (float) 47.619), new CoordRec((float) 36.9914, (float) 33.3333), }; static final CoordRec char63_stroke1[] = { new CoordRec((float) 36.9914, (float) 9.5238), new CoordRec((float) 32.2295, (float) 4.7619), new CoordRec((float) 36.9914, (float) 0), new CoordRec((float) 41.7533, (float) 4.7619), new CoordRec((float) 36.9914, (float) 9.5238), }; static final StrokeRec char63[] = { new StrokeRec(14, char63_stroke0), new StrokeRec(5, char63_stroke1), }; /* char: 64 '@' */ static final CoordRec char64_stroke0[] = { new CoordRec((float) 49.2171, (float) 52.381), new CoordRec((float) 39.6933, (float) 57.1429), new CoordRec((float) 30.1695, (float) 57.1429), new CoordRec((float) 25.4076, (float) 47.619), new CoordRec((float) 25.4076, (float) 42.8571), new CoordRec((float) 30.1695, (float) 33.3333), new CoordRec((float) 39.6933, (float) 33.3333), new CoordRec((float) 49.2171, (float) 38.0952), }; static final CoordRec char64_stroke1[] = { new CoordRec((float) 49.2171, (float) 57.1429), new CoordRec((float) 49.2171, (float) 38.0952), new CoordRec((float) 53.979, (float) 33.3333), new CoordRec((float) 63.5029, (float) 33.3333), new CoordRec((float) 68.2648, (float) 42.8571), new CoordRec((float) 68.2648, (float) 47.619), new CoordRec((float) 63.5029, (float) 61.9048), new CoordRec((float) 53.979, (float) 71.4286), new CoordRec((float) 39.6933, (float) 76.1905), new CoordRec((float) 34.9314, (float) 76.1905), new CoordRec((float) 20.6457, (float) 71.4286), new CoordRec((float) 11.1219, (float) 61.9048), new CoordRec((float) 6.36, (float) 47.619), new CoordRec((float) 6.36, (float) 42.8571), new CoordRec((float) 11.1219, (float) 28.5714), new CoordRec((float) 20.6457, (float) 19.0476), new CoordRec((float) 34.9314, (float) 14.2857), new CoordRec((float) 39.6933, (float) 14.2857), new CoordRec((float) 53.979, (float) 19.0476), }; static final StrokeRec char64[] = { new StrokeRec(8, char64_stroke0), new StrokeRec(19, char64_stroke1), }; /* char: 65 'A' */ static final CoordRec char65_stroke0[] = { new CoordRec((float) 40.5952, (float) 100), new CoordRec((float) 2.5, (float) 0), }; static final CoordRec char65_stroke1[] = { new CoordRec((float) 40.5952, (float) 100), new CoordRec((float) 78.6905, (float) 0), }; static final CoordRec char65_stroke2[] = { new CoordRec((float) 16.7857, (float) 33.3333), new CoordRec((float) 64.4048, (float) 33.3333), }; static final StrokeRec char65[] = { new StrokeRec(2, char65_stroke0), new StrokeRec(2, char65_stroke1), new StrokeRec(2, char65_stroke2), }; /* char: 66 'B' */ static final CoordRec char66_stroke0[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 11.42, (float) 0), }; static final CoordRec char66_stroke1[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 54.2771, (float) 100), new CoordRec((float) 68.5629, (float) 95.2381), new CoordRec((float) 73.3248, (float) 90.4762), new CoordRec((float) 78.0867, (float) 80.9524), new CoordRec((float) 78.0867, (float) 71.4286), new CoordRec((float) 73.3248, (float) 61.9048), new CoordRec((float) 68.5629, (float) 57.1429), new CoordRec((float) 54.2771, (float) 52.381), }; static final CoordRec char66_stroke2[] = { new CoordRec((float) 11.42, (float) 52.381), new CoordRec((float) 54.2771, (float) 52.381), new CoordRec((float) 68.5629, (float) 47.619), new CoordRec((float) 73.3248, (float) 42.8571), new CoordRec((float) 78.0867, (float) 33.3333), new CoordRec((float) 78.0867, (float) 19.0476), new CoordRec((float) 73.3248, (float) 9.5238), new CoordRec((float) 68.5629, (float) 4.7619), new CoordRec((float) 54.2771, (float) 0), new CoordRec((float) 11.42, (float) 0), }; static final StrokeRec char66[] = { new StrokeRec(2, char66_stroke0), new StrokeRec(9, char66_stroke1), new StrokeRec(10, char66_stroke2), }; /* char: 67 'C' */ static final CoordRec char67_stroke0[] = { new CoordRec((float) 78.0886, (float) 76.1905), new CoordRec((float) 73.3267, (float) 85.7143), new CoordRec((float) 63.8029, (float) 95.2381), new CoordRec((float) 54.279, (float) 100), new CoordRec((float) 35.2314, (float) 100), new CoordRec((float) 25.7076, (float) 95.2381), new CoordRec((float) 16.1838, (float) 85.7143), new CoordRec((float) 11.4219, (float) 76.1905), new CoordRec((float) 6.66, (float) 61.9048), new CoordRec((float) 6.66, (float) 38.0952), new CoordRec((float) 11.4219, (float) 23.8095), new CoordRec((float) 16.1838, (float) 14.2857), new CoordRec((float) 25.7076, (float) 4.7619), new CoordRec((float) 35.2314, (float) 0), new CoordRec((float) 54.279, (float) 0), new CoordRec((float) 63.8029, (float) 4.7619), new CoordRec((float) 73.3267, (float) 14.2857), new CoordRec((float) 78.0886, (float) 23.8095), }; static final StrokeRec char67[] = { new StrokeRec(18, char67_stroke0), }; /* char: 68 'D' */ static final CoordRec char68_stroke0[] = { new CoordRec((float) 11.96, (float) 100), new CoordRec((float) 11.96, (float) 0), }; static final CoordRec char68_stroke1[] = { new CoordRec((float) 11.96, (float) 100), new CoordRec((float) 45.2933, (float) 100), new CoordRec((float) 59.579, (float) 95.2381), new CoordRec((float) 69.1029, (float) 85.7143), new CoordRec((float) 73.8648, (float) 76.1905), new CoordRec((float) 78.6267, (float) 61.9048), new CoordRec((float) 78.6267, (float) 38.0952), new CoordRec((float) 73.8648, (float) 23.8095), new CoordRec((float) 69.1029, (float) 14.2857), new CoordRec((float) 59.579, (float) 4.7619), new CoordRec((float) 45.2933, (float) 0), new CoordRec((float) 11.96, (float) 0), }; static final StrokeRec char68[] = { new StrokeRec(2, char68_stroke0), new StrokeRec(12, char68_stroke1), }; /* char: 69 'E' */ static final CoordRec char69_stroke0[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 11.42, (float) 0), }; static final CoordRec char69_stroke1[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 73.3248, (float) 100), }; static final CoordRec char69_stroke2[] = { new CoordRec((float) 11.42, (float) 52.381), new CoordRec((float) 49.5152, (float) 52.381), }; static final CoordRec char69_stroke3[] = { new CoordRec((float) 11.42, (float) 0), new CoordRec((float) 73.3248, (float) 0), }; static final StrokeRec char69[] = { new StrokeRec(2, char69_stroke0), new StrokeRec(2, char69_stroke1), new StrokeRec(2, char69_stroke2), new StrokeRec(2, char69_stroke3), }; /* char: 70 'F' */ static final CoordRec char70_stroke0[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 11.42, (float) 0), }; static final CoordRec char70_stroke1[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 73.3248, (float) 100), }; static final CoordRec char70_stroke2[] = { new CoordRec((float) 11.42, (float) 52.381), new CoordRec((float) 49.5152, (float) 52.381), }; static final StrokeRec char70[] = { new StrokeRec(2, char70_stroke0), new StrokeRec(2, char70_stroke1), new StrokeRec(2, char70_stroke2), }; /* char: 71 'G' */ static final CoordRec char71_stroke0[] = { new CoordRec((float) 78.4886, (float) 76.1905), new CoordRec((float) 73.7267, (float) 85.7143), new CoordRec((float) 64.2029, (float) 95.2381), new CoordRec((float) 54.679, (float) 100), new CoordRec((float) 35.6314, (float) 100), new CoordRec((float) 26.1076, (float) 95.2381), new CoordRec((float) 16.5838, (float) 85.7143), new CoordRec((float) 11.8219, (float) 76.1905), new CoordRec((float) 7.06, (float) 61.9048), new CoordRec((float) 7.06, (float) 38.0952), new CoordRec((float) 11.8219, (float) 23.8095), new CoordRec((float) 16.5838, (float) 14.2857), new CoordRec((float) 26.1076, (float) 4.7619), new CoordRec((float) 35.6314, (float) 0), new CoordRec((float) 54.679, (float) 0), new CoordRec((float) 64.2029, (float) 4.7619), new CoordRec((float) 73.7267, (float) 14.2857), new CoordRec((float) 78.4886, (float) 23.8095), new CoordRec((float) 78.4886, (float) 38.0952), }; static final CoordRec char71_stroke1[] = { new CoordRec((float) 54.679, (float) 38.0952), new CoordRec((float) 78.4886, (float) 38.0952), }; static final StrokeRec char71[] = { new StrokeRec(19, char71_stroke0), new StrokeRec(2, char71_stroke1), }; /* char: 72 'H' */ static final CoordRec char72_stroke0[] = { new CoordRec((float) 11.42, (float) 100), new CoordRec((float) 11.42, (float) 0), }; static final CoordRec char72_stroke1[] = { new CoordRec((float) 78.0867, (float) 100), new CoordRec((float) 78.0867, (float) 0), }; static final CoordRec char72_stroke2[] = { new CoordRec((float) 11.42, (float) 52.381), new CoordRec((float) 78.0867, (float) 52.381), }; static final StrokeRec char72[] = { new StrokeRec(2, char72_stroke0), new StrokeRec(2, char72_stroke1), new StrokeRec(2, char72_stroke2), }; /* char: 73 'I' */ static final CoordRec char73_stroke0[] = { new CoordRec((float) 10.86, (float) 100), new CoordRec((float) 10.86, (float) 0), }; static final StrokeRec char73[] = { new StrokeRec(2, char73_stroke0), }; /* char: 74 'J' */ static final CoordRec char74_stroke0[] = { new CoordRec((float) 50.119, (float) 100), new CoordRec((float) 50.119, (float) 23.8095), new CoordRec((float) 45.3571, (float) 9.5238), new CoordRec((float) 40.5952, (float) 4.7619), new CoordRec((float) 31.0714, (float) 0), new CoordRec((float) 21.5476, (float) 0), new CoordRec((float) 12.0238, (float) 4.7619), new CoordRec((float) 7.2619, (float) 9.5238), new CoordRec((float) 2.5, (float) 23.8095), new CoordRec((float) 2.5, (float) 33.3333), }; static final StrokeRec char74[] = { new StrokeRec(10, char74_stroke0), }; /* char: 75 'K' */ static final CoordRec char75_stroke0[] = { new CoordRec((float) 11.28, (float) 100), new CoordRec((float) 11.28, (float) 0), }; static final CoordRec char75_stroke1[] = { new CoordRec((float) 77.9467, (float) 100), new CoordRec((float) 11.28, (float) 33.3333), }; static final CoordRec char75_stroke2[] = { new CoordRec((float) 35.0895, (float) 57.1429), new CoordRec((float) 77.9467, (float) 0), }; static final StrokeRec char75[] = { new StrokeRec(2, char75_stroke0), new StrokeRec(2, char75_stroke1), new StrokeRec(2, char75_stroke2), }; /* char: 76 'L' */ static final CoordRec char76_stroke0[] = { new CoordRec((float) 11.68, (float) 100), new CoordRec((float) 11.68, (float) 0), }; static final CoordRec char76_stroke1[] = { new CoordRec((float) 11.68, (float) 0), new CoordRec((float) 68.8229, (float) 0), }; static final StrokeRec char76[] = { new StrokeRec(2, char76_stroke0), new StrokeRec(2, char76_stroke1), }; /* char: 77 'M' */ static final CoordRec char77_stroke0[] = { new CoordRec((float) 10.86, (float) 100), new CoordRec((float) 10.86, (float) 0), }; static final CoordRec char77_stroke1[] = { new CoordRec((float) 10.86, (float) 100), new CoordRec((float) 48.9552, (float) 0), }; static final CoordRec char77_stroke2[] = { new CoordRec((float) 87.0505, (float) 100), new CoordRec((float) 48.9552, (float) 0), }; static final CoordRec char77_stroke3[] = { new CoordRec((float) 87.0505, (float) 100), new CoordRec((float) 87.0505, (float) 0), }; static final StrokeRec char77[] = { new StrokeRec(2, char77_stroke0), new StrokeRec(2, char77_stroke1), new StrokeRec(2, char77_stroke2), new StrokeRec(2, char77_stroke3), }; /* char: 78 'N' */ static final CoordRec char78_stroke0[] = { new CoordRec((float) 11.14, (float) 100), new CoordRec((float) 11.14, (float) 0), }; static final CoordRec char78_stroke1[] = { new CoordRec((float) 11.14, (float) 100), new CoordRec((float) 77.8067, (float) 0), }; static final CoordRec char78_stroke2[] = { new CoordRec((float) 77.8067, (float) 100), new CoordRec((float) 77.8067, (float) 0), }; static final StrokeRec char78[] = { new StrokeRec(2, char78_stroke0), new StrokeRec(2, char78_stroke1), new StrokeRec(2, char78_stroke2), }; /* char: 79 'O' */ static final CoordRec char79_stroke0[] = { new CoordRec((float) 34.8114, (float) 100), new CoordRec((float) 25.2876, (float) 95.2381), new CoordRec((float) 15.7638, (float) 85.7143), new CoordRec((float) 11.0019, (float) 76.1905), new CoordRec((float) 6.24, (float) 61.9048), new CoordRec((float) 6.24, (float) 38.0952), new CoordRec((float) 11.0019, (float) 23.8095), new CoordRec((float) 15.7638, (float) 14.2857), new CoordRec((float) 25.2876, (float) 4.7619), new CoordRec((float) 34.8114, (float) 0), new CoordRec((float) 53.859, (float) 0), new CoordRec((float) 63.3829, (float) 4.7619), new CoordRec((float) 72.9067, (float) 14.2857), new CoordRec((float) 77.6686, (float) 23.8095), new CoordRec((float) 82.4305, (float) 38.0952), new CoordRec((float) 82.4305, (float) 61.9048), new CoordRec((float) 77.6686, (float) 76.1905), new CoordRec((float) 72.9067, (float) 85.7143), new CoordRec((float) 63.3829, (float) 95.2381), new CoordRec((float) 53.859, (float) 100), new CoordRec((float) 34.8114, (float) 100), }; static final StrokeRec char79[] = { new StrokeRec(21, char79_stroke0), }; /* char: 80 'P' */ static final CoordRec char80_stroke0[] = { new CoordRec((float) 12.1, (float) 100), new CoordRec((float) 12.1, (float) 0), }; static final CoordRec char80_stroke1[] = { new CoordRec((float) 12.1, (float) 100), new CoordRec((float) 54.9571, (float) 100), new CoordRec((float) 69.2429, (float) 95.2381), new CoordRec((float) 74.0048, (float) 90.4762), new CoordRec((float) 78.7667, (float) 80.9524), new CoordRec((float) 78.7667, (float) 66.6667), new CoordRec((float) 74.0048, (float) 57.1429), new CoordRec((float) 69.2429, (float) 52.381), new CoordRec((float) 54.9571, (float) 47.619), new CoordRec((float) 12.1, (float) 47.619), }; static final StrokeRec char80[] = { new StrokeRec(2, char80_stroke0), new StrokeRec(10, char80_stroke1), }; /* char: 81 'Q' */ static final CoordRec char81_stroke0[] = { new CoordRec((float) 33.8714, (float) 100), new CoordRec((float) 24.3476, (float) 95.2381), new CoordRec((float) 14.8238, (float) 85.7143), new CoordRec((float) 10.0619, (float) 76.1905), new CoordRec((float) 5.3, (float) 61.9048), new CoordRec((float) 5.3, (float) 38.0952), new CoordRec((float) 10.0619, (float) 23.8095), new CoordRec((float) 14.8238, (float) 14.2857), new CoordRec((float) 24.3476, (float) 4.7619), new CoordRec((float) 33.8714, (float) 0), new CoordRec((float) 52.919, (float) 0), new CoordRec((float) 62.4429, (float) 4.7619), new CoordRec((float) 71.9667, (float) 14.2857), new CoordRec((float) 76.7286, (float) 23.8095), new CoordRec((float) 81.4905, (float) 38.0952), new CoordRec((float) 81.4905, (float) 61.9048), new CoordRec((float) 76.7286, (float) 76.1905), new CoordRec((float) 71.9667, (float) 85.7143), new CoordRec((float) 62.4429, (float) 95.2381), new CoordRec((float) 52.919, (float) 100), new CoordRec((float) 33.8714, (float) 100), }; static final CoordRec char81_stroke1[] = { new CoordRec((float) 48.1571, (float) 19.0476), new CoordRec((float) 76.7286, (float) -9.5238), }; static final StrokeRec char81[] = { new StrokeRec(21, char81_stroke0), new StrokeRec(2, char81_stroke1), }; /* char: 82 'R' */ static final CoordRec char82_stroke0[] = { new CoordRec((float) 11.68, (float) 100), new CoordRec((float) 11.68, (float) 0), }; static final CoordRec char82_stroke1[] = { new CoordRec((float) 11.68, (float) 100), new CoordRec((float) 54.5371, (float) 100), new CoordRec((float) 68.8229, (float) 95.2381), new CoordRec((float) 73.5848, (float) 90.4762), new CoordRec((float) 78.3467, (float) 80.9524), new CoordRec((float) 78.3467, (float) 71.4286), new CoordRec((float) 73.5848, (float) 61.9048), new CoordRec((float) 68.8229, (float) 57.1429), new CoordRec((float) 54.5371, (float) 52.381), new CoordRec((float) 11.68, (float) 52.381), }; static final CoordRec char82_stroke2[] = { new CoordRec((float) 45.0133, (float) 52.381), new CoordRec((float) 78.3467, (float) 0), }; static final StrokeRec char82[] = { new StrokeRec(2, char82_stroke0), new StrokeRec(10, char82_stroke1), new StrokeRec(2, char82_stroke2), }; /* char: 83 'S' */ static final CoordRec char83_stroke0[] = { new CoordRec((float) 74.6667, (float) 85.7143), new CoordRec((float) 65.1429, (float) 95.2381), new CoordRec((float) 50.8571, (float) 100), new CoordRec((float) 31.8095, (float) 100), new CoordRec((float) 17.5238, (float) 95.2381), new CoordRec((float) 8, (float) 85.7143), new CoordRec((float) 8, (float) 76.1905), new CoordRec((float) 12.7619, (float) 66.6667), new CoordRec((float) 17.5238, (float) 61.9048), new CoordRec((float) 27.0476, (float) 57.1429), new CoordRec((float) 55.619, (float) 47.619), new CoordRec((float) 65.1429, (float) 42.8571), new CoordRec((float) 69.9048, (float) 38.0952), new CoordRec((float) 74.6667, (float) 28.5714), new CoordRec((float) 74.6667, (float) 14.2857), new CoordRec((float) 65.1429, (float) 4.7619), new CoordRec((float) 50.8571, (float) 0), new CoordRec((float) 31.8095, (float) 0), new CoordRec((float) 17.5238, (float) 4.7619), new CoordRec((float) 8, (float) 14.2857), }; static final StrokeRec char83[] = { new StrokeRec(20, char83_stroke0), }; /* char: 84 'T' */ static final CoordRec char84_stroke0[] = { new CoordRec((float) 35.6933, (float) 100), new CoordRec((float) 35.6933, (float) 0), }; static final CoordRec char84_stroke1[] = { new CoordRec((float) 2.36, (float) 100), new CoordRec((float) 69.0267, (float) 100), }; static final StrokeRec char84[] = { new StrokeRec(2, char84_stroke0), new StrokeRec(2, char84_stroke1), }; /* char: 85 'U' */ static final CoordRec char85_stroke0[] = { new CoordRec((float) 11.54, (float) 100), new CoordRec((float) 11.54, (float) 28.5714), new CoordRec((float) 16.3019, (float) 14.2857), new CoordRec((float) 25.8257, (float) 4.7619), new CoordRec((float) 40.1114, (float) 0), new CoordRec((float) 49.6352, (float) 0), new CoordRec((float) 63.921, (float) 4.7619), new CoordRec((float) 73.4448, (float) 14.2857), new CoordRec((float) 78.2067, (float) 28.5714), new CoordRec((float) 78.2067, (float) 100), }; static final StrokeRec char85[] = { new StrokeRec(10, char85_stroke0), }; /* char: 86 'V' */ static final CoordRec char86_stroke0[] = { new CoordRec((float) 2.36, (float) 100), new CoordRec((float) 40.4552, (float) 0), }; static final CoordRec char86_stroke1[] = { new CoordRec((float) 78.5505, (float) 100), new CoordRec((float) 40.4552, (float) 0), }; static final StrokeRec char86[] = { new StrokeRec(2, char86_stroke0), new StrokeRec(2, char86_stroke1), }; /* char: 87 'W' */ static final CoordRec char87_stroke0[] = { new CoordRec((float) 2.22, (float) 100), new CoordRec((float) 26.0295, (float) 0), }; static final CoordRec char87_stroke1[] = { new CoordRec((float) 49.839, (float) 100), new CoordRec((float) 26.0295, (float) 0), }; static final CoordRec char87_stroke2[] = { new CoordRec((float) 49.839, (float) 100), new CoordRec((float) 73.6486, (float) 0), }; static final CoordRec char87_stroke3[] = { new CoordRec((float) 97.4581, (float) 100), new CoordRec((float) 73.6486, (float) 0), }; static final StrokeRec char87[] = { new StrokeRec(2, char87_stroke0), new StrokeRec(2, char87_stroke1), new StrokeRec(2, char87_stroke2), new StrokeRec(2, char87_stroke3), }; /* char: 88 'X' */ static final CoordRec char88_stroke0[] = { new CoordRec((float) 2.5, (float) 100), new CoordRec((float) 69.1667, (float) 0), }; static final CoordRec char88_stroke1[] = { new CoordRec((float) 69.1667, (float) 100), new CoordRec((float) 2.5, (float) 0), }; static final StrokeRec char88[] = { new StrokeRec(2, char88_stroke0), new StrokeRec(2, char88_stroke1), }; /* char: 89 'Y' */ static final CoordRec char89_stroke0[] = { new CoordRec((float) 1.52, (float) 100), new CoordRec((float) 39.6152, (float) 52.381), new CoordRec((float) 39.6152, (float) 0), }; static final CoordRec char89_stroke1[] = { new CoordRec((float) 77.7105, (float) 100), new CoordRec((float) 39.6152, (float) 52.381), }; static final StrokeRec char89[] = { new StrokeRec(3, char89_stroke0), new StrokeRec(2, char89_stroke1), }; /* char: 90 'Z' */ static final CoordRec char90_stroke0[] = { new CoordRec((float) 69.1667, (float) 100), new CoordRec((float) 2.5, (float) 0), }; static final CoordRec char90_stroke1[] = { new CoordRec((float) 2.5, (float) 100), new CoordRec((float) 69.1667, (float) 100), }; static final CoordRec char90_stroke2[] = { new CoordRec((float) 2.5, (float) 0), new CoordRec((float) 69.1667, (float) 0), }; static final StrokeRec char90[] = { new StrokeRec(2, char90_stroke0), new StrokeRec(2, char90_stroke1), new StrokeRec(2, char90_stroke2), }; /* char: 91 '[' */ static final CoordRec char91_stroke0[] = { new CoordRec((float) 7.78, (float) 119.048), new CoordRec((float) 7.78, (float) -33.3333), }; static final CoordRec char91_stroke1[] = { new CoordRec((float) 12.5419, (float) 119.048), new CoordRec((float) 12.5419, (float) -33.3333), }; static final CoordRec char91_stroke2[] = { new CoordRec((float) 7.78, (float) 119.048), new CoordRec((float) 41.1133, (float) 119.048), }; static final CoordRec char91_stroke3[] = { new CoordRec((float) 7.78, (float) -33.3333), new CoordRec((float) 41.1133, (float) -33.3333), }; static final StrokeRec char91[] = { new StrokeRec(2, char91_stroke0), new StrokeRec(2, char91_stroke1), new StrokeRec(2, char91_stroke2), new StrokeRec(2, char91_stroke3), }; /* char: 92 '\' */ static final CoordRec char92_stroke0[] = { new CoordRec((float) 5.84, (float) 100), new CoordRec((float) 72.5067, (float) -14.2857), }; static final StrokeRec char92[] = { new StrokeRec(2, char92_stroke0), }; /* char: 93 ']' */ static final CoordRec char93_stroke0[] = { new CoordRec((float) 33.0114, (float) 119.048), new CoordRec((float) 33.0114, (float) -33.3333), }; static final CoordRec char93_stroke1[] = { new CoordRec((float) 37.7733, (float) 119.048), new CoordRec((float) 37.7733, (float) -33.3333), }; static final CoordRec char93_stroke2[] = { new CoordRec((float) 4.44, (float) 119.048), new CoordRec((float) 37.7733, (float) 119.048), }; static final CoordRec char93_stroke3[] = { new CoordRec((float) 4.44, (float) -33.3333), new CoordRec((float) 37.7733, (float) -33.3333), }; static final StrokeRec char93[] = { new StrokeRec(2, char93_stroke0), new StrokeRec(2, char93_stroke1), new StrokeRec(2, char93_stroke2), new StrokeRec(2, char93_stroke3), }; /* char: 94 '^' */ static final CoordRec char94_stroke0[] = { new CoordRec((float) 44.0752, (float) 109.524), new CoordRec((float) 5.98, (float) 42.8571), }; static final CoordRec char94_stroke1[] = { new CoordRec((float) 44.0752, (float) 109.524), new CoordRec((float) 82.1705, (float) 42.8571), }; static final StrokeRec char94[] = { new StrokeRec(2, char94_stroke0), new StrokeRec(2, char94_stroke1), }; /* char: 95 '_' */ static final CoordRec char95_stroke0[] = { new CoordRec((float)-1.1, (float) -33.3333), new CoordRec((float) 103.662, (float) -33.3333), new CoordRec((float) 103.662, (float) -28.5714), new CoordRec((float)-1.1, (float) -28.5714), new CoordRec((float)-1.1, (float) -33.3333), }; static final StrokeRec char95[] = { new StrokeRec(5, char95_stroke0), }; /* char: 96 '`' */ static final CoordRec char96_stroke0[] = { new CoordRec((float) 33.0219, (float) 100), new CoordRec((float) 56.8314, (float) 71.4286), }; static final CoordRec char96_stroke1[] = { new CoordRec((float) 33.0219, (float) 100), new CoordRec((float) 28.26, (float) 95.2381), new CoordRec((float) 56.8314, (float) 71.4286), }; static final StrokeRec char96[] = { new StrokeRec(2, char96_stroke0), new StrokeRec(3, char96_stroke1), }; /* char: 97 'a' */ static final CoordRec char97_stroke0[] = { new CoordRec((float) 63.8229, (float) 66.6667), new CoordRec((float) 63.8229, (float) 0), }; static final CoordRec char97_stroke1[] = { new CoordRec((float) 63.8229, (float) 52.381), new CoordRec((float) 54.299, (float) 61.9048), new CoordRec((float) 44.7752, (float) 66.6667), new CoordRec((float) 30.4895, (float) 66.6667), new CoordRec((float) 20.9657, (float) 61.9048), new CoordRec((float) 11.4419, (float) 52.381), new CoordRec((float) 6.68, (float) 38.0952), new CoordRec((float) 6.68, (float) 28.5714), new CoordRec((float) 11.4419, (float) 14.2857), new CoordRec((float) 20.9657, (float) 4.7619), new CoordRec((float) 30.4895, (float) 0), new CoordRec((float) 44.7752, (float) 0), new CoordRec((float) 54.299, (float) 4.7619), new CoordRec((float) 63.8229, (float) 14.2857), }; static final StrokeRec char97[] = { new StrokeRec(2, char97_stroke0), new StrokeRec(14, char97_stroke1), }; /* char: 98 'b' */ static final CoordRec char98_stroke0[] = { new CoordRec((float) 8.76, (float) 100), new CoordRec((float) 8.76, (float) 0), }; static final CoordRec char98_stroke1[] = { new CoordRec((float) 8.76, (float) 52.381), new CoordRec((float) 18.2838, (float) 61.9048), new CoordRec((float) 27.8076, (float) 66.6667), new CoordRec((float) 42.0933, (float) 66.6667), new CoordRec((float) 51.6171, (float) 61.9048), new CoordRec((float) 61.141, (float) 52.381), new CoordRec((float) 65.9029, (float) 38.0952), new CoordRec((float) 65.9029, (float) 28.5714), new CoordRec((float) 61.141, (float) 14.2857), new CoordRec((float) 51.6171, (float) 4.7619), new CoordRec((float) 42.0933, (float) 0), new CoordRec((float) 27.8076, (float) 0), new CoordRec((float) 18.2838, (float) 4.7619), new CoordRec((float) 8.76, (float) 14.2857), }; static final StrokeRec char98[] = { new StrokeRec(2, char98_stroke0), new StrokeRec(14, char98_stroke1), }; /* char: 99 'c' */ static final CoordRec char99_stroke0[] = { new CoordRec((float) 62.6629, (float) 52.381), new CoordRec((float) 53.139, (float) 61.9048), new CoordRec((float) 43.6152, (float) 66.6667), new CoordRec((float) 29.3295, (float) 66.6667), new CoordRec((float) 19.8057, (float) 61.9048), new CoordRec((float) 10.2819, (float) 52.381), new CoordRec((float) 5.52, (float) 38.0952), new CoordRec((float) 5.52, (float) 28.5714), new CoordRec((float) 10.2819, (float) 14.2857), new CoordRec((float) 19.8057, (float) 4.7619), new CoordRec((float) 29.3295, (float) 0), new CoordRec((float) 43.6152, (float) 0), new CoordRec((float) 53.139, (float) 4.7619), new CoordRec((float) 62.6629, (float) 14.2857), }; static final StrokeRec char99[] = { new StrokeRec(14, char99_stroke0), }; /* char: 100 'd' */ static final CoordRec char100_stroke0[] = { new CoordRec((float) 61.7829, (float) 100), new CoordRec((float) 61.7829, (float) 0), }; static final CoordRec char100_stroke1[] = { new CoordRec((float) 61.7829, (float) 52.381), new CoordRec((float) 52.259, (float) 61.9048), new CoordRec((float) 42.7352, (float) 66.6667), new CoordRec((float) 28.4495, (float) 66.6667), new CoordRec((float) 18.9257, (float) 61.9048), new CoordRec((float) 9.4019, (float) 52.381), new CoordRec((float) 4.64, (float) 38.0952), new CoordRec((float) 4.64, (float) 28.5714), new CoordRec((float) 9.4019, (float) 14.2857), new CoordRec((float) 18.9257, (float) 4.7619), new CoordRec((float) 28.4495, (float) 0), new CoordRec((float) 42.7352, (float) 0), new CoordRec((float) 52.259, (float) 4.7619), new CoordRec((float) 61.7829, (float) 14.2857), }; static final StrokeRec char100[] = { new StrokeRec(2, char100_stroke0), new StrokeRec(14, char100_stroke1), }; /* char: 101 'e' */ static final CoordRec char101_stroke0[] = { new CoordRec((float) 5.72, (float) 38.0952), new CoordRec((float) 62.8629, (float) 38.0952), new CoordRec((float) 62.8629, (float) 47.619), new CoordRec((float) 58.101, (float) 57.1429), new CoordRec((float) 53.339, (float) 61.9048), new CoordRec((float) 43.8152, (float) 66.6667), new CoordRec((float) 29.5295, (float) 66.6667), new CoordRec((float) 20.0057, (float) 61.9048), new CoordRec((float) 10.4819, (float) 52.381), new CoordRec((float) 5.72, (float) 38.0952), new CoordRec((float) 5.72, (float) 28.5714), new CoordRec((float) 10.4819, (float) 14.2857), new CoordRec((float) 20.0057, (float) 4.7619), new CoordRec((float) 29.5295, (float) 0), new CoordRec((float) 43.8152, (float) 0), new CoordRec((float) 53.339, (float) 4.7619), new CoordRec((float) 62.8629, (float) 14.2857), }; static final StrokeRec char101[] = { new StrokeRec(17, char101_stroke0), }; /* char: 102 'f' */ static final CoordRec char102_stroke0[] = { new CoordRec((float) 38.7752, (float) 100), new CoordRec((float) 29.2514, (float) 100), new CoordRec((float) 19.7276, (float) 95.2381), new CoordRec((float) 14.9657, (float) 80.9524), new CoordRec((float) 14.9657, (float) 0), }; static final CoordRec char102_stroke1[] = { new CoordRec((float) 0.68, (float) 66.6667), new CoordRec((float) 34.0133, (float) 66.6667), }; static final StrokeRec char102[] = { new StrokeRec(5, char102_stroke0), new StrokeRec(2, char102_stroke1), }; /* char: 103 'g' */ static final CoordRec char103_stroke0[] = { new CoordRec((float) 62.5029, (float) 66.6667), new CoordRec((float) 62.5029, (float) -9.5238), new CoordRec((float) 57.741, (float) -23.8095), new CoordRec((float) 52.979, (float) -28.5714), new CoordRec((float) 43.4552, (float) -33.3333), new CoordRec((float) 29.1695, (float) -33.3333), new CoordRec((float) 19.6457, (float) -28.5714), }; static final CoordRec char103_stroke1[] = { new CoordRec((float) 62.5029, (float) 52.381), new CoordRec((float) 52.979, (float) 61.9048), new CoordRec((float) 43.4552, (float) 66.6667), new CoordRec((float) 29.1695, (float) 66.6667), new CoordRec((float) 19.6457, (float) 61.9048), new CoordRec((float) 10.1219, (float) 52.381), new CoordRec((float) 5.36, (float) 38.0952), new CoordRec((float) 5.36, (float) 28.5714), new CoordRec((float) 10.1219, (float) 14.2857), new CoordRec((float) 19.6457, (float) 4.7619), new CoordRec((float) 29.1695, (float) 0), new CoordRec((float) 43.4552, (float) 0), new CoordRec((float) 52.979, (float) 4.7619), new CoordRec((float) 62.5029, (float) 14.2857), }; static final StrokeRec char103[] = { new StrokeRec(7, char103_stroke0), new StrokeRec(14, char103_stroke1), }; /* char: 104 'h' */ static final CoordRec char104_stroke0[] = { new CoordRec((float) 9.6, (float) 100), new CoordRec((float) 9.6, (float) 0), }; static final CoordRec char104_stroke1[] = { new CoordRec((float) 9.6, (float) 47.619), new CoordRec((float) 23.8857, (float) 61.9048), new CoordRec((float) 33.4095, (float) 66.6667), new CoordRec((float) 47.6952, (float) 66.6667), new CoordRec((float) 57.219, (float) 61.9048), new CoordRec((float) 61.981, (float) 47.619), new CoordRec((float) 61.981, (float) 0), }; static final StrokeRec char104[] = { new StrokeRec(2, char104_stroke0), new StrokeRec(7, char104_stroke1), }; /* char: 105 'i' */ static final CoordRec char105_stroke0[] = { new CoordRec((float) 10.02, (float) 100), new CoordRec((float) 14.7819, (float) 95.2381), new CoordRec((float) 19.5438, (float) 100), new CoordRec((float) 14.7819, (float) 104.762), new CoordRec((float) 10.02, (float) 100), }; static final CoordRec char105_stroke1[] = { new CoordRec((float) 14.7819, (float) 66.6667), new CoordRec((float) 14.7819, (float) 0), }; static final StrokeRec char105[] = { new StrokeRec(5, char105_stroke0), new StrokeRec(2, char105_stroke1), }; /* char: 106 'j' */ static final CoordRec char106_stroke0[] = { new CoordRec((float) 17.3876, (float) 100), new CoordRec((float) 22.1495, (float) 95.2381), new CoordRec((float) 26.9114, (float) 100), new CoordRec((float) 22.1495, (float) 104.762), new CoordRec((float) 17.3876, (float) 100), }; static final CoordRec char106_stroke1[] = { new CoordRec((float) 22.1495, (float) 66.6667), new CoordRec((float) 22.1495, (float) -14.2857), new CoordRec((float) 17.3876, (float) -28.5714), new CoordRec((float) 7.8638, (float) -33.3333), new CoordRec((float)-1.66, (float) -33.3333), }; static final StrokeRec char106[] = { new StrokeRec(5, char106_stroke0), new StrokeRec(5, char106_stroke1), }; /* char: 107 'k' */ static final CoordRec char107_stroke0[] = { new CoordRec((float) 9.6, (float) 100), new CoordRec((float) 9.6, (float) 0), }; static final CoordRec char107_stroke1[] = { new CoordRec((float) 57.219, (float) 66.6667), new CoordRec((float) 9.6, (float) 19.0476), }; static final CoordRec char107_stroke2[] = { new CoordRec((float) 28.6476, (float) 38.0952), new CoordRec((float) 61.981, (float) 0), }; static final StrokeRec char107[] = { new StrokeRec(2, char107_stroke0), new StrokeRec(2, char107_stroke1), new StrokeRec(2, char107_stroke2), }; /* char: 108 'l' */ static final CoordRec char108_stroke0[] = { new CoordRec((float) 10.02, (float) 100), new CoordRec((float) 10.02, (float) 0), }; static final StrokeRec char108[] = { new StrokeRec(2, char108_stroke0), }; /* char: 109 'm' */ static final CoordRec char109_stroke0[] = { new CoordRec((float) 9.6, (float) 66.6667), new CoordRec((float) 9.6, (float) 0), }; static final CoordRec char109_stroke1[] = { new CoordRec((float) 9.6, (float) 47.619), new CoordRec((float) 23.8857, (float) 61.9048), new CoordRec((float) 33.4095, (float) 66.6667), new CoordRec((float) 47.6952, (float) 66.6667), new CoordRec((float) 57.219, (float) 61.9048), new CoordRec((float) 61.981, (float) 47.619), new CoordRec((float) 61.981, (float) 0), }; static final CoordRec char109_stroke2[] = { new CoordRec((float) 61.981, (float) 47.619), new CoordRec((float) 76.2667, (float) 61.9048), new CoordRec((float) 85.7905, (float) 66.6667), new CoordRec((float) 100.076, (float) 66.6667), new CoordRec((float) 109.6, (float) 61.9048), new CoordRec((float) 114.362, (float) 47.619), new CoordRec((float) 114.362, (float) 0), }; static final StrokeRec char109[] = { new StrokeRec(2, char109_stroke0), new StrokeRec(7, char109_stroke1), new StrokeRec(7, char109_stroke2), }; /* char: 110 'n' */ static final CoordRec char110_stroke0[] = { new CoordRec((float) 9.18, (float) 66.6667), new CoordRec((float) 9.18, (float) 0), }; static final CoordRec char110_stroke1[] = { new CoordRec((float) 9.18, (float) 47.619), new CoordRec((float) 23.4657, (float) 61.9048), new CoordRec((float) 32.9895, (float) 66.6667), new CoordRec((float) 47.2752, (float) 66.6667), new CoordRec((float) 56.799, (float) 61.9048), new CoordRec((float) 61.561, (float) 47.619), new CoordRec((float) 61.561, (float) 0), }; static final StrokeRec char110[] = { new StrokeRec(2, char110_stroke0), new StrokeRec(7, char110_stroke1), }; /* char: 111 'o' */ static final CoordRec char111_stroke0[] = { new CoordRec((float) 28.7895, (float) 66.6667), new CoordRec((float) 19.2657, (float) 61.9048), new CoordRec((float) 9.7419, (float) 52.381), new CoordRec((float) 4.98, (float) 38.0952), new CoordRec((float) 4.98, (float) 28.5714), new CoordRec((float) 9.7419, (float) 14.2857), new CoordRec((float) 19.2657, (float) 4.7619), new CoordRec((float) 28.7895, (float) 0), new CoordRec((float) 43.0752, (float) 0), new CoordRec((float) 52.599, (float) 4.7619), new CoordRec((float) 62.1229, (float) 14.2857), new CoordRec((float) 66.8848, (float) 28.5714), new CoordRec((float) 66.8848, (float) 38.0952), new CoordRec((float) 62.1229, (float) 52.381), new CoordRec((float) 52.599, (float) 61.9048), new CoordRec((float) 43.0752, (float) 66.6667), new CoordRec((float) 28.7895, (float) 66.6667), }; static final StrokeRec char111[] = { new StrokeRec(17, char111_stroke0), }; /* char: 112 'p' */ static final CoordRec char112_stroke0[] = { new CoordRec((float) 9.46, (float) 66.6667), new CoordRec((float) 9.46, (float) -33.3333), }; static final CoordRec char112_stroke1[] = { new CoordRec((float) 9.46, (float) 52.381), new CoordRec((float) 18.9838, (float) 61.9048), new CoordRec((float) 28.5076, (float) 66.6667), new CoordRec((float) 42.7933, (float) 66.6667), new CoordRec((float) 52.3171, (float) 61.9048), new CoordRec((float) 61.841, (float) 52.381), new CoordRec((float) 66.6029, (float) 38.0952), new CoordRec((float) 66.6029, (float) 28.5714), new CoordRec((float) 61.841, (float) 14.2857), new CoordRec((float) 52.3171, (float) 4.7619), new CoordRec((float) 42.7933, (float) 0), new CoordRec((float) 28.5076, (float) 0), new CoordRec((float) 18.9838, (float) 4.7619), new CoordRec((float) 9.46, (float) 14.2857), }; static final StrokeRec char112[] = { new StrokeRec(2, char112_stroke0), new StrokeRec(14, char112_stroke1), }; /* char: 113 'q' */ static final CoordRec char113_stroke0[] = { new CoordRec((float) 61.9829, (float) 66.6667), new CoordRec((float) 61.9829, (float) -33.3333), }; static final CoordRec char113_stroke1[] = { new CoordRec((float) 61.9829, (float) 52.381), new CoordRec((float) 52.459, (float) 61.9048), new CoordRec((float) 42.9352, (float) 66.6667), new CoordRec((float) 28.6495, (float) 66.6667), new CoordRec((float) 19.1257, (float) 61.9048), new CoordRec((float) 9.6019, (float) 52.381), new CoordRec((float) 4.84, (float) 38.0952), new CoordRec((float) 4.84, (float) 28.5714), new CoordRec((float) 9.6019, (float) 14.2857), new CoordRec((float) 19.1257, (float) 4.7619), new CoordRec((float) 28.6495, (float) 0), new CoordRec((float) 42.9352, (float) 0), new CoordRec((float) 52.459, (float) 4.7619), new CoordRec((float) 61.9829, (float) 14.2857), }; static final StrokeRec char113[] = { new StrokeRec(2, char113_stroke0), new StrokeRec(14, char113_stroke1), }; /* char: 114 'r' */ static final CoordRec char114_stroke0[] = { new CoordRec((float) 9.46, (float) 66.6667), new CoordRec((float) 9.46, (float) 0), }; static final CoordRec char114_stroke1[] = { new CoordRec((float) 9.46, (float) 38.0952), new CoordRec((float) 14.2219, (float) 52.381), new CoordRec((float) 23.7457, (float) 61.9048), new CoordRec((float) 33.2695, (float) 66.6667), new CoordRec((float) 47.5552, (float) 66.6667), }; static final StrokeRec char114[] = { new StrokeRec(2, char114_stroke0), new StrokeRec(5, char114_stroke1), }; /* char: 115 's' */ static final CoordRec char115_stroke0[] = { new CoordRec((float) 57.081, (float) 52.381), new CoordRec((float) 52.319, (float) 61.9048), new CoordRec((float) 38.0333, (float) 66.6667), new CoordRec((float) 23.7476, (float) 66.6667), new CoordRec((float) 9.4619, (float) 61.9048), new CoordRec((float) 4.7, (float) 52.381), new CoordRec((float) 9.4619, (float) 42.8571), new CoordRec((float) 18.9857, (float) 38.0952), new CoordRec((float) 42.7952, (float) 33.3333), new CoordRec((float) 52.319, (float) 28.5714), new CoordRec((float) 57.081, (float) 19.0476), new CoordRec((float) 57.081, (float) 14.2857), new CoordRec((float) 52.319, (float) 4.7619), new CoordRec((float) 38.0333, (float) 0), new CoordRec((float) 23.7476, (float) 0), new CoordRec((float) 9.4619, (float) 4.7619), new CoordRec((float) 4.7, (float) 14.2857), }; static final StrokeRec char115[] = { new StrokeRec(17, char115_stroke0), }; /* char: 116 't' */ static final CoordRec char116_stroke0[] = { new CoordRec((float) 14.8257, (float) 100), new CoordRec((float) 14.8257, (float) 19.0476), new CoordRec((float) 19.5876, (float) 4.7619), new CoordRec((float) 29.1114, (float) 0), new CoordRec((float) 38.6352, (float) 0), }; static final CoordRec char116_stroke1[] = { new CoordRec((float) 0.54, (float) 66.6667), new CoordRec((float) 33.8733, (float) 66.6667), }; static final StrokeRec char116[] = { new StrokeRec(5, char116_stroke0), new StrokeRec(2, char116_stroke1), }; /* char: 117 'u' */ static final CoordRec char117_stroke0[] = { new CoordRec((float) 9.46, (float) 66.6667), new CoordRec((float) 9.46, (float) 19.0476), new CoordRec((float) 14.2219, (float) 4.7619), new CoordRec((float) 23.7457, (float) 0), new CoordRec((float) 38.0314, (float) 0), new CoordRec((float) 47.5552, (float) 4.7619), new CoordRec((float) 61.841, (float) 19.0476), }; static final CoordRec char117_stroke1[] = { new CoordRec((float) 61.841, (float) 66.6667), new CoordRec((float) 61.841, (float) 0), }; static final StrokeRec char117[] = { new StrokeRec(7, char117_stroke0), new StrokeRec(2, char117_stroke1), }; /* char: 118 'v' */ static final CoordRec char118_stroke0[] = { new CoordRec((float) 1.8, (float) 66.6667), new CoordRec((float) 30.3714, (float) 0), }; static final CoordRec char118_stroke1[] = { new CoordRec((float) 58.9429, (float) 66.6667), new CoordRec((float) 30.3714, (float) 0), }; static final StrokeRec char118[] = { new StrokeRec(2, char118_stroke0), new StrokeRec(2, char118_stroke1), }; /* char: 119 'w' */ static final CoordRec char119_stroke0[] = { new CoordRec((float) 2.5, (float) 66.6667), new CoordRec((float) 21.5476, (float) 0), }; static final CoordRec char119_stroke1[] = { new CoordRec((float) 40.5952, (float) 66.6667), new CoordRec((float) 21.5476, (float) 0), }; static final CoordRec char119_stroke2[] = { new CoordRec((float) 40.5952, (float) 66.6667), new CoordRec((float) 59.6429, (float) 0), }; static final CoordRec char119_stroke3[] = { new CoordRec((float) 78.6905, (float) 66.6667), new CoordRec((float) 59.6429, (float) 0), }; static final StrokeRec char119[] = { new StrokeRec(2, char119_stroke0), new StrokeRec(2, char119_stroke1), new StrokeRec(2, char119_stroke2), new StrokeRec(2, char119_stroke3), }; /* char: 120 'x' */ static final CoordRec char120_stroke0[] = { new CoordRec((float) 1.66, (float) 66.6667), new CoordRec((float) 54.041, (float) 0), }; static final CoordRec char120_stroke1[] = { new CoordRec((float) 54.041, (float) 66.6667), new CoordRec((float) 1.66, (float) 0), }; static final StrokeRec char120[] = { new StrokeRec(2, char120_stroke0), new StrokeRec(2, char120_stroke1), }; /* char: 121 'y' */ static final CoordRec char121_stroke0[] = { new CoordRec((float) 6.5619, (float) 66.6667), new CoordRec((float) 35.1333, (float) 0), }; static final CoordRec char121_stroke1[] = { new CoordRec((float) 63.7048, (float) 66.6667), new CoordRec((float) 35.1333, (float) 0), new CoordRec((float) 25.6095, (float) -19.0476), new CoordRec((float) 16.0857, (float) -28.5714), new CoordRec((float) 6.5619, (float) -33.3333), new CoordRec((float) 1.8, (float) -33.3333), }; static final StrokeRec char121[] = { new StrokeRec(2, char121_stroke0), new StrokeRec(6, char121_stroke1), }; /* char: 122 'z' */ static final CoordRec char122_stroke0[] = { new CoordRec((float) 56.821, (float) 66.6667), new CoordRec((float) 4.44, (float) 0), }; static final CoordRec char122_stroke1[] = { new CoordRec((float) 4.44, (float) 66.6667), new CoordRec((float) 56.821, (float) 66.6667), }; static final CoordRec char122_stroke2[] = { new CoordRec((float) 4.44, (float) 0), new CoordRec((float) 56.821, (float) 0), }; static final StrokeRec char122[] = { new StrokeRec(2, char122_stroke0), new StrokeRec(2, char122_stroke1), new StrokeRec(2, char122_stroke2), }; /* char: 123 '{' */ static final CoordRec char123_stroke0[] = { new CoordRec((float) 31.1895, (float) 119.048), new CoordRec((float) 21.6657, (float) 114.286), new CoordRec((float) 16.9038, (float) 109.524), new CoordRec((float) 12.1419, (float) 100), new CoordRec((float) 12.1419, (float) 90.4762), new CoordRec((float) 16.9038, (float) 80.9524), new CoordRec((float) 21.6657, (float) 76.1905), new CoordRec((float) 26.4276, (float) 66.6667), new CoordRec((float) 26.4276, (float) 57.1429), new CoordRec((float) 16.9038, (float) 47.619), }; static final CoordRec char123_stroke1[] = { new CoordRec((float) 21.6657, (float) 114.286), new CoordRec((float) 16.9038, (float) 104.762), new CoordRec((float) 16.9038, (float) 95.2381), new CoordRec((float) 21.6657, (float) 85.7143), new CoordRec((float) 26.4276, (float) 80.9524), new CoordRec((float) 31.1895, (float) 71.4286), new CoordRec((float) 31.1895, (float) 61.9048), new CoordRec((float) 26.4276, (float) 52.381), new CoordRec((float) 7.38, (float) 42.8571), new CoordRec((float) 26.4276, (float) 33.3333), new CoordRec((float) 31.1895, (float) 23.8095), new CoordRec((float) 31.1895, (float) 14.2857), new CoordRec((float) 26.4276, (float) 4.7619), new CoordRec((float) 21.6657, (float) 0), new CoordRec((float) 16.9038, (float) -9.5238), new CoordRec((float) 16.9038, (float) -19.0476), new CoordRec((float) 21.6657, (float) -28.5714), }; static final CoordRec char123_stroke2[] = { new CoordRec((float) 16.9038, (float) 38.0952), new CoordRec((float) 26.4276, (float) 28.5714), new CoordRec((float) 26.4276, (float) 19.0476), new CoordRec((float) 21.6657, (float) 9.5238), new CoordRec((float) 16.9038, (float) 4.7619), new CoordRec((float) 12.1419, (float) -4.7619), new CoordRec((float) 12.1419, (float) -14.2857), new CoordRec((float) 16.9038, (float) -23.8095), new CoordRec((float) 21.6657, (float) -28.5714), new CoordRec((float) 31.1895, (float) -33.3333), }; static final StrokeRec char123[] = { new StrokeRec(10, char123_stroke0), new StrokeRec(17, char123_stroke1), new StrokeRec(10, char123_stroke2), }; /* char: 124 '|' */ static final CoordRec char124_stroke0[] = { new CoordRec((float) 11.54, (float) 119.048), new CoordRec((float) 11.54, (float) -33.3333), }; static final StrokeRec char124[] = { new StrokeRec(2, char124_stroke0), }; /* char: 125 '}' */ static final CoordRec char125_stroke0[] = { new CoordRec((float) 9.18, (float) 119.048), new CoordRec((float) 18.7038, (float) 114.286), new CoordRec((float) 23.4657, (float) 109.524), new CoordRec((float) 28.2276, (float) 100), new CoordRec((float) 28.2276, (float) 90.4762), new CoordRec((float) 23.4657, (float) 80.9524), new CoordRec((float) 18.7038, (float) 76.1905), new CoordRec((float) 13.9419, (float) 66.6667), new CoordRec((float) 13.9419, (float) 57.1429), new CoordRec((float) 23.4657, (float) 47.619), }; static final CoordRec char125_stroke1[] = { new CoordRec((float) 18.7038, (float) 114.286), new CoordRec((float) 23.4657, (float) 104.762), new CoordRec((float) 23.4657, (float) 95.2381), new CoordRec((float) 18.7038, (float) 85.7143), new CoordRec((float) 13.9419, (float) 80.9524), new CoordRec((float) 9.18, (float) 71.4286), new CoordRec((float) 9.18, (float) 61.9048), new CoordRec((float) 13.9419, (float) 52.381), new CoordRec((float) 32.9895, (float) 42.8571), new CoordRec((float) 13.9419, (float) 33.3333), new CoordRec((float) 9.18, (float) 23.8095), new CoordRec((float) 9.18, (float) 14.2857), new CoordRec((float) 13.9419, (float) 4.7619), new CoordRec((float) 18.7038, (float) 0), new CoordRec((float) 23.4657, (float) -9.5238), new CoordRec((float) 23.4657, (float) -19.0476), new CoordRec((float) 18.7038, (float) -28.5714), }; static final CoordRec char125_stroke2[] = { new CoordRec((float) 23.4657, (float) 38.0952), new CoordRec((float) 13.9419, (float) 28.5714), new CoordRec((float) 13.9419, (float) 19.0476), new CoordRec((float) 18.7038, (float) 9.5238), new CoordRec((float) 23.4657, (float) 4.7619), new CoordRec((float) 28.2276, (float) -4.7619), new CoordRec((float) 28.2276, (float) -14.2857), new CoordRec((float) 23.4657, (float) -23.8095), new CoordRec((float) 18.7038, (float) -28.5714), new CoordRec((float) 9.18, (float) -33.3333), }; static final StrokeRec char125[] = { new StrokeRec(10, char125_stroke0), new StrokeRec(17, char125_stroke1), new StrokeRec(10, char125_stroke2), }; /* char: 126 '~' */ static final CoordRec char126_stroke0[] = { new CoordRec((float) 2.92, (float) 28.5714), new CoordRec((float) 2.92, (float) 38.0952), new CoordRec((float) 7.6819, (float) 52.381), new CoordRec((float) 17.2057, (float) 57.1429), new CoordRec((float) 26.7295, (float) 57.1429), new CoordRec((float) 36.2533, (float) 52.381), new CoordRec((float) 55.301, (float) 38.0952), new CoordRec((float) 64.8248, (float) 33.3333), new CoordRec((float) 74.3486, (float) 33.3333), new CoordRec((float) 83.8724, (float) 38.0952), new CoordRec((float) 88.6343, (float) 47.619), }; static final CoordRec char126_stroke1[] = { new CoordRec((float) 2.92, (float) 38.0952), new CoordRec((float) 7.6819, (float) 47.619), new CoordRec((float) 17.2057, (float) 52.381), new CoordRec((float) 26.7295, (float) 52.381), new CoordRec((float) 36.2533, (float) 47.619), new CoordRec((float) 55.301, (float) 33.3333), new CoordRec((float) 64.8248, (float) 28.5714), new CoordRec((float) 74.3486, (float) 28.5714), new CoordRec((float) 83.8724, (float) 33.3333), new CoordRec((float) 88.6343, (float) 47.619), new CoordRec((float) 88.6343, (float) 57.1429), }; static final StrokeRec char126[] = { new StrokeRec(11, char126_stroke0), new StrokeRec(11, char126_stroke1), }; /* char: 127 */ static final CoordRec char127_stroke0[] = { new CoordRec((float) 52.381, (float) 100), new CoordRec((float) 14.2857, (float) -33.3333), }; static final CoordRec char127_stroke1[] = { new CoordRec((float) 28.5714, (float) 66.6667), new CoordRec((float) 14.2857, (float) 61.9048), new CoordRec((float) 4.7619, (float) 52.381), new CoordRec((float) 0, (float) 38.0952), new CoordRec((float) 0, (float) 23.8095), new CoordRec((float) 4.7619, (float) 14.2857), new CoordRec((float) 14.2857, (float) 4.7619), new CoordRec((float) 28.5714, (float) 0), new CoordRec((float) 38.0952, (float) 0), new CoordRec((float) 52.381, (float) 4.7619), new CoordRec((float) 61.9048, (float) 14.2857), new CoordRec((float) 66.6667, (float) 28.5714), new CoordRec((float) 66.6667, (float) 42.8571), new CoordRec((float) 61.9048, (float) 52.381), new CoordRec((float) 52.381, (float) 61.9048), new CoordRec((float) 38.0952, (float) 66.6667), new CoordRec((float) 28.5714, (float) 66.6667), }; static final StrokeRec char127[] = { new StrokeRec(2, char127_stroke0), new StrokeRec(17, char127_stroke1), }; static final StrokeCharRec chars[] = { new StrokeCharRec( 0, /* char0 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char1 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char2 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char3 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char4 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char5 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char6 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char7 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char8 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char9 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char10 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char11 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char12 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char13 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char14 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char15 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char16 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char17 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char18 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char19 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char20 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char21 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char22 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char23 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char24 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char25 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char26 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char27 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char28 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char29 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char30 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char31 */ null, (float) 0, (float) 0 ), new StrokeCharRec( 0, /* char32 */ null, (float) 52.381, (float) 104.762 ), new StrokeCharRec( 2, char33, (float) 13.3819, (float) 26.6238 ), new StrokeCharRec( 2, char34, (float) 23.0676, (float) 51.4352 ), new StrokeCharRec( 4, char35, (float) 36.5333, (float) 79.4886 ), new StrokeCharRec( 3, char36, (float) 38.1533, (float) 76.2067 ), new StrokeCharRec( 3, char37, (float) 49.2171, (float) 96.5743 ), new StrokeCharRec( 1, char38, (float) 53.599, (float) 101.758 ), new StrokeCharRec( 1, char39, (float) 4.44, (float) 13.62 ), new StrokeCharRec( 1, char40, (float) 21.8657, (float) 47.1733 ), new StrokeCharRec( 1, char41, (float) 24.3276, (float) 47.5333 ), new StrokeCharRec( 3, char42, (float) 30.7695, (float) 59.439 ), new StrokeCharRec( 2, char43, (float) 48.8371, (float) 97.2543 ), new StrokeCharRec( 1, char44, (float) 13.5219, (float) 26.0638 ), new StrokeCharRec( 1, char45, (float) 50.2371, (float) 100.754 ), new StrokeCharRec( 1, char46, (float) 13.1019, (float) 26.4838 ), new StrokeCharRec( 1, char47, (float) 40.5733, (float) 82.1067 ), new StrokeCharRec( 1, char48, (float) 38.3133, (float) 77.0667 ), new StrokeCharRec( 1, char49, (float) 30.8676, (float) 66.5295 ), new StrokeCharRec( 1, char50, (float) 38.7533, (float) 77.6467 ), new StrokeCharRec( 1, char51, (float) 38.3333, (float) 77.0467 ), new StrokeCharRec( 2, char52, (float) 37.2133, (float) 80.1686 ), new StrokeCharRec( 1, char53, (float) 38.1933, (float) 77.6867 ), new StrokeCharRec( 1, char54, (float) 34.1514, (float) 73.8048 ), new StrokeCharRec( 2, char55, (float) 38.8933, (float) 77.2267 ), new StrokeCharRec( 1, char56, (float) 38.9333, (float) 77.6667 ), new StrokeCharRec( 1, char57, (float) 39.9333, (float) 74.0648 ), new StrokeCharRec( 2, char58, (float) 14.0819, (float) 26.2238 ), new StrokeCharRec( 2, char59, (float) 12.9619, (float) 26.3038 ), new StrokeCharRec( 1, char60, (float) 41.1552, (float) 81.6105 ), new StrokeCharRec( 2, char61, (float) 48.5571, (float) 97.2543 ), new StrokeCharRec( 1, char62, (float) 40.8752, (float) 81.6105 ), new StrokeCharRec( 2, char63, (float) 36.9914, (float) 73.9029 ), new StrokeCharRec( 2, char64, (float) 34.9314, (float) 74.3648 ), new StrokeCharRec( 3, char65, (float) 40.5952, (float) 80.4905 ), new StrokeCharRec( 3, char66, (float) 44.7533, (float) 83.6267 ), new StrokeCharRec( 1, char67, (float) 39.9933, (float) 84.4886 ), new StrokeCharRec( 2, char68, (float) 45.2933, (float) 85.2867 ), new StrokeCharRec( 4, char69, (float) 39.9914, (float) 78.1848 ), new StrokeCharRec( 3, char70, (float) 39.9914, (float) 78.7448 ), new StrokeCharRec( 2, char71, (float) 40.3933, (float) 89.7686 ), new StrokeCharRec( 3, char72, (float) 44.7533, (float) 89.0867 ), new StrokeCharRec( 1, char73, (float) 10.86, (float) 21.3 ), new StrokeCharRec( 1, char74, (float) 31.0714, (float) 59.999 ), new StrokeCharRec( 3, char75, (float) 44.6133, (float) 79.3267 ), new StrokeCharRec( 2, char76, (float) 40.2514, (float) 71.3229 ), new StrokeCharRec( 4, char77, (float) 48.9552, (float) 97.2105 ), new StrokeCharRec( 3, char78, (float) 44.4733, (float) 88.8067 ), new StrokeCharRec( 1, char79, (float) 44.3352, (float) 88.8305 ), new StrokeCharRec( 2, char80, (float) 45.4333, (float) 85.6667 ), new StrokeCharRec( 2, char81, (float) 43.3952, (float) 88.0905 ), new StrokeCharRec( 3, char82, (float) 45.0133, (float) 82.3667 ), new StrokeCharRec( 1, char83, (float) 41.3333, (float) 80.8267 ), new StrokeCharRec( 2, char84, (float) 35.6933, (float) 71.9467 ), new StrokeCharRec( 1, char85, (float) 44.8733, (float) 89.4867 ), new StrokeCharRec( 2, char86, (float) 40.4552, (float) 81.6105 ), new StrokeCharRec( 4, char87, (float) 49.839, (float) 100.518 ), new StrokeCharRec( 2, char88, (float) 35.8333, (float) 72.3667 ), new StrokeCharRec( 2, char89, (float) 39.6152, (float) 79.6505 ), new StrokeCharRec( 3, char90, (float) 35.8333, (float) 73.7467 ), new StrokeCharRec( 4, char91, (float) 22.0657, (float) 46.1133 ), new StrokeCharRec( 1, char92, (float) 39.1733, (float) 78.2067 ), new StrokeCharRec( 4, char93, (float) 23.4876, (float) 46.3933 ), new StrokeCharRec( 2, char94, (float) 44.0752, (float) 90.2305 ), new StrokeCharRec( 1, char95, (float) 51.281, (float) 104.062 ), new StrokeCharRec( 2, char96, (float) 42.5457, (float) 83.5714 ), new StrokeCharRec( 2, char97, (float) 35.2514, (float) 66.6029 ), new StrokeCharRec( 2, char98, (float) 37.3314, (float) 70.4629 ), new StrokeCharRec( 1, char99, (float) 34.0914, (float) 68.9229 ), new StrokeCharRec( 2, char100, (float) 33.2114, (float) 70.2629 ), new StrokeCharRec( 1, char101, (float) 34.2914, (float) 68.5229 ), new StrokeCharRec( 2, char102, (float) 14.9657, (float) 38.6552 ), new StrokeCharRec( 2, char103, (float) 33.9314, (float) 70.9829 ), new StrokeCharRec( 2, char104, (float) 33.4095, (float) 71.021 ), new StrokeCharRec( 2, char105, (float) 14.7819, (float) 28.8638 ), new StrokeCharRec( 2, char106, (float) 17.3876, (float) 36.2314 ), new StrokeCharRec( 3, char107, (float) 33.4095, (float) 62.521 ), new StrokeCharRec( 1, char108, (float) 10.02, (float) 19.34 ), new StrokeCharRec( 3, char109, (float) 61.981, (float) 123.962 ), new StrokeCharRec( 2, char110, (float) 32.9895, (float) 70.881 ), new StrokeCharRec( 1, char111, (float) 33.5514, (float) 71.7448 ), new StrokeCharRec( 2, char112, (float) 38.0314, (float) 70.8029 ), new StrokeCharRec( 2, char113, (float) 33.4114, (float) 70.7429 ), new StrokeCharRec( 2, char114, (float) 23.7457, (float) 49.4952 ), new StrokeCharRec( 1, char115, (float) 28.5095, (float) 62.321 ), new StrokeCharRec( 2, char116, (float) 14.8257, (float) 39.3152 ), new StrokeCharRec( 2, char117, (float) 33.2695, (float) 71.161 ), new StrokeCharRec( 2, char118, (float) 30.3714, (float) 60.6029 ), new StrokeCharRec( 4, char119, (float) 40.5952, (float) 80.4905 ), new StrokeCharRec( 2, char120, (float) 25.4695, (float) 56.401 ), new StrokeCharRec( 2, char121, (float) 35.1333, (float) 66.0648 ), new StrokeCharRec( 3, char122, (float) 28.2495, (float) 61.821 ), new StrokeCharRec( 3, char123, (float) 21.6657, (float) 41.6295 ), new StrokeCharRec( 1, char124, (float) 11.54, (float) 23.78 ), new StrokeCharRec( 3, char125, (float) 18.7038, (float) 41.4695 ), new StrokeCharRec( 2, char126, (float) 45.7771, (float) 91.2743 ), new StrokeCharRec( 2, char127, (float) 33.3333, (float) 66.6667 ), }; static final StrokeFontRec glutStrokeRoman = new StrokeFontRec( "Roman", 128, chars, (float) 119.048, (float) -33.3333 ); } 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329
/**
* Copyright 2012 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 com.jogamp.opengl;
import java.util.Arrays;
import javax.media.opengl.GL;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GL2GL3;
import javax.media.opengl.GL3;
import javax.media.opengl.GLBase;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
import jogamp.opengl.Debug;
import com.jogamp.opengl.FBObject.Attachment.Type;
/**
* Core utility class simplifying usage of framebuffer objects (FBO)
* with all {@link GLProfile}s.
* <p>
* Supports on-the-fly reconfiguration of dimension and multisample buffers via {@link #reset(GL, int, int, int, boolean)}
* while preserving the {@link Attachment} references.
* </p>
* <p>
* Integrates default read/write framebuffers via {@link GLContext#getDefaultReadFramebuffer()} and {@link GLContext#getDefaultReadFramebuffer()},
* which is being hooked at {@link GL#glBindFramebuffer(int, int)} when the default (<code>zero</code>) framebuffer is selected.
* </p>
*
* <p>FIXME: Implement support for {@link Type#DEPTH_TEXTURE}, {@link Type#STENCIL_TEXTURE} .</p>
*/
public class FBObject {
protected static final boolean DEBUG = Debug.debug("FBObject");
private static final boolean FBOResizeQuirk = false;
private static enum DetachAction { NONE, DISPOSE, RECREATE };
/**
* Marker interface, denotes a color buffer attachment.
* <p>Always an instance of {@link Attachment}.</p>
* <p>Either an instance of {@link ColorAttachment} or {@link TextureAttachment}.</b>
*/
public static interface Colorbuffer {
/**
* Initializes the color buffer and set it's parameter, if uninitialized, i.e. name is <code>zero</code>.
* @return <code>true</code> if newly initialized, otherwise <code>false</code>.
* @throws GLException if buffer generation or setup fails. The just created buffer name will be deleted in this case.
*/
public boolean initialize(GL gl) throws GLException;
/**
* Releases the color buffer if initialized, i.e. name is not <code>zero</code>.
* @throws GLException if buffer release fails.
*/
public void free(GL gl) throws GLException;
/**
* Writes the internal format to the given GLCapabilities object.
* @param caps the destination for format bits
* @param rgba8Avail whether rgba8 is available
*/
public void formatToGLCapabilities(GLCapabilities caps, boolean rgba8Avail);
}
/** Common super class of all attachments */
public static abstract class Attachment {
public enum Type {
NONE, DEPTH, STENCIL, DEPTH_STENCIL, COLOR, COLOR_TEXTURE, DEPTH_TEXTURE, STENCIL_TEXTURE;
/**
* Returns {@link #COLOR}, {@link #DEPTH}, {@link #STENCIL} or {@link #DEPTH_STENCIL}
* @throws IllegalArgumentException if <code>format</code> cannot be handled.
*/
public static Type determine(int format) throws IllegalArgumentException {
switch(format) {
case GL.GL_RGBA4:
case GL.GL_RGB5_A1:
case GL.GL_RGB565:
case GL.GL_RGB8:
case GL.GL_RGBA8:
return Type.COLOR;
case GL.GL_DEPTH_COMPONENT16:
case GL.GL_DEPTH_COMPONENT24:
case GL.GL_DEPTH_COMPONENT32:
return Type.DEPTH;
case GL.GL_STENCIL_INDEX1:
case GL.GL_STENCIL_INDEX4:
case GL.GL_STENCIL_INDEX8:
return Type.STENCIL;
case GL.GL_DEPTH24_STENCIL8:
return Type.DEPTH_STENCIL;
default:
throw new IllegalArgumentException("format invalid: "+toHexString(format));
}
}
};
/** immutable type [{@link #COLOR}, {@link #DEPTH}, {@link #STENCIL}, {@link #COLOR_TEXTURE}, {@link #DEPTH_TEXTURE}, {@link #STENCIL_TEXTURE} ] */
public final Type type;
/** immutable the internal format */
public final int format;
private int width, height;
private int name;
protected Attachment(Type type, int iFormat, int width, int height, int name) {
this.type = type;
this.format = iFormat;
this.width = width;
this.height = height;
this.name = name;
}
/**
* Writes the internal format to the given GLCapabilities object.
* @param caps the destination for format bits
* @param rgba8Avail whether rgba8 is available
*/
public final void formatToGLCapabilities(GLCapabilities caps, boolean rgba8Avail) {
final int _format;
switch(format) {
case GL.GL_RGBA:
case 4:
_format = rgba8Avail ? GL.GL_RGBA8 : GL.GL_RGBA4;
break;
case GL.GL_RGB:
case 3:
_format = rgba8Avail ? GL.GL_RGB8 : GL.GL_RGB565;
break;
default:
_format = format;
}
switch(_format) {
case GL.GL_RGBA4:
caps.setRedBits(4);
caps.setGreenBits(4);
caps.setBlueBits(4);
caps.setAlphaBits(4);
break;
case GL.GL_RGB5_A1:
caps.setRedBits(5);
caps.setGreenBits(5);
caps.setBlueBits(5);
caps.setAlphaBits(1);
break;
case GL.GL_RGB565:
caps.setRedBits(5);
caps.setGreenBits(6);
caps.setBlueBits(5);
caps.setAlphaBits(0);
break;
case GL.GL_RGB8:
caps.setRedBits(8);
caps.setGreenBits(8);
caps.setBlueBits(8);
caps.setAlphaBits(0);
break;
case GL.GL_RGBA8:
caps.setRedBits(8);
caps.setGreenBits(8);
caps.setBlueBits(8);
caps.setAlphaBits(8);
break;
case GL.GL_DEPTH_COMPONENT16:
caps.setDepthBits(16);
break;
case GL.GL_DEPTH_COMPONENT24:
caps.setDepthBits(24);
break;
case GL.GL_DEPTH_COMPONENT32:
caps.setDepthBits(32);
break;
case GL.GL_STENCIL_INDEX1:
caps.setStencilBits(1);
break;
case GL.GL_STENCIL_INDEX4:
caps.setStencilBits(4);
break;
case GL.GL_STENCIL_INDEX8:
caps.setStencilBits(8);
break;
case GL.GL_DEPTH24_STENCIL8:
caps.setDepthBits(24);
caps.setStencilBits(8);
break;
default:
throw new IllegalArgumentException("format invalid: "+toHexString(format));
}
}
/** width of attachment */
public final int getWidth() { return width; }
/** height of attachment */
public final int getHeight() { return height; }
/* pp */ final void setSize(int w, int h) { width = w; height = h; }
/** buffer name [1..max], maybe a texture or renderbuffer name, depending on type. */
public final int getName() { return name; }
/* pp */ final void setName(int n) { name = n; }
/**
* Initializes the attachment and set it's parameter, if uninitialized, i.e. name is <code>zero</code>.
* <pre>
final boolean init = 0 == name;
if( init ) {
do init ..
}
return init;
* </pre>
* @return <code>true</code> if newly initialized, otherwise <code>false</code>.
* @throws GLException if buffer generation or setup fails. The just created buffer name will be deleted in this case.
*/
public abstract boolean initialize(GL gl) throws GLException;
/**
* Releases the attachment if initialized, i.e. name is not <code>zero</code>.
* <pre>
if(0 != name) {
do free ..
name = 0;
}
* </pre>
* @throws GLException if buffer release fails.
*/
public abstract void free(GL gl) throws GLException;
/**
* <p>
* Comparison by {@link #type}, {@link #format}, {@link #width}, {@link #height} and {@link #name}.
* </p>
* {@inheritDoc}
*/
@Override
public boolean equals(Object o) {
if( this == o ) return true;
if( ! ( o instanceof Attachment ) ) return false;
final Attachment a = (Attachment)o;
return type == a.type &&
format == a.format &&
width == a.width &&
height== a.height &&
name == a.name ;
}
/**
* <p>
* Hashed by {@link #type}, {@link #format}, {@link #width}, {@link #height} and {@link #name}.
* </p>
* {@inheritDoc}
*/
@Override
public int hashCode() {
// 31 * x == (x << 5) - x
int hash = 31 + type.ordinal();
hash = ((hash << 5) - hash) + format;
hash = ((hash << 5) - hash) + width;
hash = ((hash << 5) - hash) + height;
hash = ((hash << 5) - hash) + name;
return hash;
}
int objectHashCode() { return super.hashCode(); }
@Override
public String toString() {
return getClass().getSimpleName()+"[type "+type+", format "+toHexString(format)+", "+width+"x"+height+
"; name "+toHexString(name)+", obj "+toHexString(objectHashCode())+"]";
}
public static Type getType(int attachmentPoint, int maxColorAttachments) {
if( GL.GL_COLOR_ATTACHMENT0 <= attachmentPoint && attachmentPoint < GL.GL_COLOR_ATTACHMENT0+maxColorAttachments ) {
return Type.COLOR;
}
switch(attachmentPoint) {
case GL.GL_DEPTH_ATTACHMENT:
return Type.DEPTH;
case GL.GL_STENCIL_ATTACHMENT:
return Type.STENCIL;
default:
throw new IllegalArgumentException("Invalid attachment point "+toHexString(attachmentPoint));
}
}
}
/** Other renderbuffer attachment which maybe a colorbuffer, depth or stencil. */
public static class RenderAttachment extends Attachment {
private int samples;
/**
* @param type allowed types are {@link Type#DEPTH_STENCIL} {@link Type#DEPTH}, {@link Type#STENCIL} or {@link Type#COLOR}
* @param iFormat
* @param samples
* @param width
* @param height
* @param name
*/
public RenderAttachment(Type type, int iFormat, int samples, int width, int height, int name) {
super(validateType(type), iFormat, width, height, name);
this.samples = samples;
}
/** number of samples, or zero for no multisampling */
public final int getSamples() { return samples; }
/* pp */ final void setSamples(int s) { samples = s; }
private static Type validateType(Type type) {
switch(type) {
case DEPTH_STENCIL:
case DEPTH:
case STENCIL:
case COLOR:
return type;
default:
throw new IllegalArgumentException("Invalid type: "+type);
}
}
/**
* <p>
* Comparison by {@link #type}, {@link #format}, {@link #samples}, {@link #width}, {@link #height} and {@link #name}.
* </p>
* {@inheritDoc}
*/
@Override
public boolean equals(Object o) {
if( this == o ) return true;
if( ! ( o instanceof RenderAttachment ) ) return false;
return super.equals(o) &&
samples == ((RenderAttachment)o).samples;
}
/**
* <p>
* Hashed by {@link #type}, {@link #format}, {@link #samples}, {@link #width}, {@link #height} and {@link #name}.
* </p>
* {@inheritDoc}
*/
@Override
public int hashCode() {
// 31 * x == (x << 5) - x
int hash = super.hashCode();
hash = ((hash << 5) - hash) + samples;
return hash;
}
@Override
public boolean initialize(GL gl) throws GLException {
final boolean init = 0 == getName();
if( init ) {
checkPreGLError(gl);
final int[] name = new int[] { -1 };
gl.glGenRenderbuffers(1, name, 0);
setName(name[0]);
gl.glBindRenderbuffer(GL.GL_RENDERBUFFER, getName());
if( samples > 0 ) {
((GL2GL3)gl).glRenderbufferStorageMultisample(GL.GL_RENDERBUFFER, samples, format, getWidth(), getHeight());
} else {
gl.glRenderbufferStorage(GL.GL_RENDERBUFFER, format, getWidth(), getHeight());
}
final int glerr = gl.glGetError();
if(GL.GL_NO_ERROR != glerr) {
gl.glDeleteRenderbuffers(1, name, 0);
setName(0);
throw new GLException("GL Error "+toHexString(glerr)+" while creating "+this);
}
if(DEBUG) {
System.err.println("Attachment.init.X: "+this);
}
}
return init;
}
@Override
public void free(GL gl) {
final int[] name = new int[] { getName() };
if( 0 != name[0] ) {
if(DEBUG) {
System.err.println("Attachment.free.0: "+this);
}
gl.glDeleteRenderbuffers(1, name, 0);
setName(0);
}
}
@Override
public String toString() {
return getClass().getSimpleName()+"[type "+type+", format "+toHexString(format)+", samples "+samples+", "+getWidth()+"x"+getHeight()+
", name "+toHexString(getName())+", obj "+toHexString(objectHashCode())+"]";
}
}
/** Color render buffer attachment */
public static class ColorAttachment extends RenderAttachment implements Colorbuffer {
public ColorAttachment(int iFormat, int samples, int width, int height, int name) {
super(Type.COLOR, iFormat, samples, width, height, name);
}
}
/** Texture attachment */
public static class TextureAttachment extends Attachment implements Colorbuffer {
/** details of the texture setup */
public final int dataFormat, dataType, magFilter, minFilter, wrapS, wrapT;
/**
* @param type allowed types are [ {@link Type#COLOR_TEXTURE}, {@link Type#DEPTH_TEXTURE}, {@link Type#STENCIL_TEXTURE} ]
* @param iFormat
* @param width
* @param height
* @param dataFormat
* @param dataType
* @param magFilter
* @param minFilter
* @param wrapS
* @param wrapT
* @param name
*/
public TextureAttachment(Type type, int iFormat, int width, int height, int dataFormat, int dataType,
int magFilter, int minFilter, int wrapS, int wrapT, int name) {
super(validateType(type), iFormat, width, height, name);
this.dataFormat = dataFormat;
this.dataType = dataType;
this.magFilter = magFilter;
this.minFilter = minFilter;
this.wrapS = wrapS;
this.wrapT = wrapT;
}
private static Type validateType(Type type) {
switch(type) {
case COLOR_TEXTURE:
case DEPTH_TEXTURE:
case STENCIL_TEXTURE:
return type;
default:
throw new IllegalArgumentException("Invalid type: "+type);
}
}
/**
* Initializes the texture and set it's parameter, if uninitialized, i.e. name is <code>zero</code>.
* @throws GLException if texture generation and setup fails. The just created texture name will be deleted in this case.
*/
@Override
public boolean initialize(GL gl) throws GLException {
final boolean init = 0 == getName();
if( init ) {
checkPreGLError(gl);
final int[] name = new int[] { -1 };
gl.glGenTextures(1, name, 0);
if(0 == name[0]) {
throw new GLException("null texture, "+this);
}
setName(name[0]);
gl.glBindTexture(GL.GL_TEXTURE_2D, name[0]);
if( 0 < magFilter ) {
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, magFilter);
}
if( 0 < minFilter ) {
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, minFilter);
}
if( 0 < wrapS ) {
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, wrapS);
}
if( 0 < wrapT ) {
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, wrapT);
}
boolean preTexImage2D = true;
int glerr = gl.glGetError();
if(GL.GL_NO_ERROR == glerr) {
preTexImage2D = false;
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, format, getWidth(), getHeight(), 0, dataFormat, dataType, null);
glerr = gl.glGetError();
}
if(GL.GL_NO_ERROR != glerr) {
gl.glDeleteTextures(1, name, 0);
setName(0);
throw new GLException("GL Error "+toHexString(glerr)+" while creating (pre TexImage2D "+preTexImage2D+") "+this);
}
if(DEBUG) {
System.err.println("Attachment.init.X: "+this);
}
}
return init;
}
@Override
public void free(GL gl) {
final int[] name = new int[] { getName() };
if( 0 != name[0] ) {
if(DEBUG) {
System.err.println("Attachment.free.0: "+this);
}
gl.glDeleteTextures(1, name, 0);
setName(0);
}
}
@Override
public String toString() {
return getClass().getSimpleName()+"[type "+type+", target GL_TEXTURE_2D, level 0, format "+toHexString(format)+
", "+getWidth()+"x"+getHeight()+", border 0, dataFormat "+toHexString(dataFormat)+
", dataType "+toHexString(dataType)+
"; min/mag "+toHexString(minFilter)+"/"+toHexString(magFilter)+
", wrap S/T "+toHexString(wrapS)+"/"+toHexString(wrapT)+
"; name "+toHexString(getName())+", obj "+toHexString(objectHashCode())+"]";
}
}
static String toHexString(int v) {
return "0x"+Integer.toHexString(v);
}
/**
* Creates a color {@link TextureAttachment}, i.e. type {@link Type#COLOR_TEXTURE},
* selecting the texture data type and format automatically.
*
* <p>Using default min/mag filter {@link GL#GL_NEAREST} and default wrapS/wrapT {@link GL#GL_CLAMP_TO_EDGE}.</p>
*
* @param glp the chosen {@link GLProfile}
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @param width texture width
* @param height texture height
* @return the created and uninitialized color {@link TextureAttachment}
*/
public static final TextureAttachment createColorTextureAttachment(GLProfile glp, boolean alpha, int width, int height) {
return createColorTextureAttachment(glp, alpha, width, height, GL.GL_NEAREST, GL.GL_NEAREST, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE);
}
/**
* Creates a color {@link TextureAttachment}, i.e. type {@link Type#COLOR_TEXTURE},
* selecting the texture data type and format automatically.
*
* @param glp the chosen {@link GLProfile}
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @param width texture width
* @param height texture height
* @param magFilter if > 0 value for {@link GL#GL_TEXTURE_MAG_FILTER}
* @param minFilter if > 0 value for {@link GL#GL_TEXTURE_MIN_FILTER}
* @param wrapS if > 0 value for {@link GL#GL_TEXTURE_WRAP_S}
* @param wrapT if > 0 value for {@link GL#GL_TEXTURE_WRAP_T}
* @return the created and uninitialized color {@link TextureAttachment}
*/
public static final TextureAttachment createColorTextureAttachment(GLProfile glp, boolean alpha, int width, int height,
int magFilter, int minFilter, int wrapS, int wrapT) {
final int textureInternalFormat, textureDataFormat, textureDataType;
if(glp.isGLES()) {
textureInternalFormat = alpha ? GL.GL_RGBA : GL.GL_RGB;
textureDataFormat = alpha ? GL.GL_RGBA : GL.GL_RGB;
textureDataType = GL.GL_UNSIGNED_BYTE;
} else {
textureInternalFormat = alpha ? GL.GL_RGBA8 : GL.GL_RGB8;
// textureInternalFormat = alpha ? GL.GL_RGBA : GL.GL_RGB;
// textureInternalFormat = alpha ? 4 : 3;
textureDataFormat = alpha ? GL.GL_BGRA : GL.GL_RGB;
textureDataType = alpha ? GL2GL3.GL_UNSIGNED_INT_8_8_8_8_REV : GL.GL_UNSIGNED_BYTE;
}
return createColorTextureAttachment(textureInternalFormat, width, height, textureDataFormat, textureDataType, magFilter, minFilter, wrapS, wrapT);
}
/**
* Creates a color {@link TextureAttachment}, i.e. type {@link Type#COLOR_TEXTURE}.
*
* @param internalFormat internalFormat parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param width texture width
* @param height texture height
* @param dataFormat format parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param dataType type parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param magFilter if > 0 value for {@link GL#GL_TEXTURE_MAG_FILTER}
* @param minFilter if > 0 value for {@link GL#GL_TEXTURE_MIN_FILTER}
* @param wrapS if > 0 value for {@link GL#GL_TEXTURE_WRAP_S}
* @param wrapT if > 0 value for {@link GL#GL_TEXTURE_WRAP_T}
* @return the created and uninitialized color {@link TextureAttachment}
*/
public static final TextureAttachment createColorTextureAttachment(int internalFormat, int width, int height, int dataFormat, int dataType,
int magFilter, int minFilter, int wrapS, int wrapT) {
return new TextureAttachment(Type.COLOR_TEXTURE, internalFormat, width, height, dataFormat, dataType,
magFilter, minFilter, wrapS, wrapT, 0 /* name */);
}
private static boolean hasAlpha(int format) {
switch(format) {
case GL.GL_RGBA8:
case GL.GL_RGBA4:
case GL.GL_RGBA:
case GL.GL_BGRA:
case 4:
return true;
default:
return false;
}
}
private boolean initialized;
private boolean fullFBOSupport;
private boolean rgba8Avail;
private boolean depth24Avail;
private boolean depth32Avail;
private boolean stencil01Avail;
private boolean stencil04Avail;
private boolean stencil08Avail;
private boolean stencil16Avail;
private boolean packedDepthStencilAvail;
private int maxColorAttachments, maxSamples, maxTextureSize, maxRenderbufferSize;
private int width, height, samples;
private int vStatus;
private boolean ignoreStatus;
private int fbName;
private boolean bound;
private int colorAttachmentCount;
private Colorbuffer[] colorAttachmentPoints; // colorbuffer attachment points
private RenderAttachment depth, stencil; // depth and stencil maybe equal in case of packed-depth-stencil
private FBObject samplingSink; // MSAA sink
private TextureAttachment samplingSinkTexture;
private boolean samplingSinkDirty;
//
// ColorAttachment helper ..
//
private final void validateColorAttachmentPointRange(int point) {
if(!initialized) {
throw new GLException("FBO not initialized");
}
if(maxColorAttachments != colorAttachmentPoints.length) {
throw new InternalError("maxColorAttachments "+maxColorAttachments+", array.lenght "+colorAttachmentPoints);
}
if(0 > point || point >= maxColorAttachments) {
throw new IllegalArgumentException("attachment point out of range: "+point+", should be within [0.."+(maxColorAttachments-1)+"], "+this);
}
}
private final void validateAddColorAttachment(int point, Colorbuffer ca) {
validateColorAttachmentPointRange(point);
if( null != colorAttachmentPoints[point] ) {
throw new IllegalArgumentException("Cannot attach "+ca+", attachment point already in use by "+colorAttachmentPoints[point]+", "+this);
}
}
private final void addColorAttachment(int point, Colorbuffer ca) {
validateColorAttachmentPointRange(point);
final Colorbuffer c = colorAttachmentPoints[point];
if( null != c && c != ca ) {
throw new IllegalArgumentException("Add failed: requested to add "+ca+" at "+point+", but slot is holding "+c+"; "+this);
}
colorAttachmentPoints[point] = ca;
colorAttachmentCount++;
}
private final void removeColorAttachment(int point, Colorbuffer ca) {
validateColorAttachmentPointRange(point);
final Colorbuffer c = colorAttachmentPoints[point];
if( null != c && c != ca ) {
throw new IllegalArgumentException("Remove failed: requested to removed "+ca+" at "+point+", but slot is holding "+c+"; "+this);
}
colorAttachmentPoints[point] = null;
colorAttachmentCount--;
}
/**
* Return the {@link Colorbuffer} attachment at <code>attachmentPoint</code> if it is attached to this FBO, otherwise null.
*
* @see #attachColorbuffer(GL, boolean)
* @see #attachColorbuffer(GL, boolean)
* @see #attachTexture2D(GL, int, boolean, int, int, int, int)
* @see #attachTexture2D(GL, int, int, int, int, int, int, int, int)
*/
public final Colorbuffer getColorbuffer(int attachmentPoint) {
validateColorAttachmentPointRange(attachmentPoint);
return colorAttachmentPoints[attachmentPoint];
}
/**
* Finds the passed {@link Colorbuffer} within the valid range of attachment points
* using <i>reference</i> comparison only.
* <p>
* Note: Slow. Implementation uses a logN array search to save resources, i.e. not using a HashMap.
* </p>
* @param ca the {@link Colorbuffer} to look for.
* @return -1 if the {@link Colorbuffer} could not be found, otherwise [0..{@link #getMaxColorAttachments()}-1]
*/
public final int getColorbufferAttachmentPoint(Colorbuffer ca) {
for(int i=0; i<colorAttachmentPoints.length; i++) {
if( colorAttachmentPoints[i] == ca ) {
return i;
}
}
return -1;
}
/**
* Returns the passed {@link Colorbuffer} if it is attached to this FBO, otherwise null.
* Implementation compares the <i>reference</i> only.
*
* <p>
* Note: Slow. Uses {@link #getColorbufferAttachmentPoint(Colorbuffer)} to determine it's attachment point
* to be used for {@link #getColorbuffer(int)}
* </p>
*
* @see #attachColorbuffer(GL, boolean)
* @see #attachColorbuffer(GL, boolean)
* @see #attachTexture2D(GL, int, boolean, int, int, int, int)
* @see #attachTexture2D(GL, int, int, int, int, int, int, int, int)
*/
public final Colorbuffer getColorbuffer(Colorbuffer ca) {
final int p = getColorbufferAttachmentPoint(ca);
return p>=0 ? getColorbuffer(p) : null;
}
/**
* Creates an uninitialized FBObject instance.
* <p>
* Call {@link #init(GL, int, int, int)} .. etc to use it.
* </p>
*/
public FBObject() {
this.initialized = false;
// TBD @ init
this.fullFBOSupport = false;
this.rgba8Avail = false;
this.depth24Avail = false;
this.depth32Avail = false;
this.stencil01Avail = false;
this.stencil04Avail = false;
this.stencil08Avail = false;
this.stencil16Avail = false;
this.packedDepthStencilAvail = false;
this.maxColorAttachments=-1;
this.maxSamples=-1;
this.maxTextureSize = 0;
this.maxRenderbufferSize = 0;
this.width = 0;
this.height = 0;
this.samples = 0;
this.vStatus = -1;
this.ignoreStatus = false;
this.fbName = 0;
this.bound = false;
this.colorAttachmentPoints = null; // at init ..
this.colorAttachmentCount = 0;
this.depth = null;
this.stencil = null;
this.samplingSink = null;
this.samplingSinkTexture = null;
this.samplingSinkDirty = true;
}
private void init(GL gl, int width, int height, int samples) throws GLException {
if(initialized) {
throw new GLException("FBO already initialized");
}
if( !gl.hasBasicFBOSupport() ) {
throw new GLException("FBO not supported w/ context: "+gl.getContext()+", "+this);
}
fullFBOSupport = gl.hasFullFBOSupport();
rgba8Avail = gl.isGL2GL3() || gl.isExtensionAvailable(GLExtensions.OES_rgb8_rgba8);
depth24Avail = fullFBOSupport || gl.isExtensionAvailable(GLExtensions.OES_depth24);
depth32Avail = fullFBOSupport || gl.isExtensionAvailable(GLExtensions.OES_depth32);
stencil01Avail = fullFBOSupport || gl.isExtensionAvailable(GLExtensions.OES_stencil1);
stencil04Avail = fullFBOSupport || gl.isExtensionAvailable(GLExtensions.OES_stencil4);
stencil08Avail = fullFBOSupport || gl.isExtensionAvailable(GLExtensions.OES_stencil8);
stencil16Avail = fullFBOSupport;
packedDepthStencilAvail = fullFBOSupport ||
gl.isExtensionAvailable(GLExtensions.OES_packed_depth_stencil) ||
gl.isExtensionAvailable(GLExtensions.EXT_packed_depth_stencil) ;
final boolean NV_fbo_color_attachments = gl.isExtensionAvailable(GLExtensions.NV_fbo_color_attachments);
int val[] = new int[1];
checkPreGLError(gl);
int realMaxColorAttachments = 1;
maxColorAttachments = 1;
if( fullFBOSupport || NV_fbo_color_attachments ) {
try {
val[0] = 0;
gl.glGetIntegerv(GL2ES2.GL_MAX_COLOR_ATTACHMENTS, val, 0);
realMaxColorAttachments = 1 <= val[0] ? val[0] : 1; // cap minimum to 1
} catch (GLException gle) { gle.printStackTrace(); }
}
maxColorAttachments = realMaxColorAttachments <= 8 ? realMaxColorAttachments : 8; // cap to limit array size
colorAttachmentPoints = new Colorbuffer[maxColorAttachments];
colorAttachmentCount = 0;
maxSamples = gl.getMaxRenderbufferSamples();
gl.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, val, 0);
maxTextureSize = val[0];
gl.glGetIntegerv(GL.GL_MAX_RENDERBUFFER_SIZE, val, 0);
maxRenderbufferSize = val[0];
checkPreGLError(gl);
if( 0 >= width ) { width = 1; }
if( 0 >= height ) { height = 1; }
this.width = width;
this.height = height;
this.samples = samples <= maxSamples ? samples : maxSamples;
if(DEBUG) {
System.err.println("FBObject "+width+"x"+height+", "+samples+" -> "+this.samples+" samples");
System.err.println("fullFBOSupport: "+fullFBOSupport);
System.err.println("maxColorAttachments: "+maxColorAttachments+"/"+realMaxColorAttachments+" [capped/real]");
System.err.println("maxSamples: "+maxSamples);
System.err.println("maxTextureSize: "+maxTextureSize);
System.err.println("maxRenderbufferSize: "+maxRenderbufferSize);
System.err.println("rgba8: "+rgba8Avail);
System.err.println("depth24: "+depth24Avail);
System.err.println("depth32: "+depth32Avail);
System.err.println("stencil01: "+stencil01Avail);
System.err.println("stencil04: "+stencil04Avail);
System.err.println("stencil08: "+stencil08Avail);
System.err.println("stencil16: "+stencil16Avail);
System.err.println("packedDepthStencil: "+packedDepthStencilAvail);
System.err.println("NV_fbo_color_attachments: "+NV_fbo_color_attachments);
System.err.println(gl.getContext().getGLVersion());
System.err.println(JoglVersion.getGLStrings(gl, null).toString());
System.err.println(gl.getContext());
}
checkNoError(null, gl.glGetError(), "FBObject Init.pre"); // throws GLException if error
if(width > 2 + maxTextureSize || height> 2 + maxTextureSize ||
width > maxRenderbufferSize || height> maxRenderbufferSize ) {
throw new GLException("size "+width+"x"+height+" exceeds on of the maxima [texture "+maxTextureSize+", renderbuffer "+maxRenderbufferSize+"]");
}
resetSamplingSink(gl);
// generate fbo ..
gl.glGenFramebuffers(1, val, 0);
fbName = val[0];
if(0 == fbName) {
throw new GLException("null framebuffer");
}
// bind fbo ..
gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, fbName);
checkNoError(gl, gl.glGetError(), "FBObject Init.bindFB"); // throws GLException if error
if(!gl.glIsFramebuffer(fbName)) {
checkNoError(gl, GL.GL_INVALID_VALUE, "FBObject Init.isFB"); // throws GLException
}
bound = true;
samplingSinkDirty = true;
initialized = true;
vStatus = GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; // always incomplete w/o attachments!
if(DEBUG) {
System.err.println("FBObject.init(): "+this);
}
}
/**
* Initializes or resets this FBO's instance.
* <p>
* In case the new parameters are compatible with the current ones
* no action will be performed. Otherwise all attachments will be recreated
* to match the new given parameters.
* </p>
* <p>
* Incompatibility and hence recreation is forced if
* the size or sample count doesn't match for subsequent calls.
* </p>
*
* <p>Leaves the FBO bound state untouched</p>
*
* @param gl the current GL context
* @param newWidth
* @param newHeight
* @throws GLException in case of an error
*/
public final void reset(GL gl, int newWidth, int newHeight) {
reset(gl, newWidth, newHeight, 0, false);
}
/**
* Initializes or resets this FBO's instance.
* <p>
* In case the new parameters are compatible with the current ones
* no action will be performed. Otherwise all attachments will be recreated
* to match the new given parameters.
* </p>
* <p>
* Currently incompatibility and hence recreation of the attachments will be performed
* if the size or sample count doesn't match for subsequent calls.
* </p>
*
* <p>Leaves the FBO bound state untouched</p>
*
* @param gl the current GL context
* @param newWidth the new width, it's minimum is capped to 1
* @param newHeight the new height, it's minimum is capped to 1
* @param newSamples if > 0, MSAA will be used, otherwise no multisampling. Will be capped to {@link #getMaxSamples()}.
* @param resetSamplingSink <code>true</code> calls {@link #resetSamplingSink(GL)} immediatly.
* <code>false</code> postpones resetting the sampling sink until {@link #use(GL, TextureAttachment)} or {@link #syncSamplingSink(GL)},
* allowing to use the samples sink's FBO and texture until then. The latter is useful to benefit
* from implicit double buffering while resetting the sink just before it's being used, eg. at swap-buffer.
*
* @throws GLException in case of an error, i.e. size too big, etc ..
*/
public final void reset(GL gl, int newWidth, int newHeight, int newSamples, boolean resetSamplingSink) {
if( !initialized ) {
init(gl, newWidth, newHeight, newSamples);
return;
}
newSamples = newSamples <= maxSamples ? newSamples : maxSamples; // clamp
if( newWidth != width || newHeight != height || newSamples != samples ) {
if( 0 >= newWidth ) { newWidth = 1; }
if( 0 >= newHeight ) { newHeight = 1; }
if( newWidth > 2 + maxTextureSize || newHeight > 2 + maxTextureSize ||
newWidth > maxRenderbufferSize || newHeight > maxRenderbufferSize ) {
throw new GLException("size "+width+"x"+height+" exceeds on of the maxima [texture "+maxTextureSize+", renderbuffer "+maxRenderbufferSize+"]");
}
if(DEBUG) {
System.err.println("FBObject.reset - START - "+width+"x"+height+", "+samples+" -> "+newWidth+"x"+newHeight+", "+newSamples+"; "+this);
}
final boolean wasBound = isBound();
width = newWidth;
height = newHeight;
samples = newSamples;
if(0 < samples && null == samplingSink ) {
// needs valid samplingSink for detach*() -> bind()
samplingSink = new FBObject();
samplingSink.init(gl, width, height, 0);
}
detachAllImpl(gl, true , true);
if(resetSamplingSink) {
resetSamplingSink(gl);
}
samplingSinkDirty = true;
if(!wasBound) {
unbind(gl);
}
if(DEBUG) {
System.err.println("FBObject.reset - END - "+this);
}
}
}
/**
* Writes the internal format of the attachments to the given GLCapabilities object.
* @param caps the destination for format bits
*/
public final void formatToGLCapabilities(GLCapabilities caps) {
caps.setSampleBuffers(samples > 0);
caps.setNumSamples(samples);
caps.setDepthBits(0);
caps.setStencilBits(0);
final Colorbuffer cb = samples > 0 ? getSamplingSink() : getColorbuffer(0);
if(null != cb) {
cb.formatToGLCapabilities(caps, rgba8Avail);
}
if(null != depth) {
depth.formatToGLCapabilities(caps, rgba8Avail);
}
if(null != stencil && stencil != depth) {
stencil.formatToGLCapabilities(caps, rgba8Avail);
}
}
/**
* Note that the status may reflect an incomplete state during transition of attachments.
* @return The FB status. {@link GL.GL_FRAMEBUFFER_COMPLETE} if ok, otherwise return GL FBO error state or -1
* @see #validateStatus()
*/
public final int getStatus() {
return vStatus;
}
/** return the {@link #getStatus()} as a string. */
public final String getStatusString() {
return getStatusString(vStatus);
}
public static final String getStatusString(int fbStatus) {
switch(fbStatus) {
case -1:
return "NOT A FBO";
case GL.GL_FRAMEBUFFER_COMPLETE:
return "OK";
case GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return("FBO incomplete attachment\n");
case GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return("FBO missing attachment");
case GL.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
return("FBO attached images must have same dimensions");
case GL.GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
return("FBO attached images must have same format");
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
return("FBO missing draw buffer");
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
return("FBO missing read buffer");
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
return("FBO missing multisample buffer");
case GL3.GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
return("FBO missing layer targets");
case GL.GL_FRAMEBUFFER_UNSUPPORTED:
return("Unsupported FBO format");
case GL2GL3.GL_FRAMEBUFFER_UNDEFINED:
return("FBO undefined");
case 0:
return("FBO implementation fault");
default:
return("FBO incomplete, implementation ERROR "+toHexString(fbStatus));
}
}
/**
* The status may even be valid if incomplete during transition of attachments.
* @see #getStatus()
*/
public final boolean isStatusValid() {
switch(vStatus) {
case GL.GL_FRAMEBUFFER_COMPLETE:
return true;
case GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
case GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
case GL.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
case GL.GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
case GL2GL3.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
case GL3.GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
if(0 == colorAttachmentCount || null == depth) {
// we are in transition
return true;
}
case GL.GL_FRAMEBUFFER_UNSUPPORTED:
case GL2GL3.GL_FRAMEBUFFER_UNDEFINED:
case 0:
default:
if(DEBUG) {
System.err.println("Framebuffer " + fbName + " is incomplete, status = " + toHexString(vStatus) +
" : " + getStatusString(vStatus));
}
return false;
}
}
private static int checkPreGLError(GL gl) {
int glerr = gl.glGetError();
if(DEBUG && GL.GL_NO_ERROR != glerr) {
System.err.println("Pre-existing GL error: "+toHexString(glerr));
Thread.dumpStack();
}
return glerr;
}
private final boolean checkNoError(GL gl, int err, String exceptionMessage) throws GLException {
if(GL.GL_NO_ERROR != err) {
if(null != gl) {
destroy(gl);
}
if(null != exceptionMessage) {
throw new GLException(exceptionMessage+" GL Error "+toHexString(err)+" of "+this.toString());
}
return false;
}
return true;
}
private final void checkInitialized() throws GLException {
if(!initialized) {
throw new GLException("FBO not initialized, call init(GL) first.");
}
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link TextureAttachment}, to this FBO's instance at the given attachment point,
* selecting the texture data type and format automatically.
*
* <p>Using default min/mag filter {@link GL#GL_NEAREST} and default wrapS/wrapT {@link GL#GL_CLAMP_TO_EDGE}.</p>
*
* <p>Leaves the FBO bound.</p>
*
* @param gl the current GL context
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @return TextureAttachment instance describing the new attached texture colorbuffer if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the texture colorbuffer couldn't be allocated or MSAA has been chosen
* @see #createColorTextureAttachment(GLProfile, boolean, int, int)
*/
public final TextureAttachment attachTexture2D(GL gl, int attachmentPoint, boolean alpha) throws GLException {
return (TextureAttachment)attachColorbuffer(gl, attachmentPoint,
createColorTextureAttachment(gl.getGLProfile(), alpha, width, height));
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link TextureAttachment}, to this FBO's instance at the given attachment point,
* selecting the texture data type and format automatically.
*
* <p>Leaves the FBO bound.</p>
*
* @param gl the current GL context
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @param magFilter if > 0 value for {@link GL#GL_TEXTURE_MAG_FILTER}
* @param minFilter if > 0 value for {@link GL#GL_TEXTURE_MIN_FILTER}
* @param wrapS if > 0 value for {@link GL#GL_TEXTURE_WRAP_S}
* @param wrapT if > 0 value for {@link GL#GL_TEXTURE_WRAP_T}
* @return TextureAttachment instance describing the new attached texture colorbuffer if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the texture colorbuffer couldn't be allocated or MSAA has been chosen
* @see #createColorTextureAttachment(GLProfile, boolean, int, int, int, int, int, int)
*/
public final TextureAttachment attachTexture2D(GL gl, int attachmentPoint, boolean alpha, int magFilter, int minFilter, int wrapS, int wrapT) throws GLException {
return (TextureAttachment)attachColorbuffer(gl, attachmentPoint,
createColorTextureAttachment(gl.getGLProfile(), alpha, width, height, magFilter, minFilter, wrapS, wrapT));
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link TextureAttachment}, to this FBO's instance at the given attachment point.
*
* <p>Leaves the FBO bound.</p>
*
* @param gl the current GL context
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param internalFormat internalFormat parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param dataFormat format parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param dataType type parameter to {@link GL#glTexImage2D(int, int, int, int, int, int, int, int, long)}
* @param magFilter if > 0 value for {@link GL#GL_TEXTURE_MAG_FILTER}
* @param minFilter if > 0 value for {@link GL#GL_TEXTURE_MIN_FILTER}
* @param wrapS if > 0 value for {@link GL#GL_TEXTURE_WRAP_S}
* @param wrapT if > 0 value for {@link GL#GL_TEXTURE_WRAP_T}
* @return TextureAttachment instance describing the new attached texture colorbuffer if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the texture colorbuffer couldn't be allocated or MSAA has been chosen
* @see #createColorTextureAttachment(int, int, int, int, int, int, int, int, int)
*/
public final TextureAttachment attachTexture2D(GL gl, int attachmentPoint,
int internalFormat, int dataFormat, int dataType,
int magFilter, int minFilter, int wrapS, int wrapT) throws GLException {
return (TextureAttachment)attachColorbuffer(gl, attachmentPoint,
createColorTextureAttachment(internalFormat, width, height, dataFormat, dataType, magFilter, minFilter, wrapS, wrapT));
}
/**
* Creates a {@link ColorAttachment}, selecting the format automatically.
*
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @return uninitialized ColorAttachment instance describing the new attached colorbuffer
*/
public final ColorAttachment createColorAttachment(boolean alpha) {
final int internalFormat;
if( rgba8Avail ) {
internalFormat = alpha ? GL.GL_RGBA8 : GL.GL_RGB8 ;
} else {
internalFormat = alpha ? GL.GL_RGBA4 : GL.GL_RGB565;
}
return new ColorAttachment(internalFormat, samples, width, height, 0);
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link ColorAttachment}, to this FBO's instance at the given attachment point,
* selecting the format automatically.
*
* <p>Leaves the FBO bound.</p>
*
* @param gl the current GL context
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param alpha set to <code>true</code> if you request alpha channel, otherwise <code>false</code>;
* @return ColorAttachment instance describing the new attached colorbuffer if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the colorbuffer couldn't be allocated
* @see #createColorAttachment(boolean)
*/
public final ColorAttachment attachColorbuffer(GL gl, int attachmentPoint, boolean alpha) throws GLException {
return (ColorAttachment) attachColorbuffer(gl, attachmentPoint, createColorAttachment(alpha));
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link ColorAttachment}, to this FBO's instance at the given attachment point.
*
* <p>Leaves the FBO bound.</p>
*
* @param gl the current GL context
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param internalFormat usually {@link GL#GL_RGBA4}, {@link GL#GL_RGB5_A1}, {@link GL#GL_RGB565}, {@link GL#GL_RGB8} or {@link GL#GL_RGBA8}
* @return ColorAttachment instance describing the new attached colorbuffer if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the colorbuffer couldn't be allocated
* @throws IllegalArgumentException if <code>internalFormat</code> doesn't reflect a colorbuffer
*/
public final ColorAttachment attachColorbuffer(GL gl, int attachmentPoint, int internalFormat) throws GLException, IllegalArgumentException {
final Attachment.Type atype = Attachment.Type.determine(internalFormat);
if( Attachment.Type.COLOR != atype ) {
throw new IllegalArgumentException("colorformat invalid: "+toHexString(internalFormat)+", "+this);
}
return (ColorAttachment) attachColorbuffer(gl, attachmentPoint, new ColorAttachment(internalFormat, samples, width, height, 0));
}
/**
* Attaches a {@link Colorbuffer}, i.e. {@link ColorAttachment} or {@link TextureAttachment},
* to this FBO's instance at the given attachment point.
*
* <p>
* If {@link Colorbuffer} is a {@link TextureAttachment} and is uninitialized, i.e. it's texture name is <code>zero</code>,
* a new texture name is generated and setup w/ the texture parameter.<br/>
* Otherwise, i.e. texture name is not <code>zero</code>, the passed TextureAttachment <code>texA</code> is
* considered complete and assumed matching this FBO requirement. A GL error may occur is the latter is untrue.
* </p>
*
* <p>Leaves the FBO bound.</p>
*
* @param gl
* @param attachmentPoint the color attachment point ranging from [0..{@link #getMaxColorAttachments()}-1]
* @param colbuf the to be attached {@link Colorbuffer}
* @return newly attached {@link Colorbuffer} instance if bound and configured successfully, otherwise GLException is thrown
* @throws GLException in case the colorbuffer couldn't be allocated or MSAA has been chosen in case of a {@link TextureAttachment}
*/
public final Colorbuffer attachColorbuffer(GL gl, int attachmentPoint, Colorbuffer colbuf) throws GLException {
bind(gl);
return attachColorbufferImpl(gl, attachmentPoint, colbuf);
}
private final Colorbuffer attachColorbufferImpl(GL gl, int attachmentPoint, Colorbuffer colbuf) throws GLException {
validateAddColorAttachment(attachmentPoint, colbuf);
final boolean initializedColorbuf = colbuf.initialize(gl);
addColorAttachment(attachmentPoint, colbuf);
if(colbuf instanceof TextureAttachment) {
final TextureAttachment texA = (TextureAttachment) colbuf;
if(samples>0) {
removeColorAttachment(attachmentPoint, texA);
if(initializedColorbuf) {
texA.free(gl);
}
throw new GLException("Texture2D not supported w/ MSAA. If you have enabled MSAA with exisiting texture attachments, you may want to detach them via detachAllTexturebuffer(gl).");
}
// Set up the color buffer for use as a renderable texture:
gl.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
GL.GL_COLOR_ATTACHMENT0 + attachmentPoint,
GL.GL_TEXTURE_2D, texA.getName(), 0);
if(!ignoreStatus) {
updateStatus(gl);
if(!isStatusValid()) {
detachColorbuffer(gl, attachmentPoint, true);
throw new GLException("attachTexture2D "+texA+" at "+attachmentPoint+" failed "+getStatusString()+", "+this);
}
}
} else if(colbuf instanceof ColorAttachment) {
final ColorAttachment colA = (ColorAttachment) colbuf;
// Attach the color buffer
gl.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
GL.GL_COLOR_ATTACHMENT0 + attachmentPoint,