You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
7.7 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkWindow.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.
=========================================================================*/
/**
* @class vtkWindow
* @brief window superclass for vtkRenderWindow
*
* vtkWindow is an abstract object to specify the behavior of a
* rendering window. It contains vtkViewports.
*
* @sa
* vtkRenderWindow vtkViewport
*/
#ifndef vtkWindow_h
#define vtkWindow_h
#include "vtkCommonCoreModule.h" // For export macro
#include "vtkObject.h"
class vtkUnsignedCharArray;
class VTKCOMMONCORE_EXPORT vtkWindow : public vtkObject
{
public:
vtkTypeMacro(vtkWindow, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* These are window system independent methods that are used
* to help interface vtkWindow to native windowing systems.
*/
virtual void SetDisplayId(void*) {}
virtual void SetWindowId(void*) {}
virtual void SetParentId(void*) {}
virtual void* GetGenericDisplayId() { return nullptr; }
virtual void* GetGenericWindowId() { return nullptr; }
virtual void* GetGenericParentId() { return nullptr; }
virtual void* GetGenericContext() { return nullptr; }
virtual void* GetGenericDrawable() { return nullptr; }
virtual void SetWindowInfo(const char*) {}
virtual void SetParentInfo(const char*) {}
//@}
//@{
/**
* Get the position (x and y) of the rendering window in
* screen coordinates (in pixels).
*/
virtual int* GetPosition() VTK_SIZEHINT(2);
/**
* Set the position (x and y) of the rendering window in
* screen coordinates (in pixels). This resizes the operating
* system's view/window and redraws it.
*/
virtual void SetPosition(int x, int y);
virtual void SetPosition(int a[2]);
//@}
//@{
/**
* Get the size (width and height) of the rendering window in
* screen coordinates (in pixels).
*/
virtual int* GetSize() VTK_SIZEHINT(2);
/**
* Set the size (width and height) of the rendering window in
* screen coordinates (in pixels). This resizes the operating
* system's view/window and redraws it.
*
* If the size has changed, this method will fire
* vtkCommand::WindowResizeEvent.
*/
virtual void SetSize(int width, int height);
virtual void SetSize(int a[2]);
//@}
/**
* GetSize() returns the size * this->TileScale, whereas this method returns
* the size without multiplying with the tile scale. Measured in pixels.
*/
int* GetActualSize() VTK_SIZEHINT(2);
/**
* Get the current size of the screen in pixels.
*/
virtual int* GetScreenSize() VTK_SIZEHINT(2) { return nullptr; }
//@{
/**
* Keep track of whether the rendering window has been mapped to screen.
*/
vtkGetMacro(Mapped, vtkTypeBool);
//@}
//@{
/**
* Show or not Show the window
*/
vtkGetMacro(ShowWindow, bool);
vtkSetMacro(ShowWindow, bool);
vtkBooleanMacro(ShowWindow, bool);
//@}
//@{
/**
* Render to an offscreen destination such as a framebuffer.
* All four combinations of ShowWindow and UseOffScreenBuffers
* should work for most rendering backends.
*/
vtkSetMacro(UseOffScreenBuffers, bool);
vtkGetMacro(UseOffScreenBuffers, bool);
vtkBooleanMacro(UseOffScreenBuffers, bool);
//@}
//@{
/**
* Turn on/off erasing the screen between images. This allows multiple
* exposure sequences if turned on. You will need to turn double
* buffering off or make use of the SwapBuffers methods to prevent
* you from swapping buffers between exposures.
*/
vtkSetMacro(Erase, vtkTypeBool);
vtkGetMacro(Erase, vtkTypeBool);
vtkBooleanMacro(Erase, vtkTypeBool);
//@}
//@{
/**
* Keep track of whether double buffering is on or off
*/
vtkSetMacro(DoubleBuffer, vtkTypeBool);
vtkGetMacro(DoubleBuffer, vtkTypeBool);
vtkBooleanMacro(DoubleBuffer, vtkTypeBool);
//@}
//@{
/**
* Get name of rendering window
*/
vtkGetStringMacro(WindowName);
vtkSetStringMacro(WindowName);
//@}
/**
* Ask each viewport owned by this Window to render its image and
* synchronize this process.
*/
virtual void Render() {}
/**
* Release any graphics resources that are being consumed by this texture.
* The parameter window could be used to determine which graphic
* resources to release.
*/
virtual void ReleaseGraphicsResources(vtkWindow*) {}
//@{
/**
* Get the pixel data of an image, transmitted as RGBRGBRGB. The
* front argument indicates if the front buffer should be used or the back
* buffer. It is the caller's responsibility to delete the resulting
* array. It is very important to realize that the memory in this array
* is organized from the bottom of the window to the top. The origin
* of the screen is in the lower left corner. The y axis increases as
* you go up the screen. So the storage of pixels is from left to right
* and from bottom to top.
* (x,y) is any corner of the rectangle. (x2,y2) is its opposite corner on
* the diagonal.
*/
virtual unsigned char* GetPixelData(
int /*x*/, int /*y*/, int /*x2*/, int /*y2*/, int /*front*/, int /*right*/ = 0)
{
return nullptr;
}
virtual int GetPixelData(int /*x*/, int /*y*/, int /*x2*/, int /*y2*/, int /*front*/,
vtkUnsignedCharArray* /*data*/, int /*right*/ = 0)
{
return 0;
}
//@}
//@{
/**
* Return a best estimate to the dots per inch of the display
* device being rendered (or printed).
*/
vtkGetMacro(DPI, int);
vtkSetClampMacro(DPI, int, 1, VTK_INT_MAX);
//@}
/**
* Attempt to detect and set the DPI of the display device by querying the
* system. Note that this is not supported on most backends, and this method
* will return false if the DPI could not be detected. Use GetDPI() to
* inspect the detected value.
*/
virtual bool DetectDPI() { return false; }
//@{
/**
* Convenience to set SHowWindow and UseOffScreenBuffers in one call
*/
void SetOffScreenRendering(vtkTypeBool val)
{
this->SetShowWindow(val == 0);
this->SetUseOffScreenBuffers(val != 0);
}
vtkBooleanMacro(OffScreenRendering, vtkTypeBool);
//@}
/**
* Deprecated, directly use GetShowWindow and GetOffScreenBuffers
* instead.
*/
vtkTypeBool GetOffScreenRendering() { return this->GetShowWindow() ? 0 : 1; }
/**
* Make the window current. May be overridden in subclasses to do
* for example a glXMakeCurrent or a wglMakeCurrent.
*/
virtual void MakeCurrent() {}
//@{
/**
* These methods are used by vtkWindowToImageFilter to tell a VTK window
* to simulate a larger window by tiling. For 3D geometry these methods
* have no impact. It is just in handling annotation that this information
* must be available to the mappers and the coordinate calculations.
*/
vtkSetVector2Macro(TileScale, int);
vtkGetVector2Macro(TileScale, int);
void SetTileScale(int s) { this->SetTileScale(s, s); }
vtkSetVector4Macro(TileViewport, double);
vtkGetVector4Macro(TileViewport, double);
//@}
protected:
vtkWindow();
~vtkWindow() override;
char* WindowName;
int Size[2];
int Position[2];
vtkTypeBool Mapped;
bool ShowWindow;
bool UseOffScreenBuffers;
vtkTypeBool Erase;
vtkTypeBool DoubleBuffer;
int DPI;
double TileViewport[4];
int TileSize[2];
int TileScale[2];
private:
vtkWindow(const vtkWindow&) = delete;
void operator=(const vtkWindow&) = delete;
};
#endif