/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * 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.
 *
 */

/*
 * This code is based on Broken Sword 2.5 engine
 *
 * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
 *
 * Licensed under GNU GPL v2
 *
 */

#ifndef SWORD25_BITMAP_RESOURCE_H
#define SWORD25_BITMAP_RESOURCE_H

#include "sword25/kernel/common.h"
#include "sword25/kernel/resource.h"
#include "sword25/gfx/image/image.h"

namespace Sword25 {

class BitmapResource : public Resource {
public:
	BitmapResource(const Common::String &filename, Image *pImage) :
					_pImage(pImage), Resource(filename, Resource::TYPE_BITMAP) {}
	virtual ~BitmapResource() { delete _pImage; }

	/**
	    @brief Gibt zur�ck, ob das Objekt einen g�ltigen Zustand hat.
	*/
	bool isValid() const {
		return (_pImage != 0);
	}

	/**
	    @brief Gibt die Breite des Bitmaps zur�ck.
	*/
	int getWidth() const {
		assert(_pImage);
		return _pImage->getWidth();
	}

	/**
	    @brief Gibt die H�he des Bitmaps zur�ck.
	*/
	int getHeight() const {
		assert(_pImage);
		return _pImage->getHeight();
	}

	/**
	    @brief Rendert das Bild in den Framebuffer.
	    @param PosX die Position auf der X-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br>
	                Der Standardwert ist 0.
	    @param PosY die Position auf der Y-Achse im Zielbild in Pixeln, an der das Bild gerendert werden soll.<br>
	                Der Standardwert ist 0.
	    @param Flipping gibt an, wie das Bild gespiegelt werden soll.<br>
	                    Der Standardwert ist BS_Image::FLIP_NONE (keine Spiegelung)
	    @param pSrcPartRect Pointer auf ein Common::Rect, welches den Ausschnitt des Quellbildes spezifiziert, der gerendert
	                        werden soll oder NULL, falls das gesamte Bild gerendert werden soll.<br>
	                        Dieser Ausschnitt bezieht sich auf das ungespiegelte und unskalierte Bild.<br>
	                        Der Standardwert ist NULL.
	    @param Color ein ARGB Farbwert, der die Parameter f�r die Farbmodulation und f�rs Alphablending festlegt.<br>
	                 Die Alpha-Komponente der Farbe bestimmt den Alphablending Parameter (0 = keine Deckung, 255 = volle Deckung).<br>
	                 Die Farbkomponenten geben die Farbe f�r die Farbmodulation an.<br>
	                 Der Standardwert is BS_ARGB(255, 255, 255, 255) (volle Deckung, keine Farbmodulation).
	                 Zum Erzeugen des Farbwertes k�nnen die Makros BS_RGB und BS_ARGB benutzt werden.
	    @param Width gibt die Ausgabebreite des Bildausschnittes an.
	                 Falls diese von der Breite des Bildausschnittes abweicht wird
	                 das Bild entsprechend Skaliert.<br>
	                 Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br>
	                 Der Standardwert ist -1.
	    @param Width gibt die Ausgabeh�he des Bildausschnittes an.
	                 Falls diese von der H�he des Bildauschnittes abweicht, wird
	                 das Bild entsprechend Skaliert.<br>
	                 Der Wert -1 gibt an, dass das Bild nicht Skaliert werden soll.<br>
	                 Der Standardwert ist -1.
	    @return Gibt false zur�ck, falls das Rendern fehlgeschlagen ist.
	    @remark Er werden nicht alle Blitting-Operationen von allen BS_Image-Klassen unterst�tzt.<br>
	            Mehr Informationen gibt es in der Klassenbeschreibung von BS_Image und durch folgende Methoden:
	            - IsBlitTarget()
	            - IsScalingAllowed()
	            - IsFillingAllowed()
	            - IsAlphaAllowed()
	            - IsColorModulationAllowed()
	*/
	bool blit(int posX = 0, int posY = 0,
	          int flipping = Graphics::FLIP_NONE,
	          Common::Rect *pSrcPartRect = NULL,
	          uint color = BS_ARGB(255, 255, 255, 255),
	          int width = -1, int height = -1,
			  RectangleList *updateRects = 0) {
		assert(_pImage);
		return _pImage->blit(posX, posY, flipping, pSrcPartRect, color, width, height, updateRects);
	}

	/**
	    @brief F�llt einen Rechteckigen Bereich des Bildes mit einer Farbe.
	    @param pFillRect Pointer auf ein Common::Rect, welches den Ausschnitt des Bildes spezifiziert, der gef�llt
	                      werden soll oder NULL, falls das gesamte Bild gef�llt werden soll.<br>
	                      Der Standardwert ist NULL.
	    @param Color der 32 Bit Farbwert mit dem der Bildbereich gef�llt werden soll.
	    @remark Ein Aufruf dieser Methode ist nur gestattet, wenn IsFillingAllowed() true zur�ckgibt.
	    @remark Es ist m�glich �ber die Methode transparente Rechtecke darzustellen, indem man eine Farbe mit einem Alphawert ungleich
	            255 angibt.
	    @remark Unabh�ngig vom Farbformat des Bildes muss ein 32 Bit Farbwert angegeben werden. Zur Erzeugung, k�nnen die Makros
	            BS_RGB und BS_ARGB benutzt werden.
	    @remark Falls das Rechteck nicht v�llig innerhalb des Bildschirms ist, wird es automatisch zurechtgestutzt.
	*/
	bool fill(const Common::Rect *pFillRect = 0, uint color = BS_RGB(0, 0, 0)) {
		assert(_pImage);
		return _pImage->fill(pFillRect, color);
	}

	/**
	    @brief Liest einen Pixel des Bildes.
	    @param X die X-Koordinate des Pixels.
	    @param Y die Y-Koordinate des Pixels
	    @return Gibt den 32-Bit Farbwert des Pixels an der �bergebenen Koordinate zur�ck.
	    @remark Diese Methode sollte auf keine Fall benutzt werden um gr��ere Teile des Bildes zu lesen, da sie sehr langsam ist. Sie ist
	            eher daf�r gedacht einzelne Pixel des Bildes auszulesen.
	*/
	uint getPixel(int x, int y) const {
		return _pImage->getPixel(x, y);
	}

	//@{
	/** @name Auskunfts-Methoden */

	/**
	    @brief �berpr�ft, ob das BS_Image ein Zielbild f�r einen Blit-Aufruf sein kann.
	    @return Gibt false zur�ck, falls ein Blit-Aufruf mit diesem Objekt als Ziel nicht gestattet ist.
	*/
	bool isBlitTarget() {
		assert(_pImage);
		return _pImage->isBlitTarget();
	}

	/**
	    @brief Gibt true zur�ck, falls das BS_Image bei einem Aufruf von Blit() skaliert dargestellt werden kann.
	*/
	bool isScalingAllowed() {
		assert(_pImage);
		return _pImage->isScalingAllowed();
	}

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image mit einem Aufruf von Fill() gef�llt werden kann.
	*/
	bool isFillingAllowed() {
		assert(_pImage);
		return _pImage->isFillingAllowed();
	}

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image bei einem Aufruf von Blit() mit einem Alphawert dargestellt werden kann.
	*/
	bool isAlphaAllowed() {
		assert(_pImage);
		return _pImage->isAlphaAllowed();
	}

	/**
	    @brief Gibt true zur�ck, wenn das BS_Image bei einem Aufruf von Blit() mit Farbmodulation dargestellt werden kann.
	*/
	bool isColorModulationAllowed() {
		assert(_pImage);
		return _pImage->isColorModulationAllowed();
	}

	bool isSolid() {
		assert(_pImage);
		return _pImage->isSolid();
	}

private:
	Image *_pImage;
};

} // End of namespace Sword25

#endif