summaryrefslogtreecommitdiffstats
path: root/tdescreensaver/kdesavers/tdeasciiquarium/screen.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdescreensaver/kdesavers/tdeasciiquarium/screen.h')
-rw-r--r--tdescreensaver/kdesavers/tdeasciiquarium/screen.h142
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