summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 083f25b)
raw | patch | inline | side by side (parent: 083f25b)
author | ishmal <ishmal@users.sourceforge.net> | |
Thu, 8 Mar 2007 21:40:13 +0000 (21:40 +0000) | ||
committer | ishmal <ishmal@users.sourceforge.net> | |
Thu, 8 Mar 2007 21:40:13 +0000 (21:40 +0000) |
src/extension/internal/pov-out.cpp | patch | blob | history |
index 8450b104088eaf234ef7e4e37d8b7cf58fe56a22..c26af6f36276ac9d448e8cba682e064eeb8245bd 100644 (file)
* http://www.povray.org
*
* Authors:
- * Bob Jamison <rjamison@titan.com>
+ * Bob Jamison <ishmalius@gmail.com>
*
- * Copyright (C) 2004 Authors
+ * Copyright (C) 2004-2007 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
/**
* Make sure that we are in the database
*/
-bool
-PovOutput::check (Inkscape::Extension::Extension *module)
+bool PovOutput::check (Inkscape::Extension::Extension *module)
{
/* We don't need a Key
if (NULL == Inkscape::Extension::db.get(SP_MODULE_KEY_OUTPUT_POV))
return FALSE;
*/
- return TRUE;
+ return true;
}
Inkscape::XML::Node *node,
char const *name)
{
- if ( !name
- || strcmp(node->name(), name) == 0 ) {
+ if ( !name || strcmp(node->name(), name) == 0 )
results.push_back(node);
- }
- for (Inkscape::XML::Node *child = node->firstChild() ; child ; child = child->next())
+ for (Inkscape::XML::Node *child = node->firstChild() ; child ;
+ child = child->next())
findElementsByTagName( results, child, name );
}
{
public:
PovShapeInfo()
- {}
+ {}
+ PovShapeInfo(const PovShapeInfo &other)
+ { assign(other); }
+ PovShapeInfo operator=(const PovShapeInfo &other)
+ { assign(other); return *this; }
virtual ~PovShapeInfo()
- {}
+ {}
std::string id;
std::string color;
+
+private:
+ void assign(const PovShapeInfo &other)
+ {
+ id = other.id;
+ color = other.color;
+ }
};
effective_opacity(SPItem const *item)
{
double ret = 1.0;
- for (SPObject const *obj = item; obj; obj = obj->parent) {
+ for (SPObject const *obj = item; obj; obj = obj->parent)
+ {
SPStyle const *const style = SP_OBJECT_STYLE(obj);
g_return_val_if_fail(style, ret);
ret *= SP_SCALE24_TO_FLOAT(style->opacity.value);
- }
+ }
return ret;
}
+
+
/**
* Saves the <paths> of an Inkscape SVG file as PovRay spline definitions
*/
@@ -127,6 +139,7 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
findElementsByTagName(results, SP_ACTIVE_DOCUMENT->rroot, NULL);//Check all nodes
if (results.size() == 0)
return;
+
Inkscape::IO::dump_fopen_call(uri, "L");
FILE *f = Inkscape::IO::fopen_utf8name(uri, "w");
if (!f)
@@ -137,6 +150,7 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
fprintf(f, "### This PovRay document was generated by Inkscape\n");
fprintf(f, "### http://www.inkscape.org\n");
fprintf(f, "### Created: %s", ctime(&tim));
+ fprintf(f, "### Version: %s\n", VERSION);
fprintf(f, "##################################################*/\n\n\n");
std::vector<PovShapeInfo>povShapes; //A list for saving information about the shapes
@@ -161,7 +175,7 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
unsigned indx;
for (indx = 0; indx < results.size() ; indx++)
- {
+ {
//### Fetch the object from the repr info
Inkscape::XML::Node *rpath = results[indx];
gchar *id = (gchar *)rpath->attribute("id");
@@ -171,32 +185,30 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
//### Get the transform of the item
if (!SP_IS_ITEM(reprobj))
- {
continue;
- }
+
SPItem *item = SP_ITEM(reprobj);
NR::Matrix tf = sp_item_i2d_affine(item);
//### Get the Shape
if (!SP_IS_SHAPE(reprobj))//Bulia's suggestion. Allow all shapes
- {
continue;
- }
+
SPShape *shape = SP_SHAPE(reprobj);
SPCurve *curve = shape->curve;
if (sp_curve_empty(curve))
continue;
PovShapeInfo shapeInfo;
-
- shapeInfo.id = id;
- shapeInfo.color = "";
+ shapeInfo.id = id;
+ shapeInfo.color = "";
//Try to get the fill color of the shape
SPStyle *style = SP_OBJECT_STYLE(shape);
/* fixme: Handle other fill types, even if this means translating gradients to a single
flat colour. */
- if (style && (style->fill.type == SP_PAINT_TYPE_COLOR)) {
+ if (style && (style->fill.type == SP_PAINT_TYPE_COLOR))
+ {
// see color.h for how to parse SPColor
float rgb[3];
sp_color_get_rgb_floatv(&style->fill.value.color, rgb);
@@ -209,20 +221,20 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
shapeInfo.color += str;
g_free(str);
- }
+ }
povShapes.push_back(shapeInfo); //passed all tests. save the info
int curveNr;
+ int curveLength = SP_CURVE_LENGTH(curve);
//Count the NR_CURVETOs/LINETOs
int segmentCount=0;
NArtBpath *bp = SP_CURVE_BPATH(curve);
- for (curveNr=0 ; curveNr<curve->length ; curveNr++, bp++)
+ for (curveNr=0 ; curveNr<curveLength ; curveNr++, bp++)
if (bp->code == NR_CURVETO || bp->code == NR_LINETO)
segmentCount++;
- bp = SP_CURVE_BPATH(curve);
double cminx = bignum;
double cmaxx = -bignum;
double cminy = bignum;
@@ -240,7 +252,9 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
fprintf(f, " 0.0, //bottom\n");
fprintf(f, " %d, //nr points\n", segmentCount * 4);
int segmentNr = 0;
- for (bp = SP_CURVE_BPATH(curve), curveNr=0 ; curveNr<curve->length ; curveNr++, bp++) {
+ curveNr = 0;
+ for (bp = SP_CURVE_BPATH(curve) ; curveNr < curveLength ; curveNr++, bp++)
+ {
using NR::X;
using NR::Y;
NR::Point const p1(bp->c(1) * tf);
@@ -250,7 +264,8 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
double const x2 = p2[X], y2 = p2[Y];
double const x3 = p3[X], y3 = p3[Y];
- switch (bp->code) {
+ switch (bp->code)
+ {
case NR_MOVETO:
case NR_MOVETO_OPEN:
//fprintf(f, "moveto: %f %f\n", bp->x3, bp->y3);
@@ -261,10 +276,10 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
// segmentNr++, lastx, lasty, x1, y1, x2, y2, x3, y3);
fprintf(f, " /*%4d*/ <%s, %s>, <%s, %s>, <%s,%s>, <%s,%s>",
segmentNr++,
- dstr(s1, lastx), dstr(s2, lasty),
- dstr(s3, x1), dstr(s4, y1),
- dstr(s5, x2), dstr(s6, y2),
- dstr(s7, x3), dstr(s8, y3));
+ dstr(s1, lastx), dstr(s2, lasty),
+ dstr(s3, x1), dstr(s4, y1),
+ dstr(s5, x2), dstr(s6, y2),
+ dstr(s7, x3), dstr(s8, y3));
if (segmentNr < segmentCount)
fprintf(f, ",\n");
@@ -280,16 +295,17 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
if (lasty > cmaxy)
cmaxy = lasty;
break;
+
case NR_LINETO:
//fprintf(f, " /*%4d*/ <%f, %f>, <%f, %f>, <%f,%f>, <%f,%f>",
// segmentNr++, lastx, lasty, lastx, lasty, x3, y3, x3, y3);
fprintf(f, " /*%4d*/ <%s, %s>, <%s, %s>, <%s,%s>, <%s,%s>",
segmentNr++,
- dstr(s1, lastx), dstr(s2, lasty),
- dstr(s3, lastx), dstr(s4, lasty),
- dstr(s5, x3), dstr(s6, y3),
- dstr(s7, x3), dstr(s8, y3));
+ dstr(s1, lastx), dstr(s2, lasty),
+ dstr(s3, lastx), dstr(s4, lasty),
+ dstr(s5, x3), dstr(s6, y3),
+ dstr(s7, x3), dstr(s8, y3));
if (segmentNr < segmentCount)
fprintf(f, ",\n");
@@ -309,13 +325,15 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
case NR_END:
//fprintf(f, "end\n");
break;
- }
+ }
lastx = x3;
lasty = y3;
- }
+ }
fprintf(f, "}\n");
+
+
/*
- fprintf(f, "#declare %s_MIN_X = %4.3f;\n", id, cminx);
+ fprintf(f, "#declare %s_MIN_X = %4.3f;\n", id, cminx);
fprintf(f, "#declare %s_CENTER_X = %4.3f;\n", id, (cmaxx+cminx)/2.0);
fprintf(f, "#declare %s_MAX_X = %4.3f;\n", id, cmaxx);
fprintf(f, "#declare %s_WIDTH = %4.3f;\n", id, cmaxx-cminx);
@@ -323,8 +341,8 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
fprintf(f, "#declare %s_CENTER_Y = %4.3f;\n", id, (cmaxy+cminy)/2.0);
fprintf(f, "#declare %s_MAX_Y = %4.3f;\n", id, cmaxy);
fprintf(f, "#declare %s_HEIGHT = %4.3f;\n", id, cmaxy-cminy);
- */
- fprintf(f, "#declare %s_MIN_X = %s;\n", id, dstr(s1, cminx));
+ */
+ fprintf(f, "#declare %s_MIN_X = %s;\n", id, dstr(s1, cminx));
fprintf(f, "#declare %s_CENTER_X = %s;\n", id, dstr(s1, (cmaxx+cminx)/2.0));
fprintf(f, "#declare %s_MAX_X = %s;\n", id, dstr(s1, cmaxx));
fprintf(f, "#declare %s_WIDTH = %s;\n", id, dstr(s1, cmaxx-cminx));
@@ -347,13 +365,12 @@ PovOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *
if (cmaxy > maxy)
maxy = cmaxy;
-
- }//for
+ }//for
//## Let's make a union of all of the Shapes
- if (!povShapes.empty()) {
+ if (povShapes.size()>0) {
char const *id = "AllShapes";
fprintf(f, "/*##############################################\n");
fprintf(f, "### UNION OF ALL SHAPES IN DOCUMENT\n");