Files
ThirdParty-6/ParaView-5.0.1/VTK/Rendering/Matplotlib/vtkMatplotlibMathTextUtilities.h

153 lines
5.6 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkMatplotlibMathTextUtilities.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkMatplotlibMathTextUtilities - Access to MatPlotLib MathText rendering
// .SECTION Description
// vtkMatplotlibMathTextUtilities provides access to the MatPlotLib MathText
// implementation.
//
// This class is aware of a number of environment variables that can be used to
// configure and debug python initialization (all are optional):
// - VTK_MATPLOTLIB_DEBUG: Enable verbose debugging output during initialization
// of the python environment.
#ifndef vtkMatplotlibMathTextUtilities_h
#define vtkMatplotlibMathTextUtilities_h
#include "vtkRenderingMatplotlibModule.h" // For export macro
#include "vtkMathTextUtilities.h"
struct _object;
typedef struct _object PyObject;
class vtkImageData;
class vtkPath;
class vtkPythonInterpreter;
class vtkTextProperty;
class VTKRENDERINGMATPLOTLIB_EXPORT vtkMatplotlibMathTextUtilities :
public vtkMathTextUtilities
{
public:
vtkTypeMacro(vtkMatplotlibMathTextUtilities, vtkMathTextUtilities);
void PrintSelf(ostream& os, vtkIndent indent);
static vtkMatplotlibMathTextUtilities *New();
virtual bool IsAvailable();
// Description:
// Given a text property and a string, get the bounding box {xmin, xmax,
// ymin, ymax} of the rendered string in pixels. The origin of the bounding
// box is the anchor point described by the horizontal and vertical
// justification text property variables.
// Returns true on success, false otherwise.
bool GetBoundingBox(vtkTextProperty *tprop, const char *str, int dpi,
int bbox[4]);
bool GetMetrics(vtkTextProperty *tprop, const char *str, int dpi,
vtkTextRenderer::Metrics &metrics);
// Description:
// Render the given string @a str into the vtkImageData @a data with a
// resolution of @a dpi. The image is resized automatically. textDims
// will be overwritten by the pixel width and height of the rendered string.
// This is useful when ScaleToPowerOfTwo is true, and the image dimensions may
// not match the dimensions of the rendered text.
// The origin of the image's extents is aligned with the anchor point
// described by the text property's vertical and horizontal justification
// options.
bool RenderString(const char *str, vtkImageData *data, vtkTextProperty *tprop,
int dpi, int textDims[2] = NULL);
// Description:
// Parse the MathText expression in str and fill path with a contour of the
// glyphs. The origin of the path coordinates is aligned with the anchor point
// described by the text property's horizontal and vertical justification
// options.
bool StringToPath(const char *str, vtkPath *path, vtkTextProperty *tprop,
int dpi);
// Description:
// Set to true if the graphics implmentation requires texture image dimensions
// to be a power of two. Default is true, but this member will be set
// appropriately when GL is inited.
vtkSetMacro(ScaleToPowerOfTwo, bool);
vtkGetMacro(ScaleToPowerOfTwo, bool);
protected:
vtkMatplotlibMathTextUtilities();
virtual ~vtkMatplotlibMathTextUtilities();
bool InitializeMaskParser();
bool InitializePathParser();
bool InitializeFontPropertiesClass();
bool CheckForError();
bool CheckForError(PyObject *object);
// Description:
// Returns a matplotlib.font_manager.FontProperties PyObject, initialized from
// the vtkTextProperty tprop.
PyObject * GetFontProperties(vtkTextProperty *tprop);
// Description:
// Cleanup and destroy any python objects. This is called during destructor as
// well as when the Python interpreter is finalized. Thus this class must
// handle the case where the internal python objects disappear between calls.
void CleanupPythonObjects();
vtkPythonInterpreter* Interpreter;
PyObject *MaskParser;
PyObject *PathParser;
PyObject *FontPropertiesClass;
static void GetJustifiedBBox(int rows, int cols, vtkTextProperty *tprop,
int bbox[4]);
// Rotate the 4 2D corner points by the specified angle (degrees) around the
// origin and calculate the bounding box
static void RotateCorners(double angleDeg, double corners[4][2],
double bbox[4]);
bool ScaleToPowerOfTwo;
bool PrepareImageData(vtkImageData *data, int bbox[4]);
private:
vtkMatplotlibMathTextUtilities(const vtkMatplotlibMathTextUtilities&); // Not implemented.
void operator=(const vtkMatplotlibMathTextUtilities&); // Not implemented.
// Description:
// Used for runtime checking of matplotlib's mathtext availability.
// @sa IsAvailable
enum Availability
{
NOT_TESTED = 0,
AVAILABLE,
UNAVAILABLE
};
// Description:
// Function used to check MPL availability and update MPLMathTextAvailable.
// This will do tests only the first time this method is called. This method
// is called internally when matplotlib rendering is first needed and is used
// to implement IsAvailable.
static Availability CheckMPLAvailability();
// Description:
// Cache the availability of matplotlib in the current python session.
static Availability MPLMathTextAvailable;
};
#endif