summaryrefslogtreecommitdiffstats
path: root/asciiquarium/src/screen.h
blob: 26fa3efdac2f014420d6ade7d6cce11c41305c78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * Asciiquarium - Native KDE Screensaver based on the Asciiquarium program
 *    (c) Kirk Baucom <kbaucom@schizoid.com>, which you can find at
 *    http://www.robobunny.com/projects/asciiquarium/
 *
 * Ported to KDE by Maksim Orlovich <maksim@kde.org> and
 * Michael Pyne <michael.pyne@kdemail.net>.
 *
 * Copyright (c) 2003 Kirk Baucom     <kbaucom@schizoid.com>
 * Copyright (c) 2005 Maksim Orlovich <maksim@kde.org>
 * Copyright (c) 2005 Michael Pyne    <michael.pyne@kdemail.net>
 *
 * 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 <ntqcolor.h>
#include <ntqfont.h>
#include <ntqobject.h>
#include <ntqvaluevector.h>
#include <ntqpixmap.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

// vim: set et ts=8 sw=4: