RetroShare/plugins/qsolocards_plugin/CardPixmaps.cpp
defnax 082d5732b0 added game plugin solocards
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@2346 b45a01b8-16f6-495d-af2f-9b41ad6348cc
2010-02-17 01:14:52 +00:00

194 lines
5.9 KiB
C++

/*
QSoloCards is a collection of Solitaire card games written using Qt
Copyright (C) 2009 Steve Moore
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "CardPixmaps.h"
#include <QtGui/QPainter>
#include <QtGui/QImage>
const qreal CardPixmaps::CardWidthToHeight=.66;
const QString CardPixmaps::EmptyStackName("empty");
const QString CardPixmaps::EmptyStackRedealName("emtpy_redeal");
const QString CardPixmaps::CardBackName("back");
const QString CardPixmaps::TransparentNoCard("transparent");
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CardPixmaps::~CardPixmaps()
{
delete m_pSvgRendCard;
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CardPixmaps & CardPixmaps::getInst()
{
static CardPixmaps cardPixmaps;
return cardPixmaps;
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void CardPixmaps::setCardWidth(unsigned int width)
{
m_cardSize.setWidth(width);
m_cardSize.setHeight(width/CardWidthToHeight);
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void CardPixmaps::setCardHeight(unsigned int height)
{
m_cardSize.setHeight(height);
m_cardSize.setWidth(height*CardWidthToHeight);
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CardPixmaps::CardPixmaps()
:m_pSvgRendCard(new QSvgRenderer(QString(":/images/anglo_bitmap.svg"))),
m_pixmapMap(),
m_cardSize(0,0)
{
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
const QPixmap & CardPixmaps::getCardPixmap(const QString & imageName,bool highlighted)
{
QString fullImageName("");
if (highlighted)
{
fullImageName+="hl_";
}
fullImageName+=imageName;
CardPixmapMap::iterator it=m_pixmapMap.find(fullImageName.toStdString());
if (m_pixmapMap.end()!=it)
{
return it->second;
}
QPainter painter;
QPixmap dummyPix(m_cardSize);
dummyPix.fill(Qt::transparent);
m_pixmapMap[fullImageName.toStdString()]=dummyPix;
painter.begin(&m_pixmapMap[fullImageName.toStdString()]);
if (imageName==EmptyStackName || imageName==EmptyStackRedealName)
{
drawEmptyStack(painter,highlighted,imageName==EmptyStackRedealName);
}
else if (imageName==TransparentNoCard)
{
}
else if (highlighted)
{
drawHighlightedCard(painter,imageName);
}
else
{
QRect pixRect(QPoint(0,0),m_cardSize);
m_pSvgRendCard->render(&painter,imageName,pixRect);
}
painter.end();
return m_pixmapMap[fullImageName.toStdString()];
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void CardPixmaps::drawEmptyStack(QPainter & painter,bool highlighted,bool redealCircle)
{
QPoint topLeft(0,0);
QPen pen;
pen.setColor(QColor("#006520"));
pen.setWidth(3);
painter.setPen(pen);
QRect rect(topLeft,m_cardSize);
painter.setRenderHint(QPainter::Antialiasing,true);
if (redealCircle)
{
QPoint ellipseCenter(rect.left()+rect.width()/2,
rect.top()+rect.height()/2);
pen.setWidth(10);
painter.setBrush(QColor("#006520"));
painter.drawEllipse(ellipseCenter,
rect.width()/3,rect.width()/3);
}
painter.setBrush(Qt::transparent);
// draw the highlight rect if necessary.
if (highlighted)
{
painter.setBrush(QBrush(QColor("#806000"),Qt::Dense4Pattern));
}
painter.drawRoundedRect(rect.adjusted(1,1,-1,-1),6.0,6.0);
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void CardPixmaps::drawHighlightedCard(QPainter & painter,const QString & imageName)
{
// for the highlighted case we are going to manipulate the original
// image and change the background of the card to a yellowish color
// to highlight it.
// A QImage is necessary in Format_ARGB32_Premultiplied or Format_ARGB32
// is required to use the composite modes. So, draw the pixmap on the
// QImage. And then render the result in our pixmap.
QRect pixRect(QPoint(0,0),m_cardSize);
QImage image(m_cardSize,QImage::Format_ARGB32_Premultiplied);
image.fill(Qt::transparent);
QPainter imagePainter;
imagePainter.begin(&image);
imagePainter.setPen(Qt::NoPen);
imagePainter.setBrush(QColor("#ffff90"));
imagePainter.drawPixmap(QPoint(0,0),getCardPixmap(imageName));
imagePainter.setCompositionMode(QPainter::CompositionMode_Darken);
imagePainter.drawRoundedRect(pixRect.adjusted(0,0,-1,-1),4.0,4.0);
imagePainter.end();
painter.drawImage(QPoint(0,0),image);
}