diff options
Diffstat (limited to 'kpat/cardmaps.cpp')
-rw-r--r-- | kpat/cardmaps.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/kpat/cardmaps.cpp b/kpat/cardmaps.cpp new file mode 100644 index 00000000..5a2decae --- /dev/null +++ b/kpat/cardmaps.cpp @@ -0,0 +1,248 @@ +/***********************-*-C++-*-******** + + cardmaps.cpp defines pixmaps for playing cards + + Copyright (C) 1995 Paul Olav Tvete + + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + +****************************************/ + +#include <stdio.h> +#include <unistd.h> + +#include <qpainter.h> + +#include <kconfig.h> + +#include <config.h> +#include "cardmaps.h" +#include <stdlib.h> + +#include <config.h> +#include <kdebug.h> +#include <kapplication.h> +#include <klocale.h> +#include "version.h" +#include <kstaticdeleter.h> +#include <qimage.h> +#include <kimageeffect.h> +#include <kcarddialog.h> +#include <kglobalsettings.h> +#include <assert.h> + +cardMap *cardMap::_self = 0; +static KStaticDeleter<cardMap> cms; + +cardMap::cardMap(const QColor &dim) : dimcolor(dim) +{ + assert(!_self); + + card_width = 0; + card_height = 0; + + kdDebug(11111) << "cardMap\n"; + KConfig *config = kapp->config(); + KConfigGroupSaver cs(config, settings_group ); + + QString bg = config->readEntry( "Back", KCardDialog::getDefaultDeck()); + setBackSide( bg, false); + + QString dir = config->readEntry("Cards", KCardDialog::getDefaultCardDir()); + setCardDir( dir ); + + cms.setObject(_self, this); +// kdDebug(11111) << "card " << CARDX << " " << CARDY << endl; +} + +bool cardMap::setCardDir( const QString &dir) +{ + KConfig *config = kapp->config(); + KConfigGroupSaver cs(config, settings_group ); + + // create an animation window while loading pixmaps (this + // may take a while (approx. 3 seconds on my AMD K6PR200) + bool animate = config->readBoolEntry( "Animation", true); + + QWidget* w = 0; + QPainter p; + QTime t1, t2; + + QString imgname = KCardDialog::getCardPath(dir, 11); + + QImage image; + image.load(imgname); + if( image.isNull()) { + kdDebug(11111) << "cannot load card pixmap \"" << imgname << "\" in " << dir << "\n"; + p.end(); + delete w; + return false; + } + + int old_card_width = card_width; + int old_card_height = card_height; + + card_width = image.width(); + card_height = image.height(); + + const int diff_x_between_cards = QMAX(card_width / 9, 1); + QString wait_message = i18n("please wait, loading cards..."); + QString greeting = i18n("KPatience - a Solitaire game"); + + const int greeting_width = 20 + diff_x_between_cards * 52 + card_width; + + if( animate ) { + t1 = QTime::currentTime(); + w = new QWidget( 0, "", Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_Tool ); + QRect dg = KGlobalSettings::splashScreenDesktopGeometry(); + w->setBackgroundColor( Qt::darkGreen ); + w->setGeometry( dg.left() + ( dg.width() - greeting_width ) / 2, dg.top() + ( dg.height() - 180 ) / 2, greeting_width, 180); + w->show(); + qApp->processEvents(); + + p.begin( w ); + p.drawText(0, 150, greeting_width, 20, Qt::AlignCenter, + wait_message ); + + p.setFont(QFont("Times", 24)); + p.drawText(0, 0, greeting_width, 40, Qt::AlignCenter, + greeting); + + p.setPen(QPen(QColor(0, 0, 0), 4)); + p.setBrush(Qt::NoBrush); + p.drawRect(0, 0, greeting_width, 180); + p.flush(); + } + + setBackSide(back, true); + + for(int idx = 1; idx < 53; idx++) + { + // translate index to suit/rank + // this is necessary since kpoker uses another + // mapping in the pictures + int rank = (idx - 1) / 4; + if(rank != 0) + rank = 13 - rank; + int suit = 0; + switch((idx - 1) % 4) { + case 0: + suit = 0; + break; + case 1: + suit = 3; + break; + case 2: + suit = 2; + break; + case 3: + suit = 1; + break; + } + + imgname = KCardDialog::getCardPath(dir, idx); + image.load(imgname); + + if( image.isNull() || image.width() != card_width || image.height() != card_height ) { + kdDebug(11111) << "cannot load card pixmap \"" << imgname << "\" in (" << idx << ") " << dir << "\n"; + p.end(); + delete w; + card_width = old_card_width; + card_height = old_card_height; + + setBackSide(back, true); + return false; + } + + img[rank][suit].normal.convertFromImage(image); + KImageEffect::fade(image, 0.4, dimcolor); + img[rank][suit].inverted.convertFromImage(image); + + if( animate ) + { + if( idx > 1 ) + p.drawPixmap( 10 + ( idx - 1 ) * diff_x_between_cards, 45, back ); + p.drawPixmap( 10 + idx * diff_x_between_cards, 45, img[ rank ][ suit ].normal ); + p.flush(); + } + } + + if( animate ) + { + const int time_to_see = 900; + p.end(); + t2 = QTime::currentTime(); + if(t1.msecsTo(t2) < time_to_see) + usleep((time_to_see-t1.msecsTo(t2))*1000); + delete w; + } + + return true; +} + +bool cardMap::setBackSide( const QPixmap &pm, bool scale ) +{ + if (pm.isNull()) + return false; + + back = pm; + + if(scale && (back.width() != card_width || + back.height() != card_height)) + { + kdDebug(11111) << "scaling back!!\n"; + // scale to fit size + QWMatrix wm; + wm.scale(((float)(card_width))/back.width(), + ((float)(card_height))/back.height()); + back = back.xForm(wm); + } + + return true; +} + +int cardMap::CARDX() { + return self()->card_width; // 72; +} + +int cardMap::CARDY() { + return self()->card_height; // 96; +} + +QPixmap cardMap::backSide() const +{ + return back; +} + +QPixmap cardMap::image( Card::Rank _rank, Card::Suit _suit, bool inverted) const +{ + if( 1 <= _rank && _rank <= 13 + && 1 <= _suit && _suit <= 4 ) + { + if (inverted) + return img[ _rank - 1 ][ _suit - 1 ].inverted; + else + return img[ _rank - 1 ][ _suit - 1 ].normal; + } + else + { + kdError() << "access to invalid card " << int(_rank) << ", " << int(_suit) << endl; + } + return 0; +} + +cardMap *cardMap::self() { + assert(_self); + return _self; +} + |