VkDoubleBuffer is an abstract class that provides support for components that need to display double-buffered graphics.
Note: VkDoubleBuffer provides software double-buffering only; it does not use the hardware double-buffering available on many workstations. As a result, you might notice some flickering in your VkDoubleBuffer animations.
You must create a separate subclass of VkDoubleBuffer for each double-buffered display component in your application. In each subclass, you include the Xlib calls to create the text or graphics that the component displays. You do not have to worry about handling Expose events or resize requests as VkDoubleBuffer handles these automatically.
The public interface to VkDoubleBuffer consists simply of a function that your application calls whenever it needs to update the component's display. For example, to drive an animation, you could set a timer to update a component at a desired interval.
Double Buffer Constructor and Destructor
The VkDoubleBuffer constructor accepts the standard ObjectPak component constructor arguments, a component name and a parent widget:
- VkDoubleBuffer(const char *name, Widget parent)
The constructor creates the various widgets and Pixmaps used by the component and installs callbacks to handle Expose events and resize requests. In your subclass constructor, you can initialize any graphics contexts and other data that your component requires.
The VkDoubleBuffer destructor frees the widgets and Pixmaps allocated by the VkDoubleBuffer constructor:
In your subclass destructor you should free any graphics contexts and other data allocated by your component.
Drawing in the Double Buffer Component
The VkDoubleBuffer class calls your component's draw() function when your component needs to draw a new frame:
- virtual void draw()
draw() is declared by VkDoubleBuffer as a pure virtual function, and it is the only function you must override when creating a derived class of VkDoubleBuffer. The draw() function should use Xlib calls to display text or graphics by drawing to the _canvas data member:
- Pixmap _canvas
The derived class always draws to the back buffer, although the derived class does not need to be aware of this. The VkDoubleBuffer class copies the contents of this Pixmap to the front buffer as needed.
Switching Buffers in the Double Buffer Component
VkDoubleBuffer::update() is the public member function that the application calls to update the component's display:
- virtual void update()
update() calls your component's draw() function to obtain a new frame. Then it swaps buffers, and if the component is currently displayed, updates the screen with the contents of the front buffer. Finally, update() clears the back buffer by filling it with the component's background color.
Handling Double Buffer Component Resize Requests
VkDoubleBuffer automatically handles window resize requests, resizing the front and back buffers and filling them with the component's background color. If you need to perform additional operations in your derived class, you can override the virtual function VkDoubleBuffer::resize():
- virtual void resize()
VkDoubleBuffer calls resize() after resizing and reinitializing the buffers. The new height and width of the drawing area are contained in the _width and _height data members: