1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the Qt 3 compatibility classes of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
32
#include "Qt3Support/q3scrollview.h"
33
#include "QtGui/qpixmap.h"
34
#include "Qt3Support/q3ptrlist.h"
35
#include "QtGui/qbrush.h"
36
#include "QtGui/qpen.h"
37
#include "Qt3Support/q3valuelist.h"
38
#include "Qt3Support/q3pointarray.h"
41
class Q3CanvasPolygonalItem;
42
class Q3CanvasRectangle;
43
class Q3CanvasPolygon;
44
class Q3CanvasEllipse;
53
class Q_COMPAT_EXPORT Q3CanvasItemList : public Q3ValueList<Q3CanvasItem*> {
56
void drawUnique(QPainter& painter);
57
Q3CanvasItemList operator+(const Q3CanvasItemList &l) const;
61
class Q3CanvasItemExtra;
63
class Q_COMPAT_EXPORT Q3CanvasItem
66
Q3CanvasItem(Q3Canvas* canvas);
67
virtual ~Q3CanvasItem();
74
{ return myz; } // (depth)
76
virtual void moveBy(double dx, double dy);
77
void move(double x, double y);
78
void setX(double a) { move(a,y()); }
79
void setY(double a) { move(x(),a); }
80
void setZ(double a) { myz=a; changeChunks(); }
82
bool animated() const;
83
virtual void setAnimated(bool y);
84
virtual void setVelocity(double vx, double vy);
85
void setXVelocity(double vx) { setVelocity(vx,yVelocity()); }
86
void setYVelocity(double vy) { setVelocity(xVelocity(),vy); }
87
double xVelocity() const;
88
double yVelocity() const;
89
virtual void advance(int stage);
91
virtual bool collidesWith(const Q3CanvasItem*) const=0;
93
Q3CanvasItemList collisions(bool exact /* NO DEFAULT */) const;
95
virtual void setCanvas(Q3Canvas*);
97
virtual void draw(QPainter&)=0;
102
virtual void setVisible(bool yes);
103
bool isVisible() const
104
{ return (bool)vis; }
105
virtual void setSelected(bool yes);
106
bool isSelected() const
107
{ return (bool)sel; }
108
virtual void setEnabled(bool yes);
109
bool isEnabled() const
110
{ return (bool)ena; }
111
virtual void setActive(bool yes);
112
bool isActive() const
113
{ return (bool)act; }
115
{ return (bool)vis; }
116
bool selected() const
117
{ return (bool)sel; }
119
{ return (bool)ena; }
121
{ return (bool)act; }
126
Rtti_PolygonalItem = 2,
135
virtual int rtti() const;
138
virtual QRect boundingRect() const=0;
139
virtual QRect boundingRectAdvanced() const;
141
Q3Canvas* canvas() const
145
void update() { changeChunks(); }
148
// For friendly subclasses...
150
friend class Q3CanvasPolygonalItem;
151
friend class Q3CanvasSprite;
152
friend class Q3CanvasRectangle;
153
friend class Q3CanvasPolygon;
154
friend class Q3CanvasEllipse;
155
friend class Q3CanvasText;
156
friend class Q3CanvasLine;
158
virtual Q3PointArray chunks() const;
159
virtual void addToChunks();
160
virtual void removeFromChunks();
161
virtual void changeChunks();
162
virtual bool collidesWith(const Q3CanvasSprite*,
163
const Q3CanvasPolygonalItem*,
164
const Q3CanvasRectangle*,
165
const Q3CanvasEllipse*,
166
const Q3CanvasText*) const = 0;
167
// End of friend stuff
170
static Q3Canvas* current_canvas;
172
Q3CanvasItemExtra *ext;
173
Q3CanvasItemExtra& extra();
185
class Q_COMPAT_EXPORT Q3Canvas : public QObject
189
Q3Canvas(QObject* parent = 0, const char* name = 0);
190
Q3Canvas(int w, int h);
191
Q3Canvas(QPixmap p, int h, int v, int tilewidth, int tileheight);
195
virtual void setTiles(QPixmap tiles, int h, int v,
196
int tilewidth, int tileheight);
197
virtual void setBackgroundPixmap(const QPixmap& p);
198
QPixmap backgroundPixmap() const;
200
virtual void setBackgroundColor(const QColor& c);
201
QColor backgroundColor() const;
203
virtual void setTile(int x, int y, int tilenum);
204
int tile(int x, int y) const
205
{ return grid[x+y*htiles]; }
207
int tilesHorizontally() const
209
int tilesVertically() const
212
int tileWidth() const
214
int tileHeight() const
217
virtual void resize(int width, int height);
223
{ return QSize(awidth,aheight); }
225
{ return QRect(0, 0, awidth, aheight); }
226
bool onCanvas(int x, int y) const
227
{ return x>=0 && y>=0 && x<awidth && y<aheight; }
228
bool onCanvas(const QPoint& p) const
229
{ return onCanvas(p.x(),p.y()); }
230
bool validChunk(int x, int y) const
231
{ return x>=0 && y>=0 && x<chwidth && y<chheight; }
232
bool validChunk(const QPoint& p) const
233
{ return validChunk(p.x(),p.y()); }
235
int chunkSize() const
236
{ return chunksize; }
237
virtual void retune(int chunksize, int maxclusters=100);
239
bool sameChunk(int x1, int y1, int x2, int y2) const
240
{ return x1/chunksize==x2/chunksize && y1/chunksize==y2/chunksize; }
241
virtual void setChangedChunk(int i, int j);
242
virtual void setChangedChunkContaining(int x, int y);
243
virtual void setAllChanged();
244
virtual void setChanged(const QRect& area);
245
virtual void setUnchanged(const QRect& area);
247
// These call setChangedChunk.
248
void addItemToChunk(Q3CanvasItem*, int i, int j);
249
void removeItemFromChunk(Q3CanvasItem*, int i, int j);
250
void addItemToChunkContaining(Q3CanvasItem*, int x, int y);
251
void removeItemFromChunkContaining(Q3CanvasItem*, int x, int y);
253
Q3CanvasItemList allItems();
254
Q3CanvasItemList collisions(const QPoint&) const;
255
Q3CanvasItemList collisions(const QRect&) const;
256
Q3CanvasItemList collisions(const Q3PointArray& pa, const Q3CanvasItem* item,
259
void drawArea(const QRect&, QPainter* p, bool double_buffer=false);
261
// These are for Q3CanvasView to call
262
virtual void addView(Q3CanvasView*);
263
virtual void removeView(Q3CanvasView*);
264
void drawCanvasArea(const QRect&, QPainter* p=0, bool double_buffer=true);
265
void drawViewArea(Q3CanvasView* view, QPainter* p, const QRect& r, bool dbuf);
267
// These are for Q3CanvasItem to call
268
virtual void addItem(Q3CanvasItem*);
269
virtual void addAnimation(Q3CanvasItem*);
270
virtual void removeItem(Q3CanvasItem*);
271
virtual void removeAnimation(Q3CanvasItem*);
273
virtual void setAdvancePeriod(int ms);
274
virtual void setUpdatePeriod(int ms);
276
virtual void setDoubleBuffering(bool y);
282
virtual void advance();
283
virtual void update();
286
virtual void drawBackground(QPainter&, const QRect& area);
287
virtual void drawForeground(QPainter&, const QRect& area);
290
void init(int w, int h, int chunksze=16, int maxclust=100);
292
Q3CanvasChunk& chunk(int i, int j) const;
293
Q3CanvasChunk& chunkContaining(int x, int y) const;
295
QRect changeBounds(const QRect& inarea);
297
void ensureOffScrSize(int osw, int osh);
302
int chwidth,chheight;
303
Q3CanvasChunk* chunks;
307
void initTiles(QPixmap p, int h, int v, int tilewidth, int tileheight);
315
QTimer* update_timer;
317
bool debug_redraw_areas;
320
friend void qt_unview(Q3Canvas* c);
322
Q_DISABLE_COPY(Q3Canvas)
325
class Q3CanvasViewData;
327
class Q_COMPAT_EXPORT Q3CanvasView : public Q3ScrollView
332
Q3CanvasView(QWidget* parent=0, const char* name=0, Qt::WFlags f=0);
333
Q3CanvasView(Q3Canvas* viewing, QWidget* parent=0, const char* name=0, Qt::WFlags f=0);
336
Q3Canvas* canvas() const
338
void setCanvas(Q3Canvas* v);
340
const QMatrix &worldMatrix() const;
341
const QMatrix &inverseWorldMatrix() const;
342
bool setWorldMatrix(const QMatrix &);
345
void drawContents(QPainter *p, int cx, int cy, int cw, int ch);
346
QSize sizeHint() const;
349
friend class Q3Canvas;
350
void drawContents(QPainter*);
353
friend void qt_unview(Q3Canvas* c);
356
void updateContentsSize();
359
Q_DISABLE_COPY(Q3CanvasView)
363
class Q_COMPAT_EXPORT Q3CanvasPixmap : public QPixmap
366
#ifndef QT_NO_IMAGEIO
367
Q3CanvasPixmap(const QString& datafilename);
369
Q3CanvasPixmap(const QImage& image);
370
Q3CanvasPixmap(const QPixmap&, const QPoint& hotspot);
377
void setOffset(int x, int y) { hotx = x; hoty = y; }
380
Q_DISABLE_COPY(Q3CanvasPixmap)
382
void init(const QImage&);
383
void init(const QPixmap& pixmap, int hx, int hy);
385
friend class Q3CanvasSprite;
386
friend class Q3CanvasPixmapArray;
387
friend bool qt_testCollision(const Q3CanvasSprite* s1, const Q3CanvasSprite* s2);
391
QImage* collision_mask;
395
class Q_COMPAT_EXPORT Q3CanvasPixmapArray
398
Q3CanvasPixmapArray();
399
#ifndef QT_NO_IMAGEIO
400
Q3CanvasPixmapArray(const QString& datafilenamepattern, int framecount=0);
402
// this form is deprecated
403
Q3CanvasPixmapArray(Q3PtrList<QPixmap>, Q3PtrList<QPoint> hotspots);
405
Q3CanvasPixmapArray(Q3ValueList<QPixmap>, Q3PointArray hotspots = Q3PointArray());
406
~Q3CanvasPixmapArray();
408
#ifndef QT_NO_IMAGEIO
409
bool readPixmaps(const QString& datafilenamepattern, int framecount=0);
410
bool readCollisionMasks(const QString& filenamepattern);
414
bool operator!(); // Failure check.
415
bool isValid() const;
417
Q3CanvasPixmap* image(int i) const
418
{ return img ? img[i] : 0; }
419
void setImage(int i, Q3CanvasPixmap* p);
421
{ return (uint)framecount; }
424
Q_DISABLE_COPY(Q3CanvasPixmapArray)
426
#ifndef QT_NO_IMAGEIO
427
bool readPixmaps(const QString& datafilenamepattern, int framecount, bool maskonly);
432
Q3CanvasPixmap** img;
436
class Q_COMPAT_EXPORT Q3CanvasSprite : public Q3CanvasItem
439
Q3CanvasSprite(Q3CanvasPixmapArray* array, Q3Canvas* canvas);
441
void setSequence(Q3CanvasPixmapArray* seq);
443
virtual ~Q3CanvasSprite();
445
void move(double x, double y);
446
virtual void move(double x, double y, int frame);
448
enum FrameAnimationType { Cycle, Oscillate };
449
virtual void setFrameAnimation(FrameAnimationType=Cycle, int step=1, int state=0);
452
int frameCount() const
453
{ return images->count(); }
458
bool collidesWith(const Q3CanvasItem*) const;
460
QRect boundingRect() const;
462
// is there a reason for these to be protected? Lars
468
int leftEdge() const;
470
int rightEdge() const;
471
int bottomEdge() const;
473
int leftEdge(int nx) const;
474
int topEdge(int ny) const;
475
int rightEdge(int nx) const;
476
int bottomEdge(int ny) const;
477
Q3CanvasPixmap* image() const
478
{ return images->image(frm); }
479
virtual Q3CanvasPixmap* imageAdvanced() const;
480
Q3CanvasPixmap* image(int f) const
481
{ return images->image(f); }
482
virtual void advance(int stage);
485
void draw(QPainter& painter);
488
Q_DISABLE_COPY(Q3CanvasSprite)
491
void removeFromChunks();
498
bool collidesWith(const Q3CanvasSprite*,
499
const Q3CanvasPolygonalItem*,
500
const Q3CanvasRectangle*,
501
const Q3CanvasEllipse*,
502
const Q3CanvasText*) const;
504
friend bool qt_testCollision(const Q3CanvasSprite* s1,
505
const Q3CanvasSprite* s2);
507
Q3CanvasPixmapArray* images;
510
class QPolygonalProcessor;
512
class Q_COMPAT_EXPORT Q3CanvasPolygonalItem : public Q3CanvasItem
515
Q3CanvasPolygonalItem(Q3Canvas* canvas);
516
virtual ~Q3CanvasPolygonalItem();
518
bool collidesWith(const Q3CanvasItem*) const;
520
virtual void setPen(QPen p);
521
virtual void setBrush(QBrush b);
528
virtual Q3PointArray areaPoints() const=0;
529
virtual Q3PointArray areaPointsAdvanced() const;
530
QRect boundingRect() const;
536
void draw(QPainter &);
537
virtual void drawShape(QPainter &) = 0;
539
bool winding() const;
540
void setWinding(bool);
544
{ return (bool)val; }
547
void scanPolygon(const Q3PointArray& pa, int winding,
548
QPolygonalProcessor& process) const;
549
Q3PointArray chunks() const;
551
bool collidesWith(const Q3CanvasSprite*,
552
const Q3CanvasPolygonalItem*,
553
const Q3CanvasRectangle*,
554
const Q3CanvasEllipse*,
555
const Q3CanvasText*) const;
563
class Q_COMPAT_EXPORT Q3CanvasRectangle : public Q3CanvasPolygonalItem
566
Q3CanvasRectangle(Q3Canvas* canvas);
567
Q3CanvasRectangle(const QRect&, Q3Canvas* canvas);
568
Q3CanvasRectangle(int x, int y, int width, int height, Q3Canvas* canvas);
570
~Q3CanvasRectangle();
574
void setSize(int w, int h);
576
{ return QSize(w,h); }
577
Q3PointArray areaPoints() const;
579
{ return QRect(int(x()),int(y()),w,h); }
581
bool collidesWith(const Q3CanvasItem*) const;
587
void drawShape(QPainter &);
588
Q3PointArray chunks() const;
591
bool collidesWith( const Q3CanvasSprite*,
592
const Q3CanvasPolygonalItem*,
593
const Q3CanvasRectangle*,
594
const Q3CanvasEllipse*,
595
const Q3CanvasText*) const;
601
class Q_COMPAT_EXPORT Q3CanvasPolygon : public Q3CanvasPolygonalItem
604
Q3CanvasPolygon(Q3Canvas* canvas);
606
void setPoints(Q3PointArray);
607
Q3PointArray points() const;
608
void moveBy(double dx, double dy);
610
Q3PointArray areaPoints() const;
616
void drawShape(QPainter &);
621
class Q_COMPAT_EXPORT Q3CanvasSpline : public Q3CanvasPolygon
624
Q3CanvasSpline(Q3Canvas* canvas);
627
void setControlPoints(Q3PointArray, bool closed=true);
628
Q3PointArray controlPoints() const;
641
class Q_COMPAT_EXPORT Q3CanvasLine : public Q3CanvasPolygonalItem
644
Q3CanvasLine(Q3Canvas* canvas);
646
void setPoints(int x1, int y1, int x2, int y2);
648
QPoint startPoint() const
649
{ return QPoint(x1,y1); }
650
QPoint endPoint() const
651
{ return QPoint(x2,y2); }
657
void moveBy(double dx, double dy);
660
void drawShape(QPainter &);
661
Q3PointArray areaPoints() const;
668
class Q_COMPAT_EXPORT Q3CanvasEllipse : public Q3CanvasPolygonalItem
672
Q3CanvasEllipse(Q3Canvas* canvas);
673
Q3CanvasEllipse(int width, int height, Q3Canvas* canvas);
674
Q3CanvasEllipse(int width, int height, int startangle, int angle,
681
void setSize(int w, int h);
682
void setAngles(int start, int length);
683
int angleStart() const
685
int angleLength() const
687
Q3PointArray areaPoints() const;
689
bool collidesWith(const Q3CanvasItem*) const;
695
void drawShape(QPainter &);
698
bool collidesWith(const Q3CanvasSprite*,
699
const Q3CanvasPolygonalItem*,
700
const Q3CanvasRectangle*,
701
const Q3CanvasEllipse*,
702
const Q3CanvasText*) const;
708
class Q3CanvasTextExtra;
710
class Q_COMPAT_EXPORT Q3CanvasText : public Q3CanvasItem
713
Q3CanvasText(Q3Canvas* canvas);
714
Q3CanvasText(const QString&, Q3Canvas* canvas);
715
Q3CanvasText(const QString&, QFont, Q3Canvas* canvas);
717
virtual ~Q3CanvasText();
719
void setText(const QString&);
720
void setFont(const QFont&);
721
void setColor(const QColor&);
722
QString text() const;
724
QColor color() const;
726
void moveBy(double dx, double dy);
728
int textFlags() const
730
void setTextFlags(int);
732
QRect boundingRect() const;
734
bool collidesWith(const Q3CanvasItem*) const;
740
virtual void draw(QPainter&);
743
Q_DISABLE_COPY(Q3CanvasText)
746
void removeFromChunks();
755
Q3CanvasTextExtra* extra;
757
bool collidesWith(const Q3CanvasSprite*,
758
const Q3CanvasPolygonalItem*,
759
const Q3CanvasRectangle*,
760
const Q3CanvasEllipse*,
761
const Q3CanvasText*) const;