/* * Asciiquarium - Native KDE Screensaver based on the Asciiquarium program * (c) Kirk Baucom , which you can find at * http://www.robobunny.com/projects/asciiquarium/ * * Ported to KDE by Maksim Orlovich and * Michael Pyne . * * Copyright (c) 2003 Kirk Baucom * Copyright (c) 2005 Maksim Orlovich * Copyright (c) 2005 Michael Pyne * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef AA_SCREEN_H #define AA_SCREEN_H #include #include #include #include #include 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 QObject { Q_OBJECT public: /** * Represents a logical character on the Screen. */ struct Pixel { char letter; ///< Character to display in the cell. QRgb 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. */ QPixmap m_backBuffer; int m_cellW; ///< The GUI width of a character cell. int m_cellH; ///< The GUI height of a character cell. QValueVector m_sprites; ///< List of Sprites on screen. QValueVector 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 QPixmap &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 QPixmap &clearPixmap); /** * Actually paints the region on the widget. * * @param r The region of the widget to update. */ void paint(QRegion r); }; #endif // vim: set et ts=8 sw=4: