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
vtkSVGContextDevice2D::ActiveNode
vtkXMLDataElement * ActiveNode
Definition: vtkSVGContextDevice2D.h:248
vtkContextDevice2D::DrawMarkers
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.
vtkSVGContextDevice2D::SubdivisionThreshold
float SubdivisionThreshold
Definition: vtkSVGContextDevice2D.h:259
vtkContextDevice2D::ComputeStringBounds
virtual void ComputeStringBounds(const vtkStdString &string, float bounds[4])=0
Compute the bounds of the supplied string.
vtkContextDevice2D::DrawQuadStrip
virtual void DrawQuadStrip(float *, int)
Draw a quad using the specified number of points.
Definition: vtkContextDevice2D.h:115
vtkContextDevice2D::New
static vtkContextDevice2D * New()
vtkContextDevice2D::PopMatrix
virtual void PopMatrix()=0
Pop the current matrix off of the stack.
vtkX3D::scale
@ scale
Definition: vtkX3D.h:235
vtkSVGContextDevice2D::ClipRect
std::array< int, 4 > ClipRect
Definition: vtkSVGContextDevice2D.h:255
vtkContextDevice2D::End
virtual void End()
End drawing, clean up the view.
Definition: vtkContextDevice2D.h:367
vtkX3D::type
@ type
Definition: vtkX3D.h:522
vtkContextDevice2D::DrawQuad
virtual void DrawQuad(float *, int)
Draw a quad using the specified number of points.
Definition: vtkContextDevice2D.h:110
vtkContextDevice2D::MultiplyMatrix
virtual void MultiplyMatrix(vtkMatrix3x3 *m)=0
Multiply the current model view matrix by the supplied one.
vtkSVGContextDevice2D
vtkContextDevice2D implementation for use with vtkSVGExporter.
Definition: vtkSVGContextDevice2D.h:56
vtkX3D::image
@ image
Definition: vtkX3D.h:380
vtkContextDevice2D::SetMatrix
virtual void SetMatrix(vtkMatrix3x3 *m)=0
Set the model view matrix for the display.
vtkPath
concrete dataset representing a path defined by Bezier curves.
Definition: vtkPath.h:32
vtkContextDevice2D::DrawString
virtual void DrawString(float *point, const vtkStdString &string)=0
Draw some text to the screen.
vtkContextDevice2D::SetColor4
virtual void SetColor4(unsigned char color[4])=0
Set the color for the device using unsigned char of length 4, RGBA.
vtkSVGContextDevice2D::TextAsPath
bool TextAsPath
Definition: vtkSVGContextDevice2D.h:263
vtkSVGContextDevice2D::ActiveNodeClipRect
std::array< int, 4 > ActiveNodeClipRect
Definition: vtkSVGContextDevice2D.h:256
vtkSVGContextDevice2D::ContextNode
vtkXMLDataElement * ContextNode
Definition: vtkSVGContextDevice2D.h:247
vtkTransform
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:54
vtkSVGContextDevice2D::ActiveNodeIsClipping
bool ActiveNodeIsClipping
Definition: vtkSVGContextDevice2D.h:261
vtkContextDevice2D::SetClipping
virtual void SetClipping(int *x)=0
Supply an int array of length 4 with x1, y1, width, height specifying clipping region for the device ...
vtkContextDevice2D::DrawColoredPolygon
virtual void DrawColoredPolygon(float *points, int numPoints, unsigned char *colors=nullptr, int nc_comps=0)
Draw a polygon using the specified number of points.
vtkContextDevice2D::PushMatrix
virtual void PushMatrix()=0
Push the current matrix onto the stack.
vtkMatrix3x3
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:33
vtkContextDevice2D::ComputeJustifiedStringBounds
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...
vtkContextDevice2D::DrawPolygon
virtual void DrawPolygon(float *p, int n)
Draw a polygon using the specified number of points.
Definition: vtkContextDevice2D.h:121
vtkContextDevice2D::DrawImage
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....
vtkX3D::color
@ color
Definition: vtkX3D.h:227
vtkX3D::points
@ points
Definition: vtkX3D.h:452
vtkX3D::point
@ point
Definition: vtkX3D.h:242
vtkContextDevice2D::PrintSelf
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkContextDevice2D::DrawEllipticArc
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 ...
vtkContextDevice2D::SetLineType
virtual void SetLineType(int type)=0
Set the line type type (using anonymous enum in vtkPen).
vtkContextDevice2D::SetPointSize
virtual void SetPointSize(float size)=0
Set the point size for glyphs/sprites.
vtkSVGContextDevice2D::CanvasHeight
float CanvasHeight
Definition: vtkSVGContextDevice2D.h:258
vtkVector3f
Definition: vtkVector.h:475
vtkSVGContextDevice2D::Matrix
vtkNew< vtkTransform > Matrix
Definition: vtkSVGContextDevice2D.h:252
vtkImageData
topologically and geometrically regular array of data
Definition: vtkImageData.h:41
vtkIndent
a simple class to control print indentation
Definition: vtkIndent.h:33
vtkUnicodeString
String class that stores Unicode text.
Definition: vtkUnicodeString.h:69
vtkSVGContextDevice2D::Viewport
vtkViewport * Viewport
Definition: vtkSVGContextDevice2D.h:246
vtkX3D::size
@ size
Definition: vtkX3D.h:259
vtkNew< vtkTransform >
vtkSVGContextDevice2D::DefinitionNode
vtkXMLDataElement * DefinitionNode
Definition: vtkSVGContextDevice2D.h:249
vtkXMLDataElement
Represents an XML element and those nested inside.
Definition: vtkXMLDataElement.h:36
vtkContextDevice2D::DrawPointSprites
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.
vtkX3D::startAngle
@ startAngle
Definition: vtkX3D.h:492
vtkContextDevice2D::DrawPoly
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.
vtkContextDevice2D::GetMatrix
virtual void GetMatrix(vtkMatrix3x3 *m)=0
Set the model view matrix for the display.
vtkViewport
abstract specification for Viewports
Definition: vtkViewport.h:44
vtkContextDevice2D
Abstract class for drawing 2D primitives.
Definition: vtkContextDevice2D.h:50
vtkX3D::string
@ string
Definition: vtkX3D.h:496
vtkContextDevice2D::DrawLines
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...
vtkNew.h
vtkContextDevice2D::SetTexture
virtual void SetTexture(vtkImageData *image, int properties)=0
Set the texture for the device, it is used to fill the polygons.
vtkSVGContextDevice2D::EmbedFonts
bool EmbedFonts
Definition: vtkSVGContextDevice2D.h:262
vtkRenderer
abstract specification for renderers
Definition: vtkRenderer.h:67
vtkColor3ub
Some derived classes for the different colors commonly used.
Definition: vtkColor.h:194
vtkContextDevice2D::DrawMathTextString
virtual void DrawMathTextString(float *point, const vtkStdString &string)=0
Draw text using MathText markup for mathematical equations.
vtkColor4ub
Definition: vtkColor.h:264
vtkContextDevice2D::Begin
virtual void Begin(vtkViewport *)
Begin drawing, pass in the viewport to set up the view.
Definition: vtkContextDevice2D.h:362
vtkSVGContextDevice2D::ActiveNodeTransform
std::array< double, 9 > ActiveNodeTransform
Definition: vtkSVGContextDevice2D.h:253
vtkSVGContextDevice2D::Impl
Details * Impl
Definition: vtkSVGContextDevice2D.h:243
vtkStdString
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:34
vtkSVGContextDevice2D::IsClipping
bool IsClipping
Definition: vtkSVGContextDevice2D.h:260
vtkContextDevice2D::DrawEllipseWedge
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,...
vtkContextDevice2D::SetLineWidth
virtual void SetLineWidth(float width)=0
Set the line width.
vtkRectf
Definition: vtkRect.h:326
vtkContextDevice2D::EnableClipping
virtual void EnableClipping(bool enable)=0
Enable or disable the clipping of the scene.
vtkVector2f
Definition: vtkVector.h:432
vtkContextDevice2D::DrawPoints
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.
vtkContextDevice2D.h