void drvJAVA2::show_rectangle(const float llx, const float lly, const float urx, const float ury) { if (numberOfElements > limitNumberOfElements) continue_page(); outf << " // Path # " << currentNr() << endl; outf << " currentPage.add(new PSPathObject(new Color("; outf << currentR() << "f, " << currentG() << "f, " << currentB() << "f), "; outf << currentLineWidth() << "f"; if ((currentLineJoin() != 0) || (currentShowType() != 0)) { outf << ", " << currentLineJoin(); switch (currentShowType()) { case drvbase::stroke: outf << ", 0"; break; case drvbase::fill: outf << ", 1"; break; case drvbase::eofill: outf << ", 2"; break; default: errf << "\t\tFatal: unexpected case for currentShowType() in drvjava2" << endl; // cannot happen abort(); } } if (currentLineType() != solid) { outf << "," << endl; show_dashPattern(outf, dashPattern()); } outf << ", new Rectangle2D.Float(" << (llx + x_offset) << "f, " << (currentDeviceHeight - ury + y_offset) << "f"; outf << ", " << (urx - llx) << "f, " << (ury - lly) << "f)));" << endl; numberOfElements++; }
void drvJAVA::show_text(const TextInfo & textinfo) { unsigned int javaFontNumber = getFontNumber(textinfo.currentFontName.value()); outf << "\tcurrentpage.theObjects.addElement( new PSTextObject(" << endl; outf << "\t\t" << currentR() << "F," << currentG() << "F," << currentB() << "F," << endl; outf << "\t\t\""; // << textinfo.thetext for (const char *p = textinfo.thetext.value(); (*p) != 0; p++) { if ((*p) == '"') { outf << '\\' << *p; } else if ((*p) == '\\') { outf << '\\' << *p; } else if ((*p) == (char) 13) { // ^M outf << ' '; } else { outf << *p; } } outf << "\"," << (int) (textinfo.x + x_offset) << "," << (int) (currentDeviceHeight - textinfo.y + y_offset) << ',' << endl; #ifdef PASSFONTNAME const char *javaFname = JavaFonts[javaFontNumber].javaname; const char *javaFstyle = JavaFonts[javaFontNumber].javastyle; outf << "\t\t\"" << javaFname << "\"," << javaFstyle #else outf << "\t\t" << javaFontNumber; #endif outf << ',' << (int) (textinfo.currentFontSize + 0.5) << " )\n\t);" << endl; }
void drvJAVA::show_path() { outf << "\t// Path # " << currentNr() << endl; // if fill then use a polygon // else use line-segments. switch (currentShowType()) { case drvbase::stroke:{ outf << "\tl = new PSLinesObject(" << endl; outf << "\t\t" << currentR() << "F," << currentG() << "F," << currentB() << "F);" << endl; for (unsigned int t = 0; t < numberOfElementsInPath(); t++) { const Point & p = pathElement(t).getPoint(0); outf << "\tl.addPoint("; outf << (int) (p.x_ + x_offset) << "," << (int) (currentDeviceHeight - p.y_ + y_offset) << ");\n "; } outf << "\tcurrentpage.theObjects.addElement(l);" << endl; } break; case drvbase::fill: case drvbase::eofill:{ outf << "\tp = new PSPolygonObject("; outf << currentR() << "F," << currentG() << "F," << currentB() << "F);" << endl; print_coords(); if (!isPolygon()) { // make closed polygon anyway const basedrawingelement & elem = pathElement(0); const Point & p = elem.getPoint(0); outf << "\tp.addPoint("; outf << (int) (p.x_ + x_offset) << "," << (int) (currentDeviceHeight - p.y_ + y_offset) << ");\n "; } outf << "\tcurrentpage.theObjects.addElement(p);" << endl; } break; default: // cannot happen outf << "unexpected ShowType " << (int) currentShowType(); break; } // outf << "\tcurrentLineWidth: " << currentLineWidth() << endl; }
// Set libplot's filling-and-edging style. May set the line width to zero // to turn off edging. In libplot, a 0-width line is as narrow a line as // can be drawn. void drvplot::set_filling_and_edging_style() { switch (currentShowType()) { case drvbase::stroke: (void)plotter->flinewidth(currentLineWidth()); (void)plotter->pencolor(plotcolor(currentR()), plotcolor(currentG()), plotcolor(currentB())); (void)plotter->filltype(0); // no filling break; case drvbase::fill: if (pathWasMerged()) { (void)plotter->flinewidth(currentLineWidth()); (void)plotter->pencolor(plotcolor(edgeR()), plotcolor(edgeG()), plotcolor(edgeB())); (void)plotter->fillcolor(plotcolor(fillR()), plotcolor(fillG()), plotcolor(fillB())); } else { (void)plotter->flinewidth(0.0); // little or no edging (void)plotter->pencolor(plotcolor(currentR()), plotcolor(currentG()), plotcolor(currentB())); (void)plotter->fillcolor(plotcolor(currentR()), plotcolor(currentG()), plotcolor(currentB())); } (void)plotter->filltype(1); (void)plotter->fillmod("winding"); break; case drvbase::eofill: if (pathWasMerged()) { (void)plotter->flinewidth(currentLineWidth()); (void)plotter->pencolor(plotcolor(edgeR()), plotcolor(edgeG()), plotcolor(edgeB())); (void)plotter->fillcolor(plotcolor(fillR()), plotcolor(fillG()), plotcolor(fillB())); } else { (void)plotter->flinewidth(0.0); // little or no edging (void)plotter->pencolor(plotcolor(currentR()), plotcolor(currentG()), plotcolor(currentB())); (void)plotter->fillcolor(plotcolor(currentR()), plotcolor(currentG()), plotcolor(currentB())); } (void)plotter->filltype(1); (void)plotter->fillmod("even-odd"); break; default: // cannot happen errf << "unexpected ShowType " << (int) currentShowType(); break; } }
void drvTK::show_text(const TextInfo & textinfo) { int condensedfont = (strstr(textinfo.currentFontName.value(), "Condensed") != NIL); int narrowfont = (strstr(textinfo.currentFontName.value(), "Narrow") != NIL); int boldfont = (strstr(textinfo.currentFontName.value(), "Bold") != NIL); int italicfont = ((strstr(textinfo.currentFontName.value(), "Italic") != NIL) || (strstr(textinfo.currentFontName.value(), "Oblique") != NIL)); char* tempfontname = cppstrdup(textinfo.currentFontName.value()) ; // char tempfontname[1024]; char fonttype = 'r'; char *i; int actualFontSize; i = strchr(tempfontname, '-'); if (i != NIL) { *i = '\0'; } if (italicfont) fonttype = 'i'; actualFontSize = int ((textinfo.currentFontSize / .95) * 10); buffer << "set i [$Global(CurrentCanvas) create text " << textinfo.x + x_offset << " " << (currentDeviceHeight - textinfo.y + y_offset + actualFontSize / 7.2); buffer << " -text \""; outputEscapedText(textinfo.thetext.value()); buffer << endl << "\""; buffer << " -font {-*-" << tempfontname << "-"; if (boldfont) buffer << "bold"; else buffer << "medium"; buffer << "-" << fonttype; if (narrowfont) buffer << "-narrow--*-"; else if (condensedfont) buffer << "-condensed--*-"; else buffer << "-*--*-"; buffer << actualFontSize << "-72-72-*-*-*-*" << "}" << " -anchor sw" << " -fill " << colorstring(currentR(), currentG(), currentB()) << " -tags \"" << options->tagNames << "\" ]" << endl; if (strcmp(options->tagNames.value.value(), "") && !(options->noImPress)) { buffer << "set Group($Global(CurrentCanvas),$i) \"" << options->tagNames << "\"" << endl; } delete [] tempfontname; }
void drvLWO::print_coords() { LWO_POLY *p = new LWO_POLY; p->r = (unsigned char) (255.0 * currentR()); p->g = (unsigned char) (255.0 * currentG()); p->b = (unsigned char) (255.0 * currentB()); p->num = 0; // intial value; // p->num = numberOfElementsInPath(); p->x = new float[numberOfElementsInPath()]; // allocate a conservative amount p->y = new float[numberOfElementsInPath()]; // allocate a conservative amount p->next = polys; polys = p; total_polys++; for (unsigned int n = 0; n < numberOfElementsInPath(); n++) { const basedrawingelement & elem = pathElement(n); switch (elem.getType()) { case moveto:{ const Point & pe = elem.getPoint(0); // outf << "\t\tmoveto "; p->x[p->num] = pe.x_ + x_offset; p->y[p->num] = pe.y_ + y_offset; p->num++; } break; case lineto:{ const Point & pe = elem.getPoint(0); // outf << "\t\tlineto "; p->x[p->num] = pe.x_ + x_offset; p->y[p->num] = pe.y_ + y_offset; p->num++; } break; case closepath: // Not supported // outf << "\t\tclosepath "; break; case curveto:{ // Not supported } break; default: errf << "\t\tFatal: unexpected case in drvpdf " << endl; abort(); break; } // outf << endl; } total_vertices += p->num; // outf << "]" << endl; }
void drvTK::show_path() { const int fillpat = (currentShowType() == drvbase::stroke) ? noFill : Fill; if (isPolygon()) { buffer << "set i [$Global(CurrentCanvas) create polygon "; print_coords(); if (fillpat == 1) { buffer << " -fill \"" << colorstring(currentR(), currentG(), currentB()) << "\""; } else { buffer << " -fill \"\""; } buffer << " -outline \"" << colorstring(currentR(), currentG(), currentB()) << "\"" << " -width " << (currentLineWidth()? currentLineWidth() : 1) << "p" << " -tags \"" << options->tagNames << "\" ]" << endl; } else { if (fillpat == 1) { buffer << "set i [$Global(CurrentCanvas) create polygon "; print_coords(); buffer << " -fill \"" << colorstring(currentR(), currentG(), currentB()) << "\""; buffer << " -outline \"" << colorstring(currentR(), currentG(), currentB()) << "\"" << " -width " << (currentLineWidth()? currentLineWidth() : 1) << "p" << " -tags \"" << options->tagNames << "\" ]" << endl; } else { buffer << "set i [$Global(CurrentCanvas) create line "; print_coords(); buffer << " -fill \"" << colorstring(currentR(), currentG(), currentB()) << "\"" << " -width " << (currentLineWidth()? currentLineWidth() : 1) << "p" << " -tags \"" << options->tagNames << "\" ]" << endl; } } if (strcmp(options->tagNames.value.value(), "") && !(options->noImPress)) { buffer << "set Group($Global(CurrentCanvas),$i) \"" << options->tagNames << "\"" << endl; } }
void drvJAVA2::show_text(const TextInfo & textinfo) { if (numberOfElements > limitNumberOfElements) continue_page(); unsigned int javaFontNumber = getFontNumber(textinfo.currentFontName.value()); outf << " currentPage.add(new PSTextObject(new Color("; outf << currentR() << "f, " << currentG() << "f, " << currentB() << "f)," << endl; outf << " \""; for (const char *p = textinfo.thetext.value(); (*p) != 0; p++) { if ((*p) == '"') { outf << '\\' << *p; } else if ((*p) == '\\') { outf << '\\' << *p; } else if ((*p) == (char) 13) { // ^M outf << ' '; } else { outf << *p; } } outf << "\"," << endl; outf << " " << (textinfo.x + x_offset) << "f, " << (currentDeviceHeight - textinfo.y + y_offset) << "f"; #ifdef PASSFONTNAME const char *javaFname = JavaFonts[javaFontNumber].javaname; const char *javaFstyle = JavaFonts[javaFontNumber].javastyle; outf << ", \"" << javaFname << "\", " << javaFstyle; #else outf << ", " << javaFontNumber; #endif const float *CTM = getCurrentFontMatrix(); if ((fabs(pythagoras(CTM[0], CTM[1] ) - textinfo.currentFontSize) < 1e-5) && (fabs(pythagoras(CTM[2] ,CTM[3] ) - textinfo.currentFontSize) < 1e-5) && (CTM[0] * CTM[3] - CTM[1] * CTM[2] >= 0)) { outf << ", " << textinfo.currentFontSize << "f"; if (textinfo.currentFontAngle) { outf << ", " << textinfo.currentFontAngle << "f"; } } else { outf << ", new AffineTransform(" << CTM[0] << "f, " << (-CTM[1]) << "f, "; outf << (-CTM[2]) << "f, " << CTM[3] << "f, 0f, 0f)"; } outf << "));" << endl; numberOfElements++; }
void drvPDF::show_path() { // add_to_page(); // is done in drvbase !! endtext(); // close text if open const char *setrgbcolor = 0; const char *drawingop = 0; switch (currentShowType()) { case drvbase::stroke: // it's a stroke drawingop = "S"; setrgbcolor = "RG"; break; case drvbase::fill: drawingop = "f"; setrgbcolor = "rg"; break; case drvbase::eofill: drawingop = "f*"; setrgbcolor = "rg"; break; default: // cannot happen errf << "unexpected ShowType " << (int) currentShowType() << endl; exit(1); break; } // buffer.precision(3); // buffer.setf(ios::fixed); // buffer.width(0); // to force minimal width // buffer.unsetf(ios::showpoint); if (Verbose()) { buffer << "% path " << currentNr() << endl; } buffer << RND3(currentR()) << " " << RND3(currentG()) << " " << RND3(currentB()) << " " << setrgbcolor << endl; buffer << currentLineWidth() << " w" << endl; buffer << currentLineCap() << " J" << endl; buffer << currentLineJoin() << " j" << endl; buffer << dashPattern() << " d" << endl; print_coords(); buffer << drawingop << endl; }
void drvSAMPL::show_path() { outf << "Path # " << currentNr(); if (isPolygon()) outf << " (polygon): " << endl; else outf << " (polyline): " << endl; outf << "\tcurrentShowType: "; switch (currentShowType()) { case drvbase::stroke: outf << "stroked"; break; case drvbase::fill: outf << "filled"; break; case drvbase::eofill: outf << "eofilled"; break; default: // cannot happen outf << "unexpected ShowType " << (int) currentShowType(); break; } outf << endl; outf << "\tcurrentLineWidth: " << currentLineWidth() << endl; outf << "\tcurrentR: " << currentR() << endl; outf << "\tcurrentG: " << currentG() << endl; outf << "\tcurrentB: " << currentB() << endl; outf << "\tedgeR: " << edgeR() << endl; outf << "\tedgeG: " << edgeG() << endl; outf << "\tedgeB: " << edgeB() << endl; outf << "\tfillR: " << fillR() << endl; outf << "\tfillG: " << fillG() << endl; outf << "\tfillB: " << fillB() << endl; outf << "\tcurrentLineCap: " << currentLineCap() << endl; outf << "\tdashPattern: " << dashPattern() << endl; outf << "\tPath Elements 0 to " << numberOfElementsInPath() - 1 << endl; print_coords(); }
void drvJAVA2::show_path() { outf << " // Path # " << currentNr() << endl; outf << " currentPath = new PSPathObject(new Color("; outf << currentR() << "f, " << currentG() << "f, " << currentB() << "f), "; outf << currentLineWidth() << "f"; if ((currentLineCap() != 0) || (currentLineJoin() != 0) || (currentShowType() != 0) || (currentLineType() != solid)) { outf << ", " << currentLineCap() << ", " << currentLineJoin() << ", " << currentMiterLimit() << "f, "; switch (currentShowType()) { case drvbase::stroke: outf << "0"; break; case drvbase::fill: outf << "1"; break; case drvbase::eofill: outf << "2"; break; default: errf << "\t\tFatal: unexpected case for currentShowType() in drvjava2" << endl; // cannot happen abort(); } if (currentLineType() != solid) { outf << "," << endl; show_dashPattern(outf, dashPattern()); } } if (isPolygon()) { outf << ", true"; } outf << ");" << endl; numberOfElements++; print_coords(); outf << " currentPage.add(currentPath);" << endl; numberOfElements++; }
void drvRIB::show_path() { outf << "Color " << currentR() << " " << currentG() << " " << currentB() << endl; print_coords(); }
void drvFIG::show_path() { float localLineWidth = currentLineWidth(); localLineWidth *= 80.0f/72.0f; // xfig scales width differently - added in 3.50 - wogl // dont know whether this should be synchronized with -usecorrectfontsize option. /* 3.50: Originally, the resolution of Fig lines was 1/80 inch, and it was thought that the line width of "1" looked too thick, so it was reduced. Therefore, the final width of lines in PostScript/EPS is: Figwidth == 1: 7.5 Figwidth > 1: (Figwidth-1)*15 Regards, Brian Smith in reverse: l < (15+7.5)/2 : f = 1 f = (l /15) + 1 */ const float boundaryforOneCase = (((15.0f + 7.5f)/2.0f) / 15.0f); // 0.75 // if calculated linewidth is (without "+1 correction") > 0.75 // then apply correction by 1 // for the 0.75 case itself it means - map it to 1.75 and from there to 2 // if it is < 0.75, then leave it so and create in fig a 1 ( (int) 0.75+0.5 ) if (Verbose() ) { cerr << "localLineWidth " << localLineWidth << " b " << boundaryforOneCase << endl; } if (localLineWidth > boundaryforOneCase) { localLineWidth += 1.0f; // see above } else { // line width of 0 remain 0 - everything else is at least 1 if ((localLineWidth < 0.0) || ((localLineWidth > 0.0) && (localLineWidth <= 1.0))) { localLineWidth = 1.0; } } unsigned int linestyle = 0; switch (currentLineType()) { case solid: linestyle = 0; break; case dashed: linestyle = 1; break; case dotted: linestyle = 2; break; case dashdot: linestyle = 3; break; case dashdotdot: linestyle = 4; break; } const unsigned int linecap = currentLineCap(); const unsigned int linejoin = currentLineJoin(); // Calculate BBox bbox_path(); const unsigned int curvetos = nrOfCurvetos(); if (curvetos == 0) // polyline { buffer << "# polyline\n"; buffer << "2 1 " << linestyle << " " << (int) (localLineWidth + 0.5f) << " "; const unsigned int color = registercolor(currentR(), currentG(), currentB()); const int fill_or_nofill = (currentShowType() == drvbase::stroke) ? -1 : 20; if (objectId) objectId--; // don't let it get < 0 buffer << color << " " << color << " " << objectId << " 0 " << fill_or_nofill << " " << "4.0" << " " << linejoin << " " << linecap //" 0 0" << " 0 0 0 "; // 4.0 is the gap spec. we could also derive this from the input buffer << (int) (numberOfElementsInPath()) << "\n"; print_polyline_coords(); } else // contains at least one curveto { buffer << "# spline\n"; // 3 2 means "open interpolated spline" buffer << "3 4 " << linestyle << " " << (int) (localLineWidth + 0.5f) << " "; const unsigned int color = registercolor(currentR(), currentG(), currentB()); const int fill_or_nofill = (currentShowType() == drvbase::stroke) ? -1 : 20; if (objectId) objectId--; // don't let it get < 0 buffer << color << " " << color << " " << objectId << " 0 " << fill_or_nofill << " " << "4.0" << //" 0" " " << linecap << " 0 0 "; // 4.0 is the gap spec. we could also derive this from the input // IJMP - change to quintic spline - 5 pnts per spline, not 3 buffer << numberOfElementsInPath() + 5 * curvetos - curvetos << "\n"; print_spline_coords1(); print_spline_coords2(); } }