/*
Copyright (c) 2009-2010, Dirk Krause
All rights reserved.
Redistribution and use in source and binary forms,
with or without modification, are permitted provided
that the following conditions are met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the above
opyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials
provided with the distribution.
* Neither the name of the Dirk Krause nor 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 BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "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 THE COPYRIGHT OWNER 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.
*/
$*
Java output module.
$*
/** @file dkfigjav.c Java output driver module. */
/** Inside the dkfigjav module.
*/
#define DKFIGJAV_C 1
#include "fig2vect.h"
#include "dkfig.h"
#include "dktools-version.h"
$(trace-include)
/** Abbreviation.
*/
#define OI dkfig_java_output_instruction
/** Very small value used in comparisons.
*/
static double epsilon = 0.000001;
/** Names of packages to import.
*/
static char *packages_to_import[] = {
"java.awt.Font",
"java.awt.FontMetrics",
"java.awt.Color",
"java.awt.Graphics",
"java.awt.Graphics2D",
"java.awt.BasicStroke",
"java.awt.geom.GeneralPath",
"java.awt.geom.Rectangle2D",
"java.awt.geom.RoundRectangle2D",
"java.awt.geom.Ellipse2D",
"java.awt.geom.Arc2D",
"java.awt.print.Printable",
"java.awt.print.PageFormat",
"java.awt.Image",
"java.awt.image.ImageObserver",
"java.awt.image.BufferedImage",
"java.net.URL",
"java.io.InputStream",
"java.io.FileInputStream",
"javax.imageio.ImageIO",
NULL
};
/** Keywords for output.
*/
static char *kw[] = {
/* 0 */ "\n",
/* 1 */ " ",
/* 2 */ "{",
/* 3 */ "}",
/* 4 */ ".",
/* 5 */ ",",
/* 6 */ "public class",
/* 7 */ "implements Printable",
/* 8 */ "FigPrintable",
/* 9 */ "import",
/* 10 */ ";",
/* 11 */ "// Created by fig2vect.",
/* 12 */ "// See http://dktools.sourceforge.net/fig2vect.html",
/* 13 */ "/** Printable created from Fig drawing. */",
/* 14 */ "java",
/* 15 */ " /** Image width. */",
/* 16 */ " public static final double w = ",
/* 17 */ " /** Image height. */",
/* 18 */ " public static final double h = ",
/* 19 */ " /** Color ",
/* 20 */ ". */",
/* 21 */ " private Color c",
/* 22 */ " = null;",
/* 23 */ " /** Font ",
/* 24 */ " private Font f",
/* 25 */ " /** Stroke ",
/* 26 */ " private BasicStroke l",
/* 27 */ " /** Image ",
/* 28 */ " private Image i",
/* 29 */ " c",
/* 30 */ " = new Color(",
/* 31 */ ");",
/* 32 */ ".0",
/* 33 */ " try {",
/* 34 */ " } catch(Exception e) { back = false; e.printStackTrace(); }",
/* 35 */ " f",
/* 36 */ " = findFont(",
/* 37 */ " /** Font file names. */",
/* 38 */ " public static final String[][] n = {",
/* 39 */ " };",
/* 40 */ " {",
/* 41 */ " }",
/* 42 */ "//",
/* 43 */ " /** Logical names for fonts. */",
/* 44 */ " public static final String[][] l = {",
/* 45 */ " ",
/* 46 */ "\"",
/* 47 */ ".pfb",
/* 48 */ "n",
/* 49 */ "l",
/* 50 */ "[",
/* 51 */ "]",
/* 52 */ "Font.SERIF",
/* 53 */ "Font.SANS_SERIF",
/* 54 */ "Font.MONOSPACED",
/* 55 */ "Font.PLAIN",
/* 56 */ "Font.BOLD",
/* 57 */ "Font.ITALIC",
/* 58 */ "(Font.BOLD | Font.ITALIC)",
/* 59 */ " l",
/* 60 */ " = new BasicStroke(",
/* 61 */ "f",
/* 62 */ "BasicStroke.CAP_BUTT",
/* 63 */ "BasicStroke.CAP_ROUND",
/* 64 */ "BasicStroke.CAP_SQUARE",
/* 65 */ "BasicStroke.JOIN_ROUND",
/* 66 */ "BasicStroke.JOIN_BEVEL",
/* 67 */ "BasicStroke.JOIN_MITER",
/* 68 */ "\n new float[]{",
/* 69 */ "LANG",
/* 70 */ "UTF-8",
/* 71 */ "/ui/lang",
/* 72 */ " /** Search strings. */",
/* 73 */ " public static final String[] s1 = {",
/* 74 */ " /** Print Strings. */",
/* 75 */ " private String[] s2 = {",
/* 76 */ " ",
/* 77 */ "/* ",
/* 78 */ " */ ",
/* 79 */ "\"",
/* 80 */ " i",
/* 81 */ " = findImage(\"",
/* 82 */ "\\\"",
/* 83 */ "\\\\",
/* 84 */ " FontMetrics m",
/* 85 */ " = g.getFontMetrics(f",
/* 86 */ " {",
/* 87 */ " }",
/* 88 */ " Graphics2D g2 = (Graphics2D)(g.create());",
/* 89 */ " ",
/* 90 */ "g",
/* 91 */ "2",
/* 92 */ ".setFont(f",
/* 93 */ ".setColor(c",
/* 94 */ "placeText(g",
/* 95 */ "s2",
/* 96 */ "m",
/* 97 */ "ALIGN_H_LEFT",
/* 98 */ "ALIGN_H_CENTERED",
/* 99 */ "ALIGN_H_RIGHT",
/* 100 */ "g2.rotate(",
/* 101 */ "g2.translate(",
/* 102 */ "package ",
/* 103 */ "g.fill(p);",
/* 104 */ "g2.fill(p);",
/* 105 */ "g.draw(p);",
/* 106 */ "g2.draw(p);",
/* 107 */ "Rectangle2D.Double p = new Rectangle2D.Double(",
/* 108 */ "RoundRectangle2D.Double p = new RoundRectangle2D.Double(",
/* 109 */ "GeneralPath p = new GeneralPath();",
/* 110 */ "p.moveTo(",
/* 111 */ "p.lineTo(",
/* 112 */ "p.closePath();",
/* 113 */ ".setStroke(l",
/* 114 */ "Ellipse2D.Double p = new Ellipse2D.Double(",
/* 115 */ "GeneralPath ahf = new GeneralPath();",
/* 116 */ "GeneralPath ahb = new GeneralPath();",
/* 117 */ "ahf",
/* 118 */ "ahb",
/* 119 */ ".moveTo(",
/* 120 */ ".lineTo(",
/* 121 */ ".closePath();",
/* 122 */ "g.setColor(Color.WHITE);",
/* 123 */ ".fill(",
/* 124 */ ".draw(",
/* 125 */ "p.curveTo(",
/* 126 */ "Arc2D.Double p = new Arc2D.Double(",
/* 127 */ "Arc2D.OPEN",
/* 128 */ "Arc2D.PIE",
/* 129 */ " ",
/* 130 */ "ALIGN_V_CENTERED",
/* 131 */ "ALIGN_V_TOP",
/* 132 */ "ALIGN_V_BOTTOM",
/* 133 */ "placeImage(g, ",
/* 134 */ "i",
/* 135 */
"// RESOURCES NEEDED BY THIS MODULE (should be packaged into the jar archive):",
/* 136 */
"// --------------------------------------------------------------------------",
/* 137 */ "// Font ",
/* 138 */ ":",
/* 139 */ " = ",
/* 140 */ ", ",
/* 141 */ "// Image ",
/* 142 */ "/",
/* 143 */ "http://",
/* 144 */ "0",
/* 145 */ "private boolean[] se = {",
/* 146 */ "/** Flags: String enabled. */",
/* 147 */ "true",
/* 148 */ " if(se[",
/* 149 */ "]) { ",
/* 150 */ "/** String layers. */",
/* 151 */ "private int[] sl = {",
/* 152 */ "private LayerInfo[] la = {",
/* 153 */ "null",
/* 154 */ "/** Layer bounding box information. */",
/* 155 */ "new LayerInfo(",
/* 156 */ ")",
/* 157 */ "// ",
/* 158 */ "// ",
/* 159 */ "// ",
/* 160 */ "// ",
/* 161 */ "// ",
/* 162 */ "// ",
/* 163 */ " /** Horizontal alignment of the graphics on the page. */",
/* 164 */ " private int alignH = ",
/* 165 */ " /** Vertical alignment of the graphics on the page. */",
/* 166 */ " private int alignV = ",
/* 167 */ "// ",
/* 168 */ "import dirk_krause.tools.DkTool;",
/* 169 */ "import dirk_krause.wstools.DkTool;",
/* 170 */ "public ",
/* 171 */ "(DkTool d)",
/* 172 */ " = dkt.findBufferedImage(this, \"",
/* 173 */ " = dkt.findFont(this, ",
/* 174 */ "utf8",
};
/** Documentation header for a class definition.
*/
static char *class_docu_1[] = {
"/**\n",
" * Drawing class.\n",
" * This file was generated automatically from a Fig file\n",
" * (created by XFig, jFig, WinFig or others) using the\n",
" * fig2vect " VERSNUMB " program. See\n",
" * http://dktools.sourceforge.net/fig2vect.html\n",
" * for more information about fig2vect.\n",
" *\n",
" * Be carefully when applying changes to this file,\n",
" * your changes may be lost if fig2vect is run again.\n",
" *\n",
NULL
};
/** Comment for additional font/image directories.
*/
static char *class_docu_2[] = {
" * If you want to specify additional locations for font\n",
" * and image search, use the addFontBase() and\n",
" * addImageBase() functions. You can specify \"http://\"\n",
" * and \"file://\" locations. When using this class in a\n",
" * webstart application use \"http://\" URLs only, not\n",
" * \"file://\", webstart applications are not allowed to access\n",
" * local files.\n",
" *\n",
" * If you use the same code for both an application and a\n",
" * webstart application use setRunAsJnlp() to inform the object\n",
" * that it is running in a webstart application. If the JNLP\n",
" * flag is turned on the object skips \"file://\" locations\n",
" * in font and image search.\n",
" *\n",
" * If you use one of the addFontBase(), addImageBase() or\n",
" * setRunAsJnlp() functions call these functions before you\n",
" * use initialize() and pass the object to a print service.\n",
NULL
};
/** And a newline.
*/
static char *class_docu_3[] = {
" */\n",
NULL
};
/** Section containing the variables of the Java class.
*/
static char *member_variables_1[] = {
"\n",
"// \n",
"\n",
" /** Information about used ranges in layers. */\n",
" class LayerInfo {\n",
" /** Layer number. */\n",
" protected int ln;\n",
" \n",
" /** Minimum x value. */\n",
" protected double xmin;\n",
" \n",
" /** Maximum x value. */\n",
" protected double xmax;\n",
" \n",
" /** Minimum y value. */\n",
" protected double ymin;\n",
" \n",
" /** Maximum y value. */\n",
" protected double ymax;\n",
" \n",
" /**\n",
" * Constructor.\n",
" * @param l Layer number.\n",
" * @param x0 Minimum x value.\n",
" * @param x1 Maximum x value.\n",
" * @param y0 Minimum y value.\n",
" * @param y1 Maximum y value.\n",
" */\n",
" public LayerInfo(\n",
" int l,\n",
" double x0, double x1, double y0, double y1\n",
" )\n",
" {\n",
" ln = l; xmin = x0; xmax = x1; ymin = y0; ymax = y1;\n",
" }\n",
"\n",
" /**\n",
" * Get used rectangle on layer.\n",
" * @return Rectangle for used range on layer.\n",
" */\n",
" public Rectangle2D.Double getRectangle()\n",
" {\n",
" Rectangle2D.Double back;\n",
" back = new Rectangle2D.Double(\n",
" xmin, ymin, (xmax - xmin), (ymax - ymin)\n",
" );\n",
" return back;\n",
" }\n",
" \n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /** Error code: Page too small. */\n",
" public static final int ERROR_PAGE_TOO_SMALL = 1;\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /** Horizontal align: left. */\n",
" public static final int ALIGN_H_LEFT = 0;\n",
"\n",
" /** Horizontal align: centered. */\n",
" public static final int ALIGN_H_CENTERED = 1;\n",
"\n",
" /** Horizontal align: right. */\n",
" public static final int ALIGN_H_RIGHT = 2;\n",
"\n",
" /** Vertical align: top. */\n",
" public static final int ALIGN_V_TOP = 0;\n",
"\n",
" /** Vertical align: centered. */\n",
" public static final int ALIGN_V_CENTERED = 1;\n",
"\n",
" /** Vertical align: bottom. */\n",
" public static final int ALIGN_V_BOTTOM = 2;\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /** Flag: The structure is completely initialized. */\n",
" private boolean is_initialized = false;\n",
" \n",
" /** Flag: Initialization was already attempted. */\n",
" private boolean initialization_attempted = false;\n",
"\n",
" /** Border at the left page side. */\n",
" private double leftBorder = 0.0;\n",
"\n",
" /** Border at the top side. */\n",
" private double topBorder = 0.0;\n",
"\n",
" /** Last error occured. */\n",
" private int errorCode = 0;\n",
"\n",
NULL
};
/** Font and images base directory.
*/
static char *member_variables_2a[] = {
" /** Resource directories for fonts. */\n",
" private String[] fontBases = null;\n",
"\n",
" /** Resource directories for images. */\n",
" private String[] imageBases = null;\n",
"\n",
" /** Flag: Running as applet or webstart application (no file://). */\n",
" private boolean isJnlp = false;\n",
"\n",
NULL
};
/** The DkTool object.
*/
static char *member_variables_2b[] = {
" /** General tool. */\n",
" private DkTool dkt = null;\n",
"\n",
NULL
};
/** Finish editor fold.
*/
static char *member_variables_3[] = {
"// \n",
"\n\n\n",
NULL
};
/** Section containing the member functions of the Java class.
*/
static char *member_functions_1[] = {
"// \n",
"\n",
" /**\n",
" * Attempt to find a font\n",
" * @param ffn Array of font file name suggestions to search for.\n",
" * @param fn Array of font family names to use.\n",
" * @param fb Fallback font, ie Font.SERIF.\n",
" * @param fe Font features (bold, italic).\n",
" * @param fs Font size.\n",
" * @return Font reference or null.\n",
" */\n",
" private Font findFont(String[] ffn, String[] fn, String fb, int fe, float fs)\n",
" {\n",
" Font back = null;\n",
" InputStream is = null;\n",
" Font xf = null;\n",
" int i;\n",
" String[] fbas = null;\n",
" boolean jnlp = false;\n",
" synchronized(this) { fbas = fontBases; jnlp = isJnlp; }\n",
" if(ffn != null) {\n",
" for(i = 0; ((i < ffn.length) && (back == null)); i++) {\n",
" if(ffn[i] != null) {\n",
" is = null;\n",
" xf = null;\n",
" int ft = Font.TYPE1_FONT;\n",
" if((ffn[i].endsWith(\".ttf\")) || (ffn[i].endsWith(\".TTF\"))) {\n",
" ft = Font.TRUETYPE_FONT;\n",
" }\n",
" if(ffn[i].startsWith(\"http://\")) {\n",
" try {\n",
" is = (new URL(ffn[i])).openStream();\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" } else {\n",
" if(ffn[i].startsWith(\"file://\")) {\n",
" if(!jnlp) {\n",
" try {\n",
" is = (new URL(ffn[i])).openStream();\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" } else {\n",
" try {\n",
" is = getClass().getResourceAsStream( \"/\" + ffn[i]);\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" if(xf == null) {\n",
" if(fbas != null) {\n",
" for(int j = 0; ((j < fbas.length) && (xf == null)); j++) {\n",
" String urlname;\n",
" if(ffn[i].startsWith(\"/\")) {\n",
" urlname = fbas[j] + ffn[i];\n",
" } else {\n",
" urlname = fbas[j] + \"/\" + ffn[i];\n",
" }\n",
" is = null;\n",
" if(urlname.startsWith(\"http://\")) {\n",
" try {\n",
" is = (new URL(urlname)).openStream();\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" } else {\n",
" if(urlname.startsWith(\"file://\")) {\n",
" if(!jnlp) {\n",
" try {\n",
" is = (new URL(urlname)).openStream();\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" } else {\n",
" try {\n",
" is = getClass().getResourceAsStream(urlname);\n",
" xf = Font.createFont(ft, is);\n",
" } catch(Exception e) { xf = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" if(xf == null) {\n",
" if(!jnlp) {\n",
" FileInputStream fis = null;\n",
" try {\n",
" fis = new FileInputStream(ffn[i]);\n",
" xf = Font.createFont(ft, fis);\n",
" }\n",
" catch(Exception e) {\n",
" xf = null;\n",
" }\n",
" finally {\n",
" try { fis.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" if(xf != null) {\n",
" try {\n",
" back = xf.deriveFont(fs);\n",
" } catch(Exception e) { back = null; }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" if(fn != null) {\n",
" for(i = 0; ((i < fn.length) && (back == null)); i++) {\n",
" if(fn[i] != null) {\n",
" try {\n",
" xf = new Font(fn[i], fe, (int)fs);\n",
" back = xf.deriveFont(fs);\n",
" } catch(Exception e) { back = null; }\n",
" }\n",
" }\n",
" }\n",
" if(back == null) {\n",
" if(fb != null) {\n",
" try {\n",
" xf = new Font(fb, fe, (int)fs);\n",
" back = xf.deriveFont(fs);\n",
" } catch(Exception e) { back = null; }\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
" /**\n",
" * Attempt to find a font\n",
" * @param ffn Array of font file name suggestions to search for.\n",
" * @param fn Array of font family names to use.\n",
" * @param fb Fallback font, ie Font.SERIF.\n",
" * @param fe Font features (bold, italic).\n",
" * @param fs Font size.\n",
" * @return Font reference or null.\n",
" */\n",
" private Font findFont(String[] ffn, String[] fn, String fb, int fe, double fs)\n",
" {\n",
" Font back = findFont(ffn, fn, fb, fe, (float)fs);\n",
" return back;\n",
" }\n",
"\n",
" /** Find image.\n",
" * @param n Image file name or URL.\n",
" * @return The image found or null.\n",
" */\n",
" BufferedImage findImage(String n) {\n",
" BufferedImage back = null;\n",
" InputStream is = null;\n",
" String[] ib = null;\n",
" boolean jnlp = false;\n",
" synchronized(this) { jnlp = isJnlp; }\n",
" if(n.startsWith(\"http://\")) {\n",
" try {\n",
" is = (new URL(n)).openStream();\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) { back = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" } else {\n",
" if(n.startsWith(\"file://\")) {\n",
" if(!jnlp) {\n",
" try {\n",
" is = (new URL(n)).openStream();\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) { back = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" } else {\n",
" try {\n",
" is = getClass().getResourceAsStream(\"/\" + n);\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) { back = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" if(back == null) {\n",
" String urlname;\n",
" synchronized(this) { ib = imageBases; }\n",
" if(ib != null) {\n",
" for(int i = 0; ((i < ib.length) && (back == null)); i++) {\n",
" is = null;\n",
" if(n.startsWith(\"/\")) {\n",
" urlname = ib[i] + n;\n",
" } else {\n",
" urlname = ib[i] + \"/\" + n;\n",
" }\n",
" if(urlname.startsWith(\"http://\")) {\n",
" try {\n",
" is = (new URL(urlname)).openStream();\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) {\n",
" back = null;\n",
" } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" } else {\n",
" if(urlname.startsWith(\"file://\")) {\n",
" if(!jnlp) {\n",
" try {\n",
" is = (new URL(urlname)).openStream();\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) { back = null; } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" } else {\n",
" try {\n",
" is = getClass().getResourceAsStream(urlname);\n",
" back = ImageIO.read(is);\n",
" } catch(Exception e) {\n",
" back = null;\n",
" } finally {\n",
" try { is.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" if(back == null) {\n",
" if(!jnlp) {\n",
" FileInputStream fis = null;\n",
" try {\n",
" fis = new FileInputStream(n);\n",
" back = ImageIO.read(fis);\n",
" }\n",
" catch(Exception e) {\n",
" back = null;\n",
" }\n",
" finally {\n",
" try { fis.close(); } catch(Exception e) {}\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
" /**\n",
" * Add font base directory.\n",
" * @param s New font base.\n",
" */\n",
" public void addFontBase(String s) {\n",
" String[] fb = null;\n",
" String[] nfb = null;\n",
" int i;\n",
" if(s != null) {",
" synchronized(this) { fb = fontBases; }\n",
" if(fb != null) {\n",
" nfb = new String[1 + fb.length];\n",
" for(i = 0; i < fb.length; i++) {\n",
" nfb[i] = fb[i];\n",
" }\n",
" nfb[i] = new String(s);\n",
" } else {\n",
" nfb = new String[1];\n",
" nfb[0] = new String(s);\n",
" }\n",
" synchronized(this) { fontBases = nfb; }\n",
" }",
" }\n",
"\n",
" /**\n",
" * Add image base directory.\n",
" * @param s New image base.\n",
" */\n",
" public void addImageBase(String s) {\n",
" String[] ib = null;\n",
" String[] nib = null;\n",
" int i;\n",
" if(s != null) {",
" synchronized(this) { ib = imageBases; }\n",
" if(ib != null) {\n",
" nib = new String[1 + ib.length];\n",
" for(i = 0; i < ib.length; i++) {\n",
" nib[i] = ib[i];\n",
" }\n",
" nib[i] = new String(s);\n",
" } else {\n",
" nib = new String[1];\n",
" nib[0] = new String(s);\n",
" }\n",
" synchronized(this) { imageBases = nib; }\n",
" }",
" }\n",
"\n",
"// \n",
NULL
};
/** Member functions for text and graphics placement.
*/
static char *member_functions_2[] = {
"\n",
"\n",
"\n",
"// \n",
"\n",
" /** Place text.\n",
" * @param g Graphics context.\n",
" * @param t Text to place.\n",
" * @param m Font metrics of current font.\n",
" * @param x X position.\n",
" * @param y y position.\n",
" * @param align Text alignment (ALIGN_H_xxx).\n",
" */\n",
" private void placeText(\n",
" Graphics2D g, String t, FontMetrics m,\n",
" double x, double y, int align\n",
" )\n",
" {\n",
" Rectangle2D r = m.getStringBounds(t, g);\n",
" double wi = r.getWidth();\n",
" switch(align) {\n",
" case ALIGN_H_CENTERED: {\n",
" wi = 0.5 * wi;\n",
" } break;\n",
" case ALIGN_H_LEFT: {\n",
" wi = 0.0;\n",
" } break;\n",
" }\n",
" g.drawString(t, (float)(x - wi), (float)y);\n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n\n",
"\n",
" /** Place image into range.\n",
" * @param g Graphics context.\n",
" * @param x0 Left x.\n",
" * @param y0 Top y.\n",
" * @param x1 Right x.\n",
" * @param y1 Bottom y.\n",
" * @param i Image to draw.\n",
" * @param ah Horizontal alignment.\n",
" * @param av Vertical aligment.\n",
" * @return Flag to indicate success.\n",
" */\n",
" private boolean placeImage(\n",
" Graphics2D g,\n",
" double x0, double y0, double x1, double y1,\n",
" Image i,\n",
" int ah, int av\n",
" )\n",
" {\n",
" boolean back = true;\n",
" double xs = x0;\n",
" double ys = y0;\n",
" double sf;\n",
" try {\n",
" double iw = (double)i.getWidth(null);\n",
" double ih = (double)i.getHeight(null);\n",
" double sfx = (x1 - x0) / iw;\n",
" double sfy = (y1 - y0) / ih;\n",
" if(sfx < sfy) {\n",
" sf = sfx;\n",
" switch(av) {\n",
" case ALIGN_V_CENTERED: {\n",
" ys = ys + 0.5 * (y1 - y0 - sf * ih);\n",
" } break;\n",
" case ALIGN_V_BOTTOM: {\n",
" ys = y1 - sf * ih;\n",
" } break;\n",
" }\n",
" } else {\n",
" sf = sfy;\n",
" switch(ah) {\n",
" case ALIGN_H_CENTERED: {\n",
" xs = xs + 0.5 * (x1 - x0 - sf * iw);\n",
" } break;\n",
" case ALIGN_H_RIGHT: {\n",
" xs = x1 - sf * iw;\n",
" } break;\n",
" }\n",
" }\n",
" Graphics2D g2 = (Graphics2D)(g.create());\n",
" g2.translate(xs, ys);\n",
" g2.scale(sf, sf);\n",
" g2.drawImage(i, 0, 0, null);\n",
" } catch(Exception e) { back = false; }\n",
" return back;\n",
" }\n\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /**\n",
" * Print graphics to a printer page.\n",
" * @param g Graphics context.\n",
" * @param pageFormat Page format structure.\n",
" * @param pageIndex Index of the page (must be 0).\n",
" * @return Indicator whether or not the pageIndex is ok.\n",
" */\n",
" @Override\n",
" public int print(Graphics g, PageFormat pageFormat, int pageIndex) {\n",
" int back = Printable.NO_SUCH_PAGE;\n",
" double xmin;\n",
" double xmax;\n",
" double ymin;\n",
" double ymax;\n",
" if(pageIndex == 0) {\n",
" if(initialize()) {\n",
" Graphics2D g2 = (Graphics2D)g;\n",
" Graphics2D g3 = (Graphics2D)(g2.create());\n",
" xmin = pageFormat.getImageableX();\n",
" xmax = xmin + pageFormat.getImageableWidth();\n",
" ymin = pageFormat.getImageableY();\n",
" ymax = ymin + pageFormat.getImageableHeight();\n",
" if(leftBorder > xmin) { xmin = leftBorder; }\n",
" if(topBorder > ymin) { ymin = topBorder; }\n",
" if(((xmax - xmin) >= w) && ((ymax - ymin) >= h)) {\n",
" double tx = xmin;\n",
" double ty = ymin;\n",
" if((alignH != ALIGN_H_LEFT) || (alignV != ALIGN_V_TOP)) {\n",
" switch(alignH) {\n",
" case ALIGN_H_CENTERED: {\n",
" tx = xmin + (xmax - xmin - w) / 2.0;\n",
" } break;\n",
" case ALIGN_H_RIGHT: {\n",
" tx = xmax - w;\n",
" } break;\n",
" }\n",
" switch(alignV) {\n",
" case ALIGN_V_CENTERED: {\n",
" ty = ymin + (ymax - ymin - h) / 2.0;\n",
" } break;\n",
" case ALIGN_V_BOTTOM: {\n",
" ty = ymax - h;\n",
" } break;\n",
" }\n",
" }\n",
" g3.translate(tx, ty);\n",
" if(p(g3)) { back = Printable.PAGE_EXISTS; }\n",
" } else {\n",
" double tx = xmin;\n",
" double ty = ymin;\n",
" double sc = 1.0;\n",
" double nw = w;\n",
" double nh = h;\n",
" try {\n",
" double osx = (xmax - xmin) / w;\n",
" double osy = (ymax - ymin) / h;\n",
" if((osx > 0.0) && (osy > 0.0)) {\n",
" if(osy < osx) {\n",
" sc = osy;\n",
" nw = sc * w;\n",
" switch(alignH) {\n",
" case ALIGN_H_CENTERED: {\n",
" tx = tx + (xmax - xmin - nw) / 2.0;\n",
" } break;\n",
" case ALIGN_H_RIGHT: {\n",
" tx = xmax - nw;\n",
" } break;\n",
" }\n",
" } else {\n",
" sc = osx;\n",
" nh = sc * h;\n",
" switch(alignV) {\n",
" case ALIGN_V_CENTERED: {\n",
" ty = ty + (ymax - ymin - nh) / 2.0;\n",
" } break;\n",
" case ALIGN_V_BOTTOM: {\n",
" ty = ymax - nh;\n",
" } break;\n",
" }\n",
" }\n",
" g3.translate(tx, ty);\n",
" g3.scale(sc, sc);\n",
" if(p(g3)) { back = Printable.PAGE_EXISTS; }\n",
" }\n",
" } catch(Exception e) {\n",
" back = Printable.NO_SUCH_PAGE; e.printStackTrace();\n",
" }\n",
" }\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /**\n",
" * Enable or disable one text printout.\n",
" * @param s Original text of the string.\n",
" * @param f Flag whether or not to print the string.\n",
" */\n",
" public void setTextEnabled(String s, boolean f) {\n",
" int i;\n",
" for(i = 0; i < s1.length; i++) {\n",
" if(s.equals(s1[i])) {\n",
" se[i] = f;\n",
" }\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Enable or disable all texts in a specific layer.\n",
" * @param l Layer number.\n",
" * @param f Flag whether to enable or disable the texts.\n",
" */\n",
" public void setTextInLayerEnabled(int l, boolean f) {\n",
" int i;\n",
" for(i = 0; i < s1.length; i++) {\n",
" if(sl[i] == l) {\n",
" se[i] = f;\n",
" }\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Enable all texts.\n",
" */\n",
" public void enableAllTexts() {\n",
" int i;\n",
" for(i = 0; i < se.length; i++) {\n",
" se[i] = true;\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Replace one of the label strings.\n",
" * @param k Original label text from Fig file.\n",
" * @param v New label text.\n",
" * @return Flag whether or not the text was found.\n",
" */\n",
" public boolean replaceText(String k, String v) {\n",
" boolean back = false;\n",
" int i;\n",
" for(i = 0; i < s1.length; i++) {\n",
" if(k.equals(s1[i])) {\n",
" s2[i] = v; back = true;\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /**\n",
" * Set top border.\n",
" * @param d New minimum top border.\n",
" */\n",
" public void setLeftBorder(double d) {\n",
" leftBorder = d;\n",
" }\n",
"\n",
" /** Set left border.\n",
" * @param d New minimum left border.\n",
" */\n",
" public void setTopBorder(double d) {\n",
" topBorder = d;\n",
" }\n",
"\n",
" /**\n",
" * Set horizontal alignment.\n",
" * @param a New horizontal alignment.\n",
" */\n",
" public void setHorizontalAlignment(int a) {\n",
" alignH = a;\n",
" if((a != ALIGN_H_LEFT) && (a != ALIGN_H_RIGHT)) {\n",
" alignH = ALIGN_H_CENTERED;\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Set vertical alignment.\n",
" * @param a New vertical alignment.\n",
" */\n",
" public void setVerticalAlignment(int a) {\n",
" alignV = a;\n",
" if((a != ALIGN_V_TOP) && (a != ALIGN_V_BOTTOM)) {\n",
" alignV = ALIGN_V_CENTERED;\n",
" }\n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /** Retrieve error code for last error.\n",
" * @return Error code for last error.\n",
" */\n",
" public int getLastError() {\n",
" return errorCode;\n",
" }\n",
"\n",
" /** Reset error code. */\n",
" public void resetError() {\n",
" errorCode = 0;\n",
" }\n",
"\n",
"// \n",
"\n\n\n",
"// \n",
"\n",
" /**\n",
" * Retrieve used range for a layer.\n",
" * @param l Layer number.\n",
" * @return Rectangle on success (layer not found),\n",
" * null on error (layer not found).\n",
" */\n",
" public Rectangle2D.Double getLayerRectangle(int l) {\n",
" Rectangle2D.Double back = null;\n",
" int i;\n",
" for(i = 0; ((i < la.length) && (back == null)); i++) {\n",
" if(la[i] != null) {\n",
" if(la[i].ln == l) {\n",
" back = la[i].getRectangle();\n",
" }\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
" /**\n",
" * Create graphics context with transformations applied.\n",
" * @param g Original graphics context.\n",
" * @param pageFormat Page format structure.\n",
" * @return New graphics context with translations or null.\n",
" */\n",
" public Graphics2D getTransformedGraphics(\n",
" Graphics g, PageFormat pageFormat)\n",
" {\n",
" Graphics2D back = null;\n",
" double xmin;\n",
" double xmax;\n",
" double ymin;\n",
" double ymax;\n",
" Graphics2D g2 = (Graphics2D)g;\n",
" Graphics2D g3 = (Graphics2D)(g2.create());\n",
" xmin = pageFormat.getImageableX();\n",
" xmax = xmin + pageFormat.getImageableWidth();\n",
" ymin = pageFormat.getImageableY();\n",
" ymax = ymin + pageFormat.getImageableHeight();\n",
" if(leftBorder > xmin) { xmin = leftBorder; }\n",
" if(topBorder > ymin) { ymin = topBorder; }\n",
" if(((xmax - xmin) >= w) && ((ymax - ymin) >= h)) {\n",
" double tx = xmin;\n",
" double ty = ymin;\n",
" if((alignH != ALIGN_H_LEFT) || (alignV != ALIGN_V_TOP)) {\n",
" switch(alignH) {\n",
" case ALIGN_H_CENTERED: {\n",
" tx = xmin + (xmax - xmin - w) / 2.0;\n",
" } break;\n",
" case ALIGN_H_RIGHT: {\n",
" tx = xmax - w;\n",
" } break;\n",
" }\n",
" switch(alignV) {\n",
" case ALIGN_V_CENTERED: {\n",
" ty = ymin + (ymax - ymin - h) / 2.0;\n",
" } break;\n",
" case ALIGN_V_BOTTOM: {\n",
" ty = ymax - h;\n",
" } break;\n",
" }\n",
" }\n",
" g3.translate(tx, ty);\n",
" back = g3;\n",
" } else {\n",
" double tx = xmin;\n",
" double ty = ymin;\n",
" double sc = 1.0;\n",
" double nw = w;\n",
" double nh = h;\n",
" try {\n",
" double osx = (xmax - xmin) / w;\n",
" double osy = (ymax - ymin) / h;\n",
" if((osx > 0.0) && (osy > 0.0)) {\n",
" if(osy < osx) {\n",
" sc = osy;\n",
" nw = sc * w;\n",
" switch(alignH) {\n",
" case ALIGN_H_CENTERED: {\n",
" tx = tx + (xmax - xmin - nw) / 2.0;\n",
" } break;\n",
" case ALIGN_H_RIGHT: {\n",
" tx = xmax - nw;\n",
" } break;\n",
" }\n",
" } else {\n",
" sc = osx;\n",
" nh = sc * h;\n",
" switch(alignV) {\n",
" case ALIGN_V_CENTERED: {\n",
" ty = ty + (ymax - ymin - nh) / 2.0;\n",
" } break;\n",
" case ALIGN_V_BOTTOM: {\n",
" ty = ymax - nh;\n",
" } break;\n",
" }\n",
" }\n",
" g3.translate(tx, ty);\n",
" g3.scale(sc, sc);\n",
" back = g3;\n",
" }\n",
" } catch(Exception e) {\n",
" back = null;\n",
" }\n",
" }\n",
" return back;\n",
" }\n",
"\n",
NULL
};
/** Set mode for web-start applications or applets.
*/
static char *member_functions_3[] = {
" /**\n",
" * Set webstart/applet mode. This mode is disabled by default.\n",
" * In webstart/applet mode the findImage() and findFont() function\n",
" * do not attempt to open file:// URLs.\n",
" * @param b Boolean flag to turn webstart/applet mode on or off.\n",
" */\n",
" public void setRunAsJnlp(boolean b) {\n",
" synchronized(this) { isJnlp = b; }\n",
" }\n",
"\n",
NULL
};
/** Finish editor fold.
*/
static char *member_functions_4[] = {
"// \n",
"\n\n\n",
NULL
};
/** Start editor fold for DkTool object constructor.
*/
static char *dktool_constructor_p1[] = {
"// \n",
"\n",
NULL
};
/** Write construction code.
*/
static char *dktool_constructor_p2[] = {
" {\n",
" dkt = d;\n",
" }\n",
"\n",
"// \n",
NULL
};
/** Section for start of initialize() function.
*/
static char *init_begin[] = {
"// \n\n",
" /**\n",
" * Initialize (create fonts, strokes, colors).\n",
" * @return true on success, false on error.\n",
" */\n",
" public boolean initialize() {\n",
" boolean back = is_initialized;\n",
" if(!initialization_attempted) {\n",
" back = true;\n",
NULL
};
/** Section for end of initialize() function.
*/
static char *init_end[] = {
" is_initialized = back;\n",
" initialization_attempted = true;\n",
" }\n",
" return back;\n",
" }\n",
"\n// \n\n\n",
NULL
};
/** Section for start of p() function.
*/
static char *p_begin[] = {
"// \n\n",
" /**\n",
" * Print the graphics (do real printing).\n",
" * @param g Graphics context.\n",
" * @return True on success, false on error.\n",
" */\n",
" private boolean p(Graphics2D g) {\n",
" boolean back = true;\n",
" try {\n",
NULL
};
/** Section for end of p() function.
*/
static char *p_end[] = {
" } catch(Exception e) { back = false; e.printStackTrace(); }\n",
" return back;\n",
" }\n",
"\n// \n\n\n",
NULL
};
/** Pointer to character, used in size calculation.
*/
typedef char *PCHAR;
/** Size of \arg kw array.
*/
static size_t szkw = sizeof(kw)/sizeof(PCHAR);
/** Write a double value explicitly as Java float value.
@param s Output stream.
@param d Value to write.
*/
static
void
force_double DK_P2(dk_stream_t *,s, double,d) {
char buffer[256];
sprintf(buffer, "%lg", d);
dkstream_puts(s, buffer);
if(!((strchr(buffer, 'e')) || (strchr(buffer, '.')))) {
dkstream_puts(s, kw[32]);
}
}
/** Write one of the keywords to output.
@param oi OI structure.
@param i Index of keyword in kw.
*/
static
void
kw_out DK_P2(OI *,oi, size_t,i) {
if(oi) {
if(oi->s) {
if(i < szkw) {
dkstream_puts(oi->s, kw[i]);
}
}
}
}
/** Find the length (number of digits) for a number.
@param ul Number to inspect.
@return Number of dights needed.
*/
static
size_t
number_length DK_P1(unsigned long,ul) {
size_t back;
char buffer[64];
sprintf(buffer, "%lu", ul);
back = strlen(buffer);
return back;
}
/** Write an entire section to output stream.
@param oi Output sructure.
@param sp Pointer to NULL-terminated array of strings.
*/
static
void
section_out DK_P2(OI *,oi, char **,sp) {
char **ptr;
ptr = sp;
while(*ptr) {
dkstream_puts(oi->s, *ptr);
ptr++;
}
}
/** Write Java package name to output.
@param oi Output structure.
*/
static
void
write_package_name DK_P1(OI *,oi) {
int ok = 0; /* Flag: Finished. */
int isf; /* Flag: First character to handle. */
char *ptr;
char *last;
char *prev;
char buffer[2];
size_t mpl;
char *p;
$? "+ write_package_name"
buffer[1] = '\0';
if((oi->c)->ofn2) { $? ". ofn2 ok \"%s\"", TR_STR((oi->c)->ofn2)
ptr = (oi->c)->ofn2; last = prev = NULL;
while(*ptr) {
if((*ptr == '\\') || (*ptr == '/')) {
prev = last; last = ptr;
}
ptr++;
}
if(prev) {
ptr = prev; ptr++; isf = 1;
while((*ptr) && (*ptr != '\\') && (*ptr != '/')) {
if(isf) {
kw_out(oi, 102);
} isf = 0;
buffer[0] = *ptr;
dkstream_puts(oi->s, buffer);
ok = 1;
ptr++;
}
}
}
if(!ok) {
if((oi->c)->ifn2) { $? ". ifn2 ok \"%s\"", TR_STR((oi->c)->ifn2)
ptr = (oi->c)->ifn2; last = prev = NULL;
while(*ptr) {
if((*ptr == '\\') || (*ptr == '/')) {
prev = last; last = ptr;
}
ptr++;
}
if(prev) {
ptr = prev; ptr++; isf = 1;
while((*ptr) && (*ptr != '\\') && (*ptr != '/')) {
if(isf) {
kw_out(oi, 102);
} isf = 0;
buffer[0] = *ptr;
dkstream_puts(oi->s, buffer);
ok = 1;
ptr++;
}
}
}
}
if(!ok) {
mpl = (size_t)dksf_get_maxpathlen();
p = dk_new(char,mpl);
if(p) {
if(dksf_getcwd(p,mpl)) { $? ". cwd ok"
ptr = p; last = NULL;
while(*ptr) {
if((*ptr == '\\') || (*ptr == '/')) {
last = ptr;
}
ptr++;
}
if(last) {
ptr = last; ptr++;
kw_out(oi, 102);
dkstream_puts(oi->s, ptr);
ok = 1;
}
}
dk_delete(p);
}
}
if(ok) {
kw_out(oi, 10); kw_out(oi, 0); kw_out(oi, 0);
} $? "- write_package_name %d", ok
}
/** Write import instructions.
@param oi OI structure.
*/
static
void
write_import_packages DK_P1(OI *,oi) {
char **ptr;
write_package_name(oi);
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES) {
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_WEBSTART) {
kw_out(oi, 169);
} else {
kw_out(oi, 168);
}
kw_out(oi, 0); kw_out(oi, 0);
}
ptr = packages_to_import;
kw_out(oi, 157); kw_out(oi, 0); kw_out(oi, 0);
while(*ptr) {
kw_out(oi, 9);
kw_out(oi, 1);
dkstream_puts(oi->s, *ptr);
kw_out(oi, 10);
kw_out(oi, 0);
ptr++;
}
kw_out(oi, 0);
kw_out(oi, 158); kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
}
/** Check whether the current object must be filled.
@param oi Output structure.
@return Flag: must fill (1) or not (0).
*/
static
int
must_fill_object DK_P1(OI *,oi) {
int back = 0;
int wbgr = 0;
if(((oi->o)->fpd).cl) {
if(dkfig_tool_must_fill(((oi->o)->fpd).af, (oi->c)->opt1)
|| dkfig_tool_must_pattern(((oi->o)->fpd).af, (oi->c)->opt1))
{
back = 1;
}
}
if(back) {
if((oi->o)->objtype == DK_FIG_OBJ_POLYLINE) {
if((oi->o)->subtype == 5) {
if(!(((oi->c)->opt1) & DKFIG_OPT_FILL_BITMAP_AREA)) {
back = 0;
}
}
}
if(((oi->c)->opt1) & DKFIG_OPT_REMOVE_BG_RECTANGLE) {
if(((oi->c)->opt2) & DKFIG_OPT_WHITE_BGRECT) {
wbgr = 1;
}
if(dkfig_tool2_obj_is_bg_rect(oi->o, wbgr)) back = 0;
}
if(((oi->o)->fpd).fc == (oi->d)->transparent) {
back = 0;
}
}
return back;
}
/** Check whether the current object must be stroked.
@param oi Output structure.
@return Flag: must stroke (1) or not (0).
*/
static
int
must_stroke_object DK_P1(OI *,oi) {
int back = 1;
int wbgr = 0;
if((oi->o)->objtype == DK_FIG_OBJ_POLYLINE) {
if((oi->o)->subtype == 5) {
if(((oi->c)->opt1) & DKFIG_OPT_REMOVE_BITMAP_BORDER) {
back = 0;
}
}
}
if(((oi->c)->opt1) & DKFIG_OPT_REMOVE_THIN_BORDERS) {
if(((oi->o)->fpd).lt == 0L) {
if(((oi->o)->fpd).cl) {
if(dkfig_tool_must_fill(((oi->o)->fpd).af, (oi->c)->opt1)) {
back = 0;
}
if(dkfig_tool_must_pattern(((oi->o)->fpd).af, (oi->c)->opt1)) {
back = 0;
}
}
}
}
if(((oi->c)->opt1) & DKFIG_OPT_REMOVE_BG_RECTANGLE) {
if(((oi->c)->opt2) & DKFIG_OPT_WHITE_BGRECT) {
wbgr = 1;
}
if(dkfig_tool2_obj_is_bg_rect(oi->o, wbgr)) back = 0;
}
if(((oi->o)->fpd).pc == (oi->d)->transparent) {
back = 0;
}
return back;
}
/** Convert a distance to Java.
@param oi Output structure.
@param r Radius to convert.
@return Value as used in Java.
*/
static
double
convertR DK_P2(OI *,oi, double,r) {
double back;
back = dkma_mul_double_ok(r, oi->xfactor, &(oi->me));
return back;
}
/** Convert x value to Java.
@param oi Output structure.
@param x Value to convert.
@return X-position as used in Java.
*/
static
double
convertX DK_P2(OI *,oi, double,x) {
double back = x;
back = dkma_add_double_ok(
dkma_mul_double_ok(x, oi->xfactor, &(oi->me)),
oi->xshift,
&(oi->me)
);
return back;
}
/** Convert y value to Java.
@param oi Output structure.
@param y Value to convert.
@return Y-position as used in Java.
*/
static
double
convertY DK_P2(OI *,oi, double,y) {
double back;
back = y * oi->yfactor + oi->yshift;
back = dkma_add_double_ok(
dkma_mul_double_ok(y, oi->yfactor, &(oi->me)),
oi->yshift,
&(oi->me)
);
return back;
}
/** Convert distance value to Java.
@param oi Output structure.
@param r Value to convert.
@return Conversion result.
*/
static
double
convertRl DK_P2(OI *,oi, long,r) {
double back;
back = convertR(oi, dkma_l_to_double(r));
return back;
}
/** Convert x position to Java.
@param oi Output structure.
@param x Value to convert.
@return Conversion result.
*/
static
double
convertXl DK_P2(OI *,oi, long,x) {
double back;
back = convertX(oi, dkma_l_to_double(x));
return back;
}
/** Convert y position to Java.
@param oi Output structure.
@param y Value to convert.
@return Conversion result.
*/
static
double
convertYl DK_P2(OI *,oi, long,y) {
double back;
back = convertY(oi, dkma_l_to_double(y));
return back;
}
/** Convert point (long coordinates) and write it.
@param oi Output structure.
@param x x position.
@param y y position.
*/
static
void
lpointout DK_P3(OI *,oi, long,x, long,y) {
force_double(oi->s, convertXl(oi,x));
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, convertYl(oi,y));
}
/** Convert point (double coordinates) and write it.
@param oi Output structure.
@param x x position.
@param y y position.
*/
static
void
dpointout DK_P3(OI *,oi, double,x, double,y) {
force_double(oi->s, convertX(oi,x));
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, convertY(oi,y));
}
/** Compare two Java image objects.
@param l Pointer to left object.
@param r Pointer to right object.
@param cr Comparison criteria (ignored).
@return Comparison result.
*/
int
image_compare DK_P3(void *,l, void *,r, int,cr) {
int back = 0;
dkfig_java_image *il, *ir;
il = (dkfig_java_image *)l; ir = (dkfig_java_image *)r;
if(l) {
if(r) {
if(il->filename) {
if(ir->filename) {
back = strcmp(il->filename, ir->filename);
} else { back = 1; }
} else {
if(ir->filename) { back = -1; }
}
} else { back = 1; }
} else {
if(r) { back = -1; }
}
return back;
}
/** Compare two color objects.
@param l Pointer to left object.
@param r Pointer to right object.
@param c Comparison criteria (ignored).
@return Comparison result.
*/
int
color_compare DK_P3(void *,l, void *,r, int,c) {
int back = 0;
dkfig_java_color *cl, *cr;
cl = (dkfig_java_color *)l; cr = (dkfig_java_color *)r;
if(l) {
if(r) {
if(cl->r > (cr->r + epsilon)) {
back = 1;
} else {
if(cl->r < (cr->r - epsilon)) {
back = -1;
}
}
if(back == 0) {
if(cl->g > (cr->g + epsilon)) {
back = 1;
} else {
if(cl->g < (cr->g - epsilon)) {
back = -1;
}
}
}
if(back == 0) {
if(cl->b > (cr->b + epsilon)) {
back = 1;
} else {
if(cl->b < (cr->b - epsilon)) {
back = -1;
}
}
}
} else { back = 1; }
} else {
if(r) { back = -1; }
}
return back;
}
/** Compare two stroke objects.
@param l Pointer to left object.
@param r Pointer to right object.
@param cr Comparison criteria (ignored).
@return Comparison result.
*/
int
stroke_compare DK_P3(void *,l, void *,r, int,cr) {
int back = 0;
dkfig_java_stroke *sl, *sr;
sl = (dkfig_java_stroke *)l; sr = (dkfig_java_stroke *)r;
if(l) {
if(r) {
if(sl->linewidth > (sr->linewidth + epsilon)) {
back = 1;
} else {
if(sl->linewidth < (sr->linewidth - epsilon)) {
back = -1;
}
}
if(back == 0) {
if(sl->sv > (sr->sv + epsilon)) {
back = 1;
} else {
if(sl->sv < (sr->sv - epsilon)) {
back = -1;
}
}
}
if(back == 0) {
if(sl->cap > sr->cap) back = 1;
else {
if(sl->cap < sr->cap) back = -1;
}
}
if(back == 0) {
if(sl->join > sr->join) back = 1;
else {
if(sl->join < sr->join) back = -1;
}
}
if(back == 0) {
if(sl->dash > sr->dash) back = 1;
else {
if(sl->dash < sr->dash) back = -1;
}
}
} else { back = 1; }
} else {
if(r) { back = -1; }
}
return back;
}
/** Compare two font objects.
@param l Pointer to left object.
@param r Pointer to right object.
@param cr Comparison criteria (ignored).
@return Comparison result.
*/
int
font_compare DK_P3(void *,l, void *,r, int,cr) {
int back = 0;
dkfig_java_font *fl, *fr;
fl = (dkfig_java_font *)l; fr = (dkfig_java_font *)r;
if(l) {
if(r) {
if(fl->font > fr->font) {
back = 1;
} else {
if(fl->font < fr->font) {
back = -1;
}
}
if(back == 0) {
if(fl->size > (fr->size + epsilon)) {
back = 1;
} else {
if(fl->size < (fr->size - epsilon)) {
back = -1;
}
}
}
} else { back = 1; }
} else {
if(r) { back = -1; }
}
return back;
}
/** Compare two layer objects.
@param l Left layer object.
@param r Right layer object.
@param cr Comparison criteria (ignored).
*/
static
int
compare_layer DK_P3(void *,l, void *,r, int,cr) {
int back = 0;
dkfig_java_layer *ll, *lr;
ll = (dkfig_java_layer *)l;
lr = (dkfig_java_layer *)r;
if(l) {
if(r) {
if(ll->layer > lr->layer) {
back = 1;
} else {
if(ll->layer < lr->layer) {
back = -1;
}
}
} else back = 1;
} else {
if(r) back = -1;
}
return back;
}
/** Initialized image object.
@param p Pointer to object.
*/
static
void
image_init DK_P1(dkfig_java_image *,p) {
p->imgno = 0UL; p->filename = NULL;
}
/** Release memory used by image object.
@param p Pointer to object.
*/
static
void
image_delete DK_P1(dkfig_java_image *,p) {
char *x;
if(p) {
p->imgno = 0UL;
if(p->filename) {
x = p->filename; dk_delete(x);
} p->filename = NULL;
dk_delete(p);
}
}
/** Create new image style object.
@param fn Image file name.
@return Pointer to new object on success, NULL on error.
*/
static
dkfig_java_image *
image_new DK_P1(char *,fn) {
dkfig_java_image *back = NULL;
back = dk_new(dkfig_java_image,1);
if(back) {
image_init(back);
back->filename = dkstr_dup(fn);
if(!(back->filename)) {
image_delete(back); back = NULL;
}
}
return back;
}
/** Initialize color object.
@param p Pointer to object.
*/
static
void
color_init DK_P1(dkfig_java_color *,p) {
p->colno = 0UL;
p->r = 0.0; p->g = 0.0; p->b = 0.0;
}
/** Release memory used by a color object.
@param p Pointer to object.
*/
static
void
color_delete DK_P1(dkfig_java_color *,p) {
if(p) {
color_init(p);
dk_delete(p);
}
}
/** Create new color object.
@param r Red.
@param g Green.
@param b Blue.
@return Pointer to new object on success, NULL on error.
*/
static
dkfig_java_color *
color_new DK_P3(double,r, double,g, double,b) {
dkfig_java_color *back = NULL;
back = dk_new(dkfig_java_color,1);
if(back) {
color_init(back);
back->r = r; back->g = g; back->b = b;
}
return back;
}
/** Initialize font style object.
@param p Pointer to object.
*/
static
void
font_init DK_P1(dkfig_java_font *,p) {
p->fontno = 0UL;
p->font = 0;
p->size = 0.0;
}
/** Release memory used by font style object.
@param p Pointer to object.
*/
static
void
font_delete DK_P1(dkfig_java_font *,p) {
if(p) {
font_init(p);
dk_delete(p);
}
}
/** Create font style object.
@param f PS font index.
@param s Font size.
@return Pointer to new object on success, NULL on error.
*/
static
dkfig_java_font *
font_new DK_P2(int, f, double,s) {
dkfig_java_font *back = NULL;
back = dk_new(dkfig_java_font,1);
if(back) {
font_init(back);
back->font = f;
back->size = s;
}
return back;
}
/** Initialize stroke style object.
@param p Pointer to object to initialize.
*/
static
void
stroke_init DK_P1(dkfig_java_stroke *,p) {
p->strokeno = 0UL;
p->linewidth = 0.0;
p->cap = 0;
p->join = 0;
p->dash = 0;
}
/** Release memory used by a stroke style object.
@param p Pointer to stroke style object.
*/
static
void
stroke_delete DK_P1(dkfig_java_stroke *,p) {
if(p) {
stroke_init(p);
dk_delete(p);
}
}
/** Create new stroke style object.
@param w Line width.
@param sv Style value (dash pattern length).
@param c Line cap style.
@param j Line join style.
@param d Dash pattern index.
*/
static
dkfig_java_stroke *
stroke_new DK_P5(double,w, double,sv, int,c, int,j, int,d) {
dkfig_java_stroke *back = NULL;
back = dk_new(dkfig_java_stroke,1);
if(back) {
stroke_init(back);
back->linewidth = w;
back->sv = sv;
back->cap = c;
back->join = j;
back->dash = d;
}
return back;
}
/** Release memory allocated by OI.
@param oi OI to release.
*/
static
void
delete_oi DK_P1(OI *,oi) {
dkfig_java_stroke *stroke;
dkfig_java_font *font;
dkfig_java_color *color;
dkfig_java_image *image;
dkfig_java_layer *lay;
$? "+ delete_oi"
if(oi) {
oi->c = NULL;
oi->d = NULL;
oi->s = NULL;
if(oi->fli) {
dksto_it_close(oi->fli);
} oi->fli = NULL;
if(oi->fl) {
dksto_close(oi->fl);
} oi->fl = NULL;
if(oi->i_c) {
/* Release colors. */
dksto_it_reset(oi->i_c);
while((color = (dkfig_java_color *)dksto_it_next(oi->i_c)) != NULL) {
$? ". delete color %lg %lg %lg", color->r, color->g, color->b
color_delete(color);
}
dksto_it_close(oi->i_c);
} oi->i_c = NULL;
if(oi->s_c) {
dksto_close(oi->s_c);
} oi->s_c = NULL;
if(oi->i_f) {
/* Release fonts. */
dksto_it_reset(oi->i_f);
while((font = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
$? ". delete font %d %lg", font->font, font->size
font_delete(font);
}
dksto_it_close(oi->i_f);
} oi->i_f = NULL;
if(oi->s_f) {
dksto_close(oi->s_f);
} oi->s_f = NULL;
if(oi->i_s) {
/* Release strokes. */
dksto_it_reset(oi->i_s);
while((stroke = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
$? ". delete stroke %lg", stroke->linewidth
stroke_delete(stroke);
}
dksto_it_close(oi->i_s);
} oi->i_s = NULL;
if(oi->s_s) {
dksto_close(oi->s_s);
} oi->s_s = NULL;
if(oi->i_i) {
/* Release images. */
dksto_it_reset(oi->i_i);
while((image = (dkfig_java_image *)dksto_it_next(oi->i_i)) != NULL) {
$? ". delete image %s", TR_STR(image->filename)
image_delete(image);
}
dksto_it_close(oi->i_i);
} oi->i_i = NULL;
if(oi->s_i) {
dksto_close(oi->s_i);
} oi->s_i = NULL;
if(oi->i_l) {
dksto_it_reset(oi->i_l);
while((lay = (dkfig_java_layer *)dksto_it_next(oi->i_l)) != NULL) {
$? ". delete layer %ld", lay->layer
dk_delete(lay);
}
dksto_it_close(oi->i_l);
} oi->i_l = NULL;
if(oi->s_l) {
dksto_close(oi->s_l);
} oi->s_l = NULL;
if(oi->fontmap) {
dkfont_mapping_close(oi->fontmap);
} oi->fontmap = NULL;
dk_delete(oi);
} $? "- delete_oi"
}
/** Initialize Java driver-specific object extension.
@param p Pointer to DRVE.
*/
static
void
drve_init DK_P1(dkfig_java_drve *,p) {
p->st = NULL; p->draw = NULL;
p->fill = NULL; p->img = NULL;
p->font = NULL; p->tn = 0UL;
}
/** Release memory used by a Java driver-specific extension.
@param p Pointer to DRVE.
*/
static
void
drve_delete DK_P1(dkfig_java_drve *,p) {
if(p) {
drve_init(p);
dk_delete(p);
}
}
/** Create Java driver-specific extension.
@return Pointer to DRVE.
*/
static
dkfig_java_drve *
drve_new DK_P0() {
dkfig_java_drve *back = NULL;
back = dk_new(dkfig_java_drve,1);
if(back) { drve_init(back); }
return back;
}
/** Check LANG environment variable whether or not to create the Java
file in UTF-8 encoding.
@param oi Output structure.
*/
static
void
check_utf8 DK_P1(OI *,oi) {
char buffer[256], *ptr;
if((oi->c)->app) {
if(dkapp_get_pref_env((oi->c)->app,kw[71],buffer,sizeof(buffer),0,kw[69]))
{
ptr = strchr(buffer, '.');
if(ptr) {
ptr++;
if((dkstr_casecmp(ptr,kw[70])==0) || (dkstr_casecmp(ptr,kw[174])==0)) {
oi->wr_utf8 = 1;
}
}
}
} else {
ptr = getenv(kw[69]);
if(ptr) {
if(strlen(ptr) < sizeof(buffer)) {
strcpy(buffer, ptr);
ptr = strchr(buffer, '.');
if(ptr) {
ptr++;
if((dkstr_casecmp(ptr, kw[70])==0) || (dkstr_casecmp(ptr,kw[174])==0))
{
oi->wr_utf8 = 1;
}
}
}
}
}
}
/** Initialize OI structure.
@param oi OI to initialize.
@param c Conversion structure.
@return 1 on success, 0 on error.
*/
static
int
init_oi DK_P2(OI *,oi, dk_fig_conversion *,c) {
int back = 0;
$? "+ init_oi %s", TR_PTR(c)
oi->d = NULL;
oi->c = c;
oi->s = c->ostrm;
oi->dro = c->drwng;
oi->fl = NULL;
oi->fli = NULL;
oi->s_c = NULL; oi->i_c = NULL;
oi->s_f = NULL; oi->i_f = NULL;
oi->s_s = NULL; oi->i_f = NULL;
oi->s_i = NULL; oi->i_i = NULL;
oi->s_l = NULL; oi->i_l = NULL;
oi->text_right = 0x00;
oi->text_centered = 0x00;
oi->ec = 0; oi->me = 0;
oi->spcpass = 0;
oi->xfactor = oi->yfactor = oi->xshift = oi->yshift = 0.0;
oi->xleft = oi->xright = oi->ybottom = oi->ytop = 0.0;
oi->n_c = oi->n_f = oi->n_s = oi->n_i = oi->n_t = 0UL;
oi->l_c = oi->l_f = oi->l_s = oi->l_i = oi->l_t = 0;
oi->wr_utf8 = 0;
check_utf8(oi);
oi->fontmap = NULL;
if(c->drwng) { $? ". drwng ok"
oi->d = (dk_fig_drawing *)((oi->dro)->data);
if((oi->s) && (oi->dro) && (oi->d)) { $? ". pointers ok"
oi->s_c = dksto_open(0);
if(oi->s_c) {
dksto_set_comp(oi->s_c, color_compare, 0);
oi->i_c = dksto_it_open(oi->s_c);
if(oi->i_c) {
oi->s_f = dksto_open(0);
if(oi->s_f) {
dksto_set_comp(oi->s_f, font_compare, 0);
oi->i_f = dksto_it_open(oi->s_f);
if(oi->i_f) {
oi->s_s = dksto_open(0);
if(oi->s_s) {
dksto_set_comp(oi->s_s, stroke_compare, 0);
oi->i_s = dksto_it_open(oi->s_s);
if(oi->i_s) {
oi->s_i = dksto_open(0);
if(oi->s_i) {
dksto_set_comp(oi->s_i, image_compare, 0);
oi->i_i = dksto_it_open(oi->s_i);
if(oi->i_i) {
oi->s_l = dksto_open(0);
if(oi->s_l) {
dksto_set_comp(oi->s_l, compare_layer, 0);
oi->i_l = dksto_it_open(oi->s_l);
if(oi->i_l) {
back = 1; $? ". everything ok"
}
}
}
}
}
}
}
}
}
}
}
} $? "- init_oit %d", back
return back;
}
/** Create new OI.
@param c Conversion structure.
@return Pointer to new OI on success, NULL on error.
*/
static
OI *
new_oi DK_P1(dk_fig_conversion *,c) {
OI *back = NULL;
if(c) {
back = dk_new(OI,1);
if(back) {
if(!init_oi(back, c)) {
delete_oi(back); back = NULL;
}
}
}
return back;
}
/** Handle special comments.
@param oi EPS output instruction structure.
@param o Fig object.
*/
static void
handle_special_comments DK_P2(dkfig_java_output_instruction *,oi, dk_fig_object *,o)
{
int i;
if((o->osc) && (o->osci)) {
dk_fig_opt *speccom;
$? ". processing special comments for object"
dksto_it_reset(o->osci);
while((speccom = (dk_fig_opt *)dksto_it_next(o->osci)) != NULL) {
$? ". speccom = \"%s\"", speccom->name
i = dkfig_opt_process_special_comment(
oi->c, speccom->name, kw[14], 0
);
if((oi->spcpass) == 0) {
dkfig_tool2_report_special_comment(oi->c, speccom, i);
}
}
}
}
/** Clean up (release memory used by dynamic objects).
*/
static
void
cleanup_pass DK_P1(OI *,oi) {
dk_fig_object *o;
$? "+ cleanup_pass"
if(oi->fli) {
dksto_it_reset(oi->fli);
while((o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
if(o->drve) {
drve_delete(o->drve);
o->drve = NULL;
}
}
dksto_it_close(oi->fli);
}
if(oi->fl) { dksto_close(oi->fl); }
oi->fl = NULL;
oi->fli = NULL; $? "- cleanup_pass"
}
/** Find factors and shiftings for coord
transformations.
@param oi EPS output instruction structure.
*/
static int
establish_coord_transformation DK_P1(dkfig_java_output_instruction *,oi)
{
int back = 1;
int math_error = 0;
double xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0;
double cxmin = 0.0, cxmax = 0.0, cymin = 0.0, cymax = 0.0;
$? "+ establish_coord_transformation"
xmin = dkfig_tool_bb_get_xmin(&(oi->d->dbb)); $? ". xmin = %lg", xmin
xmax = dkfig_tool_bb_get_xmax(&(oi->d->dbb)); $? ". xmax = %lg", xmax
ymin = dkfig_tool_bb_get_ymin(&(oi->d->dbb)); $? ". ymin = %lg", ymin
ymax = dkfig_tool_bb_get_ymax(&(oi->d->dbb)); $? ". ymax = %lg", ymax
oi->xfactor = dkma_div_double_ok( 72.0, (oi->d)->fres, &math_error);
oi->yfactor = dkma_div_double_ok( 72.0, (oi->d)->fres, &math_error);
if(!dkfig_tool_invert_y(oi->d)) {
oi->yfactor = 0.0 - oi->yfactor;
} else { $? ". coordinates origin is left upper"
}
xmin = dkma_mul_double_ok(xmin, oi->xfactor, &math_error);
xmax = dkma_mul_double_ok(xmax, oi->xfactor, &math_error);
ymin = dkma_mul_double_ok(ymin, oi->yfactor, &math_error);
ymax = dkma_mul_double_ok(ymax, oi->yfactor, &math_error);
$? ". xmin = %lg", xmin
$? ". xmax = %lg", xmax
$? ". ymin = %lg", ymin
$? ". ymax = %lg", ymax
if(xmax < xmin) {
cxmin = xmin; xmin = xmax; xmax = cxmin;
}
if(ymax < ymin) {
cxmin = ymin; ymin = ymax; ymax = cxmin;
}
#if FORCE_INTEGER
cxmin = floor(xmin); cxmax = ceil(xmax);
cymin = floor(ymin); cymax = ceil(ymax);
#else
cxmin = xmin; cxmax = xmax;
cymin = ymin; cymax = ymax;
#endif
oi->xleft = 0.0; oi->ybottom = 0.0;
oi->xright = dkma_sub_double_ok(cxmax, cxmin, &math_error);
oi->ytop = dkma_sub_double_ok(cymax, cymin, &math_error);
oi->xshift = 0.5 * dkma_sub_double_ok(
oi->xright,
dkma_sub_double_ok(cxmax, cxmin, &math_error),
&math_error
);
oi->yshift = 0.5 * dkma_sub_double_ok(
oi->ytop,
dkma_sub_double_ok(cymax, cymin, &math_error),
&math_error
);
oi->xshift = dkma_sub_double_ok(oi->xshift, cxmin, &math_error);
$? ". xshift = %lg", oi->xshift
oi->yshift = dkma_sub_double_ok(oi->yshift, cymin, &math_error);
$? ". yshift = %lg", oi->yshift
if(math_error) {
back = 0;
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 13);
}
$? ". bounding box %lg %lg %lg %lg", oi->xleft, oi->xright, oi->ybottom, oi->ytop
$? "- establish_coord_transformation %d", back
return back;
}
/** Get linewidth for object.
@param oi EPS output instruction set.
@param ispat Flag: Is pattern.
@return Linewidth.
*/
static
double
get_object_linewidth DK_P2(dkfig_java_output_instruction *,oi, int,ispat)
{
double back = 0.0;
back = dkma_mul_double_ok(
dkma_l_to_double(((oi->o)->fpd).lt),
0.9,
&(oi->me)
);
if(ispat) {
if(!(((oi->o)->fpd).lt)) {
back = 0.9;
}
back = 0.9;
}
if(((oi->c)->opt1) & DKFIG_OPT_ENLIGHTEN_LOOK) {
back = 0.5 * back;
}
return back;
}
/** Register stroke and draw attributes for a path object.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
register_stroke_and_draw DK_P1(OI *,oi) {
int back = 1;
int must_draw = 1;
dkfig_java_drve *drve;
dk_fig_dcc dcc;
dkfig_java_color col, *pcol;
dkfig_java_stroke str, *pstr;
double lw;
if(must_draw) {
drve = (dkfig_java_drve *)((oi->o)->drve);
dkfig_tool_fill_dcc(oi->d, &dcc, ((oi->o)->fpd).pc);
col.r = dcc.red;
col.g = dcc.green;
col.b = dcc.blue;
pcol = dksto_it_find_like(oi->i_c, (void *)(&col), 0);
if(pcol) {
drve->draw = pcol;
} else {
pcol = color_new(dcc.red, dcc.green, dcc.blue);
if(pcol) {
if(dksto_add(oi->s_c, (void *)pcol)) {
drve->draw = pcol;
} else {
back = 0;
color_delete(pcol);
}
} else {
back = 0;
}
}
lw = get_object_linewidth(oi, 0);
str.linewidth = lw;
str.sv = ((oi->o)->fpd).sv;
str.cap = ((oi->o)->fpd).cs;
str.join = ((oi->o)->fpd).js;
str.dash = ((oi->o)->fpd).ls;
pstr = dksto_it_find_like(oi->i_s, (void *)(&str), 0);
if(pstr) {
drve->st = pstr;
} else {
pstr =
stroke_new(lw, ((oi->o)->fpd).sv, ((oi->o)->fpd).cs, ((oi->o)->fpd).js, ((oi->o)->fpd).ls);
if(pstr) {
if(dksto_add(oi->s_s, (void *)pstr)) {
drve->st = pstr;
} else {
back = 0; stroke_delete(pstr);
}
} else {
back = 0;
}
}
}
return back;
}
/** Write a number, use at least the required length.
@param s Stream pointer.
@param u The number to write.
@param l The minimum length to use.
*/
static
void
num_with_length DK_P3(dk_stream_t *,s, unsigned long,u, size_t,l) {
char buffer[256]; size_t i;
sprintf(buffer, "%lu", u);
i = strlen(buffer);
while(i++ < l) dkstream_puts(s, kw[144]);
dkstream_puts(s, buffer);
}
/** Register fill style attribute for a path object.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
register_fill DK_P1(OI *,oi) {
int back = 1;
int must_draw = 1;
dkfig_java_drve *drve;
dk_fig_dcc dcc;
dkfig_java_color col, *pcol;
if(must_draw) {
if(dkfig_tool_must_pattern(((oi->o)->fpd).af, (oi->c)->opt1)) {
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_WARNING, 140);
}
drve = (dkfig_java_drve *)((oi->o)->drve);
dkfig_tool_fill_dcc(oi->d, &dcc, ((oi->o)->fpd).fc);
dkfig_tool_correct_dcc(&dcc, ((oi->o)->fpd).fc, ((oi->o)->fpd).af);
col.r = dcc.red; col.g = dcc.green; col.b = dcc.blue;
pcol = dksto_it_find_like(oi->i_c, (void *)(&col), 0);
if(pcol) {
drve->fill = pcol;
} else {
pcol = color_new(dcc.red, dcc.green, dcc.blue);
if(pcol) {
if(dksto_add(oi->s_c, (void *)pcol)) {
drve->fill = pcol;
} else {
back = 0; color_delete(pcol);
}
} else {
back = 0;
}
}
}
return back;
}
/** Register style attributes (font and color) for a text object.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
register_font_and_color DK_P1(OI *,oi) {
int back = 1;
dkfig_java_font fnt, *pfnt;
dk_fig_text *t;
dkfig_java_drve *drve;
dk_fig_dcc dcc;
dkfig_java_color col, *pcol;
$? "+ register_font_and_color"
t = (dk_fig_text *)((oi->o)->data);
drve = (dkfig_java_drve *)((oi->o)->drve);
drve->tn = oi->n_t;
oi->n_t += 1UL;
if(t) { $? ". text ok"
if(!((t->font_flags) & 8)) {
if((t->font_flags) & 2) {
/* WARNUNG: Special text. */
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_WARNING, 139);
}
if((t->font_flags) & 4) { // PS font
fnt.font = t->font;
if(t->font == -1) fnt.font = 0;
} else { // LaTeX font
switch(t->font) {
case 2: { fnt.font = 2; } break;
case 3: { fnt.font = 1; } break;
case 4: { fnt.font = 16; } break;
case 5: { fnt.font = 12; } break;
default: { fnt.font = 0; } break;
}
}
fnt.size = t->font_size;
pfnt = dksto_it_find_like(oi->i_f, (void *)(&fnt), 0);
if(pfnt) {
drve->font = pfnt;
} else {
pfnt = font_new(t->font, t->font_size);
if(pfnt) {
if(dksto_add(oi->s_f, (void *)pfnt)) {
drve->font = pfnt;
} else {
back = 0;
font_delete(pfnt);
}
} else {
back = 0;
}
}
dkfig_tool_fill_dcc(oi->d, &dcc, ((oi->o)->fpd).pc);
col.r = dcc.red;
col.g = dcc.green;
col.b = dcc.blue;
pcol = dksto_it_find_like(oi->i_c, (void *)(&col), 0);
if(pcol) {
drve->draw = pcol;
} else {
pcol = color_new(dcc.red, dcc.green, dcc.blue);
if(pcol) {
if(dksto_add(oi->s_c, (void *)pcol)) {
drve->draw = pcol;
} else {
back = 0;
color_delete(pcol);
}
} else {
back = 0;
}
}
}
} $? "- register_font_and_color %d", back
return back;
}
/** Register style attributes for an image (image name).
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
register_image DK_P1(OI *,oi) {
int back = 1;
dkfig_java_image img, *pimg;
dkfig_java_drve *drve;
dk_fig_polyline *p;
p = (dk_fig_polyline *)((oi->o)->data);
drve = (dkfig_java_drve *)((oi->o)->drve);
if(p->imagename) {
img.filename = p->imagename;
pimg = dksto_it_find_like(oi->i_i, (void *)(&img), 0);
if(pimg) {
drve->img = pimg;
} else {
back = 0;
pimg = image_new(p->imagename);
if(pimg) {
if(dksto_add(oi->s_i, (void *)pimg)) {
drve->img = pimg;
back = 1;
} else {
image_delete(pimg);
}
}
}
}
return back;
}
/** Transfer current objects bb to layer bb.
@param oi Output structure.
@param play Layer object pointer.
*/
static
void
object_to_layer DK_P2(OI *,oi, dkfig_java_layer *,play) {
dkfig_tool_bb_add_x(
&(play->bb), dkfig_tool_bb_get_xmin(&((oi->o)->dbb))
);
dkfig_tool_bb_add_x(
&(play->bb), dkfig_tool_bb_get_xmax(&((oi->o)->dbb))
);
dkfig_tool_bb_add_y(
&(play->bb), dkfig_tool_bb_get_ymin(&((oi->o)->dbb))
);
dkfig_tool_bb_add_y(
&(play->bb), dkfig_tool_bb_get_ymax(&((oi->o)->dbb))
);
}
/** Register object bounding box in layer bounding box.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
register_layer_bb DK_P1(OI *,oi) {
int back = 1;
dkfig_java_layer lay, *play;
lay.layer = (oi->o)->layer;
play = dksto_it_find_like(oi->i_l, (void *)(&lay), 0);
if(play) {
object_to_layer(oi, play);
} else {
back = 0;
play = dk_new(dkfig_java_layer,1);
if(play) {
play->layer = (oi->o)->layer;
dkfig_tool_bb_reset(&(play->bb));
if(dksto_add(oi->s_l, (void *)play)) {
back = 1;
object_to_layer(oi, play);
} else {
dk_delete(play); play = NULL;
}
}
}
return back;
}
/** Register object style attributes to style elements.
@param oi Output structure.
@return 1 on success, 0 on error (memory problem).
*/
static
int
register_object_attributes DK_P1(OI *,oi) {
int back = 1;
switch((oi->o)->objtype) {
case DK_FIG_OBJ_TEXT: {
back = register_font_and_color(oi);
} break;
case DK_FIG_OBJ_ARC:
case DK_FIG_OBJ_ELLIPSE:
case DK_FIG_OBJ_SPLINE:
case DK_FIG_OBJ_POLYLINE:
{
if(must_stroke_object(oi)) {
back = register_stroke_and_draw(oi);
}
if(must_fill_object(oi)) {
if(!register_fill(oi)) { back = 0; }
}
if((oi->o)->objtype == DK_FIG_OBJ_POLYLINE) {
if((oi->o)->subtype == 5) {
back = register_image(oi);
}
}
if(!register_layer_bb(oi)) {
back = 0;
}
} break;
}
return back;
}
/** Enumerate style elements.
@param oi Output structure.
*/
static
void
enumerate_elements DK_P1(OI *,oi) {
unsigned long n;
dkfig_java_color *c;
dkfig_java_font *f;
dkfig_java_stroke *s;
dkfig_java_image *i;
$? "+ enumerate_elements"
dksto_it_reset(oi->i_c); n = 0UL;
while((c = (dkfig_java_color *)dksto_it_next(oi->i_c)) != NULL) {
c->colno = n;
n++;
}
oi->n_c = n; oi->l_c = number_length(n);
dksto_it_reset(oi->i_f); n = 0UL;
while((f = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
f->fontno = n;
n++;
}
oi->n_f = n; oi->l_f = number_length(n);
dksto_it_reset(oi->i_s); n = 0UL;
while((s = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
s->strokeno = n;
n++;
}
oi->n_s = n; oi->l_s = number_length(2UL * n);
dksto_it_reset(oi->i_i); n = 0UL;
while((i = (dkfig_java_image *)dksto_it_next(oi->i_i)) != NULL) {
i->imgno = n;
n++;
}
oi->n_i = n; oi->l_i = number_length(n);
$? "- enumerate_elements"
}
/** Attempt to load a font map file.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
load_font_map_file DK_P1(OI *,oi) {
int back = 1;
if((oi->c)->fcfg) {
oi->fontmap = dkfig_tool2_read_font_mapping(oi->c);
if(!(oi->fontmap)) {
back = 0;
}
}
return back;
}
/** Gather all information needed for output.
@param oi OI structure.
@return 1 on success, 0 on error.
*/
static
int
preparation_pass DK_P1(OI *,oi) {
int back = 0;
int font_map_failed = 0;
dk_fig_object *o;
unsigned long backuplineno, backupopt1, backupopt2;
int backupia;
$? "+ preparation_pass"
oi->fl = dkfig_flat_list(oi->c, (oi->c)->drwng);
if(oi->fl) {
oi->fli = dksto_it_open(oi->fl);
if(oi->fli) {
if(establish_coord_transformation(oi)) {
back = 1;
dksto_it_reset(oi->fli);
while((o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
oi->o = o;
backuplineno = dkapp_get_source_lineno((oi->c)->app);
dkapp_set_source_lineno((oi->c)->app, o->lineno);
backupopt1 = (oi->c)->opt1;
backupopt2 = (oi->c)->opt2;
backupia = (oi->c)->image_align;
if((oi->c)->app) { dkapp_set_source_lineno((oi->c)->app, o->lineno); }
handle_special_comments(oi, o);
o->drve = drve_new();
if(o->drve) {
if(!register_object_attributes(oi)) {
back = 0;
}
} else {
back = 0;
}
if(oi->me) {
back = 0; oi->me = 0;
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 13);
}
(oi->c)->image_align = backupia;
(oi->c)->opt2 = backupopt2;
(oi->c)->opt1 = backupopt1;
dkapp_set_source_lineno((oi->c)->app, backuplineno);
}
oi->spcpass += 1;
if((oi->c)->app) { dkapp_set_source_lineno((oi->c)->app, 0UL); }
enumerate_elements(oi);
if(!load_font_map_file(oi)) {
back = 0; font_map_failed = 1;
}
}
} else {
}
} else {
}
if(back) {
if(oi->me) {
back = 0;
/* ##### ERROR: Math. */
}
} else {
if(font_map_failed) {
/* ERROR: Failed to load font map file. */
if((oi->c)->fcfg) {
dkfig_tool2_msg3(oi->c, DK_LOG_LEVEL_ERROR, 134, 135, (oi->c)->fcfg);
}
} else {
/* ERROR: Memory */
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 11);
}
} $? "- preparation_pass %d", back
return back;
}
/** Write file name as class name (remove directory and suffix).
@param oi Output structure.
@param fn File name.
@return 1 on success, 0 on error.
*/
static
int
class_name_output DK_P2(OI *,oi, char *,fn) {
char x[2];
int back = 0;
int cc ;
char *ptr;
char *last;
$? "+ class_name_output %s", TR_STR(fn)
ptr = fn; last = NULL;
while(*ptr) { if((*ptr == '\\') || (*ptr == '/')) { last = ptr; } ptr++; }
ptr = fn; cc = 1;
if(last) { ptr = last; ptr++; }
x[1] = '\0';
while(cc) {
if(*ptr) {
if(*ptr != '.') {
x[0] = *ptr;
dkstream_puts(oi->s, x);
back = 1;
} else { cc = 0; }
ptr++;
} else { cc = 0; }
} $? "- class_name_output"
return back;
}
/** Write class name to Java output file.
@param oi Output structure.
*/
static
void
print_class_name DK_P1(OI *,oi) {
int ok = 0;
$? "+ print_class_name"
if(oi->c) {
if((oi->c)->ofn2) {
ok = class_name_output(oi, (oi->c)->ofn2);
} else {
if((oi->c)->ifn2) {
ok = class_name_output(oi, (oi->c)->ifn2);
}
}
}
if(!ok) {
kw_out(oi, 8);
} $? "- print_class_name"
}
/** Print graphics width and height.
@param oi Output structure.
*/
static
void
wh_out DK_P1(OI *,oi) {
kw_out(oi, 162); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 15); kw_out(oi, 0);
kw_out(oi, 16); dkstream_puts_double(oi->s, oi->xright);
kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 17); kw_out(oi, 0);
kw_out(oi, 18); dkstream_puts_double(oi->s, oi->ytop);
kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 163); kw_out(oi, 0);
kw_out(oi, 164);
/* h align. */
switch((oi->c)->align_h) {
case DKFIG_ALIGN_H_LEFT: {
kw_out(oi, 97);
} break;
case DKFIG_ALIGN_H_RIGHT: {
kw_out(oi, 99);
} break;
default: {
kw_out(oi, 98);
} break;
}
kw_out(oi, 10); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 165); kw_out(oi, 0);
kw_out(oi, 166);
/* v align. */
switch((oi->c)->align_v) {
case DKFIG_ALIGN_V_TOP: {
kw_out(oi, 131);
} break;
case DKFIG_ALIGN_V_BOTTOM: {
kw_out(oi, 132);
} break;
default: {
kw_out(oi, 130);
} break;
}
kw_out(oi, 10); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 158); kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
}
/** Write initialization function to Java output file.
@param oi Output structure.
*/
static
int
init_out DK_P1(OI *,oi) {
int back = 1;
dkfig_java_color *c;
dkfig_java_font *f;
dkfig_java_stroke *s;
dkfig_java_image *i;
int ft;
int ff;
double dv;
double dist;
double dashgap;
char *ptr;
char *found;
oi->me = 0;
kw_out(oi, 0);
section_out(oi, init_begin);
kw_out(oi, 33); kw_out(oi, 0);
dksto_it_reset(oi->i_c);
while((c = (dkfig_java_color *)dksto_it_next(oi->i_c)) != NULL) {
kw_out(oi, 29);
num_with_length(oi->s, c->colno, oi->l_c);
kw_out(oi, 30);
force_double(oi->s, c->r); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, c->g); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, c->b); kw_out(oi, 61);
kw_out(oi, 31); kw_out(oi, 0);
}
dksto_it_reset(oi->i_f);
while((f = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
kw_out(oi, 35);
num_with_length(oi->s, f->fontno, oi->l_f);
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES) {
kw_out(oi, 173);
} else {
kw_out(oi, 36);
}
kw_out(oi, 48); kw_out(oi, 50);
dkstream_puts_ul(oi->s, (unsigned long)(f->font));
kw_out(oi, 51);
kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 49); kw_out(oi, 50);
dkstream_puts_ul(oi->s, (unsigned long)(f->font));
kw_out(oi, 51);
kw_out(oi, 5); kw_out(oi, 1);
ft = dkfont_get_features(f->font);
switch(ft & (DK_FONT_FEATURE_BD | DK_FONT_FEATURE_IT)) {
case DK_FONT_FEATURE_BD: {
ff = 56;
} break;
case DK_FONT_FEATURE_IT: {
ff = 57;
} break;
case (DK_FONT_FEATURE_BD | DK_FONT_FEATURE_IT) : {
ff = 58;
} break;
default: {
ff = 55;
} break;
}
switch(ft & DK_FONT_FEATURE_TT) {
case DK_FONT_FEATURE_TT: {
ft = 54;
} break;
case DK_FONT_FEATURE_SF: {
ft = 53;
} break;
default: {
ft = 52;
} break;
}
kw_out(oi, ft); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, ff); kw_out(oi, 5); kw_out(oi, 1);
// force_double(oi->s, f->size);
force_double(
oi->s,
dkma_double_restrict_digits(
dkma_mul_double_ok(
f->size,
(oi->c)->fsf,
&(oi->me)
),
2
)
);
if(oi->me) {
back = 0;
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 13);
oi->me = 0;
}
kw_out(oi, 61);
kw_out(oi, 31);
kw_out(oi, 0);
}
// Object strokes
dksto_it_reset(oi->i_s);
while((s = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
/* Initialize stroke. */
kw_out(oi, 59);
num_with_length(oi->s, s->strokeno, oi->l_s);
kw_out(oi, 60);
force_double(oi->s, s->linewidth);
kw_out(oi, 61); kw_out(oi, 5); kw_out(oi, 1);
switch(s->cap) {
case 2: { kw_out(oi, 64); } break;
case 1: { kw_out(oi, 63); } break;
default: { kw_out(oi, 62); } break;
} kw_out(oi, 5); kw_out(oi, 1);
switch(s->join) {
case 2: { kw_out(oi, 66); } break;
case 1: { kw_out(oi, 65); } break;
default: { kw_out(oi, 67); } break;
} kw_out(oi, 5); kw_out(oi, 1);
if(((s->join != 1) && (s->join != 2)) || ((s->dash > 0) && (s->dash < 6))) {
if((s->join != 1) && (s->join != 2)) {
dv = s->linewidth * 10.0;
if(dv < 10.0) dv = 10.0;
force_double(oi->s, dv); kw_out(oi, 61);
} else {
force_double(oi->s, 0.0); kw_out(oi, 61);
}
if((s->dash > 0) && (s->dash < 6)) {
dist = 0.9 * s->sv;
dashgap = 0.1;
if(s->linewidth > 0.0) dashgap = 0.1 * s->linewidth;
if(((oi->c)->opt1) & DKFIG_OPT_DP_DOT_LW) {
dashgap = s->linewidth;
}
kw_out(oi, 5);
kw_out(oi, 68);
switch(s->dash) {
case 1: {
force_double(oi->s, dist); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
} break;
case 2: {
force_double(oi->s, dashgap); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
} break;
case 3: case 4: case 5: {
force_double(oi->s, dist); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dashgap); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
if(s->dash > 3) {
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dashgap); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
if(s->dash > 4) {
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dashgap); kw_out(oi, 61);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, dist); kw_out(oi, 61);
}
}
} break;
}
kw_out(oi, 3);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, 0.0); kw_out(oi, 61);
}
}
kw_out(oi, 31); kw_out(oi, 0);
}
// Arrowhead strokes
dksto_it_reset(oi->i_s);
while((s = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
/* Initialize stroke. */
kw_out(oi, 59);
num_with_length(oi->s, (oi->n_s + s->strokeno), oi->l_s);
kw_out(oi, 60);
force_double(oi->s, s->linewidth);
kw_out(oi, 61); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 62); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 67);
kw_out(oi, 31); kw_out(oi, 0);
}
dksto_it_reset(oi->i_i);
while((i = (dkfig_java_image *)dksto_it_next(oi->i_i)) != NULL) {
$? ". must initialize image"
/* Initialize image. */
kw_out(oi, 80);
num_with_length(oi->s, i->imgno, oi->l_i);
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES) {
kw_out(oi, 172);
} else {
kw_out(oi, 81);
}
if(i->filename) {
ptr = i->filename; found = NULL;
while(*ptr) {
if((*ptr == '/') || (*ptr == '\\')) {
found = ptr;
}
ptr++;
}
if(found) found++;
else found = i->filename;
dkstream_puts(oi->s, found);
}
kw_out(oi, 46); kw_out(oi, 31); kw_out(oi, 0);
}
kw_out(oi, 34); kw_out(oi, 0);
section_out(oi, init_end);
return back;
}
/** Set font.
@param oi Output structure.
@param isc Flag: Use copy g2 (1) or original (0).
@param fontno Index of new current font.
*/
static
void
set_font DK_P3(OI *,oi, int,isc, unsigned long,fontno) {
kw_out(oi, 89);
kw_out(oi, 90);
if(isc) kw_out(oi, 91);
kw_out(oi, 92);
num_with_length(oi->s, fontno, oi->l_f);
kw_out(oi, 31);
kw_out(oi, 0);
}
/** Set color.
@param oi Output structure.
@param isc Flag: Use copy g2 (1) or original (0).
@param colno Index of the new current color.
*/
static
void
set_color DK_P3(OI *,oi, int,isc, unsigned long,colno) {
kw_out(oi, 89);
kw_out(oi, 90);
if(isc) kw_out(oi, 91);
kw_out(oi, 93);
num_with_length(oi->s, colno, oi->l_c);
kw_out(oi, 31);
kw_out(oi, 0);
}
/** Set new current font, keep font number in mind.
@param oi Output structure.
@param f Font structure.
*/
static
void
set_registered_font DK_P2(OI *,oi, dkfig_java_font *,f) {
if((!(oi->h_f)) || (oi->c_f != f->fontno)) {
set_font(oi, 0, f->fontno);
oi->h_f = 0x01; oi->c_f = f->fontno;
}
}
/** Set stroke.
@param oi Output structure.
@param isc Flag: Use copy g2 (1) or original (0).
@param n Index of the new current stroke.
*/
static
void
set_stroke DK_P3(OI *,oi, int,isc, unsigned long,n) {
kw_out(oi, 89);
kw_out(oi, 90);
if(isc) kw_out(oi, 91);
kw_out(oi, 113);
num_with_length(oi->s, n, oi->l_s);
kw_out(oi, 31); kw_out(oi, 0);
}
/** Set new current stroke, keep number in mind.
@param oi Output structure.
@param s Index of new current stroke.
*/
static
void
set_registered_stroke_number DK_P2(OI *,oi, unsigned long,s) {
if((!(oi->h_s)) || (oi->c_s != s)) {
set_stroke(oi, 0, s);
oi->h_s = 0x01; oi->c_s = s;
}
}
/** Set new current stroke, keep number in mind.
@param oi Output structure.
@param s New current stroke.
*/
static
void
set_registered_stroke DK_P2(OI *,oi, dkfig_java_stroke *,s) {
set_registered_stroke_number(oi, s->strokeno);
}
/** Set new current color, keep number in mind.
@param oi Output structure.
@param c Index of the new current color.
*/
static
void
set_registered_color_number DK_P2(OI *,oi, unsigned long,c) {
if((!(oi->h_c)) || (oi->c_c != c)) {
set_color(oi, 0, c);
oi->h_c = 0x01; oi->c_c = c;
}
}
/** Set new current color, keep number in mind.
@param oi Output structure.
@param c New current color.
*/
static
void
set_registered_color DK_P2(OI *,oi, dkfig_java_color *,c) {
set_registered_color_number(oi, c->colno);
}
/** Write current object (text object).
@param oi Output structure.
@return Graphics context to use: 1=g, 2=g2.
*/
static
int
print_text_object DK_P1(OI *,oi) {
int back = 1;
dk_fig_text *t;
dkfig_java_drve *drve;
dkfig_java_font *f;
dkfig_java_color *c;
t = (dk_fig_text *)((oi->o)->data);
drve = (dkfig_java_drve *)((oi->o)->drve);
f = drve->font; c = drve->draw;
if(!((t->font_flags) & 8)) {
if((f) && (c)) {
kw_out(oi, 86); kw_out(oi, 0);
set_registered_font(oi, f);
set_registered_color(oi, c);
if(fabs(t->angle) > epsilon) {
kw_out(oi, 88); kw_out(oi, 0);
kw_out(oi, 89);
kw_out(oi, 101);
lpointout(oi, t->x, t->y);
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 89);
kw_out(oi, 100);
force_double(oi->s, (0.0 - t->angle));
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 148);
dkstream_puts_ul(oi->s, drve->tn);
kw_out(oi, 149);
kw_out(oi, 94); kw_out(oi, 91); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 95); kw_out(oi, 50);
dkstream_puts_ul(oi->s, drve->tn);
kw_out(oi, 51); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 96); num_with_length(oi->s, f->fontno, oi->l_f);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, 0.0);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, 0.0);
kw_out(oi, 5); kw_out(oi, 1);
switch((oi->o)->subtype) {
case 2: {
kw_out(oi, 99);
} break;
case 1: {
kw_out(oi, 98);
} break;
default: {
kw_out(oi, 97);
} break;
}
kw_out(oi, 31); kw_out(oi, 1); kw_out(oi, 3); kw_out(oi, 0);
} else {
kw_out(oi, 148);
dkstream_puts_ul(oi->s, drve->tn);
kw_out(oi, 149);
kw_out(oi, 94); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 95); kw_out(oi, 50);
dkstream_puts_ul(oi->s, drve->tn);
kw_out(oi, 51); kw_out(oi, 5); kw_out(oi, 1);
kw_out(oi, 96); num_with_length(oi->s, f->fontno, oi->l_f);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, t->x, t->y);
kw_out(oi, 5); kw_out(oi, 1);
switch((oi->o)->subtype) {
case 2: {
kw_out(oi, 99);
} break;
case 1: {
kw_out(oi, 98);
} break;
default: {
kw_out(oi, 97);
} break;
}
kw_out(oi, 31); kw_out(oi, 1); kw_out(oi, 3); kw_out(oi, 0);
}
kw_out(oi, 87); kw_out(oi, 0);
} else {
/* ##### Internal error. */
back = 0;
}
}
return back;
}
/** Write current object (arc object).
@param oi Output structure.
@return Graphics context to use: 1=g, 2=g2.
*/
static
int
write_arc DK_P1(OI *,oi) {
int back = 0;
dk_fig_arc *a;
dk_fig_bb bbdest;
double w;
double h;
double x0;
double y0;
a = (dk_fig_arc *)((oi->o)->data);
if(a) {
back = 1;
dkfig_tool_bb_reset(&bbdest);
dkfig_tool_bb_add_x(
&bbdest,
dkma_sub_double_ok(
convertX(oi, (a->calc).xm), convertR(oi, (a->calc).ra), &(oi->me)
)
);
dkfig_tool_bb_add_x(
&bbdest,
dkma_add_double_ok(
convertX(oi, (a->calc).xm), convertR(oi, (a->calc).ra), &(oi->me)
)
);
dkfig_tool_bb_add_y(
&bbdest,
dkma_sub_double_ok(
convertY(oi, (a->calc).ym), convertR(oi, (a->calc).ra), &(oi->me)
)
);
dkfig_tool_bb_add_y(
&bbdest,
dkma_add_double_ok(
convertY(oi, (a->calc).ym), convertR(oi, (a->calc).ra), &(oi->me)
)
);
x0 = bbdest.xmin; y0 = bbdest.ymin;
w = dkma_sub_double_ok(bbdest.xmax, bbdest.xmin, &(oi->me));
h = dkma_sub_double_ok(bbdest.ymax, bbdest.ymin, &(oi->me));
kw_out(oi, 89); kw_out(oi, 126); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, x0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y0);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, w);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, h);
kw_out(oi, 5); kw_out(oi, 1);
force_double(
oi->s,
dkma_mul_double_ok(
360.0,
dkma_div_double_ok((a->calc).astart, 2 * M_PI, &(oi->me)),
&(oi->me)
)
);
kw_out(oi, 5); kw_out(oi, 1);
force_double(
oi->s,
dkma_mul_double_ok(
360.0,
dkma_div_double_ok((a->calc).alength, 2 * M_PI, &(oi->me)),
&(oi->me)
)
);
kw_out(oi, 5); kw_out(oi, 0); kw_out(oi, 129);
kw_out(oi, (((oi->o)->subtype == 1) ? 127 : 128));
kw_out(oi, 0); kw_out(oi, 89);
kw_out(oi, 31); kw_out(oi, 0);
}
return back;
}
/** Write current object (spline object).
@param oi Output structure.
@return Graphics context to use: 1=g, 2=g2.
*/
static
int
write_spline DK_P1(OI *,oi) {
int back = 0;
dk_fig_spline *s;
dk_fig_bezier_point *bpptr;
size_t nsegs; /* Segments */
size_t li; /* Left border of current segment. */
size_t ri; /* Right border of current segment. */
size_t maxli; /* Maximum for left li. */
s = (dk_fig_spline *)((oi->o)->data);
if(s) {
back = 1;
bpptr = s->bpoints;
nsegs = s->nbpoints - 1;
if(((oi->o)->fpd).cl) { nsegs = s->nbpoints; }
kw_out(oi, 89); kw_out(oi, 109); kw_out(oi, 0);
if((!(((oi->o)->fpd).cl)) && (((oi->o)->fpd).ar & 2)) {
kw_out(oi, 89); kw_out(oi, 110);
dpointout(oi, (s->pa).value.x, (s->pa).value.y);
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 89); kw_out(oi, 125);
dpointout(oi, (s->pa).rcontrol.x, (s->pa).rcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, (s->pa2).lcontrol.x, (s->pa2).lcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, (s->pa2).value.x, (s->pa2).value.y);
kw_out(oi, 31); kw_out(oi, 0);
li = s->normals;
} else {
kw_out(oi, 89); kw_out(oi, 110);
dpointout(oi, bpptr[0].value.x, bpptr[0].value.y);
kw_out(oi, 31); kw_out(oi, 0);
li = 0;
}
if((s->normale > 0) || (((oi->o)->fpd).cl) || (!((((oi->o)->fpd).ar) & 1))) {
maxli = s->nbpoints - 2;
if(((oi->o)->fpd).cl) { maxli = s->nbpoints - 1; }
if((!(((oi->o)->fpd).cl)) && (((oi->o)->fpd).ar & 1)) {
maxli = s->normale - 1;
}
while(li <= maxli) {
ri = li + 1;
if(ri >= s->nbpoints) { ri = 0; }
kw_out(oi, 89); kw_out(oi, 125);
dpointout(oi, bpptr[li].rcontrol.x, bpptr[li].rcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, bpptr[ri].lcontrol.x, bpptr[ri].lcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, bpptr[ri].value.x, bpptr[ri].value.y);
kw_out(oi, 31); kw_out(oi, 0);
li++;
}
}
if(((oi->o)->fpd).cl) {
kw_out(oi, 89); kw_out(oi, 112); kw_out(oi, 0);
} else {
if((((oi->o)->fpd).ar) & 1) {
kw_out(oi, 89); kw_out(oi, 125);
dpointout(oi, (s->pe2).rcontrol.x, (s->pe2).rcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, (s->pe).lcontrol.x, (s->pe).lcontrol.y);
kw_out(oi, 5); kw_out(oi, 1);
dpointout(oi, (s->pe).value.x, (s->pe).value.y);
kw_out(oi, 31); kw_out(oi, 0);
}
}
back = 1;
}
return back;
}
/** Write current object (polyline object).
@param oi Output structure.
@return Graphics context to use: 1=g, 2=g2.
*/
static
int
write_polyline DK_P1(OI *,oi) {
int back = 0;
dk_fig_polyline *p;
long *xptr;
long *yptr;
dk_fig_bb bbdest;
double x0;
double y0;
double w;
double h;
double r;
size_t i;
p = (dk_fig_polyline *)((oi->o)->data);
if(p) {
back = 1;
xptr = p->xvalues; yptr = p->yvalues;
switch((oi->o)->subtype) {
case 2: case 4: case 5: { // rectangle
dkfig_tool_bb_reset(&bbdest);
for(i = 0; i < p->npoints; i++) {
dkfig_tool_bb_add_x(&bbdest, convertXl(oi, *(xptr++)));
dkfig_tool_bb_add_y(&bbdest, convertYl(oi, *(yptr++)));
}
x0 = bbdest.xmin;
y0 = bbdest.ymin;
w = dkma_sub_double_ok(bbdest.xmax, bbdest.xmin, &(oi->me));
h = dkma_sub_double_ok(bbdest.ymax, bbdest.ymin, &(oi->me));
if((oi->o)->subtype == 4) { // arc rectangle
r = 0.9 * dkma_l_to_double(p->radius);
if(r > (0.5 * w)) r = 0.5 * w;
if(r > (0.5 * h)) r = 0.5 * h;
kw_out(oi, 89);
kw_out(oi, 108); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, x0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, w); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, h); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, r); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, r); kw_out(oi, 0); kw_out(oi, 89);
kw_out(oi, 31); kw_out(oi, 0);
back = 1;
} else { // normal rectangle
kw_out(oi, 89);
kw_out(oi, 107); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, x0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, w); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, h); kw_out(oi, 0); kw_out(oi, 89);
kw_out(oi, 31); kw_out(oi, 0);
back = 1;
}
} break;
default: { // real polygon or polyline
kw_out(oi, 89); kw_out(oi, 109); kw_out(oi, 0);
for(i = 0; i < p->npoints; i++) {
kw_out(oi, 89);
if(i == 0) { // first point
kw_out(oi, 110);
if((!(((oi->o)->fpd).cl)) && ((((oi->o)->fpd).ar) & 2)) {
dpointout(oi, (p->pa).x, (p->pa).y);
} else {
lpointout(oi, xptr[i], yptr[i]);
}
kw_out(oi, 31); kw_out(oi, 0);
} else {
kw_out(oi, 111);
if(i == (p->npoints - 1)) { // last point
if((!(((oi->o)->fpd).cl)) && ((((oi->o)->fpd).ar) & 1)) {
dpointout(oi, (p->pe).x, (p->pe).y);
} else {
lpointout(oi, xptr[i], yptr[i]);
}
} else { // inner point
lpointout(oi, xptr[i], yptr[i]);
}
kw_out(oi, 31); kw_out(oi, 0);
}
}
if(((oi->o)->fpd).cl) {
kw_out(oi, 89); kw_out(oi, 112); kw_out(oi, 0);
}
} break;
}
}
return back;
}
/** Write current object (ellipse object).
@param oi Output structure.
@return Graphics context to use: 1=g, 2=g2.
*/
static
int
write_ellipse DK_P1(OI *,oi) {
int back = 0;
dk_fig_ellipse *e;
dk_fig_bb bbdest;
double w;
double h;
double x0;
double y0;
e = (dk_fig_ellipse *)((oi->o)->data);
if(e) {
back = 1;
dkfig_tool_bb_reset(&bbdest);
dkfig_tool_bb_add_x(
&bbdest,
dkma_sub_double_ok(
convertXl(oi, e->centerx), convertRl(oi, e->radiusx), &(oi->me)
)
);
dkfig_tool_bb_add_x(
&bbdest,
dkma_add_double_ok(
convertXl(oi, e->centerx), convertRl(oi, e->radiusx), &(oi->me)
)
);
dkfig_tool_bb_add_y(
&bbdest,
dkma_sub_double_ok(
convertYl(oi, e->centery), convertRl(oi, e->radiusy), &(oi->me)
)
);
dkfig_tool_bb_add_y(
&bbdest,
dkma_add_double_ok(
convertYl(oi, e->centery), convertRl(oi, e->radiusy), &(oi->me)
)
);
x0 = bbdest.xmin; y0 = bbdest.ymin;
w = dkma_sub_double_ok(bbdest.xmax, bbdest.xmin, &(oi->me));
h = dkma_sub_double_ok(bbdest.ymax, bbdest.ymin, &(oi->me));
if((e->radiusx != e->radiusy) && (fabs(e->angle) > epsilon)) {
back = 2;
kw_out(oi, 88);
kw_out(oi, 101);
lpointout(oi, e->centerx, e->centery);
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 100);
force_double(oi->s, (0.0 - e->angle));
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 89); kw_out(oi, 114); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, (0.0 - 0.5 * w)); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, (0.0 - 0.5 * h)); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, w); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, h); kw_out(oi, 0); kw_out(oi, 89);
kw_out(oi, 31); kw_out(oi, 0);
} else {
kw_out(oi, 89); kw_out(oi, 114); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, x0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y0); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, w); kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, h); kw_out(oi, 0); kw_out(oi, 89);
kw_out(oi, 31); kw_out(oi, 0);
}
}
return back;
}
/** Write path and optionally new graphics context g2.
@param oi Output structure.
@return 0=no draw, 1=g, 2=g2.
*/
static
int
write_path DK_P1(OI *,oi) {
int back = 0;
switch((oi->o)->objtype) {
case DK_FIG_OBJ_ELLIPSE: {
back = write_ellipse(oi);
} break;
case DK_FIG_OBJ_POLYLINE: {
back = write_polyline(oi);
} break;
case DK_FIG_OBJ_SPLINE: {
back = write_spline(oi);
} break;
case DK_FIG_OBJ_ARC: {
back = write_arc(oi);
} break;
}
return back;
}
/** Write arrowhead path.
@param oi Output structure.
@param a Arrowhead data.
@param ai Arrowhead index (0=forward, 1=backward).
*/
static
void
path_arrowhead DK_P3(OI *,oi, dk_fig_arrow *,a, int,ai) {
kw_out(oi, 89);
kw_out(oi, (115+ai)); kw_out(oi, 0);
kw_out(oi, 89);
kw_out(oi, (117+ai));
kw_out(oi, 119);
dpointout(oi, (a->p1).x, (a->p1).y);
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 89);
kw_out(oi, (117+ai));
kw_out(oi, 120);
dpointout(oi, (a->p2).x, (a->p2).y);
kw_out(oi, 31); kw_out(oi, 0);
kw_out(oi, 89);
kw_out(oi, (117+ai));
kw_out(oi, 120);
dpointout(oi, (a->p3).x, (a->p3).y);
kw_out(oi, 31); kw_out(oi, 0);
if(a->type > 1) { // 4 points
kw_out(oi, 89);
kw_out(oi, (117+ai));
kw_out(oi, 120);
dpointout(oi, (a->p4).x, (a->p4).y);
kw_out(oi, 31); kw_out(oi, 0);
}
if(a->type > 0) { // closepath
kw_out(oi, 89); kw_out(oi, (117+ai));
kw_out(oi, 121); kw_out(oi, 0);
}
}
/** Write arrowhead.
@param oi Output structure.
@param a Arrowhead data.
@param ai Arrowhead index (0=forward, 1=backward).
@param c Draw color object number.
@param s Stroke object number.
*/
static
void
arrowhead DK_P5(\
OI *,oi, dk_fig_arrow *,a, int,ai, unsigned long,c, unsigned long,s)
{
$? "+ arrowhead type=%d style=%d", a->type, a->style
path_arrowhead(oi, a, ai);
if(a->type > 0) {
if(a->style == 0) { $? ". arrowhead in white"
// set color white
kw_out(oi, 89); kw_out(oi, 122); kw_out(oi, 0);
oi->h_c = 0x00;
} else { $? ". arrowhead in line color"
set_registered_color_number(oi, c);
}
// fill
kw_out(oi, 89);
kw_out(oi, 90);
kw_out(oi, 123);
kw_out(oi, (117+ai));
kw_out(oi, 31);
kw_out(oi, 0);
}
// set draw color
set_registered_color_number(oi, c);
set_registered_stroke_number(oi, (oi->n_s + s));
// draw arrowhead
kw_out(oi, 89);
kw_out(oi, 90);
kw_out(oi, 124);
kw_out(oi, (117+ai));
kw_out(oi, 31);
kw_out(oi, 0); $? "- arrowhead"
}
/** Show image.
@param oi Output structure.
*/
static
void
show_image DK_P1(OI *,oi) {
dk_fig_polyline *p;
dkfig_java_drve *drve;
long *xptr;
long *yptr;
dk_fig_bb bbdest;
double x0;
double y0;
double x1;
double y1;
size_t i;
$? "+ show_image"
p = (dk_fig_polyline *)((oi->o)->data);
drve = (dkfig_java_drve *)((oi->o)->drve);
if((p) && (drve)) { $? ". p and drve ok"
if(drve->img) { $? ". drve->img ok"
xptr = p->xvalues; yptr = p->yvalues;
dkfig_tool_bb_reset(&bbdest);
for(i = 0; i < p->npoints; i++) {
dkfig_tool_bb_add_x(&bbdest, convertXl(oi, *(xptr++)));
dkfig_tool_bb_add_y(&bbdest, convertYl(oi, *(yptr++)));
}
x0 = bbdest.xmin;
y0 = bbdest.ymin;
x1 = bbdest.xmax;
y1 = bbdest.ymax; $? ". bb = %lg %lg %lg %lg", x0, y0, x1, y1
if(must_stroke_object(oi)) {
if(drve->st) {
x0 = dkma_add_double_ok(x0, (0.5 * (drve->st)->linewidth), &(oi->me));
y0 = dkma_add_double_ok(y0, (0.5 * (drve->st)->linewidth), &(oi->me));
x1 = dkma_sub_double_ok(x1, (0.5 * (drve->st)->linewidth), &(oi->me));
y1 = dkma_sub_double_ok(y1, (0.5 * (drve->st)->linewidth), &(oi->me));
}
} $? ". bb = %lg %lg %lg %lg", x0, y0, x1, y1
if((y1 > y0) && (x1 > x0)) { $? ". image extensions ok"
kw_out(oi, 89);
kw_out(oi, 133); kw_out(oi, 0); kw_out(oi, 129);
force_double(oi->s, x0);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y0);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, x1);
kw_out(oi, 5); kw_out(oi, 1);
force_double(oi->s, y1);
kw_out(oi, 5); kw_out(oi, 0); kw_out(oi, 129);
kw_out(oi, 134);
num_with_length(oi->s, (drve->img)->imgno, oi->l_i);
kw_out(oi, 5); kw_out(oi, 1);
switch(((oi->c)->image_align) & 3) {
case DKFIG_ALIGN_H_LEFT: { $? ". h left"
kw_out(oi, 97);
} break;
case DKFIG_ALIGN_H_RIGHT: { $? ". h right"
kw_out(oi, 99);
} break;
default: { $? ". h centered"
kw_out(oi, 98);
} break;
} kw_out(oi, 5); kw_out(oi, 1);
switch((((oi->c)->image_align) >> 2) & 3) {
case DKFIG_ALIGN_V_TOP: { $? ". v top"
kw_out(oi, 131);
} break;
case DKFIG_ALIGN_V_BOTTOM: { $? ". v bottom"
kw_out(oi, 132);
} break;
default: { $? ". v centered"
kw_out(oi, 130);
} break;
}
kw_out(oi, 0); kw_out(oi, 89); kw_out(oi, 31);
kw_out(oi, 0);
}
}
} $? "- show_image"
}
/** Print path object.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
print_path_object DK_P1(OI *,oi) {
int back = 1;
dkfig_java_drve *drve;
int mf = 0; /* Must fill object. */
int ms = 0; /* Must stroke object. */
int mi = 0; /* Must show image file. */
int ng = 0; /* 0/1/2 = no/g/g2 */
$? "+ print_path_object"
drve = (oi->o)->drve;
mf = must_fill_object(oi);
ms = must_stroke_object(oi);
if((oi->o)->objtype == DK_FIG_OBJ_POLYLINE) {
if((oi->o)->subtype == 5) {
mi = 1; $? ". must show image"
}
}
if((mf) || (ms) || (mi)) {
kw_out(oi, 86); kw_out(oi, 0);
if((mf) || (ms)) {
ng = write_path(oi);
}
if(mf) {
switch(ng) {
case 1: { // fill g
// Fill color
if(drve->fill) {
set_registered_color(oi, drve->fill);
}
// Fill path
kw_out(oi, 89); kw_out(oi, 103); kw_out(oi, 0);
} break;
case 2: { // fill g2
// Fill color
if(drve->fill) {
set_color(oi, 1, (drve->fill)->colno);
}
// Fill path
kw_out(oi, 89); kw_out(oi, 104); kw_out(oi, 0);
} break;
}
}
if(mi) {
show_image(oi);
}
if(ms) {
switch(ng) {
case 1: { // stroke g
// Stroke color
if(drve->draw) {
set_registered_color(oi, drve->draw);
}
if(drve->st) {
set_registered_stroke(oi, drve->st);
}
// Stroke path
kw_out(oi, 89); kw_out(oi, 105); kw_out(oi, 0);
} break;
case 2: { // stroke g2
// Stroke color
if(drve->draw) {
set_color(oi, 1, (drve->draw)->colno);
}
// Stroke path
if(drve->st) {
set_stroke(oi, 1, (drve->st)->strokeno);
}
kw_out(oi, 89); kw_out(oi, 106); kw_out(oi, 0);
} break;
}
if((((oi->o)->fpd).ar) & 1) {
arrowhead(
oi, &(((oi->o)->fpd).ahf), 0,
(drve->draw)->colno, (drve->st)->strokeno
);
}
if((((oi->o)->fpd).ar) & 2) {
arrowhead(
oi, &(((oi->o)->fpd).ahb), 1,
(drve->draw)->colno, (drve->st)->strokeno
);
}
}
kw_out(oi, 87); kw_out(oi, 0);
} $? "- print_path_object"
return back;
}
/** Print current object.
@param oi Output structure.
*/
static
int
print_object DK_P1(OI *,oi) {
int back = 1;
if((oi->o)->objtype == DK_FIG_OBJ_TEXT) {
back = print_text_object(oi);
} else {
back = print_path_object(oi);
}
return back;
}
/** Print output.
@param oi Output structure.
*/
static
int
print_out DK_P1(OI *,oi) {
int back = 1;
dkfig_java_font *f;
unsigned long backupopt1;
unsigned long backupopt2;
unsigned long backuplineno;
int backupia;
oi->me = 0;
kw_out(oi, 0);
section_out(oi, p_begin);
/* Create font metrics for all the fonts. */
dksto_it_reset(oi->i_f);
while((f = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
kw_out(oi, 84); num_with_length(oi->s, f->fontno, oi->l_f);
kw_out(oi, 85); num_with_length(oi->s, f->fontno, oi->l_f);
kw_out(oi, 31); kw_out(oi, 0);
}
dksto_it_reset(oi->fli);
while((oi->o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
backuplineno = dkapp_get_source_lineno((oi->c)->app);
dkapp_set_source_lineno((oi->c)->app, (oi->o)->lineno);
backupopt1 = (oi->c)->opt1;
backupopt2 = (oi->c)->opt2;
backupia = (oi->c)->image_align; $? ". ia = %d", (oi->c)->image_align
oi->me = 0;
handle_special_comments(oi, oi->o); $? ". ia = %d", (oi->c)->image_align
if(!print_object(oi)) { back = 0; }
if(oi->me) {
back = 0;
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 13);
}
(oi->c)->image_align = backupia; $? ". ia = %d", (oi->c)->image_align
(oi->c)->opt2 = backupopt2;
(oi->c)->opt1 = backupopt1;
dkapp_set_source_lineno((oi->c)->app, backuplineno);
}
section_out(oi, p_end);
kw_out(oi, 0);
return back;
}
/** Put character to Java string.
@param st Stream to write to.
@param c Character to write.
*/
static
void
put_java_char DK_P2(dk_stream_t *,st, char,c) {
switch(c) {
case '"': {
dkstream_puts(st, kw[82]);
} break;
case '\\': {
dkstream_puts(st, kw[83]);
} break;
default: {
dkstream_write(st, &c, 1);
} break;
}
}
static
void
put_java_escaped_char DK_P2(dk_stream_t *,st, unsigned char,c) {
unsigned u;
char buffer[16];
if(c < 0x80) {
put_java_char(st, (char)c);
} else {
u = (unsigned)c;
sprintf(buffer, "\\u%04X", u);
dkstream_puts(st, buffer);
}
}
/** Put a text as Java string.
@param st Stream to write to.
@param s String to print.
*/
static
void
put_java_string DK_P2(dk_stream_t *,st, char *,s) {
char *ptr;
ptr = s;
while(*ptr) {
put_java_char(st, *ptr);
ptr++;
}
}
/** Put a text as Java string.
@param st Stream to write to.
@param s String to print.
*/
static
void
put_java_escaped_string DK_P2(dk_stream_t *,st, char *,s) {
char *ptr;
ptr = s;
while(*ptr) {
put_java_escaped_char(st, (unsigned char)(*ptr));
ptr++;
}
}
/** Convert text string from UTF-8 to ISO and write it to
Java output file as Java string.
@param oi Output structure.
@param t Text to write.
*/
static
void
utf8_to_iso DK_P2(OI *,oi, char *,t) {
dk_udword ucb;
int cc;
unsigned char uc;
size_t max;
size_t used;
size_t avail;
size_t step;
size_t curpos;
cc = 1; max = strlen(t); used = 0; avail = max; curpos = 0;
while(cc) {
cc = 0;
if(avail > 0) {
step = 0;
cc = dkenc_utf82uc(&ucb, (unsigned char *)(&(t[used])), avail, &step);
if(cc) {
used = used + step;
if(avail > step) { avail = avail - step; } else { avail = 0; }
if(ucb < 256UL) {
uc = (unsigned char)ucb;
put_java_char(oi->s, (char)uc);
} else { $? "! character out of range."
/* ##### ERROR: Character out of range. */
}
}
}
}
}
/** Convert text string from UTF-8 to ISO and write it to
Java output file as Java string.
@param oi Output structure.
@param t Text to write.
*/
static
void
utf8_to_escaped DK_P2(OI *,oi, char *,t) {
dk_udword ucb;
int cc;
unsigned char uc;
size_t max;
size_t used;
size_t avail;
size_t step;
size_t curpos;
char buffer[16];
cc = 1; max = strlen(t); used = 0; avail = max; curpos = 0;
while(cc) {
cc = 0;
if(avail > 0) {
step = 0;
cc = dkenc_utf82uc(&ucb, (unsigned char *)(&(t[used])), avail, &step);
if(cc) {
used = used + step;
if(avail > step) { avail = avail - step; } else { avail = 0; }
if(ucb < 256UL) {
uc = (unsigned char)ucb;
put_java_escaped_char(oi->s, (char)uc);
} else { $? "! character out of range."
if(ucb > 0xFFFFUL) {
if(ucb < 0x00110000UL) {
sprintf(buffer, "\\U%06lX", ucb);
dkstream_puts(oi->s, buffer);
} else {
/* ##### ERROR: Character too large */
}
} else {
sprintf(buffer, "\\u%04lX", ucb);
dkstream_puts(oi->s, buffer);
}
}
}
}
}
}
/** Write all string elements to output.
@param oi Output structure.
@param kwi Index of declaration in kw.
*/
static
void
all_strings_out DK_P2(OI *,oi, size_t,kwi) {
int is_not_first = 0;
dk_fig_object *o;
dkfig_java_drve *drve;
dk_fig_text *t;
unsigned long backupopt1, backupopt2;
int backupia;
char buffer[32], *ptr;
unsigned char uc;
dk_udword udw;
size_t sz;
kw_out(oi, kwi); kw_out(oi, 0);
kw_out(oi, (kwi+1));
dksto_it_reset(oi->fli);
while((o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
oi->o = o;
if((oi->o)->objtype == DK_FIG_OBJ_TEXT) {
backupopt1 = (oi->c)->opt1;
backupopt2 = (oi->c)->opt2;
backupia = (oi->c)->image_align;
drve = (dkfig_java_drve *)(o->drve);
t = (dk_fig_text *)(o->data);
if(t) {
if(is_not_first) {
kw_out(oi, 5);
} is_not_first = 1;
kw_out(oi, 0);
kw_out(oi, 76);
kw_out(oi, 77);
num_with_length(oi->s, drve->tn, oi->l_t);
kw_out(oi, 78);
kw_out(oi, 79);
if(t->text) {
if(((oi->c)->opt2) & DKFIG_OPT_JAVA_UNICODE) {
if(((oi->c)->opt2) & DKFIG_OPT_UTF_8) {
} else {
put_java_escaped_string(oi->s, t->text);
}
} else {
if(oi->wr_utf8) {
if(((oi->c)->opt2) & DKFIG_OPT_UTF_8) {
put_java_string(oi->s, t->text);
} else {
/* size_t dkenc_uc2utf8 DK_PR((dk_udword c, dk_ubyte *u8p, size_t u8l)); */
ptr = t->text;
while(*ptr) {
uc = (unsigned char)(*ptr);
udw = (dk_udword)uc;
sz = dkenc_uc2utf8(udw, (dk_ubyte *)buffer, sizeof(buffer));
if(sz > 0) {
buffer[sz] = '\0';
put_java_string(oi->s, buffer);
}
ptr++;
}
}
} else {
if(((oi->c)->opt2) & DKFIG_OPT_UTF_8) {
utf8_to_iso(oi, t->text);
} else {
put_java_string(oi->s, t->text);
}
}
}
}
kw_out(oi, 79);
(oi->c)->image_align = backupia;
(oi->c)->opt2 = backupopt2;
(oi->c)->opt1 = backupopt1;
}
}
}
kw_out(oi, 0); kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 3); kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
}
/** Write booleans (string enabled).
@param oi Output structure.
*/
static
void
string_booleans_out DK_P1(OI *,oi) {
int is_not_first = 0;
dk_fig_object *o;
kw_out(oi, 1); kw_out(oi, 1); kw_out(oi, 146); kw_out(oi, 0);
kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 145);
dksto_it_reset(oi->fli);
while((o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
oi->o = o;
if((oi->o)->objtype == DK_FIG_OBJ_TEXT) {
if(is_not_first) {
kw_out(oi, 5);
} is_not_first = 1;
kw_out(oi, 0);
kw_out(oi, 76);
kw_out(oi, 147);
}
}
kw_out(oi, 0); kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 3); kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
}
/** Write information about layers in which texts are placed.
@param oi Output structure.
*/
static
void
string_layers_out DK_P1(OI *,oi) {
int is_not_first = 0;
dk_fig_object *o;
char buffer[32];
kw_out(oi, 1); kw_out(oi, 1); kw_out(oi, 150); kw_out(oi, 0);
kw_out(oi, 1); kw_out(oi, 1); kw_out(oi, 151);
dksto_it_reset(oi->fli);
while((o = (dk_fig_object *)dksto_it_next(oi->fli)) != NULL) {
oi->o = o;
if((oi->o)->objtype == DK_FIG_OBJ_TEXT) {
if(is_not_first) {
kw_out(oi, 5);
} is_not_first = 1;
kw_out(oi, 0);
sprintf(buffer, "%ld", o->layer);
kw_out(oi, 76); dkstream_puts(oi->s, buffer);
}
}
kw_out(oi, 0); kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 3); kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
}
/** Write all strings to output file.
@param oi Output structure.
*/
static
void
strings_out DK_P1(OI *,oi) {
kw_out(oi, 0);
kw_out(oi, 161); kw_out(oi, 0); kw_out(oi, 0);
oi->l_t = number_length(oi->n_t);
all_strings_out(oi, 72);
all_strings_out(oi, 74);
string_booleans_out(oi);
string_layers_out(oi);
kw_out(oi, 0);
kw_out(oi, 158); kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
}
/** Check whether a strings starts with a pattern.
@param s String to test.
@param p Pattern at start of string.
@return 1 if \arg p is at the start of \arg s, otherwise 0.
*/
static
int
string_starts_with DK_P2(char *,s, char *,p) {
int back = 0;
size_t n;
n = strlen(p);
if(strlen(s) > n) {
if(strncmp(s, p, n) == 0) {
back = 1;
}
}
return back;
}
/** Write information about used ranges in layers.
@param oi Output structure.
*/
static
void
layer_info_out DK_P1(OI *,oi) {
dkfig_java_layer *l;
int is_not_first = 0;
double x1, x2, y1, y2, xmin, xmax, ymin, ymax;
kw_out(oi, 0);
kw_out(oi, 167); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 154); kw_out(oi, 0);
kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 152);
dksto_it_reset(oi->i_l);
while((l = (dkfig_java_layer *)dksto_it_next(oi->i_l)) != NULL) {
if(is_not_first) {
kw_out(oi, 5);
} is_not_first = 1;
kw_out(oi, 0);
kw_out(oi, 76);
/*
kw_out(oi, 153);
*/
x1 = dkfig_tool_bb_get_xmin(&(l->bb));
x2 = dkfig_tool_bb_get_xmax(&(l->bb));
y1 = dkfig_tool_bb_get_ymin(&(l->bb));
y2 = dkfig_tool_bb_get_ymax(&(l->bb));
x1 = convertX(oi, x1);
x2 = convertX(oi, x2);
y1 = convertY(oi, y1);
y2 = convertY(oi, y2);
if(x1 < x2) { xmin = x1; xmax = x2; }
else { xmin = x2; xmax = x1; }
if(y1 < y2) { ymin = y1; ymax = y2; }
else { ymin = y2; ymax = y1; }
kw_out(oi, 155);
dkstream_puts_ul(oi->s, (unsigned long)(l->layer));
kw_out(oi, 5);
kw_out(oi, 1);
force_double(oi->s, xmin);
kw_out(oi, 5);
kw_out(oi, 1);
force_double(oi->s, xmax);
kw_out(oi, 5);
kw_out(oi, 1);
force_double(oi->s, ymin);
kw_out(oi, 5);
kw_out(oi, 1);
force_double(oi->s, ymax);
kw_out(oi, 156);
}
kw_out(oi, 0);
kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 3); kw_out(oi, 10);
kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 158); kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
}
/** Write variables section to output file.
@param oi Output structure.
*/
static
int
variables_out DK_P1(OI *,oi) {
int back = 1;
dkfig_java_color *c;
dkfig_java_font *f;
dkfig_java_stroke *s;
dkfig_java_image *i;
int fontno; /* Font index. */
int repno; /* Replacement number. */
char *ptr; /* Retrieve dkfont_xxx. */
char *bptr; /* Pointer to font base directory. */
dk_one_font_mapping_t *o; /* One font mapping. */
dk_font_replacement_t *r; /* Font replacement. */
kw_out(oi, 0);
kw_out(oi, 159); kw_out(oi, 0); kw_out(oi, 0);
dksto_it_reset(oi->i_c);
while((c = (dkfig_java_color *)dksto_it_next(oi->i_c)) != NULL) {
kw_out(oi, 19);
dkstream_puts_ul(oi->s, c->colno);
kw_out(oi, 20); kw_out(oi, 0);
kw_out(oi, 21); num_with_length(oi->s, c->colno, oi->l_c);
kw_out(oi, 22); kw_out(oi, 0); kw_out(oi, 0);
}
dksto_it_reset(oi->i_f);
while((f = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
kw_out(oi, 23);
dkstream_puts_ul(oi->s, f->fontno);
kw_out(oi, 20); kw_out(oi, 0);
kw_out(oi, 24); num_with_length(oi->s, f->fontno, oi->l_f);
kw_out(oi, 22); kw_out(oi, 0); kw_out(oi, 0);
}
dksto_it_reset(oi->i_s);
while((s = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
kw_out(oi, 25); dkstream_puts_ul(oi->s, s->strokeno);
kw_out(oi, 20); kw_out(oi, 0);
kw_out(oi, 26); num_with_length(oi->s, s->strokeno, oi->l_s);
kw_out(oi, 22); kw_out(oi, 0); kw_out(oi, 0);
}
// Arrowhead strokes
dksto_it_reset(oi->i_s);
while((s = (dkfig_java_stroke *)dksto_it_next(oi->i_s)) != NULL) {
kw_out(oi, 25); dkstream_puts_ul(oi->s, (oi->n_s + s->strokeno));
kw_out(oi, 20); kw_out(oi, 0);
kw_out(oi, 26); num_with_length(oi->s, (oi->n_s + s->strokeno), oi->l_s);
kw_out(oi, 22); kw_out(oi, 0); kw_out(oi, 0);
}
dksto_it_reset(oi->i_i);
while((i = (dkfig_java_image *)dksto_it_next(oi->i_i)) != NULL) {
$? ". (1)"
kw_out(oi, 27); dkstream_puts_ul(oi->s, i->imgno);
$? ". (2)"
kw_out(oi, 20); kw_out(oi, 0);
$? ". (3)"
kw_out(oi, 28); num_with_length(oi->s, i->imgno, oi->l_i);
$? ". (4)"
kw_out(oi, 22); kw_out(oi, 0); kw_out(oi, 0);
$? ". (5)"
}
kw_out(oi, 158); kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 0);
kw_out(oi, 160); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 37); kw_out(oi, 0);
kw_out(oi, 38);
for(fontno = 0; fontno < 35; fontno++) {
if(fontno) { kw_out(oi, 5); }
kw_out(oi, 0);
kw_out(oi, 40);
kw_out(oi, 1);
kw_out(oi, 42);
kw_out(oi, 1);
dkstream_puts(oi->s, dkfont_get_ps_name(fontno));
repno = 0;
if(((oi->c)->opt2) & DKFIG_OPT_USE_GS_FONTS) {
ptr = dkfont_get_gs_file_name(fontno);
if(ptr) {
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 47);
kw_out(oi, 46);
repno++;
}
ptr = dkfont_get_new_gs_file_name(fontno);
if(ptr) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
}
}
if(oi->fontmap) {
o = dkfont_get_one_font(oi->fontmap, fontno);
if(o) {
dkfont_one_font_reset(o);
while((r = dkfont_one_font_get(o)) != NULL) {
ptr = dkfont_rep_get_pfb_source_name(r);
if(ptr) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
bptr = dkfont_rep_get_pfb_location(r);
if(bptr) {
if(string_starts_with(bptr, kw[143])) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, bptr);
kw_out(oi, 142);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
}
}
}
ptr = dkfont_rep_get_ttf_source_name(r);
if(ptr) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
bptr = dkfont_rep_get_ttf_location(r);
if(bptr) {
if(string_starts_with(bptr, kw[143])) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, bptr);
kw_out(oi, 142);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
}
}
}
}
}
}
kw_out(oi, 0); kw_out(oi, 41);
}
kw_out(oi, 0); kw_out(oi, 39); kw_out(oi, 0); kw_out(oi, 0);
kw_out(oi, 43); kw_out(oi, 0);
kw_out(oi, 44);
for(fontno = 0; fontno < 35; fontno++) {
if(fontno) { kw_out(oi, 5); }
kw_out(oi, 0);
kw_out(oi, 40);
kw_out(oi, 1);
kw_out(oi, 42);
kw_out(oi, 1);
dkstream_puts(oi->s, dkfont_get_ps_name(fontno));
repno = 0;
ptr = dkfont_get_ps_name(fontno);
if(ptr) {
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
}
if(oi->fontmap) {
o = dkfont_get_one_font(oi->fontmap, fontno);
if(o) {
dkfont_one_font_reset(o);
while((r = dkfont_one_font_get(o)) != NULL) {
ptr = dkfont_rep_get_name(r);
if(ptr) {
if(repno) kw_out(oi, 5);
kw_out(oi, 0);
kw_out(oi, 45);
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
repno++;
}
}
}
}
kw_out(oi, 0); kw_out(oi, 41);
}
kw_out(oi, 0); kw_out(oi, 39); kw_out(oi, 0);
kw_out(oi, 0);
kw_out(oi, 158);
kw_out(oi, 0); kw_out(oi, 0); kw_out(oi, 0);
layer_info_out(oi);
return back;
}
/** Write needed resources to header of file.
@param oi Output structure.
*/
static
void
header_for_resources DK_P1(OI *,oi) {
kw_out(oi, 135); kw_out(oi, 0);
kw_out(oi, 136); kw_out(oi, 0);
}
/** List needed resources.
@param oi Output structure.
@return 1 on success, 0 on error.
*/
static
int
write_needed_resources DK_P1(OI *,oi) {
int back = 1;
dkfig_java_font *f;
int i;
int header_printed = 0;
dk_one_font_mapping_t *o;
dk_font_replacement_t *r;
char *ptr, *last;
int first_in_line;
int font_found;
int any_resource;
dkfig_java_image *img;
any_resource = 0;
if(oi->fontmap) {
dksto_it_reset(oi->i_f);
while((f = (dkfig_java_font *)dksto_it_next(oi->i_f)) != NULL) {
dkfont_set_used(oi->fontmap, f->font, 1);
}
for(i = 0; i < 35; i++) {
first_in_line = 1;
if(dkfont_get_used(oi->fontmap, i)) {
font_found = 0;
if(!header_printed) {
header_for_resources(oi);
} header_printed = 1;
kw_out(oi, 137); num_with_length(oi->s, (unsigned long)i, 2);
kw_out(oi, 138); kw_out(oi, 1);
kw_out(oi, 46);
dkstream_puts(oi->s, dkfont_get_ps_name(i));
kw_out(oi, 46);
o = dkfont_get_one_font(oi->fontmap, i);
if(o) {
dkfont_one_font_reset(o);
if(((oi->c)->opt2) & DKFIG_OPT_USE_GS_FONTS) {
font_found = 1;
ptr = dkfont_get_gs_file_name(i);
if(ptr) { $? ". gs font %s", ptr
if(first_in_line) {
kw_out(oi, 139);
} else {
kw_out(oi, 140);
} first_in_line = 0;
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 47);
kw_out(oi, 46);
}
ptr = dkfont_get_new_gs_file_name(i);
if(ptr) { $? ". new gs font %s", ptr
if(first_in_line) {
kw_out(oi, 139);
} else {
kw_out(oi, 140);
} first_in_line = 0;
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
}
}
while((r = dkfont_one_font_get(o)) != NULL) {
ptr = dkfont_rep_get_pfb_source_name(r);
if(ptr) { $? ". pfb file %s", ptr
font_found = 1;
if(first_in_line) {
kw_out(oi, 139);
} else {
kw_out(oi, 140);
} first_in_line = 0;
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
dkfig_tool2_msg3(oi->c, DK_LOG_LEVEL_INFO, 136, 137, ptr);
any_resource = 1;
}
ptr = dkfont_rep_get_ttf_source_name(r);
if(ptr) { $? ". ttf file %s", ptr
font_found = 1;
if(first_in_line) {
kw_out(oi, 139);
} else {
kw_out(oi, 140);
} first_in_line = 0;
kw_out(oi, 46);
dkstream_puts(oi->s, ptr);
kw_out(oi, 46);
dkfig_tool2_msg3(oi->c, DK_LOG_LEVEL_INFO, 136, 137, ptr);
any_resource = 1;
}
}
}
kw_out(oi, 0);
if(!font_found) {
back = 0;
/* ##### ERROR: No data found for font! */
}
}
}
}
dksto_it_reset(oi->i_i);
while((img = (dkfig_java_image *)dksto_it_next(oi->i_i)) != NULL) {
if(img->filename) {
if(!header_printed) {
header_for_resources(oi);
} header_printed = 1;
last = NULL; ptr = img->filename;
while(*ptr) {
if((*ptr == '\\') || (*ptr == '/')) {
last = ptr;
}
ptr++;
}
if(last) last++;
else last = img->filename;
kw_out(oi, 141);
kw_out(oi, 46);
dkstream_puts(oi->s, last);
kw_out(oi, 46);
kw_out(oi, 138);
kw_out(oi, 1);
kw_out(oi, 46);
dkstream_puts(oi->s, img->filename);
kw_out(oi, 46);
kw_out(oi, 0);
dkfig_tool2_msg3(oi->c, DK_LOG_LEVEL_INFO, 136, 137, last);
any_resource = 1;
}
}
if(header_printed) {
kw_out(oi, 0);
}
if(any_resource) {
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_INFO, 138);
}
return back;
}
/** Create output.
@param oi OI structure.
@return 1 on success, 0 on error.
*/
static
int
output_pass DK_P1(OI *,oi) {
int back = 1;
$? "+ output_pass"
kw_out(oi, 11); kw_out(oi, 0);
kw_out(oi, 12); kw_out(oi, 0); kw_out(oi, 0);
if(!write_needed_resources(oi)) { back = 0; }
write_import_packages(oi);
kw_out(oi, 0);
/* 2010/01/30: Larger comment section added. */
#if 0
kw_out(oi, 13); kw_out(oi, 0);
#endif
kw_out(oi, 0);
section_out(oi, class_docu_1);
if(!(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES)) {
section_out(oi, class_docu_2);
}
section_out(oi, class_docu_3);
kw_out(oi, 6);
kw_out(oi, 1);
print_class_name(oi);
kw_out(oi, 1);
kw_out(oi, 7);
kw_out(oi, 1);
kw_out(oi, 2);
kw_out(oi, 0);
section_out(oi, member_variables_1);
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES) {
section_out(oi, member_variables_2b);
} else {
section_out(oi, member_variables_2a);
}
section_out(oi, member_variables_3);
wh_out(oi);
strings_out(oi);
variables_out(oi);
if(!init_out(oi)) { back = 0; }
if(!print_out(oi)) { back = 0; }
if(!(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES)) {
section_out(oi, member_functions_1);
}
section_out(oi, member_functions_2);
if(!(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES)) {
section_out(oi, member_functions_3);
}
section_out(oi, member_functions_4);
if(((oi->c)->opt2) & DKFIG_OPT_DKLIBSJ_LIBRARIES) {
kw_out(oi, 0); kw_out(oi, 0);
section_out(oi, dktool_constructor_p1);
kw_out(oi, 1); kw_out(oi, 1);
kw_out(oi, 170);
print_class_name(oi);
kw_out(oi, 171); kw_out(oi, 0);
section_out(oi, dktool_constructor_p2);
kw_out(oi, 0); kw_out(oi, 0);
}
kw_out(oi, 3);
kw_out(oi, 0); $? "- output_pass %d", back
return back;
}
/** Java output driver function.
@param c Conversion job structure.
@return 1 on success, 0 on error.
*/
int
dkfig_output_java DK_P1(dk_fig_conversion *,c) {
int back = 0;
OI *oi;
$? "+ dkfig_output_java"
oi = new_oi(c);
if(oi) { $? ". ia = %d", (oi->c)->image_align
if(preparation_pass(oi)) {
back = output_pass(oi);
}
cleanup_pass(oi);
delete_oi(oi);
} else {
dkfig_tool2_msg1(oi->c, DK_LOG_LEVEL_ERROR, 11);
}
$? "- dkfig_output_java"
return back;
}