VTK  9.7.1
vtkSVGContextDevice2D.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
27 #ifndef vtkSVGContextDevice2D_h
28 #define vtkSVGContextDevice2D_h
29 
30 #include "vtkContextDevice2D.h"
31 #include "vtkIOExportModule.h" // For export macro
32 #include "vtkNew.h" // For vtkNew!
33 
34 #include <array> // For std::array!
35 
36 VTK_ABI_NAMESPACE_BEGIN
37 class vtkColor3ub;
38 class vtkColor4ub;
39 class vtkPath;
40 class vtkRenderer;
41 class vtkTransform;
42 class vtkVector3f;
43 class vtkXMLDataElement;
44 
45 class VTKIOEXPORT_EXPORT vtkSVGContextDevice2D : public vtkContextDevice2D
46 {
47 public:
48  static vtkSVGContextDevice2D* New();
50  void PrintSelf(ostream& os, vtkIndent indent) override;
51 
54  void SetSVGContext(vtkXMLDataElement* context, vtkXMLDataElement* defs);
55 
66  vtkSetMacro(EmbedFonts, bool);
67  vtkGetMacro(EmbedFonts, bool);
68  vtkBooleanMacro(EmbedFonts, bool);
86  vtkSetMacro(TextAsPath, bool);
87  vtkGetMacro(TextAsPath, bool);
88  vtkBooleanMacro(TextAsPath, bool);
106  vtkSetMacro(SubdivisionThreshold, float);
107  vtkGetMacro(SubdivisionThreshold, float);
114  void GenerateDefinitions();
115 
116  void Begin(vtkViewport*) override;
117  void End() override;
118 
122  void DrawPoly(float* points, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
123  void DrawLines(float* f, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
124  void DrawPoints(float* points, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
125  void DrawPointSprites(vtkImageData* sprite, float* points, int n, unsigned char* colors = nullptr,
126  int nc_comps = 0) override;
127  void DrawMarkers(int shape, bool highlight, float* points, int n, unsigned char* colors = nullptr,
128  int nc_comps = 0) override;
129  void DrawQuad(float*, int) override;
130  void DrawQuadStrip(float*, int) override;
131  void DrawPolygon(float*, int) override;
132  void DrawColoredPolygon(
133  float* points, int numPoints, unsigned char* colors = nullptr, int nc_comps = 0) override;
134  void DrawEllipseWedge(float x, float y, float outRx, float outRy, float inRx, float inRy,
135  float startAngle, float stopAngle) override;
136  void DrawEllipticArc(
137  float x, float y, float rX, float rY, float startAngle, float stopAngle) override;
138  void DrawString(float* point, const vtkStdString& string) override;
139  void ComputeStringBounds(const vtkStdString& string, float bounds[4]) override;
140  void ComputeJustifiedStringBounds(const char* string, float bounds[4]) override;
141  void DrawMathTextString(float* point, const vtkStdString& str) override;
142  void DrawImage(float p[2], float scale, vtkImageData* image) override;
143  void DrawImage(const vtkRectf& pos, vtkImageData* image) override;
144  void SetColor4(unsigned char color[4]) override;
145  void SetTexture(vtkImageData* image, int properties) override;
146  void SetPointSize(float size) override;
147  void SetLineWidth(float width) override;
148 
149  void SetLineType(int type) override;
150  void SetMatrix(vtkMatrix3x3* m) override;
151  void GetMatrix(vtkMatrix3x3* m) override;
152  void MultiplyMatrix(vtkMatrix3x3* m) override;
153  void PushMatrix() override;
154  void PopMatrix() override;
155  void SetClipping(int* x) override;
156  void EnableClipping(bool enable) override;
157 
158 protected:
160  ~vtkSVGContextDevice2D() override;
161 
162  void SetViewport(vtkViewport*);
163 
164  void PushGraphicsState();
165  void PopGraphicsState();
166 
167  // Apply clipping and transform information current active node.
168  void SetupClippingAndTransform();
169 
170  // pen -> stroke state
171  void ApplyPenStateToNode(vtkXMLDataElement* node);
172  void ApplyPenColorToNode(vtkXMLDataElement* node);
173  void ApplyPenOpacityToNode(vtkXMLDataElement* node);
174  void ApplyPenWidthToNode(vtkXMLDataElement* node);
175  void ApplyPenStippleToNode(vtkXMLDataElement* node);
176 
177  // pen -> fill state
178  void ApplyPenAsFillColorToNode(vtkXMLDataElement* node);
179  void ApplyPenAsFillOpacityToNode(vtkXMLDataElement* node);
180 
181  // brush -> fill state
182  void ApplyBrushStateToNode(vtkXMLDataElement* node);
183  void ApplyBrushColorToNode(vtkXMLDataElement* node);
184  void ApplyBrushOpacityToNode(vtkXMLDataElement* node);
185  void ApplyBrushTextureToNode(vtkXMLDataElement* node);
186 
187  // tprop --> text state
188  void ApplyTextPropertyStateToNode(vtkXMLDataElement* node, float x, float y);
189  void ApplyTextPropertyStateToNodeForPath(vtkXMLDataElement* node, float x, float y);
190 
191  void ApplyTransform();
192 
193  // Add marker symbols to defs, return symbol id.
194  std::string AddCrossSymbol(bool highlight);
195  std::string AddPlusSymbol(bool highlight);
196  std::string AddSquareSymbol(bool highlight);
197  std::string AddCircleSymbol(bool highlight);
198  std::string AddDiamondSymbol(bool highlight);
199 
200  void DrawPath(vtkPath* path, std::ostream& out);
201 
202  void DrawLineGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
203  const vtkColor4ub& c2, bool useAlpha);
204  void DrawTriangleGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
205  const vtkColor4ub& c2, const vtkVector2f& p3, const vtkColor4ub& c3, bool useAlpha);
206 
207  // Used by the Draw*Gradient methods to prevent subdividing triangles / lines
208  // that are already really small.
209  bool AreaLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2, const vtkVector2f& p3);
210  bool LengthLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2);
211 
212  bool ColorsAreClose(const vtkColor4ub& c1, const vtkColor4ub& c2, bool useAlpha);
213  bool ColorsAreClose(
214  const vtkColor4ub& c1, const vtkColor4ub& c2, const vtkColor4ub& c3, bool useAlpha);
215 
216  void WriteFonts();
217  void WriteImages();
218  void WritePatterns();
219  void WriteClipRects();
220 
221  void AdjustMatrixForSVG(const double in[9], double out[9]);
222  void GetSVGMatrix(double svg[9]);
223  static bool Transform2DEqual(const double mat3[9], const double mat4[16]);
224  static void Matrix3ToMatrix4(const double mat3[9], double mat4[16]);
225  static void Matrix4ToMatrix3(const double mat4[16], double mat3[9]);
226 
227  float GetScaledPenWidth();
228  void GetScaledPenWidth(float& x, float& y);
229  void TransformSize(float& x, float& y);
230 
231  vtkImageData* PreparePointSprite(vtkImageData* in);
232 
233  struct Details;
234  Details* Impl;
235 
240 
241  // This is a 3D transform, the 2D version doesn't support push/pop.
243  std::array<double, 9> ActiveNodeTransform;
244 
245  std::array<int, 4> ClipRect; // x, y, w, h
246  std::array<int, 4> ActiveNodeClipRect; // x, y, w, h
247 
248  float CanvasHeight; // Used in y coordinate conversions.
254 
255 private:
257  void operator=(const vtkSVGContextDevice2D&) = delete;
258 };
259 
260 VTK_ABI_NAMESPACE_END
261 #endif // vtkSVGContextDevice2D_h
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:27
virtual void SetMatrix(vtkMatrix3x3 *m)=0
Set the model view matrix for the display.
virtual void DrawPointSprites(vtkImageData *sprite, float *points, int n, unsigned char *colors=nullptr, int nc_comps=0)=0
Draw a series of point sprites, images centred at the points supplied.
virtual void SetClipping(int *x)=0
Supply an int array of length 4 with x1, y1, width, height specifying clipping region for the device ...
Represents an XML element and those nested inside.
virtual void ComputeJustifiedStringBounds(const char *string, float bounds[4])=0
Compute the bounds of the supplied string while taking into account the justification of the currentl...
virtual void DrawPoly(float *points, int n, unsigned char *colors=nullptr, int nc_comps=0)=0
Draw a poly line using the points - fastest code path due to memory layout of the coordinates...
concrete dataset representing a path defined by Bezier curves.
Definition: vtkPath.h:24
abstract specification for Viewports
Definition: vtkViewport.h:46
virtual void DrawPolygon(float *p, int n)
Draw a polygon using the specified number of points.
std::array< int, 4 > ActiveNodeClipRect
vtkContextDevice2D implementation for use with vtkSVGExporter.
vtkXMLDataElement * DefinitionNode
std::array< double, 9 > ActiveNodeTransform
abstract specification for renderers
Definition: vtkRenderer.h:63
static vtkContextDevice2D * New()
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:50
virtual void Begin(vtkViewport *)
Begin drawing, pass in the viewport to set up the view.
virtual void SetColor4(unsigned char color[4])=0
Set the color for the device using unsigned char of length 4, RGBA.
virtual void EnableClipping(bool enable)=0
Enable or disable the clipping of the scene.
virtual void SetLineWidth(float width)=0
Set the line width.
virtual void DrawPoints(float *points, int n, unsigned char *colors=nullptr, int nc_comps=0)=0
Draw a series of points - fastest code path due to memory layout of the coordinates.
anari::std_types::mat4 mat4
Some derived classes for the different colors commonly used.
Definition: vtkColor.h:183
a simple class to control print indentation
Definition: vtkIndent.h:28
virtual void DrawMarkers(int shape, bool highlight, float *points, int n, unsigned char *colors=nullptr, int nc_comps=0)
Draw a series of markers centered at the points supplied.
topologically and geometrically regular array of data
Definition: vtkImageData.h:45
virtual void DrawQuadStrip(float *, int)
Draw a quad using the specified number of points.
Abstract class for drawing 2D primitives.
virtual void PopMatrix()=0
Pop the current matrix off of the stack.
vtkNew< vtkTransform > Matrix
virtual void DrawLines(float *f, int n, unsigned char *colors=nullptr, int nc_comps=0)=0
Draw lines using the points - memory layout is as follows: l1p1,l1p2,l2p1,l2p2... ...
virtual void SetTexture(vtkImageData *image, int properties)=0
Set the texture for the device, it is used to fill the polygons.
virtual void DrawMathTextString(float *point, const vtkStdString &string)=0
Draw text using MathText markup for mathematical equations.
virtual void SetPointSize(float size)=0
Set the point size for glyphs/sprites.
virtual void DrawQuad(float *, int)
Draw a quad using the specified number of points.
virtual void DrawEllipticArc(float x, float y, float rX, float rY, float startAngle, float stopAngle)=0
Draw an elliptic arc with center at x,y with radii rX and rY between angles startAngle and stopAngle ...
virtual void MultiplyMatrix(vtkMatrix3x3 *m)=0
Multiply the current model view matrix by the supplied one.
virtual void DrawString(float *point, const vtkStdString &string)=0
Draw some text to the screen.
virtual void End()
End drawing, clean up the view.
virtual void DrawEllipseWedge(float x, float y, float outRx, float outRy, float inRx, float inRy, float startAngle, float stopAngle)=0
Draw an elliptic wedge with center at x, y, outer radii outRx, outRy, inner radii inRx...
std::array< int, 4 > ClipRect
virtual void DrawColoredPolygon(float *points, int numPoints, unsigned char *colors=nullptr, int nc_comps=0)
Draw a polygon using the specified number of points.
virtual void GetMatrix(vtkMatrix3x3 *m)=0
Set the model view matrix for the display.
virtual void ComputeStringBounds(const vtkStdString &string, float bounds[4])=0
Compute the bounds of the supplied string.
virtual void PushMatrix()=0
Push the current matrix onto the stack.
vtkXMLDataElement * ContextNode
vtkXMLDataElement * ActiveNode
virtual void DrawImage(float p[2], float scale, vtkImageData *image)=0
Draw the supplied image at the given x, y (p[0], p[1]) (bottom corner), scaled by scale (1...
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:26
virtual void SetLineType(int type)=0
Set the line type type (using anonymous enum in vtkPen).
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.