VTK  9.2.6
vtkSVGContextDevice2D.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkSVGContextDevice2D.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
39 #ifndef vtkSVGContextDevice2D_h
40 #define vtkSVGContextDevice2D_h
41 
42 #include "vtkContextDevice2D.h"
43 #include "vtkIOExportModule.h" // For export macro
44 #include "vtkNew.h" // For vtkNew!
45 
46 #include <array> // For std::array!
47 
48 class vtkColor3ub;
49 class vtkColor4ub;
50 class vtkPath;
51 class vtkRenderer;
52 class vtkTransform;
53 class vtkVector3f;
54 class vtkXMLDataElement;
55 
56 class VTKIOEXPORT_EXPORT vtkSVGContextDevice2D : public vtkContextDevice2D
57 {
58 public:
61  void PrintSelf(ostream& os, vtkIndent indent) override;
62 
66 
77  vtkSetMacro(EmbedFonts, bool);
78  vtkGetMacro(EmbedFonts, bool);
79  vtkBooleanMacro(EmbedFonts, bool);
97  vtkSetMacro(TextAsPath, bool);
98  vtkGetMacro(TextAsPath, bool);
99  vtkBooleanMacro(TextAsPath, bool);
117  vtkSetMacro(SubdivisionThreshold, float);
118  vtkGetMacro(SubdivisionThreshold, float);
126 
127  void Begin(vtkViewport*) override;
128  void End() override;
129 
130  void DrawPoly(float* points, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
131  void DrawLines(float* f, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
132  void DrawPoints(float* points, int n, unsigned char* colors = nullptr, int nc_comps = 0) override;
133  void DrawPointSprites(vtkImageData* sprite, float* points, int n, unsigned char* colors = nullptr,
134  int nc_comps = 0) override;
135  void DrawMarkers(int shape, bool highlight, float* points, int n, unsigned char* colors = nullptr,
136  int nc_comps = 0) override;
137  void DrawQuad(float*, int) override;
138  void DrawQuadStrip(float*, int) override;
139  void DrawPolygon(float*, int) override;
141  float* points, int numPoints, unsigned char* colors = nullptr, int nc_comps = 0) override;
142  void DrawEllipseWedge(float x, float y, float outRx, float outRy, float inRx, float inRy,
143  float startAngle, float stopAngle) override;
145  float x, float y, float rX, float rY, float startAngle, float stopAngle) override;
146  void DrawString(float* point, const vtkStdString& string) override;
147  void ComputeStringBounds(const vtkStdString& string, float bounds[4]) override;
148  void ComputeJustifiedStringBounds(const char* string, float bounds[4]) override;
149  void DrawMathTextString(float* point, const vtkStdString& str) override;
150  void DrawImage(float p[2], float scale, vtkImageData* image) override;
151  void DrawImage(const vtkRectf& pos, vtkImageData* image) override;
152  void SetColor4(unsigned char color[4]) override;
153  void SetTexture(vtkImageData* image, int properties) override;
154  void SetPointSize(float size) override;
155  void SetLineWidth(float width) override;
156 
157  void SetLineType(int type) override;
158  void SetMatrix(vtkMatrix3x3* m) override;
159  void GetMatrix(vtkMatrix3x3* m) override;
160  void MultiplyMatrix(vtkMatrix3x3* m) override;
161  void PushMatrix() override;
162  void PopMatrix() override;
163  void SetClipping(int* x) override;
164  void EnableClipping(bool enable) override;
165 
166 protected:
169 
171 
174 
175  // Apply clipping and transform information current active node.
177 
178  // pen -> stroke state
184 
185  // pen -> fill state
188 
189  // brush -> fill state
194 
195  // tprop --> text state
196  void ApplyTextPropertyStateToNode(vtkXMLDataElement* node, float x, float y);
198 
200 
201  // Add marker symbols to defs, return symbol id.
202  std::string AddCrossSymbol(bool highlight);
203  std::string AddPlusSymbol(bool highlight);
204  std::string AddSquareSymbol(bool highlight);
205  std::string AddCircleSymbol(bool highlight);
206  std::string AddDiamondSymbol(bool highlight);
207 
208  void DrawPath(vtkPath* path, std::ostream& out);
209 
210  void DrawLineGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
211  const vtkColor4ub& c2, bool useAlpha);
212  void DrawTriangleGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
213  const vtkColor4ub& c2, const vtkVector2f& p3, const vtkColor4ub& c3, bool useAlpha);
214 
215  // Used by the Draw*Gradient methods to prevent subdividing triangles / lines
216  // that are already really small.
217  bool AreaLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2, const vtkVector2f& p3);
218  bool LengthLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2);
219 
220  bool ColorsAreClose(const vtkColor4ub& c1, const vtkColor4ub& c2, bool useAlpha);
222  const vtkColor4ub& c1, const vtkColor4ub& c2, const vtkColor4ub& c3, bool useAlpha);
223 
224  void WriteFonts();
225  void WriteImages();
228 
229  void AdjustMatrixForSVG(const double in[9], double out[9]);
230  void GetSVGMatrix(double svg[9]);
231  static bool Transform2DEqual(const double mat3[9], const double mat4[16]);
232  static void Matrix3ToMatrix4(const double mat3[9], double mat4[16]);
233  static void Matrix4ToMatrix3(const double mat4[16], double mat3[9]);
234 
236  void GetScaledPenWidth(float& x, float& y);
237  void TransformSize(float& x, float& y);
238 
240 
241  struct Details;
242  Details* Impl;
243 
248 
249  // This is a 3D transform, the 2D version doesn't support push/pop.
251  std::array<double, 9> ActiveNodeTransform;
252 
253  std::array<int, 4> ClipRect; // x, y, w, h
254  std::array<int, 4> ActiveNodeClipRect; // x, y, w, h
255 
256  float CanvasHeight; // Used in y coordinate conversions.
262 
263 private:
265  void operator=(const vtkSVGContextDevice2D&) = delete;
266 };
267 
268 #endif // vtkSVGContextDevice2D_h
Some derived classes for the different colors commonly used.
Definition: vtkColor.h:304
Abstract class for drawing 2D primitives.
topologically and geometrically regular array of data
Definition: vtkImageData.h:163
a simple class to control print indentation
Definition: vtkIndent.h:119
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:66
concrete dataset representing a path defined by Bezier curves.
Definition: vtkPath.h:36
abstract specification for renderers
Definition: vtkRenderer.h:182
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.
vtkImageData * PreparePointSprite(vtkImageData *in)
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.
static vtkSVGContextDevice2D * New()
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...
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.
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
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.
Definition: vtkStdString.h:108
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:170
abstract specification for Viewports
Definition: vtkViewport.h:56
Represents an XML element and those nested inside.
@ point
Definition: vtkX3D.h:242
@ points
Definition: vtkX3D.h:452
@ startAngle
Definition: vtkX3D.h:492
@ scale
Definition: vtkX3D.h:235
@ type
Definition: vtkX3D.h:522
@ color
Definition: vtkX3D.h:227
@ image
Definition: vtkX3D.h:380
@ size
Definition: vtkX3D.h:259
@ string
Definition: vtkX3D.h:496