KiCad PCB EDA Suite
Loading...
Searching...
No Matches
plotters_pslike.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
25
26#pragma once
27
28#include "plotter.h"
29#include <memory>
30#include <optional>
33#include <math/vector3.h>
34
35namespace MARKUP { struct NODE; }
36
41class PSLIKE_PLOTTER : public PLOTTER
42{
43public:
44 PSLIKE_PLOTTER( const PROJECT* aProject = nullptr) :
45 PLOTTER( aProject ),
46 plotScaleAdjX( 1 ),
47 plotScaleAdjY( 1 ),
49 {
50 }
51
55 virtual void SetTextMode( PLOT_TEXT_MODE mode ) override
56 {
57 if( mode != PLOT_TEXT_MODE::DEFAULT )
58 m_textMode = mode;
59 }
60
64 void SetScaleAdjust( double scaleX, double scaleY )
65 {
66 plotScaleAdjX = scaleX;
67 plotScaleAdjY = scaleY;
68 }
69
70 // Pad routines are handled with lower level primitives
71 virtual void FlashPadCircle( const VECTOR2I& aPadPos, int aDiameter, void* aData ) override;
72 virtual void FlashPadOval( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
73 const EDA_ANGLE& aPadOrient, void* aData ) override;
74 virtual void FlashPadRect( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
75 const EDA_ANGLE& aPadOrient, void* aData ) override;
76 virtual void FlashPadRoundRect( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
77 int aCornerRadius, const EDA_ANGLE& aOrient,
78 void* aData ) override;
79 virtual void FlashPadCustom( const VECTOR2I& aPadPos, const VECTOR2I& aSize,
80 const EDA_ANGLE& aOrient, SHAPE_POLY_SET* aPolygons,
81 void* aData ) override;
82 virtual void FlashPadTrapez( const VECTOR2I& aPadPos, const VECTOR2I* aCorners,
83 const EDA_ANGLE& aPadOrient, void* aData ) override;
84 virtual void FlashRegularPolygon( const VECTOR2I& aShapePos, int aDiameter, int aCornerCount,
85 const EDA_ANGLE& aOrient, void* aData ) override;
86
91 virtual void SetColor( const COLOR4D& color ) override;
92
93protected:
101 void computeTextParameters( const VECTOR2I& aPos,
102 const wxString& aText,
103 const EDA_ANGLE& aOrient,
104 const VECTOR2I& aSize,
105 bool aMirror,
106 enum GR_TEXT_H_ALIGN_T aH_justify,
107 enum GR_TEXT_V_ALIGN_T aV_justify,
108 int aWidth,
109 bool aItalic,
110 bool aBold,
111 double *wideningFactor,
112 double *ctm_a,
113 double *ctm_b,
114 double *ctm_c,
115 double *ctm_d,
116 double *ctm_e,
117 double *ctm_f,
118 double *heightFactor );
119
122 virtual std::string encodeStringForPlotter( const wxString& aUnicode );
123
125 virtual void emitSetRGBColor( double r, double g, double b, double a ) = 0;
126
128 static const double postscriptTextAscent; // = 0.718;
129
135 int returnPostscriptTextWidth( const wxString& aText, int aXSize, bool aItalic, bool aBold );
136
139
142};
143
144
146{
147public:
148 PS_PLOTTER( const PROJECT* aProject = nullptr ) :
149 PSLIKE_PLOTTER( aProject )
150 {
151 // The phantom plot in postscript is an hack and reportedly
152 // crashes Adobe's own postscript interpreter!
154 }
155
156 static wxString GetDefaultFileExtension()
157 {
158 return wxString( wxT( "ps" ) );
159 }
160
161 virtual PLOT_FORMAT GetPlotterType() const override
162 {
163 return PLOT_FORMAT::POST;
164 }
165
179 virtual bool StartPlot( const wxString& aPageNumber ) override;
180 virtual bool EndPlot() override;
181
185 virtual void SetCurrentLineWidth( int width, void* aData = nullptr ) override;
186
190 virtual void SetDash( int aLineWidth, LINE_STYLE aLineStyle ) override;
191
192 virtual void SetViewport( const VECTOR2I& aOffset, double aIusPerDecimil,
193 double aScale, bool aMirror ) override;
194 virtual void Rect( const VECTOR2I& p1, const VECTOR2I& p2, FILL_T fill, int width,
195 int aCornerRadius = 0 ) override;
196 virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill, int width ) override;
197 virtual void Arc( const VECTOR2D& aCenter, const EDA_ANGLE& aStartAngle,
198 const EDA_ANGLE& aAngle, double aRadius, FILL_T aFill, int aWidth ) override;
199
200 virtual void PlotPoly( const std::vector<VECTOR2I>& aCornerList, FILL_T aFill,
201 int aWidth, void* aData = nullptr ) override;
202
206 virtual void PlotImage( const wxImage& aImage, const VECTOR2I& aPos,
207 double aScaleFactor ) override;
208
209 virtual void PenTo( const VECTOR2I& pos, char plume ) override;
210 virtual void Text( const VECTOR2I& aPos,
211 const COLOR4D& aColor,
212 const wxString& aText,
213 const EDA_ANGLE& aOrient,
214 const VECTOR2I& aSize,
215 enum GR_TEXT_H_ALIGN_T aH_justify,
216 enum GR_TEXT_V_ALIGN_T aV_justify,
217 int aWidth,
218 bool aItalic,
219 bool aBold,
220 bool aMultilineAllowed,
221 KIFONT::FONT* aFont,
222 const KIFONT::METRICS& aFontMetrics,
223 void* aData = nullptr ) override;
224
225 virtual void PlotText( const VECTOR2I& aPos,
226 const COLOR4D& aColor,
227 const wxString& aText,
228 const TEXT_ATTRIBUTES& aAttributes,
229 KIFONT::FONT* aFont,
230 const KIFONT::METRICS& aFontMetrics,
231 void* aData = nullptr ) override;
232
233 virtual void PlotPoly( const SHAPE_LINE_CHAIN& aCornerList, FILL_T aFill,
234 int aWidth, void* aData = nullptr ) override;
235
236
237protected:
238 virtual void emitSetRGBColor( double r, double g, double b, double a ) override;
239};
240
241
243{
244 std::string m_name;
245 std::vector<float> m_cameraMatrix;
247 float m_fov;
248};
249
250
252{
253public:
254 PDF_PLOTTER( const PROJECT* aProject = nullptr ) :
255 PSLIKE_PLOTTER( aProject ),
256 m_pageTreeHandle( 0 ),
260 m_jsNamesHandle( 0 ),
261 m_pageStreamHandle( -1 ),
263 m_workFile( nullptr ),
265 m_3dModelHandle( -1 ),
266 m_3dExportMode( false ),
267 m_usedBase14Fonts( false ),
268 m_currentAlpha( 1.0 ),
269 m_strokeFontManager( nullptr ),
270 m_outlineFontManager( nullptr )
271 {
272 }
273
274 virtual ~PDF_PLOTTER();
275
276 virtual PLOT_FORMAT GetPlotterType() const override
277 {
278 return PLOT_FORMAT::PDF;
279 }
280
281 static wxString GetDefaultFileExtension()
282 {
283 return wxString( wxT( "pdf" ) );
284 }
285
295 virtual bool OpenFile( const wxString& aFullFilename ) override;
296
301 virtual bool StartPlot( const wxString& aPageNumber ) override;
302
303 virtual bool StartPlot( const wxString& aPageNumber,
304 const wxString& aPageName = wxEmptyString );
305
306 virtual bool EndPlot() override;
307
311 virtual void StartPage( const wxString& aPageNumber,
312 const wxString& aPageName = wxEmptyString,
313 const wxString& aParentPageNumber = wxEmptyString,
314 const wxString& aParentPageName = wxEmptyString );
315
319 virtual void ClosePage();
320
329 virtual void SetCurrentLineWidth( int width, void* aData = nullptr ) override;
330
334 virtual void SetDash( int aLineWidth, LINE_STYLE aLineStyle ) override;
335
340 virtual void SetViewport( const VECTOR2I& aOffset, double aIusPerDecimil, double aScale,
341 bool aMirror ) override;
342
346 virtual void Rect( const VECTOR2I& p1, const VECTOR2I& p2, FILL_T fill, int width,
347 int aCornerRadius = 0 ) override;
348
352 virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill, int width ) override;
353
357 virtual void Arc( const VECTOR2D& aCenter, const EDA_ANGLE& aStartAngle, const EDA_ANGLE& aAngle,
358 double aRadius, FILL_T aFill, int aWidth ) override;
359
363 virtual void PlotPoly( const std::vector<VECTOR2I>& aCornerList, FILL_T aFill,
364 int aWidth = USE_DEFAULT_LINE_WIDTH, void* aData = nullptr ) override;
365
366 virtual void PlotPoly( const SHAPE_LINE_CHAIN& aLineChain, FILL_T aFill,
367 int aWidth = USE_DEFAULT_LINE_WIDTH, void* aData = nullptr ) override;
368
369 virtual void PenTo( const VECTOR2I& pos, char plume ) override;
370
371 virtual void Text( const VECTOR2I& aPos,
372 const COLOR4D& aColor,
373 const wxString& aText,
374 const EDA_ANGLE& aOrient,
375 const VECTOR2I& aSize,
376 enum GR_TEXT_H_ALIGN_T aH_justify,
377 enum GR_TEXT_V_ALIGN_T aV_justify,
378 int aWidth,
379 bool aItalic,
380 bool aBold,
381 bool aMultilineAllowed,
382 KIFONT::FONT* aFont,
383 const KIFONT::METRICS& aFontMetrics,
384 void* aData = nullptr ) override;
385
386private:
387 // Structure to hold overbar drawing information
389 {
390 VECTOR2I startPos; // Start position of overbar text
391 VECTOR2I endPos; // End position of overbar text
392 VECTOR2I fontSize; // Font size for proper overbar positioning
393 bool isOutline; // True if the overbar applies to an outline font run
394 GR_TEXT_V_ALIGN_T vAlign; // Original vertical alignment of the parent text
395 };
396
400 VECTOR2I renderWord( const wxString& aWord, const VECTOR2I& aPosition, const VECTOR2I& aSize,
401 const EDA_ANGLE& aOrient, bool aTextMirrored, int aWidth, bool aBold, bool aItalic,
402 KIFONT::FONT* aFont, const KIFONT::METRICS& aFontMetrics,
403 enum GR_TEXT_V_ALIGN_T aV_justify, TEXT_STYLE_FLAGS aTextStyle );
404
408 VECTOR2I renderMarkupNode( const MARKUP::NODE* aNode, const VECTOR2I& aPosition,
409 const VECTOR2I& aBaseSize, const EDA_ANGLE& aOrient, bool aTextMirrored,
410 int aWidth, bool aBaseBold, bool aBaseItalic, KIFONT::FONT* aFont,
411 const KIFONT::METRICS& aFontMetrics, enum GR_TEXT_V_ALIGN_T aV_justify,
412 TEXT_STYLE_FLAGS aTextStyle, std::vector<OVERBAR_INFO>& aOverbars );
413
417 void drawOverbars( const std::vector<OVERBAR_INFO>& aOverbars, const EDA_ANGLE& aOrient,
418 const KIFONT::METRICS& aFontMetrics );
419
420 std::vector<VECTOR2D> arcPath( const VECTOR2D& aCenter, const EDA_ANGLE& aStartAngle,
421 const EDA_ANGLE& aAngle, double aRadius );
422
423public:
424 virtual void PlotText( const VECTOR2I& aPos,
425 const COLOR4D& aColor,
426 const wxString& aText,
427 const TEXT_ATTRIBUTES& aAttributes,
428 KIFONT::FONT* aFont,
429 const KIFONT::METRICS& aFontMetrics,
430 void* aData = nullptr ) override;
431
432 void HyperlinkBox( const BOX2I& aBox, const wxString& aDestinationURL ) override;
433
434 void HyperlinkMenu( const BOX2I& aBox, const std::vector<wxString>& aDestURLs ) override;
435
436 void Bookmark( const BOX2I& aBox, const wxString& aName,
437 const wxString& aGroupName = wxEmptyString ) override;
438
439 void Plot3DModel( const wxString& aSourcePath, const std::vector<PDF_3D_VIEW>& a3DViews );
440
441 void Set3DExport( bool aYes ) { m_3dExportMode = aYes; }
442
446 void PlotImage( const wxImage& aImage, const VECTOR2I& aPos, double aScaleFactor ) override;
447
461 static std::vector<float> CreateC2WMatrixFromAngles( const VECTOR3D& aTargetPosition,
462 float aCameraDistance,
463 float aYawDegrees,
464 float aPitchDegrees,
465 float aRollDegrees );
466
467protected:
469 {
471 wxString title;
473
474 std::vector<OUTLINE_NODE*> children;
475
477 {
478 std::for_each( children.begin(), children.end(),
479 []( OUTLINE_NODE* node )
480 {
481 delete node;
482 } );
483 }
484
485 OUTLINE_NODE* AddChild( int aActionHandle, const wxString& aTitle, int aEntryHandle )
486 {
487 OUTLINE_NODE* child = new OUTLINE_NODE
488 {
489 aActionHandle, aTitle, aEntryHandle, {}
490 };
491
492 children.push_back( child );
493
494 return child;
495 }
496 };
497
508 OUTLINE_NODE* addOutlineNode( OUTLINE_NODE* aParent, int aActionHandle,
509 const wxString& aTitle );
510
513 std::string encodeStringForPlotter( const wxString& aUnicode ) override;
514
516 std::string encodeDoubleForPlotter( double aValue ) const;
517
530 virtual void emitSetRGBColor( double r, double g, double b, double a ) override;
531
538 int allocPdfObject();
539
546 int getExtGStateHandleForAlpha( double aAlpha );
547
552 int startPdfObject( int aHandle = -1 );
553
557 void closePdfObject();
558
566 int startPdfStream( int aHandle = -1 );
567
571 void closePdfStream();
572
576 int emitOutline();
577
581 void emitOutlineNode( OUTLINE_NODE* aNode, int aParentHandle, int aNextNode, int aPrevNode );
582
588 int emitGoToAction( int aPageHandle, const VECTOR2I& aBottomLeft, const VECTOR2I& aTopRight );
589 int emitGoToAction( int aPageHandle );
590
591
593
594 void emitStrokeFonts();
595 void emitOutlineFonts();
596
597 std::string encodeByteString( const std::string& aBytes );
598
599protected:
606 {
607 public:
608 void Reset()
609 {
610 m_offsets.assign( 1, 0 );
611 }
612
623 {
624 m_offsets.push_back( 0 );
625 return static_cast<int>( m_offsets.size() ) - 1;
626 }
627
631 bool IsValid( int aHandle ) const
632 {
633 return aHandle > 0 && aHandle < static_cast<int>( m_offsets.size() );
634 }
635
642 void SetOffset( int aHandle, long aOffset )
643 {
644 wxASSERT_MSG( IsValid( aHandle ), "PDF object handle is not valid" );
645 wxASSERT_MSG( aOffset >= 0, "PDF object offset must be non-negative" );
646
647 if( IsValid( aHandle ) )
648 m_offsets[aHandle] = aOffset;
649 }
650
651 const std::vector<long>& Entries() const
652 {
653 return m_offsets;
654 }
655
656 private:
657 std::vector<long> m_offsets = { 0 };
658 };
659
665 std::vector<int> m_pageHandles;
668
670 wxString m_pageName;
672
674
677
679 std::vector<wxString> m_pageNumbers;
680
682 std::vector<std::pair<BOX2I, wxString>> m_hyperlinksInPage;
683 std::vector<std::pair<BOX2I, std::vector<wxString>>> m_hyperlinkMenusInPage;
684
686 std::map<int, std::pair<BOX2D, wxString>> m_hyperlinkHandles;
687 std::map<int, std::pair<BOX2D, std::vector<wxString>>> m_hyperlinkMenuHandles;
688
689 std::map<wxString, std::vector<std::pair<BOX2I, wxString>>> m_bookmarksInPage;
690
691 std::map<int, wxImage> m_imageHandles;
692
693 std::unique_ptr<OUTLINE_NODE> m_outlineRoot;
695
698
701
703 double m_currentAlpha = 1.0;
704
706 std::map<double, int> m_alphaToExtGStateHandles;
707
708 std::unique_ptr<PDF_STROKE_FONT_MANAGER> m_strokeFontManager;
709 std::unique_ptr<PDF_OUTLINE_FONT_MANAGER> m_outlineFontManager;
710};
711
712
714{
715public:
716 SVG_PLOTTER( const PROJECT* aProject = nullptr );
717
718 static wxString GetDefaultFileExtension()
719 {
720 return wxString( wxT( "svg" ) );
721 }
722
723 virtual PLOT_FORMAT GetPlotterType() const override
724 {
725 return PLOT_FORMAT::SVG;
726 }
727
731 virtual bool StartPlot( const wxString& aPageNumber ) override;
732 virtual bool EndPlot() override;
733
737 virtual void SetCurrentLineWidth( int width, void* aData = nullptr ) override;
738
742 virtual void SetDash( int aLineWidth, LINE_STYLE aLineStyle ) override;
743
744 virtual void SetViewport( const VECTOR2I& aOffset, double aIusPerDecimil, double aScale,
745 bool aMirror ) override;
746 virtual void Rect( const VECTOR2I& p1, const VECTOR2I& p2, FILL_T fill, int width,
747 int aCornerRadius = 0 ) override;
748 virtual void Circle( const VECTOR2I& pos, int diametre, FILL_T fill, int width ) override;
749 virtual void Arc( const VECTOR2D& aCenter, const EDA_ANGLE& aStartAngle,
750 const EDA_ANGLE& aAngle, double aRadius, FILL_T aFill,
751 int aWidth ) override;
752
753 virtual void BezierCurve( const VECTOR2I& aStart, const VECTOR2I& aControl1,
754 const VECTOR2I& aControl2, const VECTOR2I& aEnd,
755 int aTolerance, int aLineThickness ) override;
756
757 virtual void PlotPoly( const std::vector<VECTOR2I>& aCornerList, FILL_T aFill,
758 int aWidth, void * aData ) override;
759
763 virtual void PlotImage( const wxImage& aImage, const VECTOR2I& aPos,
764 double aScaleFactor ) override;
765
766 virtual void PenTo( const VECTOR2I& pos, char plume ) override;
767
778 virtual void SetSvgCoordinatesFormat( unsigned aPrecision ) override;
779
789 virtual void SetPlotBBox( const BOX2I& aBBoxIU ) override;
790
796 virtual void StartBlock( void* aData ) override;
797
803 virtual void EndBlock( void* aData ) override;
804
805 virtual void Text( const VECTOR2I& aPos,
806 const COLOR4D& aColor,
807 const wxString& aText,
808 const EDA_ANGLE& aOrient,
809 const VECTOR2I& aSize,
810 enum GR_TEXT_H_ALIGN_T aH_justify,
811 enum GR_TEXT_V_ALIGN_T aV_justify,
812 int aWidth,
813 bool aItalic,
814 bool aBold,
815 bool aMultilineAllowed,
816 KIFONT::FONT* aFont,
817 const KIFONT::METRICS& aFontMetrics,
818 void* aData = nullptr ) override;
819
820
821 virtual void PlotText( const VECTOR2I& aPos,
822 const COLOR4D& aColor,
823 const wxString& aText,
824 const TEXT_ATTRIBUTES& aAttributes,
825 KIFONT::FONT* aFont,
826 const KIFONT::METRICS& aFontMetrics,
827 void* aData = nullptr ) override;
828
829protected:
830 virtual VECTOR2D userToDeviceCoordinates( const VECTOR2I& aCoordinate ) override;
831
836 virtual void emitSetRGBColor( double r, double g, double b, double a ) override;
837
845 void setSVGPlotStyle( int aLineWidth, bool aIsGroup = true,
846 const std::string& aExtraStyle = {} );
847
851 void setFillMode( FILL_T fill );
852
853 FILL_T m_fillMode; // true if the current contour rect, arc, circle, polygon must
854 // be filled
855 uint32_t m_pen_rgb_color; // current rgb color value: each color has a value 0 ... 255,
856 // and the 3 colors are grouped in a 3x8 bits value (written
857 // in hex to svg files)
858 uint32_t m_brush_rgb_color; // same as m_pen_rgb_color, used to fill some contours.
860 bool m_graphics_changed; // true if a pen/brush parameter is modified color, pen size,
861 // fill mode ... the new SVG stype must be output on file
862 LINE_STYLE m_dashed; // plot line style
863 unsigned m_precision; // How fine the step size is
864 // Use 3-6 (3 means um precision, 6 nm precision) in PcbNew
865 // 3-4 in other modules (avoid values >4 to avoid overflow)
866 // see also comment for m_useInch.
867
868 std::optional<BOX2I> m_plotBBoxIU; // Explicit plot content bounding box (IUs), when set.
869};
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:94
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
The PDF cross-reference table.
std::vector< long > m_offsets
void SetOffset(int aHandle, long aOffset)
Set the file offset for a given PDF object handle.
const std::vector< long > & Entries() const
int Allocate()
Allocate a new PDF object handle.
bool IsValid(int aHandle) const
Is the given PDF object handle in the table?
XREF_TABLE m_xrefTable
The PDF xref offset table.
std::vector< int > m_pageHandles
Handles to the page objects.
FILE * m_workFile
Temporary file to construct the stream before zipping.
void emitOutlineFonts()
wxString m_parentPageName
virtual void ClosePage()
Close the current page in the PDF document (and emit its compressed stream).
void emitOutlineNode(OUTLINE_NODE *aNode, int aParentHandle, int aNextNode, int aPrevNode)
Emits a outline item object and recurses into any children.
std::map< int, wxImage > m_imageHandles
int emitOutline()
Starts emitting the outline object.
virtual bool EndPlot() override
int startPdfObject(int aHandle=-1)
Open a new PDF object and returns the handle if the parameter is -1.
virtual void PlotPoly(const std::vector< VECTOR2I > &aCornerList, FILL_T aFill, int aWidth=USE_DEFAULT_LINE_WIDTH, void *aData=nullptr) override
Polygon plotting for PDF.
virtual ~PDF_PLOTTER()
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width) override
Circle drawing for PDF.
virtual void SetCurrentLineWidth(int width, void *aData=nullptr) override
Pen width setting for PDF.
double m_currentAlpha
Alpha currently set in the page graphics state (PDF starts each page with 1.0).
int m_streamLengthHandle
Handle to the deferred stream length.
void PlotImage(const wxImage &aImage, const VECTOR2I &aPos, double aScaleFactor) override
PDF images are handles as inline, not XObject streams...
int m_jsNamesHandle
Handle for Names dictionary with JS.
wxString m_pageName
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle) override
PDF supports dashed lines.
void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs) override
Create a clickable hyperlink menu with a rectangular click area.
virtual bool OpenFile(const wxString &aFullFilename) override
Open or create the plot file aFullFilename.
std::string encodeDoubleForPlotter(double aValue) const
Convert a double to a PDF-compatible numeric token (no exponent notation).
int m_fontResDictHandle
Font resource dictionary.
virtual void emitSetRGBColor(double r, double g, double b, double a) override
PDF supports colors fully.
void emitStrokeFonts()
void Set3DExport(bool aYes)
PDF_PLOTTER(const PROJECT *aProject=nullptr)
std::map< int, std::pair< BOX2D, wxString > > m_hyperlinkHandles
Handles for all the hyperlink objects that will be deferred.
int m_pageTreeHandle
Handle to the root of the page tree object.
std::map< double, int > m_alphaToExtGStateHandles
Graphics state objects keyed by alpha.
virtual void Text(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
Draw text with the plotter.
int emitGoToAction(int aPageHandle, const VECTOR2I &aBottomLeft, const VECTOR2I &aTopRight)
Emit an action object that instructs a goto coordinates on a page.
void closePdfStream()
Finish the current PDF stream (writes the deferred length, too).
void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString) override
Create a bookmark to a symbol.
void endPlotEmitResources()
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width, int aCornerRadius=0) override
Rectangles in PDF.
int startPdfStream(int aHandle=-1)
Start a PDF stream (for the page).
VECTOR2I renderMarkupNode(const MARKUP::NODE *aNode, const VECTOR2I &aPosition, const VECTOR2I &aBaseSize, const EDA_ANGLE &aOrient, bool aTextMirrored, int aWidth, bool aBaseBold, bool aBaseItalic, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, enum GR_TEXT_V_ALIGN_T aV_justify, TEXT_STYLE_FLAGS aTextStyle, std::vector< OVERBAR_INFO > &aOverbars)
Recursively render markup nodes with appropriate styling.
virtual void Arc(const VECTOR2D &aCenter, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aRadius, FILL_T aFill, int aWidth) override
The PDF engine can't directly plot arcs so we use polygonization.
void HyperlinkBox(const BOX2I &aBox, const wxString &aDestinationURL) override
Create a clickable hyperlink with a rectangular click area.
virtual void PenTo(const VECTOR2I &pos, char plume) override
Moveto/lineto primitive, moves the 'pen' to the specified direction.
int m_extGStateResDictHandle
Graphics state resource dictionary.
std::map< wxString, std::vector< std::pair< BOX2I, wxString > > > m_bookmarksInPage
virtual bool StartPlot(const wxString &aPageNumber) override
The PDF engine supports multiple pages; the first one is opened 'for free' the following are to be cl...
static wxString GetDefaultFileExtension()
bool m_usedBase14Fonts
Set when the non-embeddable font fallback references the base-14 /KicadFont* resources.
int getExtGStateHandleForAlpha(double aAlpha)
Return the ExtGState resource handle for the given alpha, allocating a new object the first time that...
virtual void StartPage(const wxString &aPageNumber, const wxString &aPageName=wxEmptyString, const wxString &aParentPageNumber=wxEmptyString, const wxString &aParentPageName=wxEmptyString)
Start a new page in the PDF document.
std::unique_ptr< PDF_OUTLINE_FONT_MANAGER > m_outlineFontManager
OUTLINE_NODE * addOutlineNode(OUTLINE_NODE *aParent, int aActionHandle, const wxString &aTitle)
Add a new outline node entry.
int m_imgResDictHandle
Image resource dictionary.
std::string encodeStringForPlotter(const wxString &aUnicode) override
convert a wxString unicode string to a char string compatible with the accepted string PDF format (co...
std::unique_ptr< PDF_STROKE_FONT_MANAGER > m_strokeFontManager
void Plot3DModel(const wxString &aSourcePath, const std::vector< PDF_3D_VIEW > &a3DViews)
std::vector< wxString > m_pageNumbers
List of user-space page numbers for resolving internal hyperlinks.
int allocPdfObject()
Allocate a new handle in the table of the PDF object.
VECTOR2I renderWord(const wxString &aWord, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aOrient, bool aTextMirrored, int aWidth, bool aBold, bool aItalic, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, enum GR_TEXT_V_ALIGN_T aV_justify, TEXT_STYLE_FLAGS aTextStyle)
Render a single word with the given style parameters.
wxString m_workFilename
std::string encodeByteString(const std::string &aBytes)
void drawOverbars(const std::vector< OVERBAR_INFO > &aOverbars, const EDA_ANGLE &aOrient, const KIFONT::METRICS &aFontMetrics)
Draw overbar lines above text.
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror) override
PDF can have multiple pages, so SetPageSettings can be called with the outputFile open (but not insid...
std::map< int, std::pair< BOX2D, std::vector< wxString > > > m_hyperlinkMenuHandles
int m_pageStreamHandle
Handle of the page content object.
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
static std::vector< float > CreateC2WMatrixFromAngles(const VECTOR3D &aTargetPosition, float aCameraDistance, float aYawDegrees, float aPitchDegrees, float aRollDegrees)
Generates the camera to world matrix for use with a 3D View.
std::vector< std::pair< BOX2I, wxString > > m_hyperlinksInPage
List of loaded hyperlinks in current page.
std::unique_ptr< OUTLINE_NODE > m_outlineRoot
Root outline node.
std::vector< std::pair< BOX2I, std::vector< wxString > > > m_hyperlinkMenusInPage
void closePdfObject()
Close the current PDF object.
virtual PLOT_FORMAT GetPlotterType() const override
Return the effective plot engine in use.
int m_totalOutlineNodes
Total number of outline nodes.
std::vector< VECTOR2D > arcPath(const VECTOR2D &aCenter, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aRadius)
static const int USE_DEFAULT_LINE_WIDTH
Definition plotter.h:142
PLOTTER(const PROJECT *aProject=nullptr)
Definition plotter.cpp:46
Container for project specific data.
Definition project.h:63
static const double postscriptTextAscent
Height of the postscript font (from the AFM)
void SetScaleAdjust(double scaleX, double scaleY)
Set the 'fine' scaling for the postscript engine.
virtual void SetColor(const COLOR4D &color) override
The SetColor implementation is split with the subclasses: the PSLIKE computes the rgb values,...
PSLIKE_PLOTTER(const PROJECT *aProject=nullptr)
virtual void emitSetRGBColor(double r, double g, double b, double a)=0
Virtual primitive for emitting the setrgbcolor operator.
PLOT_TEXT_MODE m_textMode
How to draw text.
virtual void SetTextMode(PLOT_TEXT_MODE mode) override
PS and PDF fully implement native text (for the Latin-1 subset)
virtual void FlashRegularPolygon(const VECTOR2I &aShapePos, int aDiameter, int aCornerCount, const EDA_ANGLE &aOrient, void *aData) override
Flash a regular polygon.
int returnPostscriptTextWidth(const wxString &aText, int aXSize, bool aItalic, bool aBold)
Sister function for the GRTextWidth in gr_text.cpp Does the same processing (i.e.
virtual void FlashPadCircle(const VECTOR2I &aPadPos, int aDiameter, void *aData) override
virtual void FlashPadOval(const VECTOR2I &aPadPos, const VECTOR2I &aSize, const EDA_ANGLE &aPadOrient, void *aData) override
virtual void FlashPadRoundRect(const VECTOR2I &aPadPos, const VECTOR2I &aSize, int aCornerRadius, const EDA_ANGLE &aOrient, void *aData) override
double plotScaleAdjX
Fine user scale adjust ( = 1.0 if no correction)
void computeTextParameters(const VECTOR2I &aPos, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, bool aMirror, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, double *wideningFactor, double *ctm_a, double *ctm_b, double *ctm_c, double *ctm_d, double *ctm_e, double *ctm_f, double *heightFactor)
This is the core for postscript/PDF text alignment.
virtual std::string encodeStringForPlotter(const wxString &aUnicode)
convert a wxString unicode string to a char string compatible with the accepted string plotter format...
virtual void FlashPadCustom(const VECTOR2I &aPadPos, const VECTOR2I &aSize, const EDA_ANGLE &aOrient, SHAPE_POLY_SET *aPolygons, void *aData) override
virtual void FlashPadTrapez(const VECTOR2I &aPadPos, const VECTOR2I *aCorners, const EDA_ANGLE &aPadOrient, void *aData) override
Flash a trapezoidal pad.
virtual void FlashPadRect(const VECTOR2I &aPadPos, const VECTOR2I &aSize, const EDA_ANGLE &aPadOrient, void *aData) override
virtual bool EndPlot() override
virtual void Text(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
Draw text with the plotter.
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width, int aCornerRadius=0) override
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
virtual void PlotImage(const wxImage &aImage, const VECTOR2I &aPos, double aScaleFactor) override
PostScript-likes at the moment are the only plot engines supporting bitmaps.
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror) override
Set the plot offset and scaling for the current plot.
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width) override
virtual void PlotPoly(const std::vector< VECTOR2I > &aCornerList, FILL_T aFill, int aWidth, void *aData=nullptr) override
Draw a polygon ( filled or not ).
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle) override
PostScript supports dashed lines.
virtual void Arc(const VECTOR2D &aCenter, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aRadius, FILL_T aFill, int aWidth) override
virtual bool StartPlot(const wxString &aPageNumber) override
The code within this function (and the CloseFilePS function) creates postscript files whose contents ...
virtual PLOT_FORMAT GetPlotterType() const override
Return the effective plot engine in use.
PS_PLOTTER(const PROJECT *aProject=nullptr)
virtual void emitSetRGBColor(double r, double g, double b, double a) override
Virtual primitive for emitting the setrgbcolor operator.
virtual void SetCurrentLineWidth(int width, void *aData=nullptr) override
Set the current line width (in IUs) for the next plot.
static wxString GetDefaultFileExtension()
virtual void PenTo(const VECTOR2I &pos, char plume) override
Moveto/lineto primitive, moves the 'pen' to the specified direction.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
virtual void emitSetRGBColor(double r, double g, double b, double a) override
Initialize m_pen_rgb_color from reduced values r, g ,b ( reduced values are 0.0 to 1....
virtual void PlotImage(const wxImage &aImage, const VECTOR2I &aPos, double aScaleFactor) override
PostScript-likes at the moment are the only plot engines supporting bitmaps.
unsigned m_precision
virtual bool StartPlot(const wxString &aPageNumber) override
Create SVG file header.
virtual void SetPlotBBox(const BOX2I &aBBoxIU) override
Set an explicit bounding box for the plotted content (in IUs).
virtual void EndBlock(void *aData) override
Calling this function allows one to define the end of a group of drawing items the group is started b...
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror) override
Set the plot offset and scaling for the current plot.
LINE_STYLE m_dashed
SVG_PLOTTER(const PROJECT *aProject=nullptr)
virtual void Text(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const EDA_ANGLE &aOrient, const VECTOR2I &aSize, enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify, int aWidth, bool aItalic, bool aBold, bool aMultilineAllowed, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
Draw text with the plotter.
virtual PLOT_FORMAT GetPlotterType() const override
Return the effective plot engine in use.
uint32_t m_brush_rgb_color
virtual void Rect(const VECTOR2I &p1, const VECTOR2I &p2, FILL_T fill, int width, int aCornerRadius=0) override
virtual void SetSvgCoordinatesFormat(unsigned aPrecision) override
Select SVG coordinate precision (number of digits needed for 1 mm ) (SVG plotter uses always metric u...
virtual bool EndPlot() override
void setSVGPlotStyle(int aLineWidth, bool aIsGroup=true, const std::string &aExtraStyle={})
Output the string which define pen and brush color, shape, transparency.
std::optional< BOX2I > m_plotBBoxIU
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width) override
virtual void PlotPoly(const std::vector< VECTOR2I > &aCornerList, FILL_T aFill, int aWidth, void *aData) override
Draw a polygon ( filled or not ).
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont, const KIFONT::METRICS &aFontMetrics, void *aData=nullptr) override
virtual VECTOR2D userToDeviceCoordinates(const VECTOR2I &aCoordinate) override
Modify coordinates according to the orientation, scale factor, and offsets trace.
virtual void BezierCurve(const VECTOR2I &aStart, const VECTOR2I &aControl1, const VECTOR2I &aControl2, const VECTOR2I &aEnd, int aTolerance, int aLineThickness) override
Generic fallback: Cubic Bezier curve rendered as a polyline.
virtual void Arc(const VECTOR2D &aCenter, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aRadius, FILL_T aFill, int aWidth) override
virtual void PenTo(const VECTOR2I &pos, char plume) override
Moveto/lineto primitive, moves the 'pen' to the specified direction.
uint32_t m_pen_rgb_color
static wxString GetDefaultFileExtension()
virtual void SetDash(int aLineWidth, LINE_STYLE aLineStyle) override
SVG supports dashed lines.
virtual void StartBlock(void *aData) override
Calling this function allows one to define the beginning of a group of drawing items (used in SVG for...
void setFillMode(FILL_T fill)
Prepare parameters for setSVGPlotStyle()
virtual void SetCurrentLineWidth(int width, void *aData=nullptr) override
Set the current line width (in IUs) for the next plot.
FILL_T
Definition eda_fill.h:29
unsigned int TEXT_STYLE_FLAGS
Definition font.h:61
PLOT_TEXT_MODE
Which kind of text to output with the PSLIKE plotters.
Definition plotter.h:101
PLOT_FORMAT
The set of supported output plot formats.
Definition plotter.h:65
LINE_STYLE
Dashed line types.
std::vector< float > m_cameraMatrix
std::string m_name
wxString title
Title of outline node.
std::vector< OUTLINE_NODE * > children
Ordered list of children.
int entryHandle
Allocated handle for this outline entry.
OUTLINE_NODE * AddChild(int aActionHandle, const wxString &aTitle, int aEntryHandle)
int actionHandle
Handle to action.
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708
VECTOR2< double > VECTOR2D
Definition vector2d.h:707
VECTOR3< double > VECTOR3D
Definition vector3.h:230