diff options
Diffstat (limited to 'tdescreensaver/kdesavers/tdeasciiquarium/screen.h')
-rw-r--r-- | tdescreensaver/kdesavers/tdeasciiquarium/screen.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/tdescreensaver/kdesavers/tdeasciiquarium/screen.h b/tdescreensaver/kdesavers/tdeasciiquarium/screen.h new file mode 100644 index 00000000..b6e7f92b --- /dev/null +++ b/tdescreensaver/kdesavers/tdeasciiquarium/screen.h @@ -0,0 +1,142 @@ +#ifndef AA_SCREEN_H +#define AA_SCREEN_H + +#include <tqcolor.h> +#include <tqfont.h> +#include <tqobject.h> +#include <tqvaluevector.h> +#include <tqpixmap.h> + +class Sprite; +class AASaver; + +/** + * This is the main display class of Asciiquarium. We use a pseudo-terminal-ish + * type coordinate system, where although this is a full fledged GUI application, + * Sprites and most external functions deal with logical text position + * coordinates instead of GUI coordinates. (x, y) starts in the upper-left of + * the real screen at (0, 0), and continues on to (width - 1, height - 1). + * + * Use addSprite() to add new Sprites to the Screen after you have created them + * and added their Frames. + */ +class Screen: public TQObject +{ + Q_OBJECT + +public: + /** + * Represents a logical character on the Screen. + */ + struct Pixel { + char letter; ///< Character to display in the cell. + TQRgb color; ///< Color to use for the cell. + + /// Default constructor. + Pixel(): letter(' '), color(0) + { + } + }; + +private: + AASaver* m_widget; ///< Widget that we should paint on. + int m_width; ///< Number of logical columns in the screen. + int m_height; ///< Number of logical rows on the screen. + int m_offX; ///< Number of pixels on left side needed to center image. + int m_offY; ///< Number of pixels on top side needed to center image. + + /** Pixmap cache of the image used to speed up rendering. All paints happen + * to the pixmap, which is then bitBlt()'ed to m_widget when the time comes + * to paint. + */ + TQPixmap m_backBuffer; + + int m_cellW; ///< The GUI width of a character cell. + int m_cellH; ///< The GUI height of a character cell. + + TQValueVector<Sprite*> m_sprites; ///< List of Sprites on screen. + TQValueVector<Sprite*> m_addedSprites; ///< List of Sprites to be added next frame. + +private slots: + /** + * Handles updating the screen buffer to draw the next frame. + */ + void doAnimate(); + +public: + /** + * Constructor. + * + * @param widget The widget to draw on. + */ + Screen(AASaver* widget); + ~Screen(); + + /// Returns the logical width of the screen. + int width() const + { + return m_width; + } + + /// Returns the logical height of the screen. + int height() const + { + return m_height; + } + + /// Returns the GUI width of a character cell. + int cellWidth() const + { + return m_cellW; + } + + /// Returns the GUI height of a character cell. + int cellHeight() const + { + return m_cellH; + } + + /** + * Adds a sprite to the internal sprite list. + * + * @param sprite The Sprite to add. It will show up in the next frame. + */ + void addSprite(Sprite* sprite) + { + m_addedSprites.append(sprite); + } + + /// Returns the number of milliseconds separating each animation tick. + int msPerTick() const; + + /** + * Updates the backbuffer, and asks the portion of the widget to be + * repainted. + * + * @param x The logical x coordinate of the left edge of the update area. + * @param y The logical y coordinate of the top edge of the update area. + * @param updatePixmap The pixmap to draw into the buffer, which should be + * masked to only draw non-transparent regions. + */ + void updateSpan(int x, int y, const TQPixmap &updatePixmap); + + /** + * Clear the given portion of the backbuffer, asks for a repaint. + * + * @param x The logical x coordinate of the left edge of the update region. + * @param y The logical y coordinate of the top edge of the update region. + * @param clearPixmap the pixmap to use to clear the span, which should be + * the background color of the Screen, and masked to + * only draw the area that needs cleared. + */ + void clearSpan(int x, int y, const TQPixmap &clearPixmap); + + /** + * Actually paints the region on the widget. + * + * @param r The region of the widget to update. + */ + void paint(TQRegion r); +}; + +#endif |