24 #include <kconfiggroup.h>
26 #include <kstandarddirs.h>
27 #include <qsvgrenderer.h>
29 #include <QPixmapCache>
36 class KMahjonggTilesetMetricsData
46 KMahjonggTilesetMetricsData()
47 : lvloffx(0), lvloffy(0), w(0), h(0), fw(0), fh(0)
51 class KMahjonggTilesetPrivate
54 KMahjonggTilesetPrivate() : isSVG(false), graphicsLoaded(false) {}
55 QList<QString> elementIdTable;
56 QMap<QString, QString> authorproperties;
58 KMahjonggTilesetMetricsData originaldata;
59 KMahjonggTilesetMetricsData scaleddata;
71 : d(new KMahjonggTilesetPrivate)
75 static bool _inited =
false;
78 KGlobal::dirs()->addResourceType(
"kmahjonggtileset",
"data", QString::fromLatin1(
"kmahjongglib/tilesets/"));
80 KGlobal::locale()->insertCatalog( QLatin1String(
"libkmahjongglib" ));
92 d->scaleddata.w = tilew;
93 d->scaleddata.h = tileh;
94 double ratio = ((qreal) d->scaleddata.w) / ((qreal) d->originaldata.w);
95 d->scaleddata.lvloffx = (short) (d->originaldata.lvloffx * ratio);
96 d->scaleddata.lvloffy = (short) (d->originaldata.lvloffy * ratio);
97 d->scaleddata.fw = (short) (d->originaldata.fw * ratio);
98 d->scaleddata.fh = (short) (d->originaldata.fh * ratio);
104 qreal newtilew, newtileh, aspectratio;
105 qreal bw = boardsize.width();
106 qreal bh = boardsize.height();
109 qreal fullh = (d->originaldata.fh * verticalCells) + d->originaldata.h;
110 qreal fullw = (d->originaldata.fw * horizontalCells) + d->originaldata.w;
111 qreal floatw = d->originaldata.w;
112 qreal floath = d->originaldata.h;
114 if ((fullw/fullh)>(bw/bh)) {
116 aspectratio = bw/fullw;
118 aspectratio = bh/fullh;
120 newtilew = aspectratio * floatw;
121 newtileh = aspectratio * floath;
122 return QSize((
short)newtilew, (
short)newtileh);
127 QString idx = QLatin1String(
"default.desktop" );
129 QString tilesetPath = KStandardDirs::locate(
"kmahjonggtileset", idx);
130 kDebug() <<
"Inside LoadDefault(), located path at" << tilesetPath;
131 if (tilesetPath.isEmpty()) {
139 return d->authorproperties[key];
144 return d->scaleddata.w;
149 return d->scaleddata.h;
154 return d->scaleddata.lvloffx;
159 return d->scaleddata.lvloffy;
164 return (
short) (d->scaleddata.fw / 2.0);
169 return (
short) (d->scaleddata.fh / 2.0);
177 #define kTilesetVersionFormat 1
184 kDebug() <<
"Attempting to load .desktop at" << tilesetPath;
187 d->authorproperties.clear();
190 QFile tilesetfile(tilesetPath);
191 if (!tilesetfile.open(QIODevice::ReadOnly)) {
196 KConfig tileconfig(tilesetPath, KConfig::SimpleConfig);
197 KConfigGroup group = tileconfig.group(
"KMahjonggTileset");
199 d->authorproperties.insert(QLatin1String(
"Name" ), group.readEntry(
"Name"));
200 d->authorproperties.insert(QLatin1String(
"Author" ), group.readEntry(
"Author"));
201 d->authorproperties.insert(QLatin1String(
"Description" ), group.readEntry(
"Description"));
202 d->authorproperties.insert(QLatin1String(
"AuthorEmail" ), group.readEntry(
"AuthorEmail"));
205 int tileversion = group.readEntry(
"VersionFormat",0);
211 QString graphName = group.readEntry(
"FileName");
213 d->graphicspath = KStandardDirs::locate(
"kmahjonggtileset", graphName);
214 kDebug() <<
"Using tileset at" << d->graphicspath;
219 if (d->graphicspath.isEmpty())
return (
false);
221 d->originaldata.w = group.readEntry(
"TileWidth", 30);
222 d->originaldata.h = group.readEntry(
"TileHeight", 50);
223 d->originaldata.fw = group.readEntry(
"TileFaceWidth", 30);
224 d->originaldata.fh = group.readEntry(
"TileFaceHeight", 50);
225 d->originaldata.lvloffx = group.readEntry(
"LevelOffsetX", 10);
226 d->originaldata.lvloffy = group.readEntry(
"LevelOffsetY", 10);
229 d->graphicsLoaded =
false;
230 d->filename = tilesetPath;
256 if (d->graphicsLoaded ==
true)
return (
true) ;
259 d->svg.load(d->graphicspath);
260 if (d->svg.isValid()) {
262 QPixmapCache::clear();
263 d->graphicsLoaded =
true;
279 QString tilesetPath = d->filename;
281 if (QSize(d->scaleddata.w, d->scaleddata.h) == newTilesize)
return false;
284 if (d->svg.isValid()) {
301 for (
short idx=1; idx<=4; idx++) {
302 d->elementIdTable.append(QString::fromLatin1(
"TILE_%1").arg(idx));
305 for (
short idx=1; idx<=4; idx++) {
306 d->elementIdTable.append(QString::fromLatin1(
"TILE_%1_SEL").arg(idx));
309 for (
short idx=1; idx<=9; idx++) {
310 d->elementIdTable.append(QString::fromLatin1(
"CHARACTER_%1").arg(idx));
312 for (
short idx=1; idx<=9; idx++) {
313 d->elementIdTable.append(QString::fromLatin1(
"BAMBOO_%1").arg(idx));
315 for (
short idx=1; idx<=9; idx++) {
316 d->elementIdTable.append(QString::fromLatin1(
"ROD_%1").arg(idx));
318 for (
short idx=1; idx<=4; idx++) {
319 d->elementIdTable.append(QString::fromLatin1(
"SEASON_%1").arg(idx));
321 for (
short idx=1; idx<=4; idx++) {
322 d->elementIdTable.append(QString::fromLatin1(
"WIND_%1").arg(idx));
324 for (
short idx=1; idx<=3; idx++) {
325 d->elementIdTable.append(QString::fromLatin1(
"DRAGON_%1").arg(idx));
327 for (
short idx=1; idx<=4; idx++) {
328 d->elementIdTable.append(QString::fromLatin1(
"FLOWER_%1").arg(idx));
333 return authorProperty(QLatin1String(
"Name" ))+ elementid + QString::fromLatin1(
"W%1H%2").arg(d->scaleddata.w).arg(d->scaleddata.h);
338 QImage qiRend(QSize(width, height),QImage::Format_ARGB32_Premultiplied);
341 if (d->svg.isValid()) {
343 d->svg.render(&p, elementid);
345 return QPixmap::fromImage(qiRend);
350 QString elemId = d->elementIdTable.at(num+4);
353 pm =
renderElement(d->scaleddata.w, d->scaleddata.h, elemId);
361 QString elemId = d->elementIdTable.at(num);
364 pm =
renderElement(d->scaleddata.w, d->scaleddata.h, elemId);
372 if ((num + 8) >= d->elementIdTable.count()) {
373 kDebug() <<
"Client asked for invalid tileface id";
377 QString elemId = d->elementIdTable.at(num + 8);
380 pm =
renderElement(d->scaleddata.fw, d->scaleddata.fh, elemId);
QPixmap unselectedTile(int num)
void buildElementIdTable(void)
QSize preferredTileSize(const QSize &boardsize, int horizontalCells, int verticalCells)
QPixmap selectedTile(int num)
short levelOffsetX() const
QPixmap tileface(int num)
#define kTilesetVersionFormat
short levelOffsetY() const
bool reloadTileset(const QSize &newTilesize)
void updateScaleInfo(short tilew, short tileh)
bool loadTileset(const QString &tilesetPath)
QString authorProperty(const QString &key) const
QString pixmapCacheNameFromElementId(const QString &elementid)
QPixmap renderElement(short width, short height, const QString &elementid)