diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/extension/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/extension/implementation/xslt.cpp | 13 | ||||
| -rw-r--r-- | src/extension/init.cpp | 2 | ||||
| -rw-r--r-- | src/extension/internal/javafx-out.cpp | 984 | ||||
| -rw-r--r-- | src/extension/internal/javafx-out.h | 155 | ||||
| -rw-r--r-- | src/io/README | 2 |
6 files changed, 13 insertions, 1145 deletions
diff --git a/src/extension/CMakeLists.txt b/src/extension/CMakeLists.txt index e779f788a..eaa9b4956 100644 --- a/src/extension/CMakeLists.txt +++ b/src/extension/CMakeLists.txt @@ -50,7 +50,6 @@ set(extension_SRC internal/odf.cpp internal/latex-text-renderer.cpp internal/pov-out.cpp - internal/javafx-out.cpp internal/svg.cpp internal/svgz.cpp internal/text_reassemble.c @@ -123,7 +122,6 @@ set(extension_SRC internal/gimpgrad.h internal/grid.h internal/image-resolution.h - internal/javafx-out.h internal/latex-pstricks-out.h internal/latex-pstricks.h internal/latex-text-renderer.h diff --git a/src/extension/implementation/xslt.cpp b/src/extension/implementation/xslt.cpp index 1f2b79281..8ea8e5a7a 100644 --- a/src/extension/implementation/xslt.cpp +++ b/src/extension/implementation/xslt.cpp @@ -163,7 +163,18 @@ SPDocument * XSLT::open(Inkscape::Extension::Input */*module*/, void XSLT::save(Inkscape::Extension::Output *module, SPDocument *doc, gchar const *filename) { /* TODO: Should we assume filename to be in utf8 or to be a raw filename? - * See JavaFXOutput::save for discussion. */ + * See JavaFXOutput::save for discussion. + * + * From JavaFXOutput::save (now removed): + * --- + * N.B. The name `filename_utf8' represents the fact that we want it to be in utf8; whereas in + * fact we know that some callers of Extension::save pass something in the filesystem's + * encoding, while others do g_filename_to_utf8 before calling. + * + * In terms of safety, it's best to make all callers pass actual filenames, since in general + * one can't round-trip from filename to utf8 back to the same filename. Whereas the argument + * for passing utf8 filenames is one of convenience: we often want to pass to g_warning or + * store as a string (rather than a byte stream) in XML, or the like. */ g_return_if_fail(doc != nullptr); g_return_if_fail(filename != nullptr); diff --git a/src/extension/init.cpp b/src/extension/init.cpp index 6626ff20d..c3d34b0c1 100644 --- a/src/extension/init.cpp +++ b/src/extension/init.cpp @@ -45,7 +45,6 @@ # include "internal/cairo-ps-out.h" #endif #include "internal/pov-out.h" -#include "internal/javafx-out.h" #include "internal/odf.h" #include "internal/latex-pstricks-out.h" #include "internal/latex-pstricks.h" @@ -170,7 +169,6 @@ init() Internal::PrintWmf::init(); Internal::Wmf::init(); Internal::PovOutput::init(); - Internal::JavaFXOutput::init(); Internal::OdfOutput::init(); Internal::PrintLatex::init(); Internal::LatexOutput::init(); diff --git a/src/extension/internal/javafx-out.cpp b/src/extension/internal/javafx-out.cpp deleted file mode 100644 index 1b0e9150d..000000000 --- a/src/extension/internal/javafx-out.cpp +++ /dev/null @@ -1,984 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * A simple utility for exporting Inkscape svg Shapes as JavaFX paths. - * - * For information on the JavaFX file format, see: - * https://openjfx.dev.java.net/ - * - * Authors: - * Bob Jamison <ishmal@inkscape.org> - * Silveira Neto <silveiraneto@gmail.com> - * Jim Clarke <Jim.Clarke@sun.com> - * Jon A. Cruz <jon@joncruz.org> - * Abhishek Sharma - * - * Copyright (C) 2008,2009 Authors - * - * Released under GNU GPL v2+, read the file 'COPYING' for more information. - */ - -#include <glibmm/miscutils.h> -#include "javafx-out.h" -#include <inkscape.h> -#include <inkscape-version.h> -#include <display/curve.h> -#include <display/canvas-bpath.h> -#include <svg/svg.h> -#include <extension/system.h> -#include <2geom/pathvector.h> -#include <2geom/rect.h> -#include <2geom/curves.h> -#include "helper/geom.h" -#include "helper/geom-curves.h" -#include <io/sys.h> - -#include "object/sp-root.h" -#include "object/sp-path.h" -#include "object/sp-linear-gradient.h" -#include "object/sp-radial-gradient.h" -#include "style.h" - -#include <string> -#include <cstdio> -#include <cstdarg> -#include "extension/extension.h" - - -namespace Inkscape -{ -namespace Extension -{ -namespace Internal -{ - - - - -//######################################################################## -//# M E S S A G E S -//######################################################################## - -static void err(const char *fmt, ...) -{ - va_list args; - g_log(nullptr, G_LOG_LEVEL_WARNING, "javafx-out err: "); - va_start(args, fmt); - g_logv(nullptr, G_LOG_LEVEL_WARNING, fmt, args); - va_end(args); - g_log(nullptr, G_LOG_LEVEL_WARNING, "\n"); -} - - -//######################################################################## -//# U T I L I T Y -//######################################################################## - -/** - * Got this method from Bulia, and modified it a bit. It basically - * starts with this style, gets its SPObject parent, walks up the object - * tree and finds all of the opacities and multiplies them. - * - * We use this for our "flat" object output. If the code is modified - * to reflect a tree of <groups>, then this will be unnecessary. - */ -static double effective_opacity(const SPStyle *style) -{ - double val = 1.0; - for (SPObject const *obj = style->object; obj ; obj = obj->parent) - { - if (obj->style) { - val *= SP_SCALE24_TO_FLOAT(obj->style->opacity.value); - } - } - return val; -} - -//######################################################################## -//# OUTPUT FORMATTING -//######################################################################## - -JavaFXOutput::JavaFXOutput() : - name(), - outbuf(), - foutbuf(), - nrNodes(0), - nrShapes(0), - idindex(0), - minx(0), - miny(0), - maxx(0), - maxy(0) -{ -} - -/** - * We want to control floating output format. - * Especially to avoid localization. (decimal ',' for example) - */ -static JavaFXOutput::String dstr(double d) -{ - char dbuf[G_ASCII_DTOSTR_BUF_SIZE+1]; - g_ascii_formatd(dbuf, G_ASCII_DTOSTR_BUF_SIZE, - "%.8f", (gdouble)d); - JavaFXOutput::String s = dbuf; - return s; -} - -#define DSTR(d) (dstr(d).c_str()) - - -/** - * Format an rgba() string - */ -static JavaFXOutput::String rgba(guint32 rgba) -{ - unsigned int r = SP_RGBA32_R_U(rgba); - unsigned int g = SP_RGBA32_G_U(rgba); - unsigned int b = SP_RGBA32_B_U(rgba); - unsigned int a = SP_RGBA32_A_U(rgba); - char buf[80]; - snprintf(buf, 79, "Color.rgb(0x%02x, 0x%02x, 0x%02x, %s)", - r, g, b, DSTR((double)a/255.0)); - JavaFXOutput::String s = buf; - return s; -} - - -/** - * Format an rgba() string for a color and a 0.0-1.0 alpha - */ -static JavaFXOutput::String rgba(SPColor color, gdouble alpha) -{ - return rgba(color.toRGBA32(alpha)); -} - -/** - * Map Inkscape linecap styles to JavaFX - */ -static JavaFXOutput::String getStrokeLineCap(unsigned value) { - switch(value) { - case SP_STROKE_LINECAP_BUTT: - return "StrokeLineCap.BUTT"; - case SP_STROKE_LINECAP_ROUND: - return "StrokeLineCap.ROUND"; - case SP_STROKE_LINECAP_SQUARE: - return "StrokeLineCap.SQUARE"; - default: - return "INVALID LINE CAP"; - } -} - - -/** - * Map Inkscape linejoin styles to JavaFX - */ -static JavaFXOutput::String getStrokeLineJoin(unsigned value) { - switch(value) { - case SP_STROKE_LINEJOIN_MITER: - return "StrokeLineJoin.MITER"; - case SP_STROKE_LINEJOIN_ROUND: - return "StrokeLineJoin.ROUND"; - case SP_STROKE_LINEJOIN_BEVEL: - return "StrokeLineJoin.BEVEL"; - default: - return "INVALID LINE JOIN"; - } -} - - -/** - * Replace illegal characters for JavaFX for a underscore. - */ -static JavaFXOutput::String sanatize(const JavaFXOutput::String &badstr){ - JavaFXOutput::String good(badstr); - for (int pos = 0; pos < static_cast<int>(badstr.length()); ++pos ) - if ((badstr.at(pos)=='-')||(badstr.at(pos)==' ')) { - good.replace(pos, 1, "_"); - } - return good; -} - -/** - * Output data to the buffer, printf()-style - */ -void JavaFXOutput::out(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - gchar *output = g_strdup_vprintf(fmt, args); - va_end(args); - outbuf.append(output); - g_free(output); -} - - - -/** - * Output the file header - */ -bool JavaFXOutput::doHeader() -{ - time_t tim = time(nullptr); - out("/*###################################################################\n"); - out("### This JavaFX document was generated by Inkscape\n"); - out("### http://www.inkscape.org\n"); - out("### Created: %s", ctime(&tim)); - out("### Version: %s\n", Inkscape::version_string); - out("#####################################################################\n"); - out("### NOTES:\n"); - out("### ============\n"); - out("### JavaFX information can be found at\n"); - out("### http://www.javafx.com/\n"); - out("###\n"); - out("### If you have any problems with this output, please see the\n"); - out("### Inkscape project at http://www.inkscape.org, or visit\n"); - out("### the #inkscape channel on irc.freenode.net . \n"); - out("###\n"); - out("###################################################################*/\n"); - out("\n\n"); - out("/*###################################################################\n"); - out("## Exports in this file\n"); - out("##==========================\n"); - out("## Shapes : %d\n", nrShapes); - out("## Nodes : %d\n", nrNodes); - out("###################################################################*/\n"); - out("\n\n"); - - // import javafx libraries we can need - out("import javafx.scene.*;\n"); - out("import javafx.scene.shape.*;\n"); - out("import javafx.scene.transform.*;\n"); - out("import javafx.scene.paint.*;\n"); - out("\n"); - - out("\n\n"); - - // Creates a class extended from CustomNode - out("public class %s extends CustomNode {\n", name.c_str()); - - return true; -} - - - -/** - * Output the file footer - */ -bool JavaFXOutput::doTail() -{ - float border = 25.0; - - // Write the tail of CustomNode - out(" ] // content\n"); - out(" transforms: Translate { x : %s, y : %s }\n", - DSTR((-minx) + border), DSTR((-miny) + border) ); - out(" } // Group\n"); - out(" } // function create()\n"); - out("} // class %s\n", name.c_str()); - out("\n"); - - // Stage -// out(" stage: Stage {\n"); -// out(" content: %s{}\n", name.c_str()); -// out(" } // Stage\n"); - - - out("\n"); - - out("/*###################################################################\n"); - out("### E N D C L A S S %s\n", name.c_str()); - out("###################################################################*/\n"); - out("\n\n"); - return true; -} - - - -/** - * Output gradient information to the buffer - */ -bool JavaFXOutput::doGradient(SPGradient *grad, const String &id) -{ - String jfxid = sanatize(id); - - if (SP_IS_LINEARGRADIENT(grad)) - { - SPLinearGradient *g = SP_LINEARGRADIENT(grad); - out(" /* create LinearGradient for %s */\n", jfxid.c_str()); - out(" function %s(): LinearGradient {\n", jfxid.c_str()); - out(" LinearGradient {\n"); - std::vector<SPGradientStop> stops = g->vector.stops; - if (!stops.empty()) - { - out(" stops:\n"); - out(" [\n"); - for (auto stop : stops) - { - out(" Stop {\n"); - out(" offset: %s\n", DSTR(stop.offset)); - out(" color: %s\n", rgba(stop.color, stop.opacity).c_str()); - out(" },\n"); - } - out(" ]\n"); - } - out(" };\n"); - out(" } // end LinearGradient: %s\n", jfxid.c_str()); - out("\n\n"); - } - else if (SP_IS_RADIALGRADIENT(grad)) - { - SPRadialGradient *g = SP_RADIALGRADIENT(grad); - out(" /* create RadialGradient for %s */\n", jfxid.c_str()); - out(" function %s() {\n", jfxid.c_str()); - out(" RadialGradient {\n"); - out(" centerX: %s\n", DSTR(g->cx.value)); - out(" centerY: %s\n", DSTR(g->cy.value)); - out(" focusX: %s\n", DSTR(g->fx.value)); - out(" focusY: %s\n", DSTR(g->fy.value)); - out(" radius: %s\n", DSTR(g->r.value )); - std::vector<SPGradientStop> stops = g->vector.stops; - if (!stops.empty()) - { - out(" stops:\n"); - out(" [\n"); - for (auto stop : stops) - { - out(" Stop {\n"); - out(" offset: %s\n", DSTR(stop.offset)); - out(" color: %s\n", rgba(stop.color, stop.opacity).c_str()); - out(" },\n"); - } - out(" ]\n"); - } - out(" };\n"); - out(" } // end RadialGradient: %s\n", jfxid.c_str()); - out("\n\n"); - } - else - { - err("Unknown gradient type for '%s'\n", jfxid.c_str()); - return false; - } - - - return true; -} - - - - -/** - * Output an element's style attribute - */ -bool JavaFXOutput::doStyle(SPStyle *style) -{ - if (!style) { - return true; - } - - out(" opacity: %s\n", DSTR(effective_opacity(style))); - - /** - * Fill - */ - SPIPaint const &fill = style->fill; - if (fill.isColor()) - { - // see color.h for how to parse SPColor - out(" fill: %s\n", - rgba(fill.value.color, SP_SCALE24_TO_FLOAT(style->fill_opacity.value)).c_str()); - } - else if (fill.isPaintserver()){ - if (fill.value.href && fill.value.href->getURI() ){ - String uri = fill.value.href->getURI()->str(); - /* trim the anchor '#' from the front */ - if (uri.size() > 0 && uri[0]=='#') { - uri = uri.substr(1); - } - out(" fill: %s()\n", sanatize(uri).c_str()); - } - } - - - /** - * Stroke - */ - /** - *NOTE: Things in style we can use: - * SPIPaint stroke; - * SPILength stroke_width; - * SPIEnum stroke_linecap; - * SPIEnum stroke_linejoin; - * SPIFloat stroke_miterlimit; - * SPIDashArray stroke_dasharray; - * SPILength stroke_dashoffset; - * SPIScale24 stroke_opacity; - */ - if (style->stroke_opacity.value > 0) - { - SPIPaint const &stroke = style->stroke; - out(" stroke: %s\n", - rgba(stroke.value.color, SP_SCALE24_TO_FLOAT(style->stroke_opacity.value)).c_str()); - double strokewidth = style->stroke_width.value; - unsigned linecap = style->stroke_linecap.value; - unsigned linejoin = style->stroke_linejoin.value; - out(" strokeWidth: %s\n", DSTR(strokewidth)); - out(" strokeLineCap: %s\n", getStrokeLineCap(linecap).c_str()); - out(" strokeLineJoin: %s\n", getStrokeLineJoin(linejoin).c_str()); - out(" strokeMiterLimit: %s\n", DSTR(style->stroke_miterlimit.value)); - if (style->stroke_dasharray.set) { - if (style->stroke_dashoffset.set) { - out(" strokeDashOffset: %s\n", DSTR(style->stroke_dashoffset.value)); - } - out(" strokeDashArray: [ "); - for(unsigned i = 0; i < style->stroke_dasharray.values.size(); i++ ) { - if (i > 0) { - out(", %.2lf", style->stroke_dasharray.values[i].value); - }else { - out(" %.2lf", style->stroke_dasharray.values[i].value); - } - } - out(" ]\n"); - } - - } - - return true; -} - - -#if 1 - -/** - * Output the curve data to buffer - */ -bool JavaFXOutput::doCurve(SPItem *item, const String &id) -{ - using Geom::X; - using Geom::Y; - - String jfxid = sanatize(id); - - //### Get the Shape - if (!SP_IS_SHAPE(item)) { //Bulia's suggestion. Allow all shapes - return true; - } - - SPShape *shape = SP_SHAPE(item); - if (shape->_curve->is_empty()) { - return true; - } - - nrShapes++; - - out(" /** path %s */\n", jfxid.c_str()); - out(" function %s() : Path {\n",jfxid.c_str()); - out(" Path {\n"); - out(" id: \"%s\"\n", jfxid.c_str()); - - /** - * Output the style information - */ - if (!doStyle(shape->style)) { - return false; - } - - // convert the path to only lineto's and cubic curveto's: - Geom::Affine tf = item->i2doc_affine(); - Geom::PathVector pathv = pathv_to_linear_and_cubic_beziers( shape->_curve->get_pathvector() * tf ); - - //Count the NR_CURVETOs/LINETOs (including closing line segment) - guint segmentCount = 0; - for(Geom::PathVector::const_iterator it = pathv.begin(); it != pathv.end(); ++it) { - segmentCount += (*it).size(); - if (it->closed()) { - segmentCount += 1; - } - } - - out(" elements: [\n"); - - unsigned int segmentNr = 0; - - nrNodes += segmentCount; - - Geom::Rect cminmax( pathv.front().initialPoint(), pathv.front().initialPoint() ); - - /** - * For all Subpaths in the <path> - */ - for (Geom::PathVector::const_iterator pit = pathv.begin(); pit != pathv.end(); ++pit) - { - Geom::Point p = pit->front().initialPoint(); - cminmax.expandTo(p); - out(" MoveTo {\n"); - out(" x: %s\n", DSTR(p[X])); - out(" y: %s\n", DSTR(p[Y])); - out(" },\n"); - - /** - * For all segments in the subpath - */ - for (Geom::Path::const_iterator cit = pit->begin(); cit != pit->end_closed(); ++cit) - { - //### LINE - if ( dynamic_cast<Geom::LineSegment const *> (&*cit) ) - { - Geom::Point p = cit->finalPoint(); - out(" LineTo {\n"); - out(" x: %s\n", DSTR(p[X])); - out(" y: %s\n", DSTR(p[Y])); - out(" },\n"); - nrNodes++; - } - //### BEZIER - else if (Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const*>(&*cit)) - { - std::vector<Geom::Point> points = cubic->controlPoints(); - Geom::Point p1 = points[1]; - Geom::Point p2 = points[2]; - Geom::Point p3 = points[3]; - out(" CubicCurveTo {\n"); - out(" controlX1: %s\n", DSTR(p1[X])); - out(" controlY1: %s\n", DSTR(p1[Y])); - out(" controlX2: %s\n", DSTR(p2[X])); - out(" controlY2: %s\n", DSTR(p2[Y])); - out(" x: %s\n", DSTR(p3[X])); - out(" y: %s\n", DSTR(p3[Y])); - out(" },\n"); - nrNodes++; - } - else - { - g_error ("logical error, because pathv_to_linear_and_cubic_beziers was used"); - } - segmentNr++; - cminmax.expandTo(cit->finalPoint()); - } - if (pit->closed()) - { - out(" ClosePath {},\n"); - } - } - - out(" ] // elements\n"); - out(" }; // Path\n"); - out(" } // end path %s\n\n", jfxid.c_str()); - - double cminx = cminmax.min()[X]; - double cmaxx = cminmax.max()[X]; - double cminy = cminmax.min()[Y]; - double cmaxy = cminmax.max()[Y]; - - if (cminx < minx) { - minx = cminx; - } - if (cmaxx > maxx) { - maxx = cmaxx; - } - if (cminy < miny) { - miny = cminy; - } - if (cmaxy > maxy) { - maxy = cmaxy; - } - - return true; -} - - - -#else - -/** - * Output the curve data to buffer - */ -bool JavaFXOutput::doCurve(SPItem *item, const String &id) -{ - using Geom::X; - using Geom::Y; - - //### Get the Shape - if (!SP_IS_SHAPE(item)) { //Bulia's suggestion. Allow all shapes - return true; - } - - SPShape *shape = SP_SHAPE(item); - SPCurve *curve = shape->curve; - if (curve->is_empty()) { - return true; - } - - nrShapes++; - - out(" SVGPath \n"); - out(" {\n"); - out(" id: \"%s\"\n", id.c_str()); - - /** - * Output the style information - */ - if (!doStyle(shape->style)) { - return false; - } - - // convert the path to only lineto's and cubic curveto's: - Geom::Affine tf = item->i2doc_affine(); - Geom::PathVector pathv = pathv_to_linear_and_cubic_beziers( curve->get_pathvector() * tf ); - - //Count the NR_CURVETOs/LINETOs (including closing line segment) - nrNodes = 0; - for(Geom::PathVector::const_iterator it = pathv.begin(); it != pathv.end(); ++it) { - nrNodes += (*it).size(); - if (it->closed()) { - nrNodes += 1; - } - } - - char *dataStr = sp_svg_write_path(pathv); - out(" content: \"%s\"\n", dataStr); - free(dataStr); - - Geom::Rect cminmax( pathv.front().initialPoint(), pathv.front().initialPoint() ); - - /** - * Get the Min and Max X and Y extends for the Path. - * ....For all Subpaths in the <path> - */ - for (Geom::PathVector::const_iterator pit = pathv.begin(); pit != pathv.end(); ++pit) - { - cminmax.expandTo(pit->front().initialPoint()); - /** - * For all segments in the subpath - */ - for (Geom::Path::const_iterator cit = pit->begin(); cit != pit->end_closed(); ++cit) - { - cminmax.expandTo(cit->finalPoint()); - } - } - - out(" },\n"); - - double cminx = cminmax.min()[X]; - double cmaxx = cminmax.max()[X]; - double cminy = cminmax.min()[Y]; - double cmaxy = cminmax.max()[Y]; - - if (cminx < minx) { - minx = cminx; - } - if (cmaxx > maxx) { - maxx = cmaxx; - } - if (cminy < miny) { - miny = cminy; - } - if (cmaxy > maxy) { - maxy = cmaxy; - } - - return true; -} - - - -#endif /* #if o */ - - - -/** - * Output the tree data to buffer - */ -bool JavaFXOutput::doTreeRecursive(SPDocument *doc, SPObject *obj) -{ - /** - * Check the type of node and process - */ - String id; - if (!obj->getId()) - { - char buf[16]; - sprintf(buf, "id%d", idindex++); - id = buf; - } - else - { - id = obj->getId(); - } - if (SP_IS_ITEM(obj)) - { - SPItem *item = SP_ITEM(obj); - if (!doCurve(item, id)) { - return false; - } - } - else if (SP_IS_GRADIENT(obj)) - { - SPGradient *grad = SP_GRADIENT(obj); - if (!doGradient(grad, id)) { - return false; - } - } - - /** - * Descend into children - */ - for (auto &child: obj->children) - { - if (!doTreeRecursive(doc, &child)) { - return false; - } - } - - return true; -} - - -/** - * Output the curve data to buffer - */ -bool JavaFXOutput::doTree(SPDocument *doc) -{ - - double bignum = 1000000.0; - minx = bignum; - maxx = -bignum; - miny = bignum; - maxy = -bignum; - - if (!doTreeRecursive(doc, doc->getRoot())) { - return false; - } - - return true; - -} - - -bool JavaFXOutput::doBody(SPDocument *doc, SPObject *obj) -{ - /** - * Check the type of node and process - */ - String id; - if (!obj->getId()) - { - char buf[16]; - sprintf(buf, "id%d", idindex++); - id = buf; - } - else - { - id = obj->getId(); - } - - if (SP_IS_ITEM(obj)) { - SPItem *item = SP_ITEM(obj); - //### Get the Shape - if (SP_IS_SHAPE(item)) {//Bulia's suggestion. Allow all shapes - SPShape *shape = SP_SHAPE(item); - SPCurve *curve = shape->_curve; - if (!curve->is_empty()) { - String jfxid = sanatize(id); - out(" %s(),\n", jfxid.c_str()); - } - } - } - else if (SP_IS_GRADIENT(obj)) { - //TODO: what to do with Gradient within body????? - //SPGradient *grad = SP_GRADIENT(reprobj); - //if (!doGradient(grad, id)) { - // return false; - //} - } - - /** - * Descend into children - */ - for (auto &child: obj->children) - { - if (!doBody(doc, &child)) { - return false; - } - } - - return true; -} - - - -//######################################################################## -//# M A I N O U T P U T -//######################################################################## - - - -/** - * Set values back to initial state - */ -void JavaFXOutput::reset() -{ - nrNodes = 0; - nrShapes = 0; - idindex = 0; - name.clear(); - outbuf.clear(); - foutbuf.clear(); -} - - - -/** - * Saves the <paths> of an Inkscape SVG file as JavaFX spline definitions - */ -bool JavaFXOutput::saveDocument(SPDocument *doc, gchar const *filename_utf8) -{ - reset(); - - - name = Glib::path_get_basename(filename_utf8); - int pos = name.find('.'); - if (pos > 0) { - name = name.substr(0, pos); - } - - - //###### SAVE IN JAVAFX FORMAT TO BUFFER - //# Lets do the curves first, to get the stats - - if (!doTree(doc)) { - return false; - } - String curveBuf = outbuf; - outbuf.clear(); - - if (!doHeader()) { - return false; - } - - outbuf.append(curveBuf); - - out(" override function create(): Node {\n"); - out(" Group {\n"); - out(" content: [\n"); - idindex = 0; - - doBody(doc, doc->getRoot()); - - if (!doTail()) { - return false; - } - - - - //###### WRITE TO FILE - FILE *f = Inkscape::IO::fopen_utf8name(filename_utf8, "w"); - if (!f) - { - err("Could open JavaFX file '%s' for writing", filename_utf8); - return false; - } - - for (String::iterator iter = outbuf.begin() ; iter!=outbuf.end(); ++iter) - { - fputc(*iter, f); - } - - fclose(f); - - return true; -} - - - - -//######################################################################## -//# EXTENSION API -//######################################################################## - - - -#include "clear-n_.h" - - - -/** - * API call to save document -*/ -void -JavaFXOutput::save(Inkscape::Extension::Output */*mod*/, - SPDocument *doc, gchar const *filename_utf8) -{ - /* N.B. The name `filename_utf8' represents the fact that we want it to be in utf8; whereas in - * fact we know that some callers of Extension::save pass something in the filesystem's - * encoding, while others do g_filename_to_utf8 before calling. - * - * In terms of safety, it's best to make all callers pass actual filenames, since in general - * one can't round-trip from filename to utf8 back to the same filename. Whereas the argument - * for passing utf8 filenames is one of convenience: we often want to pass to g_warning or - * store as a string (rather than a byte stream) in XML, or the like. */ - if (!saveDocument(doc, filename_utf8)) - { - g_warning("Could not save JavaFX file '%s'", filename_utf8); - } -} - - - -/** - * Make sure that we are in the database - */ -bool JavaFXOutput::check (Inkscape::Extension::Extension */*module*/) -{ - /* We don't need a Key - if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_OUTPUT_JFX)) { - return FALSE; - } - */ - - return true; -} - - - -/** - * This is the definition of JavaFX output. This function just - * calls the extension system with the memory allocated XML that - * describes the data. -*/ -void -JavaFXOutput::init() -{ - Inkscape::Extension::build_from_mem( - "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n" - "<name>" N_("JavaFX Output") "</name>\n" - "<id>org.inkscape.output.jfx</id>\n" - "<output>\n" - "<extension>.fx</extension>\n" - "<mimetype>text/x-javafx-script</mimetype>\n" - "<filetypename>" N_("JavaFX (*.fx)") "</filetypename>\n" - "<filetypetooltip>" N_("JavaFX Raytracer File") "</filetypetooltip>\n" - "</output>\n" - "</inkscape-extension>", - new JavaFXOutput()); -} - - - - - -} // namespace Internal -} // namespace Extension -} // namespace Inkscape - - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/extension/internal/javafx-out.h b/src/extension/internal/javafx-out.h deleted file mode 100644 index 594886004..000000000 --- a/src/extension/internal/javafx-out.h +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * A simple utility for exporting an Inkscape svg image as a JavaFX - * scene tree. - * - * Authors: - * Bob Jamison <ishmal@inkscape.org> - * Silveira Neto <silveiraneto@gmail.com> - * Jim Clarke <Jim.Clarke@sun.com> - * - * Copyright (C) 2008 Authors - * - * Released under GNU GPL v2+, read the file 'COPYING' for more information. - */ - -#ifndef EXTENSION_INTERNAL_JAVAFX_OUT_H -#define EXTENSION_INTERNAL_JAVAFX_OUT_H - -#include <glib.h> -#include "extension/implementation/implementation.h" -#include "document.h" - -class SPGradient; - -namespace Inkscape -{ -namespace Extension -{ -namespace Internal -{ - - - -/** - * Output the current svg document in JavaFX format. - * - * For information, @see: - * https://openjfx.dev.java.net/ - */ -class JavaFXOutput : public Inkscape::Extension::Implementation::Implementation -{ - -public: - JavaFXOutput (); - - /** - * Our internal String definition - */ - typedef Glib::ustring String; - - - /** - * Check whether we can actually output using this module - */ - bool check (Inkscape::Extension::Extension * module) override; - - /** - * API call to perform the output to a file - */ - void save(Inkscape::Extension::Output *mod, - SPDocument *doc, gchar const *filename) override; - - /** - * Inkscape runtime startup call. - */ - static void init(); - - /** - * Reset variables to initial state - */ - void reset(); - -private: - - //output class name - String name; - - //For formatted output - String outbuf; //main output buffer - String foutbuf; //header function buffer - - - /** - * Format text to our output buffer - */ - void out(const char *fmt, ...) G_GNUC_PRINTF(2,3); - - /** - * Format text to our function output buffer - */ - void fout(const char *fmt, ...) G_GNUC_PRINTF(2,3); - - //Output the parts of the file - - /** - * Output the file header - */ - bool doHeader(); - - /** - * Output gradient information to the buffer - */ - bool doGradient(SPGradient *grad, const String &id); - - /** - * Output an element's style attribute - */ - bool doStyle(SPStyle *style); - - /** - * Output the SVG document's curve data as JavaFX geometry types - */ - bool doCurve(SPItem *item, const String &id); - bool doTreeRecursive(SPDocument *doc, SPObject *obj); - bool doTree(SPDocument *doc); - - bool doBody(SPDocument *doc, SPObject *obj); - - /** - * Output the file footer - */ - bool doTail(); - - - - /** - * Actual method to save document - */ - bool saveDocument(SPDocument *doc, gchar const *filename); - - //For statistics - int nrNodes; - int nrShapes; - - int idindex; - - double minx; - double miny; - double maxx; - double maxy; - - -}; - - - - -} // namespace Internal -} // namespace Extension -} // namespace Inkscape - - - -#endif /* EXTENSION_INTERNAL_POV_OUT_H */ - diff --git a/src/io/README b/src/io/README index 141078616..9d971b766 100644 --- a/src/io/README +++ b/src/io/README @@ -7,7 +7,7 @@ Note that input and output to particular file formats may be implemented elsewhe 1. Internal extensions. See src/extensions/internal Input: CDR, EMF, WMF VSD WPG - Output: SVG, PNG (via Cairo), PS, EPS, PDF, JavaFX, POV, ODF, EMF, WMF, XAML, LaTex. + Output: SVG, PNG (via Cairo), PS, EPS, PDF, POV, ODF, EMF, WMF, XAML, LaTex. 2. External extensions (Python). See share/extensions |
