Export backgrounds in vector files

VectorFileWriter::Background() is an empty impl, except that it writes
  * a rectangle the size of the output for EPS and PDF, and
  * a <style> element setting background-color for SVG

Ref: #525
pull/694/head
nabijaczleweli 2020-03-25 21:40:14 +01:00 committed by phkahler
parent 028b613f10
commit 360b347ad7
3 changed files with 85 additions and 0 deletions

View File

@ -724,6 +724,9 @@ void VectorFileWriter::OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm) {
}
StartFile();
if(SS.exportBackgroundColor) {
Background(SS.backgroundColor);
}
if(sm && SS.exportShadedTriangles) {
for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
Triangle(tr);

View File

@ -551,6 +551,9 @@ void DxfFileWriter::StartFile() {
paths.clear();
}
void DxfFileWriter::Background(RgbaColor color) {
}
void DxfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -696,6 +699,35 @@ void EpsFileWriter::StartFile() {
MmToPts(ptMax.y - ptMin.y));
}
void EpsFileWriter::Background(RgbaColor color) {
double width = ptMax.x - ptMin.x;
double height = ptMax.y - ptMin.y;
fprintf(f,
"%.3f %.3f %.3f setrgbcolor\r\n"
"newpath\r\n"
" %.3f %.3f moveto\r\n"
" %.3f %.3f lineto\r\n"
" %.3f %.3f lineto\r\n"
" %.3f %.3f lineto\r\n"
" closepath\r\n"
"gsave fill grestore\r\n",
color.redF(), color.greenF(), color.blueF(),
MmToPts(0), MmToPts(0),
MmToPts(width), MmToPts(0),
MmToPts(width), MmToPts(height),
MmToPts(0), MmToPts(height));
// same issue with cracks, stroke it to avoid them
double sw = max(width, height) / 1000;
fprintf(f,
"1 setlinejoin\r\n"
"1 setlinecap\r\n"
"%.3f setlinewidth\r\n"
"gsave stroke grestore\r\n",
MmToPts(sw));
}
void EpsFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -926,6 +958,30 @@ void PdfFileWriter::FinishAndCloseFile() {
}
void PdfFileWriter::Background(RgbaColor color) {
double width = ptMax.x - ptMin.x;
double height = ptMax.y - ptMin.y;
double sw = max(width, height) / 1000;
fprintf(f,
"1 J 1 j\r\n"
"%.3f %.3f %.3f RG\r\n"
"%.3f %.3f %.3f rg\r\n"
"%.3f w\r\n"
"%.3f %.3f m\r\n"
"%.3f %.3f l\r\n"
"%.3f %.3f l\r\n"
"%.3f %.3f l\r\n"
"b\r\n",
color.redF(), color.greenF(), color.blueF(),
color.redF(), color.greenF(), color.blueF(),
MmToPts(sw),
MmToPts(0), MmToPts(0),
MmToPts(width), MmToPts(0),
MmToPts(width), MmToPts(height),
MmToPts(0), MmToPts(height));
}
void PdfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -1051,6 +1107,16 @@ void SvgFileWriter::StartFile() {
fprintf(f, "]]></style>\r\n");
}
void SvgFileWriter::Background(RgbaColor color) {
fprintf(f,
"<style><![CDATA[\r\n"
"svg {\r\n"
"background-color:#%02x%02x%02x;\r\n"
"}\r\n"
"]]></style>\r\n",
color.red, color.green, color.blue);
}
void SvgFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -1146,6 +1212,9 @@ void HpglFileWriter::StartFile() {
fprintf(f, "SP1;\r\n");
}
void HpglFileWriter::Background(RgbaColor color) {
}
void HpglFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -1187,6 +1256,8 @@ void GCodeFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
}
void GCodeFileWriter::Background(RgbaColor color) {
}
void GCodeFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
bool filled, RgbaColor fillRgb, hStyle hs)
{
@ -1248,6 +1319,9 @@ void Step2dFileWriter::StartFile() {
sfw.WriteHeader();
}
void Step2dFileWriter::Background(RgbaColor color) {
}
void Step2dFileWriter::Triangle(STriangle *tr) {
}

View File

@ -339,6 +339,7 @@ public:
virtual void Bezier(SBezier *sb) = 0;
virtual void Triangle(STriangle *tr) = 0;
virtual bool OutputConstraints(IdList<Constraint,hConstraint> *) { return false; }
virtual void Background(RgbaColor color) = 0;
virtual void StartFile() = 0;
virtual void FinishAndCloseFile() = 0;
virtual bool HasCanvasSize() const = 0;
@ -363,6 +364,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return false; }
@ -380,6 +382,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return true; }
@ -398,6 +401,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return true; }
@ -414,6 +418,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return true; }
@ -428,6 +433,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return false; }
@ -441,6 +447,7 @@ class Step2dFileWriter : public VectorFileWriter {
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return false; }
@ -455,6 +462,7 @@ public:
bool filled, RgbaColor fillRgb, hStyle hs) override;
void Triangle(STriangle *tr) override;
void Bezier(SBezier *sb) override;
void Background(RgbaColor color) override;
void StartFile() override;
void FinishAndCloseFile() override;
bool HasCanvasSize() const override { return false; }