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
276 lines
7.7 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|