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:
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 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:
171 
173 
176 
177  // Apply clipping and transform information current active node.
179 
180  // pen -> stroke state
186 
187  // pen -> fill state
190 
191  // brush -> fill state
196 
197  // tprop --> text state
198  void ApplyTextPropertyStateToNode(vtkXMLDataElement* node, float x, float y);
200 
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);
224  const vtkColor4ub& c1, const vtkColor4ub& c2, const vtkColor4ub& c3, bool useAlpha);
225 
226  void WriteFonts();
227  void WriteImages();
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 
238  void GetScaledPenWidth(float& x, float& y);
239  void TransformSize(float& x, float& y);
240 
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::Matrix4ToMatrix3
static void Matrix4ToMatrix3(const double mat4[16], double mat3[9])
vtkSVGContextDevice2D::ActiveNode
vtkXMLDataElement * ActiveNode
Definition: vtkSVGContextDevice2D.h:248
vtkSVGContextDevice2D::AddDiamondSymbol
std::string AddDiamondSymbol(bool highlight)
vtkSVGContextDevice2D::ApplyBrushColorToNode
void ApplyBrushColorToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::SubdivisionThreshold
float SubdivisionThreshold
Definition: vtkSVGContextDevice2D.h:259
vtkSVGContextDevice2D::WriteFonts
void WriteFonts()
vtkSVGContextDevice2D::ComputeStringBounds
void ComputeStringBounds(const vtkUnicodeString &string, float bounds[4]) override
Compute the bounds of the supplied string.
vtkSVGContextDevice2D::~vtkSVGContextDevice2D
~vtkSVGContextDevice2D() override
vtkSVGContextDevice2D::DrawEllipseWedge
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,...
vtkSVGContextDevice2D::ApplyTransform
void ApplyTransform()
vtkSVGContextDevice2D::TransformSize
void TransformSize(float &x, float &y)
vtkSVGContextDevice2D::GetScaledPenWidth
void GetScaledPenWidth(float &x, float &y)
vtkX3D::scale
@ scale
Definition: vtkX3D.h:235
vtkSVGContextDevice2D::WriteClipRects
void WriteClipRects()
vtkSVGContextDevice2D::PushGraphicsState
void PushGraphicsState()
vtkSVGContextDevice2D::ClipRect
std::array< int, 4 > ClipRect
Definition: vtkSVGContextDevice2D.h:255
vtkX3D::type
@ type
Definition: vtkX3D.h:522
vtkSVGContextDevice2D::ComputeJustifiedStringBounds
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...
vtkSVGContextDevice2D
vtkContextDevice2D implementation for use with vtkSVGExporter.
Definition: vtkSVGContextDevice2D.h:57
vtkSVGContextDevice2D::ComputeStringBounds
void ComputeStringBounds(const vtkStdString &string, float bounds[4]) override
Compute the bounds of the supplied string.
vtkSVGContextDevice2D::New
static vtkSVGContextDevice2D * New()
vtkSVGContextDevice2D::SetColor4
void SetColor4(unsigned char color[4]) override
Set the color for the device using unsigned char of length 4, RGBA.
vtkX3D::image
@ image
Definition: vtkX3D.h:380
vtkSVGContextDevice2D::PreparePointSprite
vtkImageData * PreparePointSprite(vtkImageData *in)
vtkSVGContextDevice2D::AddSquareSymbol
std::string AddSquareSymbol(bool highlight)
vtkPath
concrete dataset representing a path defined by Bezier curves.
Definition: vtkPath.h:33
vtkSVGContextDevice2D::ApplyPenStateToNode
void ApplyPenStateToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::TextAsPath
bool TextAsPath
Definition: vtkSVGContextDevice2D.h:263
vtkSVGContextDevice2D::DrawImage
void DrawImage(const vtkRectf &pos, vtkImageData *image) override
Draw the supplied image at the given position.
vtkSVGContextDevice2D::ActiveNodeClipRect
std::array< int, 4 > ActiveNodeClipRect
Definition: vtkSVGContextDevice2D.h:256
vtkSVGContextDevice2D::ApplyBrushTextureToNode
void ApplyBrushTextureToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::ApplyPenOpacityToNode
void ApplyPenOpacityToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::ContextNode
vtkXMLDataElement * ContextNode
Definition: vtkSVGContextDevice2D.h:247
vtkSVGContextDevice2D::DrawString
void DrawString(float *point, const vtkStdString &string) override
Draw some text to the screen.
vtkSVGContextDevice2D::vtkSVGContextDevice2D
vtkSVGContextDevice2D()
vtkSVGContextDevice2D::ApplyPenStippleToNode
void ApplyPenStippleToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::DrawString
void DrawString(float *point, const vtkUnicodeString &string) override
Draw some text to the screen.
vtkSVGContextDevice2D::PopMatrix
void PopMatrix() override
Pop the current matrix off of the stack.
vtkSVGContextDevice2D::ApplyPenAsFillOpacityToNode
void ApplyPenAsFillOpacityToNode(vtkXMLDataElement *node)
vtkTransform
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:55
vtkSVGContextDevice2D::DrawPointSprites
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.
vtkSVGContextDevice2D::ActiveNodeIsClipping
bool ActiveNodeIsClipping
Definition: vtkSVGContextDevice2D.h:261
vtkSVGContextDevice2D::MultiplyMatrix
void MultiplyMatrix(vtkMatrix3x3 *m) override
Multiply the current model view matrix by the supplied one.
vtkMatrix3x3
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:34
vtkSVGContextDevice2D::AddCircleSymbol
std::string AddCircleSymbol(bool highlight)
vtkSVGContextDevice2D::PopGraphicsState
void PopGraphicsState()
vtkSVGContextDevice2D::Begin
void Begin(vtkViewport *) override
Begin drawing, pass in the viewport to set up the view.
vtkSVGContextDevice2D::SetLineType
void SetLineType(int type) override
Set the line type type (using anonymous enum in vtkPen).
vtkX3D::color
@ color
Definition: vtkX3D.h:227
vtkX3D::points
@ points
Definition: vtkX3D.h:452
vtkSVGContextDevice2D::ApplyBrushOpacityToNode
void ApplyBrushOpacityToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::WritePatterns
void WritePatterns()
vtkSVGContextDevice2D::DrawQuadStrip
void DrawQuadStrip(float *, int) override
Draw a quad using the specified number of points.
vtkX3D::point
@ point
Definition: vtkX3D.h:242
vtkSVGContextDevice2D::GetSVGMatrix
void GetSVGMatrix(double svg[9])
vtkSVGContextDevice2D::DrawLineGradient
void DrawLineGradient(const vtkVector2f &p1, const vtkColor4ub &c1, const vtkVector2f &p2, const vtkColor4ub &c2, bool useAlpha)
vtkSVGContextDevice2D::SetSVGContext
void SetSVGContext(vtkXMLDataElement *context, vtkXMLDataElement *defs)
The svg container element to draw into, and the global definitions element.
vtkSVGContextDevice2D::DrawImage
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....
vtkSVGContextDevice2D::Transform2DEqual
static bool Transform2DEqual(const double mat3[9], const double mat4[16])
vtkSVGContextDevice2D::ApplyTextPropertyStateToNodeForPath
void ApplyTextPropertyStateToNodeForPath(vtkXMLDataElement *node, float x, float y)
vtkSVGContextDevice2D::CanvasHeight
float CanvasHeight
Definition: vtkSVGContextDevice2D.h:258
vtkVector3f
Definition: vtkVector.h:476
vtkSVGContextDevice2D::DrawPoints
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.
vtkSVGContextDevice2D::Matrix
vtkNew< vtkTransform > Matrix
Definition: vtkSVGContextDevice2D.h:252
vtkSVGContextDevice2D::WriteImages
void WriteImages()
vtkImageData
topologically and geometrically regular array of data
Definition: vtkImageData.h:42
vtkIndent
a simple class to control print indentation
Definition: vtkIndent.h:34
vtkUnicodeString
String class that stores Unicode text.
Definition: vtkUnicodeString.h:70
vtkSVGContextDevice2D::Viewport
vtkViewport * Viewport
Definition: vtkSVGContextDevice2D.h:246
vtkSVGContextDevice2D::AddPlusSymbol
std::string AddPlusSymbol(bool highlight)
vtkSVGContextDevice2D::GenerateDefinitions
void GenerateDefinitions()
Write any definition information (fonts, images, etc) that are accumulated between actors.
vtkSVGContextDevice2D::ApplyTextPropertyStateToNode
void ApplyTextPropertyStateToNode(vtkXMLDataElement *node, float x, float y)
vtkSVGContextDevice2D::PushMatrix
void PushMatrix() override
Push the current matrix onto the stack.
vtkSVGContextDevice2D::DrawMathTextString
void DrawMathTextString(float *point, const vtkStdString &str) override
Draw text using MathText markup for mathematical equations.
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:37
vtkSVGContextDevice2D::DrawQuad
void DrawQuad(float *, int) override
Draw a quad using the specified number of points.
vtkX3D::startAngle
@ startAngle
Definition: vtkX3D.h:492
vtkSVGContextDevice2D::DrawMarkers
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.
vtkSVGContextDevice2D::DrawEllipticArc
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 ...
vtkViewport
abstract specification for Viewports
Definition: vtkViewport.h:45
vtkSVGContextDevice2D::ApplyPenAsFillColorToNode
void ApplyPenAsFillColorToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::SetTexture
void SetTexture(vtkImageData *image, int properties) override
Set the texture for the device, it is used to fill the polygons.
vtkSVGContextDevice2D::ColorsAreClose
bool ColorsAreClose(const vtkColor4ub &c1, const vtkColor4ub &c2, const vtkColor4ub &c3, bool useAlpha)
vtkContextDevice2D
Abstract class for drawing 2D primitives.
Definition: vtkContextDevice2D.h:51
vtkSVGContextDevice2D::AdjustMatrixForSVG
void AdjustMatrixForSVG(const double in[9], double out[9])
vtkSVGContextDevice2D::ColorsAreClose
bool ColorsAreClose(const vtkColor4ub &c1, const vtkColor4ub &c2, bool useAlpha)
vtkX3D::string
@ string
Definition: vtkX3D.h:496
vtkSVGContextDevice2D::End
void End() override
End drawing, clean up the view.
vtkSVGContextDevice2D::GetMatrix
void GetMatrix(vtkMatrix3x3 *m) override
Set the model view matrix for the display.
vtkNew.h
vtkSVGContextDevice2D::DrawPolygon
void DrawPolygon(float *, int) override
Draw a polygon using the specified number of points.
vtkSVGContextDevice2D::SetViewport
void SetViewport(vtkViewport *)
vtkSVGContextDevice2D::AreaLessThanTolerance
bool AreaLessThanTolerance(const vtkVector2f &p1, const vtkVector2f &p2, const vtkVector2f &p3)
vtkSVGContextDevice2D::AddCrossSymbol
std::string AddCrossSymbol(bool highlight)
vtkSVGContextDevice2D::EmbedFonts
bool EmbedFonts
Definition: vtkSVGContextDevice2D.h:262
vtkRenderer
abstract specification for renderers
Definition: vtkRenderer.h:59
vtkColor3ub
Some derived classes for the different colors commonly used.
Definition: vtkColor.h:195
vtkColor4ub
Definition: vtkColor.h:265
vtkSVGContextDevice2D::SetPointSize
void SetPointSize(float size) override
Set the point size for glyphs/sprites.
vtkSVGContextDevice2D::ActiveNodeTransform
std::array< double, 9 > ActiveNodeTransform
Definition: vtkSVGContextDevice2D.h:253
vtkSVGContextDevice2D::Impl
Details * Impl
Definition: vtkSVGContextDevice2D.h:243
vtkSVGContextDevice2D::SetupClippingAndTransform
void SetupClippingAndTransform()
vtkSVGContextDevice2D::DrawLines
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...
vtkSVGContextDevice2D::EnableClipping
void EnableClipping(bool enable) override
Enable or disable the clipping of the scene.
vtkSVGContextDevice2D::SetClipping
void SetClipping(int *x) override
Supply an int array of length 4 with x1, y1, width, height specifying clipping region for the device ...
vtkStdString
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:35
vtkSVGContextDevice2D::IsClipping
bool IsClipping
Definition: vtkSVGContextDevice2D.h:260
vtkSVGContextDevice2D::PrintSelf
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkSVGContextDevice2D::ApplyBrushStateToNode
void ApplyBrushStateToNode(vtkXMLDataElement *node)
vtkSVGContextDevice2D::GetScaledPenWidth
float GetScaledPenWidth()
vtkSVGContextDevice2D::Matrix3ToMatrix4
static void Matrix3ToMatrix4(const double mat3[9], double mat4[16])
vtkSVGContextDevice2D::DrawTriangleGradient
void DrawTriangleGradient(const vtkVector2f &p1, const vtkColor4ub &c1, const vtkVector2f &p2, const vtkColor4ub &c2, const vtkVector2f &p3, const vtkColor4ub &c3, bool useAlpha)
vtkSVGContextDevice2D::ApplyPenWidthToNode
void ApplyPenWidthToNode(vtkXMLDataElement *node)
vtkRectf
Definition: vtkRect.h:327
vtkSVGContextDevice2D::DrawColoredPolygon
void DrawColoredPolygon(float *points, int numPoints, unsigned char *colors=nullptr, int nc_comps=0) override
Draw a polygon using the specified number of points.
vtkSVGContextDevice2D::DrawPoly
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.
vtkVector2f
Definition: vtkVector.h:433
vtkSVGContextDevice2D::DrawPath
void DrawPath(vtkPath *path, std::ostream &out)
vtkSVGContextDevice2D::SetMatrix
void SetMatrix(vtkMatrix3x3 *m) override
Set the model view matrix for the display.
vtkSVGContextDevice2D::SetLineWidth
void SetLineWidth(float width) override
Set the line width.
vtkSVGContextDevice2D::LengthLessThanTolerance
bool LengthLessThanTolerance(const vtkVector2f &p1, const vtkVector2f &p2)
vtkContextDevice2D.h
vtkSVGContextDevice2D::ApplyPenColorToNode
void ApplyPenColorToNode(vtkXMLDataElement *node)