#ifndef Bildschirm_H
#define Bildschirm_H

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <d3d9.h>

namespace Framework
{
	class Bild; // Bild.h
	class Punkt; // Punkt.h
	class WFenster; // Fenster.h
	class Bildschirm; // aus dieser Datei
	class ObjektArray; // Objekt.h
	class Objekt; // Objekt.h
	class Farbe; // Farbe.h

	//Diese Klasse wird das Bild auf dem Bildschirm verwalten
	class Bildschirm
	{
	private:
		IDirect3D9*			pDirect3D;
		IDirect3DDevice9*	pDevice;
		IDirect3DSurface9*	pBackBuffer;
		D3DLOCKED_RECT		backRect;
		WFenster *fenster;
		Bild *renderB;
		CRITICAL_SECTION threadSave;
		int ref;
		ObjektArray *members;
		Farbe *füllFarbe;
		bool vollbild;
		Punkt *backBufferGröße;

	public:
		// Konstruktor 
		Bildschirm( WFenster *fenster );
		// Destruktor 
		~Bildschirm();
		// nicht constant 
		void lock();
		void unlock();
		void update(); // aktualisiert directX
		void addMember( Objekt *obj ); // Fügt ein Objekt hinzu
		void removeMember( Objekt *obj ); // Entfernt ein Objekt
		void render(); // Zeichnet das Bild
		void setFüllFarbeZ( Farbe *f ); // setzt die Fill Farbe
		void setFüllFarbe( Farbe *f );
		void setFüllFarbe( int f );
		void setVollbild( bool fullscreen ); // setzt vollbild
		void tick( double tickval );
		void setBackBufferGröße( int breite, int höhe ); // setzt die Größe des Backbuffers
		void setBackBufferGröße( Punkt *größe );
		void setBackBufferGrößeZ( Punkt *größe );
		// constant 
		Bild *getRenderBild() const; // Gibt das RenderObj zurück
		ObjektArray *getMembers() const; // gibt die Objekte zurück
		Farbe *getFüllFarbe() const; // gibt die Füll Farbe zurück
		Farbe *zFüllFarbe() const;
		bool istVolbild() const; // gibt zurück, ob vollbild an ist
		Punkt *getBackBufferGröße() const; // gibt die Größe des Backbuffers zurück
		Punkt *zBackBufferGröße() const;
		// Reference Counting 
		Bildschirm *getThis();
		Bildschirm *release();
	};
}

#endif