VTK  9.0.1
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:
59  static vtkSVGContextDevice2D* New();
61  void PrintSelf(ostream& os, vtkIndent indent) override;
62 
65  void SetSVGContext(vtkXMLDataElement* context, vtkXMLDataElement* defs);
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);
125  void GenerateDefinitions();
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;
140  void DrawColoredPolygon(
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;
144  void DrawEllipticArc(
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 DrawString(float* point, const vtkUnicodeString& string) override;
149  void ComputeStringBounds(const vtkUnicodeString& string, float bounds[4]) override;
150  void ComputeJustifiedStringBounds(const char* string, float bounds[4]) override;
151  void DrawMathTextString(float* point, const vtkStdString& str) override;
152  void DrawImage(float p[2], float scale, vtkImageData* image) override;
153  void DrawImage(const vtkRectf& pos, vtkImageData* image) override;
154  void SetColor4(unsigned char color[4]) override;
155  void SetTexture(vtkImageData* image, int properties) override;
156  void SetPointSize(float size) override;
157  void SetLineWidth(float width) override;
158 
159  void SetLineType(int type) override;
160  void SetMatrix(vtkMatrix3x3* m) override;
161  void GetMatrix(vtkMatrix3x3* m) override;
162  void MultiplyMatrix(vtkMatrix3x3* m) override;
163  void PushMatrix() override;
164  void PopMatrix() override;
165  void SetClipping(int* x) override;
166  void EnableClipping(bool enable) override;
167 
168 protected:
170  ~vtkSVGContextDevice2D() override;
171 
172  void SetViewport(vtkViewport*);
173 
174  void PushGraphicsState();
175  void PopGraphicsState();
176 
177  // Apply clipping and transform information current active node.
178  void SetupClippingAndTransform();
179 
180  // pen -> stroke state
181  void ApplyPenStateToNode(vtkXMLDataElement* node);
182  void ApplyPenColorToNode(vtkXMLDataElement* node);
183  void ApplyPenOpacityToNode(vtkXMLDataElement* node);
184  void ApplyPenWidthToNode(vtkXMLDataElement* node);
185  void ApplyPenStippleToNode(vtkXMLDataElement* node);
186 
187  // pen -> fill state
188  void ApplyPenAsFillColorToNode(vtkXMLDataElement* node);
189  void ApplyPenAsFillOpacityToNode(vtkXMLDataElement* node);
190 
191  // brush -> fill state
192  void ApplyBrushStateToNode(vtkXMLDataElement* node);
193  void ApplyBrushColorToNode(vtkXMLDataElement* node);
194  void ApplyBrushOpacityToNode(vtkXMLDataElement* node);
195  void ApplyBrushTextureToNode(vtkXMLDataElement* node);
196 
197  // tprop --> text state
198  void ApplyTextPropertyStateToNode(vtkXMLDataElement* node, float x, float y);
199  void ApplyTextPropertyStateToNodeForPath(vtkXMLDataElement* node, float x, float y);
200 
201  void ApplyTransform();
202 
203  // Add marker symbols to defs, return symbol id.
204  std::string AddCrossSymbol(bool highlight);
205  std::string AddPlusSymbol(bool highlight);
206  std::string AddSquareSymbol(bool highlight);
207  std::string AddCircleSymbol(bool highlight);
208  std::string AddDiamondSymbol(bool highlight);
209 
210  void DrawPath(vtkPath* path, std::ostream& out);
211 
212  void DrawLineGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
213  const vtkColor4ub& c2, bool useAlpha);
214  void DrawTriangleGradient(const vtkVector2f& p1, const vtkColor4ub& c1, const vtkVector2f& p2,
215  const vtkColor4ub& c2, const vtkVector2f& p3, const vtkColor4ub& c3, bool useAlpha);
216 
217  // Used by the Draw*Gradient methods to prevent subdividing triangles / lines
218  // that are already really small.
219  bool AreaLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2, const vtkVector2f& p3);
220  bool LengthLessThanTolerance(const vtkVector2f& p1, const vtkVector2f& p2);
221 
222  bool ColorsAreClose(const vtkColor4ub& c1, const vtkColor4ub& c2, bool useAlpha);
223  bool ColorsAreClose(
224  const vtkColor4ub& c1, const vtkColor4ub& c2, const vtkColor4ub& c3, bool useAlpha);
225 
226  void WriteFonts();
227  void WriteImages();
228  void WritePatterns();
229  void WriteClipRects();
230 
231  void AdjustMatrixForSVG(const double in[9], double out[9]);
232  void GetSVGMatrix(double svg[9]);
233  static bool Transform2DEqual(const double mat3[9], const double mat4[16]);
234  static void Matrix3ToMatrix4(const double mat3[9], double mat4[16]);
235  static void Matrix4ToMatrix3(const double mat4[16], double mat3[9]);
236 
237  float GetScaledPenWidth();
238  void GetScaledPenWidth(float& x, float& y);
239  void TransformSize(float& x, float& y);
240 
241  vtkImageData* PreparePointSprite(vtkImageData* in);
242 
243  struct Details;
244  Details* Impl;
245 
250 
251  // This is a 3D transform, the 2D version doesn't support push/pop.
253  std::array<double, 9> ActiveNodeTransform;
254 
255  std::array<int, 4> ClipRect; // x, y, w, h
256  std::array<int, 4> ActiveNodeClipRect; // x, y, w, h
257 
258  float CanvasHeight; // Used in y coordinate conversions.
264 
265 private:
267  void operator=(const vtkSVGContextDevice2D&) = delete;
268 };
269 
270 #endif // vtkSVGContextDevice2D_h
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:34
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:32
abstract specification for Viewports
Definition: vtkViewport.h:44
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:67
static vtkContextDevice2D * New()
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:54
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.
Some derived classes for the different colors commonly used.
Definition: vtkColor.h:194
a simple class to control print indentation
Definition: vtkIndent.h:33
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:41
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:33
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.
String class that stores Unicode text.