summaryrefslogtreecommitdiffstats
path: root/ksokoban/ImageData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksokoban/ImageData.cpp')
-rw-r--r--ksokoban/ImageData.cpp213
1 files changed, 213 insertions, 0 deletions
diff --git a/ksokoban/ImageData.cpp b/ksokoban/ImageData.cpp
new file mode 100644
index 00000000..13040c47
--- /dev/null
+++ b/ksokoban/ImageData.cpp
@@ -0,0 +1,213 @@
+/*
+ * ksokoban - a Sokoban game for KDE
+ * Copyright (C) 1998 Anders Widell <[email protected]>
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "ImageData.h"
+
+#include <assert.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qcolor.h>
+
+ImageData::ImageData() : indexSize_(0), size_(0), halfSize_(0) {
+ random.setSeed(0);
+}
+
+ImageData::~ImageData() {
+}
+
+void
+ImageData::expandIndex(int size) {
+ size++;
+ assert(size < 2500);
+
+ upperLargeIndex_.resize(size);
+ lowerLargeIndex_.resize(size);
+ leftSmallIndex_.resize(size);
+ rightSmallIndex_.resize(size);
+
+ for (int i=indexSize_; i<size; i++) {
+ upperLargeIndex_[i] = random.getLong(LARGE_STONES);
+ lowerLargeIndex_[i] = random.getLong(LARGE_STONES);
+ leftSmallIndex_[i] = random.getLong(SMALL_STONES);
+ rightSmallIndex_[i] = random.getLong(SMALL_STONES);
+ }
+
+ indexSize_ = size;
+}
+
+const QPixmap &
+ImageData::upperLarge(int index) {
+ assert(index >= 0);
+ if (indexSize_ <= index) expandIndex(index);
+ return largeStone_xpm_[(unsigned char)upperLargeIndex_[index]];
+}
+
+const QPixmap &
+ImageData::lowerLarge(int index) {
+ assert(index >= 0);
+ if (indexSize_ <= index) expandIndex(index);
+ return largeStone_xpm_[(unsigned char)lowerLargeIndex_[index]];
+}
+
+const QPixmap &
+ImageData::leftSmall(int index) {
+ assert(index >= 0);
+ if (indexSize_ <= index) expandIndex(index);
+ return smallStone_xpm_[(unsigned char)leftSmallIndex_[index]];
+}
+
+const QPixmap &
+ImageData::rightSmall(int index) {
+ assert(index >= 0);
+ if (indexSize_ <= index) expandIndex(index);
+ return smallStone_xpm_[(unsigned char)rightSmallIndex_[index]];
+}
+
+int
+ImageData::resize(int size) {
+ assert(size > 0);
+ size &= ~1u;
+ if (size == size_) return size;
+
+ size_ = size;
+ halfSize_ = size/2;
+
+ for (int i=0; i<SMALL_STONES; i++) {
+ image2pixmap(images_[i].smoothScale(halfSize_, halfSize_), smallStone_xpm_[i]);
+// smallStone_xpm_[i].convertFromImage(images_[i].smoothScale(halfSize_, halfSize_), QPixmap::ColorOnly|QPixmap::DiffuseDither|QPixmap::DiffuseAlphaDither|QPixmap::AvoidDither);
+ }
+
+ for (int i=0; i<LARGE_STONES; i++) {
+ image2pixmap(images_[SMALL_STONES+i].smoothScale(size_, halfSize_), largeStone_xpm_[i]);
+// largeStone_xpm_[i].convertFromImage(images_[SMALL_STONES+i].smoothScale(size_, halfSize_) , QPixmap::ColorOnly|QPixmap::DiffuseDither|QPixmap::DiffuseAlphaDither|QPixmap::AvoidDither);
+ }
+
+ objectImg_ = images_[SMALL_STONES+LARGE_STONES].smoothScale(size_, size_);
+
+ // Use copy() because if the size is not changed, smoothScale is not
+ // really a copy
+ // Use {[Geometry] height=753 width=781} to test
+
+ if (objectImg_.width() == size_) objectImg_ = objectImg_.copy();
+
+ image2pixmap(objectImg_, otherPixmaps_[0], false);
+ brighten(objectImg_);
+ image2pixmap(objectImg_, brightObject_, false);
+
+ QImage img = images_[SMALL_STONES+LARGE_STONES+1].smoothScale(size_, size_);
+ if (img.width() == size_) img = img.copy();
+
+ image2pixmap(img, otherPixmaps_[1], false);
+ brighten(img);
+ image2pixmap(img, brightTreasure_, false);
+
+ for (int i=2; i<OTHER_IMAGES; i++) {
+ image2pixmap(images_[SMALL_STONES+LARGE_STONES+i].smoothScale(size_, size_), otherPixmaps_[i]);
+// otherPixmaps_[i].convertFromImage(images_[SMALL_STONES+LARGE_STONES+i].smoothScale(size_, size_), QPixmap::ColorOnly|QPixmap::OrderedDither|QPixmap::OrderedAlphaDither|QPixmap::AvoidDither);
+ }
+
+ return size_;
+}
+
+// Don't use DiffuseDither for the objects on the "floor" since
+// it gives spurious dots on the floor around them
+
+void
+ImageData::image2pixmap(QImage img, QPixmap& xpm, bool diffuse) {
+ xpm.convertFromImage(img,
+ (diffuse ?
+ (QPixmap::DiffuseDither|QPixmap::DiffuseAlphaDither) :
+ (QPixmap::OrderedDither|QPixmap::OrderedAlphaDither))|
+ QPixmap::ColorOnly|QPixmap::AvoidDither);
+}
+
+void
+ImageData::brighten(QImage& img) {
+ assert(img.depth() == 32);
+
+ for (int y=0; y<img.height(); y++) {
+ for (int x=0; x<img.width(); x++) {
+ QRgb rgb = img.pixel(x, y);
+ int r = qRed(rgb);
+ int g = qGreen(rgb);
+ int b = qBlue(rgb);
+
+ if (r > g && r > b) {
+ // only modify redish pixels
+
+ QColor col(r, g, b);
+ QColor lcol = col.light(130);
+
+ img.setPixel(x, y, lcol.rgb());
+ }
+ }
+ }
+}
+
+void
+ImageData::wall(QPainter &p, int x, int y, int index, bool left, bool right) {
+ if (left) p.drawPixmap(x, y, upperLarge(index-1), halfSize_);
+ else p.drawPixmap(x, y, leftSmall(index));
+
+ if (right) p.drawPixmap(x+halfSize_, y, upperLarge(index), 0, 0, halfSize_);
+ else p.drawPixmap(x+halfSize_, y, rightSmall(index));
+
+ p.drawPixmap(x, y+halfSize_, lowerLarge(index));
+}
+
+void
+ImageData::floor(QPainter &p, int x, int y) {
+ p.eraseRect(x, y, size_, size_);
+}
+
+void
+ImageData::goal(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, otherPixmaps_[2]);
+}
+
+void
+ImageData::man(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, otherPixmaps_[3]);
+}
+
+void
+ImageData::object(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, otherPixmaps_[0]);
+}
+
+void
+ImageData::saveman(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, otherPixmaps_[4]);
+}
+
+void
+ImageData::treasure(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, otherPixmaps_[1]);
+}
+
+void
+ImageData::brightObject(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, brightObject_);
+}
+
+void
+ImageData::brightTreasure(QPainter &p, int x, int y) {
+ p.drawPixmap(x, y, brightTreasure_);
+}