2 * Copyright 2007 Matthew Woehlke <mw_triad@users.sourceforge.net>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License version 2 as published by the Free Software Foundation.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Library General Public License for more details.
13 * You should have received a copy of the GNU Library General Public License
14 * along with this library; see the file COPYING.LIB. If not, write to
15 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 * Boston, MA 02110-1301, USA.
19 #include <QtGui/QPainter>
23 void TileSet::initPixmap(int s
, const QPixmap
&pix
, int w
, int h
, const QRect
®ion
)
25 if (w
!= region
.width() || h
!= region
.height()) {
26 QPixmap tile
= pix
.copy(region
);
27 _pixmap
[s
] = QPixmap(w
, h
);
28 _pixmap
[s
].fill(QColor(0,0,0,0));
29 QPainter
p(&_pixmap
[s
]);
30 p
.drawTiledPixmap(0, 0, w
, h
, tile
);
33 _pixmap
[s
] = pix
.copy(region
);
37 TileSet::TileSet(const QPixmap
&pix
, int w1
, int h1
, int w2
, int h2
)
43 _w3
= pix
.width() - (w1
+ w2
);
44 _h3
= pix
.height() - (h1
+ h2
);
45 int w
= w2
; while (w
< 32) w
+= w2
;
46 int h
= h2
; while (h
< 32) h
+= h2
;
48 initPixmap(0, pix
, _w1
, _h1
, QRect(0, 0, _w1
, _h1
));
49 initPixmap(1, pix
, w
, _h1
, QRect(_w1
, 0, w2
, _h1
));
50 initPixmap(2, pix
, _w3
, _h1
, QRect(_w1
+w2
, 0, _w3
, _h1
));
51 initPixmap(3, pix
, _w1
, h
, QRect(0, _h1
, _w1
, h2
));
52 initPixmap(4, pix
, w
, h
, QRect(_w1
, _h1
, w2
, h2
));
53 initPixmap(5, pix
, _w3
, h
, QRect(_w1
+w2
, _h1
, _w3
, h2
));
54 initPixmap(6, pix
, _w1
, _h3
, QRect(0, _h1
+h2
, _w1
, _h3
));
55 initPixmap(7, pix
, w
, _h3
, QRect(_w1
, _h1
+h2
, w2
, _h3
));
56 initPixmap(8, pix
, _w3
, _h3
, QRect(_w1
+w2
, _h1
+h2
, _w3
, _h3
));
59 TileSet::TileSet(const QPixmap
&pix
, int w1
, int h1
, int w3
, int h3
, int x1
, int y1
, int w2
, int h2
)
60 : _w1(w1
), _h1(h1
), _w3(w3
), _h3(h3
)
65 int x2
= pix
.width() - _w3
;
66 int y2
= pix
.height() - _h3
;
67 int w
= w2
; while (w
< 32) w
+= w2
;
68 int h
= h2
; while (h
< 32) h
+= h2
;
70 initPixmap(0, pix
, _w1
, _h1
, QRect(0, 0, _w1
, _h1
));
71 initPixmap(1, pix
, w
, _h1
, QRect(x1
, 0, w2
, _h1
));
72 initPixmap(2, pix
, _w3
, _h1
, QRect(x2
, 0, _w3
, _h1
));
73 initPixmap(3, pix
, _w1
, h
, QRect(0, y1
, _w1
, h2
));
74 initPixmap(4, pix
, w
, h
, QRect(x1
, y1
, w2
, h2
));
75 initPixmap(5, pix
, _w3
, h
, QRect(x2
, y1
, _w3
, h2
));
76 initPixmap(6, pix
, _w1
, _h3
, QRect(0, y2
, _w1
, _h3
));
77 initPixmap(7, pix
, w
, _h3
, QRect(x1
, y2
, w2
, _h3
));
78 initPixmap(8, pix
, _w3
, _h3
, QRect(x2
, y2
, _w3
, _h3
));
81 TileSet::TileSet(const TileSet
&other
)
82 : _w1(other
._w1
), _h1(other
._h1
), _w3(other
._w3
), _h3(other
._h3
)
84 for (int i
=0; i
<9; i
++) {
85 _pixmap
[i
] = other
._pixmap
[i
];
89 TileSet
& TileSet::operator=(const TileSet
&other
)
95 for (int i
=0; i
<9; i
++) {
96 _pixmap
[i
] = other
._pixmap
[i
];
101 inline bool bits(TileSet::Tiles flags
, TileSet::Tiles testFlags
)
103 return (flags
& testFlags
) == testFlags
;
106 void TileSet::render(const QRect
&r
, QPainter
*p
, Tiles t
) const
108 if (_pixmap
[0].isNull())
112 r
.getRect(&x0
, &y0
, &w
, &h
);
120 if (bits(t
, Top
|Left
)) p
->drawPixmap(x0
, y0
, _pixmap
[0]);
121 if (bits(t
, Top
|Right
)) p
->drawPixmap(x2
, y0
, _pixmap
[2]);
122 if (bits(t
, Bottom
|Left
)) p
->drawPixmap(x0
, y2
, _pixmap
[6]);
123 if (bits(t
, Bottom
|Right
)) p
->drawPixmap(x2
, y2
, _pixmap
[8]);
125 if (t
& Top
) p
->drawTiledPixmap(x1
, y0
, w
, _h1
, _pixmap
[1]);
126 if (t
& Bottom
) p
->drawTiledPixmap(x1
, y2
, w
, _h3
, _pixmap
[7]);
127 if (t
& Left
) p
->drawTiledPixmap(x0
, y1
, _w1
, h
, _pixmap
[3]);
128 if (t
& Right
) p
->drawTiledPixmap(x2
, y1
, _w3
, h
, _pixmap
[5]);
130 if (t
& Center
) p
->drawTiledPixmap(x1
, y1
, w
, h
, _pixmap
[4]);