VTK  9.4.20250206
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
36VTK_ABI_NAMESPACE_BEGIN
37class vtkColor3ub;
38class vtkColor4ub;
39class vtkPath;
40class vtkRenderer;
41class vtkTransform;
42class vtkVector3f;
44
45class VTKIOEXPORT_EXPORT vtkSVGContextDevice2D : public vtkContextDevice2D
46{
47public:
50 void PrintSelf(ostream& os, vtkIndent indent) override;
51
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);
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;
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;
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
158protected:
161
163
166
167 // Apply clipping and transform information current active node.
169
170 // pen -> stroke state
176
177 // pen -> fill state
180
181 // brush -> fill state
186
187 // tprop --> text state
188 void ApplyTextPropertyStateToNode(vtkXMLDataElement* node, float x, float y);
190
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);
211
212 bool ColorsAreClose(const vtkColor4ub& c1, const vtkColor4ub& c2, bool useAlpha);
214 const vtkColor4ub& c1, const vtkColor4ub& c2, const vtkColor4ub& c3, bool useAlpha);
215
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
228 void GetScaledPenWidth(float& x, float& y);
229 void TransformSize(float& x, float& y);
230
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
255private:
257 void operator=(const vtkSVGContextDevice2D&) = delete;
258};
259
260VTK_ABI_NAMESPACE_END
261#endif // vtkSVGContextDevice2D_h
Some derived classes for the different colors commonly used.
Definition vtkColor.h:203
Abstract class for drawing 2D primitives.
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.
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.
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.
topologically and geometrically regular array of data
a simple class to control print indentation
Definition vtkIndent.h:108
represent and manipulate 3x3 transformation matrices
Allocate and hold a VTK object.
Definition vtkNew.h:167
concrete dataset representing a path defined by Bezier curves.
Definition vtkPath.h:44
abstract specification for renderers
vtkContextDevice2D implementation for use with vtkSVGExporter.
~vtkSVGContextDevice2D() override
void DrawColoredPolygon(float *points, int numPoints, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a polygon using the specified number of points.
void ApplyPenStateToNode(vtkXMLDataElement *node)
void DrawEllipseWedge(float x, float y, float outRx, float outRy, float inRx, float inRy, float startAngle, float stopAngle) override
Draw an elliptic wedge with center at x, y, outer radii outRx, outRy, inner radii inRx,...
void DrawLineGradient(const vtkVector2f &p1, const vtkColor4ub &c1, const vtkVector2f &p2, const vtkColor4ub &c2, bool useAlpha)
void PopMatrix() override
Pop the current matrix off of the stack.
void DrawQuad(float *, int) override
Draw a quad using the specified number of points.
vtkXMLDataElement * ActiveNode
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void DrawMarkers(int shape, bool highlight, float *points, int n, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a series of markers centered at the points supplied.
void PushMatrix() override
Push the current matrix onto the stack.
void SetSVGContext(vtkXMLDataElement *context, vtkXMLDataElement *defs)
The svg container element to draw into, and the global definitions element.
void ComputeStringBounds(const vtkStdString &string, float bounds[4]) override
Compute the bounds of the supplied string.
void ApplyBrushOpacityToNode(vtkXMLDataElement *node)
void SetLineWidth(float width) override
Set the line width.
void GenerateDefinitions()
Write any definition information (fonts, images, etc) that are accumulated between actors.
std::string AddPlusSymbol(bool highlight)
void ApplyTextPropertyStateToNodeForPath(vtkXMLDataElement *node, float x, float y)
void Begin(vtkViewport *) override
Begin drawing, pass in the viewport to set up the view.
void DrawEllipticArc(float x, float y, float rX, float rY, float startAngle, float stopAngle) override
Draw an elliptic arc with center at x,y with radii rX and rY between angles startAngle and stopAngle ...
void AdjustMatrixForSVG(const double in[9], double out[9])
void DrawQuadStrip(float *, int) override
Draw a quad using the specified number of points.
void SetColor4(unsigned char color[4]) override
Set the color for the device using unsigned char of length 4, RGBA.
void SetMatrix(vtkMatrix3x3 *m) override
Set the model view matrix for the display.
void DrawPolygon(float *, int) override
Draw a polygon using the specified number of points.
std::string AddCircleSymbol(bool highlight)
static bool Transform2DEqual(const double mat3[9], const double mat4[16])
std::string AddSquareSymbol(bool highlight)
void SetupClippingAndTransform()
void End() override
End drawing, clean up the view.
void SetClipping(int *x) override
Supply an int array of length 4 with x1, y1, width, height specifying clipping region for the device ...
void SetTexture(vtkImageData *image, int properties) override
Set the texture for the device, it is used to fill the polygons.
void ApplyPenStippleToNode(vtkXMLDataElement *node)
void GetSVGMatrix(double svg[9])
void SetLineType(int type) override
Set the line type type (using anonymous enum in vtkPen).
bool ColorsAreClose(const vtkColor4ub &c1, const vtkColor4ub &c2, bool useAlpha)
void DrawPoly(float *points, int n, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a poly line using the points - fastest code path due to memory layout of the coordinates.
void MultiplyMatrix(vtkMatrix3x3 *m) override
Multiply the current model view matrix by the supplied one.
vtkNew< vtkTransform > Matrix
void SetViewport(vtkViewport *)
static void Matrix3ToMatrix4(const double mat3[9], double mat4[16])
void ApplyPenOpacityToNode(vtkXMLDataElement *node)
bool ColorsAreClose(const vtkColor4ub &c1, const vtkColor4ub &c2, const vtkColor4ub &c3, bool useAlpha)
void ComputeJustifiedStringBounds(const char *string, float bounds[4]) override
Compute the bounds of the supplied string while taking into account the justification of the currentl...
void DrawString(float *point, const vtkStdString &string) override
Draw some text to the screen.
void DrawPointSprites(vtkImageData *sprite, float *points, int n, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a series of point sprites, images centred at the points supplied.
void ApplyPenAsFillColorToNode(vtkXMLDataElement *node)
void EnableClipping(bool enable) override
Enable or disable the clipping of the scene.
std::string AddDiamondSymbol(bool highlight)
void DrawTriangleGradient(const vtkVector2f &p1, const vtkColor4ub &c1, const vtkVector2f &p2, const vtkColor4ub &c2, const vtkVector2f &p3, const vtkColor4ub &c3, bool useAlpha)
static void Matrix4ToMatrix3(const double mat4[16], double mat3[9])
void ApplyPenWidthToNode(vtkXMLDataElement *node)
void ApplyBrushTextureToNode(vtkXMLDataElement *node)
void GetMatrix(vtkMatrix3x3 *m) override
Set the model view matrix for the display.
void ApplyPenColorToNode(vtkXMLDataElement *node)
void DrawPoints(float *points, int n, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a series of points - fastest code path due to memory layout of the coordinates.
void DrawImage(float p[2], float scale, vtkImageData *image) override
Draw the supplied image at the given x, y (p[0], p[1]) (bottom corner), scaled by scale (1....
bool LengthLessThanTolerance(const vtkVector2f &p1, const vtkVector2f &p2)
void DrawLines(float *f, int n, unsigned char *colors=nullptr, int nc_comps=0) override
Draw lines using the points - memory layout is as follows: l1p1,l1p2,l2p1,l2p2... The lines will be c...
void TransformSize(float &x, float &y)
vtkXMLDataElement * ContextNode
std::array< int, 4 > ActiveNodeClipRect
void ApplyPenAsFillOpacityToNode(vtkXMLDataElement *node)
void DrawPath(vtkPath *path, std::ostream &out)
void SetPointSize(float size) override
Set the point size for glyphs/sprites.
static vtkSVGContextDevice2D * New()
bool AreaLessThanTolerance(const vtkVector2f &p1, const vtkVector2f &p2, const vtkVector2f &p3)
std::array< double, 9 > ActiveNodeTransform
void DrawMathTextString(float *point, const vtkStdString &str) override
Draw text using MathText markup for mathematical equations.
vtkXMLDataElement * DefinitionNode
void GetScaledPenWidth(float &x, float &y)
std::array< int, 4 > ClipRect
vtkImageData * PreparePointSprite(vtkImageData *in)
void DrawImage(const vtkRectf &pos, vtkImageData *image) override
Draw the supplied image at the given position.
void ApplyBrushColorToNode(vtkXMLDataElement *node)
std::string AddCrossSymbol(bool highlight)
void ApplyBrushStateToNode(vtkXMLDataElement *node)
void ApplyTextPropertyStateToNode(vtkXMLDataElement *node, float x, float y)
Wrapper around std::string to keep symbols short.
describes linear transformations via a 4x4 matrix
abstract specification for Viewports
Definition vtkViewport.h:65
Represents an XML element and those nested inside.