]> git.vomp.tv Git - vompclient.git/blob - boxx.h
Fix text corruption in channel number display on live tv
[vompclient.git] / boxx.h
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #ifndef BOXX_H
22 #define BOXX_H
23
24 #include <stdio.h>
25 #include <vector>
26
27 using namespace std;
28
29 #include "colour.h"
30 #include "region.h"
31 #include "message.h"
32
33
34 #include "surface.h"
35 #include "video.h"
36 #include "tvmedia.h"
37 #include "osdvector.h"
38
39 class Bitmap;
40
41 class Boxx
42 {
43   friend class Wwss;
44   public:
45     Boxx();
46     virtual ~Boxx();
47
48     virtual void setSize(UINT w, UINT h);  // virtual? really?
49     void setPosition(UINT x, UINT y); // Set position on parent. Even numbers only!!!
50     void createBuffer(); // Make this a root view that goes in the BoxStack
51     virtual void draw();
52     
53     
54     void setGap(UINT gap);
55     void setBackgroundColour(const DrawStyle& colour);
56     void setVisible(bool isVisible);
57     void setVideoBackground();
58
59
60     // The following are supposed to be abstract functions
61     // However, it is useful to be able to make instances of Boxx
62     // Therefore the following stubs are provided.
63     virtual void preDelete() {}
64     virtual int handleCommand(int x) { return 0; }
65     virtual void processMessage(Message* m) {}
66         virtual bool mouseMove(int x, int y);
67         virtual bool mouseLBDOWN(int x, int y);
68     virtual bool mouseAndroidScroll(int x, int y,int sx, int sy) { return false; }
69     virtual void deactivateAllControls() {}
70
71     /* preDelete 
72     
73      I think it's functionally equivalent to e.g. delete timers in Boxx::preDelete
74      because the only place where a Boxx is deleted is in 
75      BoxStack::remove. There is now a call in BoxStack::remove to Boxx::preDelete
76      The reason for this is to stop timercalls calling BoxStack::update at the
77      same time BoxStack::remove is locked trying to delete the Boxx
78     */
79
80     // Get functions
81     int getScreenX();        // where is it on screen
82     int getScreenY();
83     int getRootBoxOffsetX(); // where is it relative to the top-parent in the boxstack
84     int getRootBoxOffsetY();
85     int getX();              // where is it relative to its parent
86     int getX2();             // .. and the right edge
87     int getY();
88     int getY2();
89     UINT getWidth();
90     UINT getHeight();
91     bool getVisible();
92     Region* getRegion();     // Not to be used for changing the region
93     Region getRegionR();     // Same but as an object
94     void getRootBoxRegion(Region*);
95     
96     bool getVideoDisplay(VideoDisplay &vd);
97
98     // Drawing functions level 1
99     void fillColour(const DrawStyle & colour);
100     int drawPara(const char* text, int x, int y, const DrawStyle& colour, unsigned int skiplines=0);
101
102     // Drawing functions level 0
103     void rectangle(UINT x, UINT y, UINT w, UINT h, const DrawStyle& colour);
104     void rectangle(Region& region, const DrawStyle& colour);
105
106     void drawText(const char* text, int x, int y, const DrawStyle& colour);
107     void drawText(const char* text, int x, int y, int width, const DrawStyle& colour);
108     void drawTextRJ(const char* text, int x, int y, const DrawStyle& colour);
109     void drawTextCentre(const char* text, int x, int y, const DrawStyle& colour);
110     //Now deprecated
111     //void drawPixel(UINT x, UINT y, const Colour& colour, bool fastdraw=false);
112     void drawBitmap(UINT x, UINT y, const Bitmap& bm, const DisplayRegion & region);
113    //Now deprecated
114     // void drawPixelAlpha(UINT x, UINT y, const Colour& colour,bool fastdraw=false);
115     void drawTVMedia(TVMediaInfo & tvmedia,float x, float y, float width, float height, Corner corner=TopLeft);
116     void drawClippingRectangle(float x, float y, float w, float h);
117     int getFontHeight();
118
119     void drawJpeg(const char *fileName,int x, int y,int *width, int *height);
120
121     void drawTTChar(int ox, int oy,int x, int y, cTeletextChar c);
122     void drawMonoBitmap(UCHAR*base, int dx, int dy, unsigned int height,unsigned int width, DrawStyle& nextColour);
123
124     /* This is for system which need a locking of the drawing surface to speed up drawing */
125     void startFastDraw();
126     void endFastDraw();
127
128     float charWidth(wchar_t c);
129
130     void add(Boxx*); // a boxx has a set of child boxxs
131     void remove(Boxx*);
132
133     /*
134     The following function sets the child's parent pointer without adding the child to the children vector.
135     It's a hack (that should be deprecated?) to allow things like WSymbol to be created, do some drawing on
136     the surface and then be deleted again, leaving the drawing present.
137     A better design would be to create many WSymbols - one per symbol and leave them created - then the
138     automatic draw code will be able to redraw the symbols without all that code needing
139     to be in the derived boxx's draw method.
140     */    
141     void TEMPADD(Boxx* child) { child->setParent(this); }
142
143   friend class BoxStack;
144   protected:
145     //get the surface this box is drawing to
146     Surface *getSurface();
147     Boxx* parent;
148     Region area;
149     vector<Boxx*> children;
150     VideoDisplay vdisplay;
151
152     void setParent(Boxx*);    
153     void blt(Region& r);
154     void removeVisibleChilds(Region & r);
155
156     static const int paraMargin = 10;
157     UINT paraVSpace;
158
159     DrawStyle backgroundColour;
160     bool backgroundColourSet;
161     bool visible;
162
163     static char numBoxxes;
164     Surface* surface;
165 };
166
167 #endif
168
169
170 /*
171
172 New Boxx design
173
174 It's "Boxx" because "Box" was already taken.
175
176 BoxStack replaces Viewman and handles displaying a stack of root boxxs (boxxs with surfaces) on the screen.
177
178 Boxx relaces Box, Widget and parts of View and represents a box with or without a surface.
179 Let's call a Boxx with a surface a root box, and a boxx without a surface a child box.
180
181 A boxx with a surface (root) is like an old View and is handled by BoxStack.
182 A boxx without a surface (child) is like and old Widget and needs to be a child box of another boxx (root or not).
183
184 Don't add a boxx with a surface to another boxx. That isn't the design.
185
186 So, when you create a boxx, either that boxx calls createBuffer() on itself,
187 or some other box add()s the new box to itself.
188
189 Root boxxs can overlap each other - this is managed by boxstack.
190 Child boxxs within a parent boxx do not overlap each other.
191 However, a grandchild box can overlap a child box (but must be entirely contained within the child box).
192
193 TBBoxx replaces View but is now only a convenience class for the window dressing stuff. It isn't required anymore since
194 all the real work that view used to do is done in Boxx now.
195
196 Obseleted classes: Box, View, Viewman, Widget, others?
197 No code outside boxx should talk about surfaces anymore. Hopefully.
198
199 */
200