home *** CD-ROM | disk | FTP | other *** search
- //////////////////////////////////////////////////////////////////////////////
- //
- // This file is part of the Atari Machine Specific Library,
- // and is Copyright 1992 by Warwick W. Allison.
- //
- // You are free to copy and modify these sources, provided you acknoledge
- // the origin by retaining this notice, and adhere to the conditions
- // described in the file COPYING.
- //
- //////////////////////////////////////////////////////////////////////////////
-
- #ifndef _DoubleBuffer_h
- #define _DoubleBuffer_h
- //
- // Encapsulated Double Buffering support.
- //
- // Various other modules in this library write to the current double
- // buffer page. Double buffering provides smoothe output, even at
- // slow update rates.
- //
- // To use, simply create two Screens you want to use as the two pages,
- // and create Pages with them. eg. Pages=new DoubleBuffer(This,That);
- //
- // Once created, use Pages->Flip() to swap pages. This call includes
- // a wait for vertical retrace.
- //
- // Too write on the double buffer (as Sprites do), write to the screen
- // specified by Pages->Current(), or just access Pages->Location().
- //
- // Use Flop() if, for some reason, you don't want the retrace to be
- // waited for.
- //
- // NowShowing() gives the page PHYSICALLY showing, whereas Location() is
- // the page not showing. For double buffering to work correctly, you
- // should never write on the currently shown page.
- //
-
- #include "screen.h"
-
- class DoubleBuffer
- {
- public:
- DoubleBuffer();
- DoubleBuffer(Screen&,Screen&);
-
- void Flip(); // Swap pages smoothly (synced to retrace)
- void Flop(); // Swap pages immediately (unsynced)
- char *Location();
- char *NowShowing();
- Screen& Current();
-
- short Pulse;
-
- private:
- Screen* Canvas[2];
- };
-
- extern DoubleBuffer *Pages;
-
-
- inline char *DoubleBuffer::Location() { return Canvas[Pulse]->Location(); }
- inline char *DoubleBuffer::NowShowing() { return Canvas[1-Pulse]->Location(); }
- inline Screen& DoubleBuffer::Current() { return *Canvas[Pulse]; }
-
- #endif
-