#ifndef DateiSystem_H
#define DateiSystem_H

#include <fstream>
#include "Array.h"
#include "Punkt.h"

namespace Framework
{
    class Bild; // Bild.h
    class Text; // Text.h
    class FBalken; // Fortschritt.h
#ifdef WIN32
    class Buchstabe; // Schrift.h
    class Alphabet; // Schrift.h
    class Schrift; // Schrift.h
#endif
    class LTDBPixel; // aus dieser Datei
    class LTDBKopf; // aus dieser Datei
    class LTDBBody; // aus dieser Datei
    class LTDBDatei; // aus dieser Datei
    class LTDSPixel; // aus dieser Datei
#ifdef WIN32
    class LTDSDateiKopf; // aus dieser Datei
    class LTDSSchriftKopf; // aus dieser Datei
    class LTDSBuchstabenKopf; // aus dieser Datei
    class LTDSBuchstabenK�rper; // aus dieser Datei
    class LTDSDatei; // aus dieser Datei
#endif

    // LTDB Dateivormat --- Dient zum speichern von mehreren Bildern in einer Datei.

    // Dient zum Speichern und Laden eines einzelnen Pixels aus einem Bild im LTDB Dateiformat
    class LTDBPixel // Pixel einer LTDB Datei
    {
    private:
        LTDBPixel *davor; // Letzter Pixel
        char index; // Bitl�nge des Pixels
        char iR, iG, iB, iA;
        char miR, miG, miB, miA;
        char maxIndex; // L�nge des Pixels
        bool change : 1; // Ver�ndert sich etwas an den volgenden 5 Variablen
        bool changeR : 1; // �ndert sich Rot
        bool changeG : 1; // �ndert sich Gr�n
        bool changeB : 1; // �ndert sich Blau
        bool changeA : 1; // �ndert sich Alpha
        unsigned char komp : 3; // Komprimierung der Farbwerte
        unsigned char R; // Rot
        unsigned char G; // Gr�n
        unsigned char B; // Blau
        unsigned char A; // Alpha
        bool addBitZuFarbe( unsigned char bit ); // F�gt den Farbwerten ein Bit hinzu
        bool getNextFarbeBit( char &byte, int i ); // Speichert das n�chste Farbbit in byte
        int ref;

    public:
        // Konstruktor
        //  davor: Der Pixel, der Vorher geladen wurde. 0, falls die� der Erste Pixel ist
        __declspec( dllexport ) LTDBPixel( LTDBPixel *davor );
        // Destruktor 
        __declspec( dllexport ) ~LTDBPixel();
        // zum Laden gedacht. F�gt dem Pixel einiege bits hinzu
        //  byte: Das zuletzt aus der Datei gelesene Byte
        //  begin: Der Index des ersten Bits im byte, wo der Pixel beginnt
        //  return: Der Index des Bits im Byte, wo der Pixel aufgeh�hrt hat. -1, falls der Pixel am ende Des Bytes noch nicht zuende ist
        __declspec( dllexport ) char addByte( char byte, char begin );
        // zum speichern gedacht. Setzt die Farbe, die im Pixel gespeichert werden soll
        //  f: Die zu speichernde Farbe
        __declspec( dllexport ) void setFarbe( int f );
        // Komprimiert den Pixel. Muss vor dem Speichern aufgerufen werden.
        __declspec( dllexport ) void komprimieren();
        // Gibt ein Teil der Bits zur�ck, die den Pixel representieren
        //  byte: Eine Referens auf das Byte, dass als n�chstes gespeichert werden soll
        //  begin: Der Index des ersten Bits im zu speichernden Byte, wo der Pixel gespeichert werden soll
        //  return: Der Index des Bits im zu speichernden Byte, wo der Pixel aufh�hrt. -1, falls der Pixel im n�chsten Byte fortgesetzt werden muss
        __declspec( dllexport ) char getNextByte( char &byte, int begin );
        // Gibt den Farbwert des Pixels zur�ck
        __declspec( dllexport ) int zuFarbe() const;
        // Gibt zur�ck, ob sich der Anteil an Rot in der Farbe im Vergleich zum Pixel davor ge�ndert hat
        __declspec( dllexport ) bool getChangeR() const;
        // Gibt zur�ck, ob sich der Anteil an Gr�n in der Farbe im Vergleich zum Pixel davor ge�ndert hat
        __declspec( dllexport ) bool getChangeG() const;
        // Gibt zur�ck, ob sich der Anteil an Blau in der Farbe im Vergleich zum Pixel davor ge�ndert hat
        __declspec( dllexport ) bool getChangeB() const;
        // Gibt zur�ck, ob sich der Anteil an Alpha in der Farbe im Vergleich zum Pixel davor ge�ndert hat
        __declspec( dllexport ) bool getChangeA() const;
        // Gibt die Komprimierung des Pixels zur�ck
        __declspec( dllexport ) unsigned char getKomp() const;
        // Gibt den Anteil an Rot in der Farbe des Pixels zur�ck
        __declspec( dllexport ) unsigned char getR() const;
        // Gibt den Anteil an Gr�n in der Farbe des Pixels zur�ck
        __declspec( dllexport ) unsigned char getG() const;
        // Gibt den Anteil an Blau in der Farbe des Pixels zur�ck
        __declspec( dllexport ) unsigned char getB() const;
        // Gibt den Anteil an Alpha in der Farbe des Pixels zur�ck
        __declspec( dllexport ) unsigned char getA() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDBPixel *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDBPixel *release();
    };

    // Der Kopf des LTDB Dateiformates. Hier werden informationen �ber alle Abgespeicherten Bilder verwaltet
    class LTDBDateiKopf
    {
    private:
        RCArray< Text > *bilder;
        Array< __int64 > *pos;
        int bAnzahl;
        int ref;

    public:
        // konstructor
        __declspec( dllexport ) LTDBDateiKopf();
        // destructor 
        __declspec( dllexport ) ~LTDBDateiKopf();
        // Entfernt ein Bild aus dem Dateikopf
        //  i: Der Index des Bildes, welches entfernt werden soll
        __declspec( dllexport ) void removeBild( int i );
        // Entfernt ein Bild aus dem Dateikopf
        //  txt: Der Name des Bildes, welches entfernt werden soll
        __declspec( dllexport ) void removeBild( Text *txt );
        // F�gt dem Dateikopf ein Bild hinzu
        //  txt: Der Name des Bildes.
        __declspec( dllexport ) void addBild( Text *txt );
        // Legt den Index des Bytes aus der Datei fest, wo das Bild anf�ngt
        //  i: Der index Des Bildes
        //  pos: Die Position des Bildes in der Datei
        __declspec( dllexport ) void setBildPos( int i, __int64 pos );
        // Legt den Index des Bytes aus der Datei fest, wo das Bild anf�ngt
        //  txt: Der Name Des Bildes
        //  pos: Die Position des Bildes in der Datei
        __declspec( dllexport ) void setBildPos( Text *txt, __int64 pos );
        // L�dt den Dateikopf einer LTDB Datei
        //  f: Ein Zeiger auf einen Fortschrittsbalken, der zum Laden verwendet werden soll. Kann 0 sein.
        //  inF: Der ge�ffnete ifstream der LTDB Datei, bei dem die Leseposition bereits auf das erste Byte des Dateiopfes zeigt.
        __declspec( dllexport ) void laden( FBalken *f, std::ifstream *inF );
        // Speichert den Dateikopf in einer LTDB Datei
        //  outF: Der ge�ffnete ofstream der LTDB Datei, bei dem die Schreibposition bereits auf das erste Byte des Dateikopfes zeigt.
        __declspec( dllexport ) void speichern( std::ofstream *outF ) const;
        // Gibt den Namen eines bestimmten Bildes zur�ck
        //  i: Der Index des Bildes, dessen Namen zur�ckgegeben werden soll
        //  return: Der Name des bildes
        __declspec( dllexport ) Text *getBild( int i ) const;
        // Gibt den Namen eines bestimmten Bildes zur�ck
        //  i: Der Index des Bildes, dessen Namen zur�ckgegeben werden soll
        //  return: Der Name des bildes ohne erh�hten Reference Counter
        __declspec( dllexport ) Text *zBild( int i ) const;
        // Gibt den Index des Ersten Bytes eines Bildes in der Datei zur�ck
        //  txt: Der Name des Bildes, dessen Beginn gefunden werden soll
        //  return: -1, falls das Bild nicht gefunden wurde.
        __declspec( dllexport ) __int64 getBildPosition( Text *txt ) const;
        // Gibt den Index des Ersten Bytes eines Bildes in der Datei zur�ck
        // Fals der Index nicht existiert wird die Exception std::out_of_range geworfen.
        //  indes: Der Indes des Bildes, dessen Beginn gefunden werden soll
        __declspec( dllexport ) __int64 getBildPosition( int index ) const;
        // Gibt den Index eines Bestimmten Bildes zur�ck
        //  txt: Der Name des Bildes
        //  return: -1, falls das Bild nicht gefunden wurde
        __declspec( dllexport ) int getBildIndex( Text *txt ) const;
        // Gibt die Anzahl der Bilder in der Datei zur�ck
        __declspec( dllexport ) int getbAnzahl() const;
        // Gibt eine Liste mit Bildern in der Datei ohne erh�hten Reference Counter zur�ck.
        // Die Liste sollte nicht ver�ndert werden
        __declspec( dllexport ) RCArray< Text > *zBildListe() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDBDateiKopf *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDBDateiKopf *release();
    };

    // Die im LTDB Dateikopf gespeicherten Informationen f�r ein einzelnes Bild
    class LTDBKopf
    {
    private:
        __int64 a; // Det LTDB Dateikopf ist maximal 104 Bits lang
        __int32 b; // - bis zu 75 Bits f�r den Titel
        __int8 c;  // - 12 Bits f�r breite
        int ref;   // - 12 Bits f�r h�he

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDBKopf();
        // L�hdt die Informationen �ber ein Bild
        //  f: Der ge�ffnette und an die richtiege Stelle zeigende ifstream der LTDB Datei
        __declspec( dllexport ) void laden( std::ifstream *f );
        // Setzt die Informationen die gespeichert werden sollen
        //  titel: Der Titel des Bildes
        //  size: Die Gr��e des Bildes
        //  return: Die Anzahl der Buchstaben aus dem Titel, die im LTDB Dateiformat nicht gespeichert werden k�nnen. Erlaubt ist nur a-z und A-Z und � � � � und � � � und .
        // Alle gro�buchstaben im Titel werden in Kleinbuchstaben umgewandelt
        __declspec( dllexport ) int Init( Text *titel, const Punkt &size );
        // L�hd informationen aus geladenen Bits. Wird von der laden( std::ifstream ) Funktion verwendet.
        //  BeginBit: Der Index des ersten Bits, welches ausgewertet werden soll
        //  EndBit: Der Index des letzten Bits, welches nichtmehr ausgewertet werden soll
        //  bits: Die Bits, von denen alle von BeginBit bis EndBit ausgewertet werden sollen
        // Insgesamt m�ssen 104 Bits gesetzt werden. Hierauf bezihen sich BeginBit und EndBit
        __declspec( dllexport ) void setBits( int BeginBit, int EndBit, __int16 bits );
        // Speichert die Informationen in eine Datei
        //  f: Der ge�ffnete und an die richtiege Stelle zeigende ofstream der LTDB Datei
        __declspec( dllexport ) void speichern( std::ofstream *f ) const;
        // Gibt die L�nge des Titels zur�ck
        __declspec( dllexport ) int getTitelLength() const;
        // Gibt den Titel des Bildes zur�ck
        __declspec( dllexport ) Text *getTitel() const;
        // Gibt die Gr��e des Bildes zur�ck
        __declspec( dllexport ) Punkt getSize() const;
        // Gibt die n�chsten zu speichernden Bits zur�ck
        //  begin: Der Index des ersten Bits, in das gespeichert werden soll
        //  end: Der Index des letzten Bits, in das gespeichert werden soll
        //  return: 16 Bits, in denen die Informationen zwischen begin und end stehen
        // Insgesamt m�ssen 104 Bits gelesen werden. Hierauf bezihen sich BeginBit und EndBit
        __declspec( dllexport ) __int16 getBits( int begin, int end )const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDBKopf *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDBKopf *release();
    };

    // Verwaltet die Pixeldaten eines einzelnen Bildes einer LTDB Datei
    class LTDBBody
    {
    private:
        Punkt gr;
        Bild *b;
        int dateiSize;
        int ref;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDBBody();
        // Konstruktor
        //  k: Der LTDB Kopf des Bildes, der Informationen �ber die Gr��e des Bildes enth�lt
        __declspec( dllexport ) LTDBBody( LTDBKopf *k );
        // Destruktor 
        __declspec( dllexport ) ~LTDBBody();
        // Setzt die Informationen �ber die Gr��e des Bildes. Wird zum Laden ben�tigt.
        //  k: Der LTDB Kopf des Bildes
        __declspec( dllexport ) void init( LTDBKopf k );
        // Setzt die Informationen �ber die Gr��e des Bildes. Wird zum Laden ben�tigt.
        //  k: Der LTDB Kopf des Bildes
        __declspec( dllexport ) void init( LTDBKopf *k );
        // L�dt die Pixeldaten aus der Datei
        //  zF: Ein Fortschrittsbalken, der 0 sein kann
        //  inF: Der ge�ffnete und an die richtiege Stelle zeigende ifstream der LTDB Datei
        __declspec( dllexport ) void laden( FBalken *zF, std::ifstream *inF );
        // Setzt das Bild, welches gespeichert werden soll
        //  b: Das zu speichernde Bild
        __declspec( dllexport ) void setBild( Bild *b );
        // Speichert die Pixeldaten des Bildes in einer LTDB Datei
        //  zF: Ein Fortschrittsbalken, der 0 sein kann
        //  outF: Der ge�ffnete und an die richtiege Stelle zeigende ofstream der LTDB Datei
        __declspec( dllexport ) void speichern( FBalken *zF, std::ofstream *outF ) const;
        // Gibt das geladene Bild zur�ck
        __declspec( dllexport ) Bild *getBild() const;
        // Gibt die Gr��e des Bildes zur�ck
        __declspec( dllexport ) const Punkt &getSize() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDBBody *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDBBody *release();
    };

    // Verwaltet eine LTDB Datei
    class LTDBDatei
    {
    private:
        Text *pfad;
        LTDBDateiKopf *datKpf;
        int ref;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDBDatei();
        // Destruktor 
        __declspec( dllexport ) ~LTDBDatei();
        // Setzt den Pfad zu Datei
        //  pfad: Der Pfad
        __declspec( dllexport ) void setDatei( Text *pfad );
        // Erstellt eine neue LTDB Datei
        __declspec( dllexport ) void erstellen();
        // Lie�t grundlegende Informationen aus der Datei.
        // Wird ben�tigt, bevor mit der Datei gearbeitet wird
        //  zF: Ein Fortschrittsbalken, der 0 sein kann
        __declspec( dllexport ) void leseDaten( FBalken *zF );
        // L�scht die LTDB Datei
        __declspec( dllexport ) void remove();
        // L�scht ein Bild aus der LTDB Datei
        //  zF: Ein Fortschrittsbalken der 0 sein kann
        //  name: Der Name des zu l�schenden Bildes
        __declspec( dllexport ) void remove( FBalken *zF, Text *name );
        // L�dt ein Bild aus der LTDB Datei
        //  zF: Ein Fortschrittsbalken, der 0 sein kann
        //  name: Der Name des Bildes, welches geladen werden soll
        //  return: Das geladene Bild. 0, falls das Bild nicht gefunden wurde
        __declspec( dllexport ) Bild *laden( FBalken *zF, Text *name );
        // Speichert ein neues Bild in der LTDB Datei
        //  zF: Ein Fortscrittsbalken, der 0 sein kann
        //  bild: Das Bild, welches gel�scht werden soll
        //  name: Der Name, unter dem das Bild gespeichert werden soll
        //  return: Anzahl der Warnungen, die beim Konvertieren des Namens in einen g�ltigen Namen aufgetreten sind. -1, falls bereis ein Bild mit dem selben Namen existiert
        __declspec( dllexport ) int speichern( FBalken *zF, Bild *bild, Text *name );
        // Gibt eine Liste mit gespeicherten Bildern zur�ck
        // Die Liste sollte nicht ver�ndert werden
        __declspec( dllexport ) RCArray< Text > *zBildListe();
        // Gibt den Pfad zur LTDB Datei zur�ck
        __declspec( dllexport ) Text *getPfad() const;
        // Gibt die Anzahl der Bilder in der LTDB Datei zur�ck
        __declspec( dllexport ) int getBildAnzahl() const;
        // Pr�ft, ob die LTDB Datei existiert
        __declspec( dllexport ) bool istOffen() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDBDatei *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDBDatei *release();
    };

#ifdef WIN32
    // LTDS Dateivormat --- Dient zum speichern von Schriftarten

    // Verwaltet einen einzelnen Pixel von einem Buchstaben
    class LTDSPixel
    {
    private:
        int ref;
        char index;
        char iA;
        char miA;
        char maxIndex; // L�nge des Pixels
        bool �nder;
        bool �nderA;
        unsigned char komp : 3; // Komprimierung der Farbwerte
        unsigned char alpha;
        LTDSPixel *davor;
        bool addBitZuFarbe( unsigned char bit ); // F�gt den Farbwerten ein Bit hinzu
        bool getNextFarbeBit( char &byte, int i ); // Speichert das n�chste Farbbit in byte

    public:
        // Konstruktor
        //  davor: Der Pixel, der vor diesem geladen wurde. 0, fals die� der erste Pixel ist
        __declspec( dllexport ) LTDSPixel( LTDSPixel *davor );
        // Destruktor 
        __declspec( dllexport ) ~LTDSPixel();
        // F�gt dem Pixel einiege geladene Bits hinzu. Zum Laden gedacht.
        //  byte: Das letzte aus der Datei geladene Byte.
        //  begin: Der Index des ersten Bits im Byte, wo der Pixel beginnt
        //  return: Der Index des Letzten Bits in Byte, wo der Pixel aufh�hrt. -1, falls der Pixel im n�chsten Byte weitergeht
        __declspec( dllexport ) char addByte( char byte, char begin );
        // Setzt den Alpha Wert des Pixels. Zum speichern gedacht.
        //  alpha: Der Alpha Wert des Pixels.
        __declspec( dllexport ) void setAlpha( unsigned char alpha );
        // Komprimiert den Pixel. Muss vor dem Speichern aufgerufen werden.
        __declspec( dllexport ) void Komp();
        // Gibt ein Teil der Bits zur�ck, die den Pixel representieren
        //  byte: Eine Referens auf das Byte, dass als n�chstes gespeichert werden soll
        //  begin: Der Index des ersten Bits im zu speichernden Byte, wo der Pixel gespeichert werden soll
        //  return: Der Index des Bits im zu speichernden Byte, wo der Pixel aufh�hrt. -1, falls der Pixel im n�chsten Byte fortgesetzt werden muss
        __declspec( dllexport ) char getNextByte( char &byte, int bbegin );
        // Gibt die Komprimierung des Pixels zur�ck
        __declspec( dllexport ) unsigned char getKomp() const;
        // Gibt zur�ck, ob sich der Alpha Wert im Vergleich zu dem Pixel davor ge�ndert hat
        __declspec( dllexport ) bool get�nderA() const;
        // Gibt den Alpha Wert des Pixels zur�ck
        __declspec( dllexport ) unsigned char getA() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSPixel *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSPixel *release();
    };

    // Verwaltet den Kopf einer LTDS Datei. Er enth�lt Informationen �ber die in der Datei gespeicherten Schriftgr��en
    class LTDSDateiKopf
    {
    private:
        int ref;
        unsigned char sganzahl;
        unsigned char *gr;
        int *pos;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDSDateiKopf();
        // Destruktor 
        __declspec( dllexport ) ~LTDSDateiKopf();
        // L�dt den Kopf aus der LTDS Datei
        //  inF: Der ge�ffnete und an die richtige Stelle zeigende ifstream der LTDS Datei
        __declspec( dllexport ) void laden( std::ifstream *inF );
        // F�gt eine Schriftgr��e hinzu
        //  sg: Die Schriftgr��e, die hinzugef�gt werden soll
        __declspec( dllexport ) void addSG( char sg );
        // L�scht eine Schriftgr��e
        //  sg: Die Schriftgr��e, die gel�scht werden soll
        __declspec( dllexport ) void removeSG( char sg );
        // Speichert den LTDS Kopf in der Datei
        //  outF: Der ge�ffnete und an die richtiege Stelle zeigende ofstream der LTDS Datei
        __declspec( dllexport ) void speichern( std::ofstream *outF ) const;
        // Gibt einen Array von gespeicherten Schriftgr��en zur�ck
        // Der Array sollte nicht ver�dert werden
        __declspec( dllexport ) unsigned char *getSchriftGr��eList() const;
        // Gibt einen Array mit positionen der ersten Bytes f�r jede Schriftgr��e aus der Datei zur�ck
        __declspec( dllexport ) int *getPositionList() const;
        // Gibt die Anzahl der gespeicherten Schriftgr��en zur�ck
        __declspec( dllexport ) int getSchriftGr��eAnzahl() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSDateiKopf *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSDateiKopf *release();
    };

    // Der Kopf einer Schriftgr��e. Enth�lt Informationen �ber die gespeicherten Zeichen
    class LTDSSchriftKopf
    {
    private:
        int ref;
        unsigned char schriftSize;
        unsigned char *zeichen;
        int *pos;
        unsigned char zeichenAnzahl;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDSSchriftKopf();
        // Destruktor 
        __declspec( dllexport ) ~LTDSSchriftKopf();
        // L�dt den Kopf einer Schriftgr��e aus der Datei
        //  inF: Der ge�ffnete und an de richtiege Stelle zeigende ifstream der LTDS Datei
        __declspec( dllexport ) void laden( std::ifstream *inF );
        // Setzt die Schriftgr��e. Zum speichern gedacht
        //  gr: Die Schriftgr��e
        __declspec( dllexport ) void setSchriftgr��e( unsigned char gr );
        // Setzt das Alphabet, welches in der Schriftgr��e gespeichert werden soll
        //  alphabet: Das Alphabet, welches alle zu speichernden Zeichen in der Schriftgr��e enth�lt
        __declspec( dllexport ) void setZeichenAlphabet( Alphabet *alphabet );
        // F�gt der Schriftgr��e ein Zeichen hinzu, welches gespeichert werden soll
        //  zeichen: Der ASCII code des Zeichens, welches hinzugef�gt werden soll
        __declspec( dllexport ) void addZeichen( unsigned char zeichen );
        // L�scht ein Zeichen aus der Schriftgr��e
        //  zeich: Der ASCII code des Zeichens, welches gel�scht werden soll
        __declspec( dllexport ) void removeZeichen( unsigned char zeich );
        // Speichert den Kopf der Schriftgr��e in der LTDS Datei
        //  outF: Der ge�ffnete und an die richtiege Stelle zeigende ofstream der LTDS Datei
        __declspec( dllexport ) void speichern( std::ofstream *outF ) const;
        // Gibt die Schriftgr��e zur�ck, zu der dieser Kopf geh�hrt
        __declspec( dllexport ) unsigned char getSchriftGr��e() const;
        // Gibt die Anzahl der in der Schriftgr��e gespeicherten Zeichen zur�ck
        __declspec( dllexport ) unsigned char getZeichenAnzahl() const;
        // Gibt einen Array mit den Positionen der ersten Bytes von den gespeicherten Zeichen aus der LTDS Datei zur�ck 
        __declspec( dllexport ) int *getPositionen() const;
        // Gibt einen Array mit den ASCII codes der Gespeicherten Zeichen zur�ck
        __declspec( dllexport ) unsigned char *getZeichen() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSSchriftKopf *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSSchriftKopf *release();
    };

    // Der Kopf eines einzelnen Zeichens aus der LTDS Datei. Enth�lt informationen �ber die Pixelgr��e des Zeichens
    class LTDSBuchstabenKopf
    {
    private:
        int ref;
        unsigned char zeichen;
        Punkt size;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDSBuchstabenKopf();
        // L�dt die Daten aus der LTDS Datei
        //  inF: Der ge�ffnete und an die richtiege Stelle zeigende ifstream der LTDS Datei
        __declspec( dllexport ) void laden( std::ifstream *inF );
        // Setzt die Daten, die gespeichert werden sollen.
        //  zeichen: Der ASCII code des Zeichens
        //  gr��e: Die Gr��e des Zeichens in Pixeln
        __declspec( dllexport ) void init( unsigned char zeichen, const Punkt &gr��e );
        // Setzt die Daten, die gespeichert werden sollen.
        //  zeichen: Der ASCII code des Zeichens
        //  br: Die Breite des Zeichens in Pixeln
        //  h�: Die H�he des Zeichens in Pixeln
        __declspec( dllexport ) void init( unsigned char zeichen, int br, int h� );
        // Speichert die Daten in der LTDS Datei
        //  outF: Der ge�ffnete und auf die richtiege Stelle zeigende ofstream der LTDS Datei
        __declspec( dllexport ) void speichern( std::ofstream *outF ) const;
        // Gibt den ASCII code des Zeichens zur�ck
        __declspec( dllexport ) unsigned char getZeichen() const;
        // Gibt die Breite des Zeichens in Pixeln zur�ck
        __declspec( dllexport ) int getBreite() const;
        // Gibt die H�he des Zeichens in Pixeln zur�ck
        __declspec( dllexport ) int getH�he() const;
        // Gib t die Gr��e des Zeichens in Pixeln zur�ck
        __declspec( dllexport ) const Punkt &getGr��e() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSBuchstabenKopf *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSBuchstabenKopf *release();
    };

    // Verwaltet die Pixeldaten eines Zeichens
    class LTDSBuchstabenK�rper
    {
    private:
        int ref;
        Punkt size;
        unsigned char zeichen;
        Buchstabe *buchstabe;

    public:
        // Konstruktor
        //  kopf: Der Kopf des Zeichens
        __declspec( dllexport ) LTDSBuchstabenK�rper( LTDSBuchstabenKopf *kopf );
        // Destruktor 
        __declspec( dllexport ) ~LTDSBuchstabenK�rper();
        // Setzt den Buchstaben, der gespeichert werden soll
        //  zeichen: Der zu speichernde Buchstabe
        __declspec( dllexport ) void setBuchstabe( Buchstabe *zeichen );
        // L�dt die Pixel aus der LTDS Datei
        //  inF: Der ge�ffnete und auf die richtiege Stelle zeigende ifstream der LTDS Datei
        __declspec( dllexport ) void laden( std::ifstream *inF );
        // Speichert die Pixel in die LTDS Datei
        //  outF: der ge�ffnete und an die richtiege Stelle zeigende ofstream der LTDS Datei
        __declspec( dllexport ) void speichern( std::ofstream *outF ) const;
        // Gibt den geladenen Buchstaben zur�ck
        __declspec( dllexport ) Buchstabe *getBuchstabe() const;
        // Gibt den ASCII code des Buchstabens zur�ck
        __declspec( dllexport ) unsigned char getZeichen() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSBuchstabenK�rper *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSBuchstabenK�rper *release();
    };

    // Verwaltet eine LTDS Datei
    class LTDSDatei
    {
    private:
        int ref;
        Text *pfad;
        LTDSDateiKopf *dateiKopf;

    public:
        // Konstruktor 
        __declspec( dllexport ) LTDSDatei();
        // Destruktor 
        __declspec( dllexport ) ~LTDSDatei();
        // Setzt den Pfad zur Datei
        //  txt: Der Pfad
        __declspec( dllexport ) void setPfad( Text *txt );
        // L�dt wichtiege Informationen aus der Datei. Muss vor dem Verwenden der Datei aufgerufen werden
        __declspec( dllexport ) void leseDaten();
        // F�gt der Datei eine Schriftgr��e hinzu, fals diese noch nicht existiert
        //  alphabet: Das Alphabet, welches die Zeichen in der gew�nschten Schriftgr�0e enth�lt
        __declspec( dllexport ) void addSchriftgr��e( Alphabet *alphabet );
        // F�gt einer Schriftgr��e einen Buchstaben hinzu
        //  gr: Die Schriftgr��e des Buchstabens
        //  zeich: Der Buchstabe, der gespeichert werden soll
        //  zeichen: Der ASCII code des Buchstabens
        __declspec( dllexport ) void addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen );
        // L�scht eine bestimmte Schriftgr��e aus der Datei
        //  gr: Die Schriftgr��e, die entfernt werden soll
        __declspec( dllexport ) void l�scheSchrifrGr��e( int gr );
        // L�scht einen Buchstaben aus einer Schriftgr��e
        //  gr: Die Schriftgr��e, aus der der Buchstabe entfernt werden soll
        //  zeichen: Der ASCII code des Zeichens, welches gel�scht werden soll
        __declspec( dllexport ) void l�scheBuchstabe( int gr, unsigned char zeichen );
        // L�scht die LTDS Datei
        __declspec( dllexport ) void l�scheDatei();
        // Erstellt die LTDS Datei
        __declspec( dllexport ) void erstelleDatei();
        // Speichert eine gesammte Schrift in der Datei
        //  schrift: Die schrift, die gespeichert werden soll
        __declspec( dllexport ) void speicherSchrift( Schrift *schrift );
        // L�dt die gesammte Schrift aus der Datei
        //  return: Die geladene Schrift. 0, falls ein Fehler beim Laden aufgetreten ist
        __declspec( dllexport ) Schrift *ladeSchrift();
        // L�dt eine einzelne Schriftgr��e aus der Datei
        //  schriftgr��e: Die zu ladende Schriftgr��e
        //  return: Ein Alphabet mit den Zeichen in der Schriftgr��e. 0, falls die Schriftgr��e nicht gefunden wurde
        __declspec( dllexport ) Alphabet *ladeAlphabet( int schriftgr��e );
        // L�dt ein bestimmtes Zeichen einer bestimmten Schriftgr��e
        //  schriftgr��e: Die Schriftgr��e, zu dem das Zeichen geh�rt
        //  zeichen: Der ASCII code des zu ladenden Zeichens
        //  return: Der geladene Buchstabe. 0, falls das Zeichen nicht gefunden wurde.
        __declspec( dllexport ) Buchstabe *ladeBuchstabe( int schriftgr��e, unsigned char zeichen );
        // Gibt den Pfad zur LTDS Datei zur�ck
        __declspec( dllexport ) Text *getPfad() const;
        // Gibt die Anzahl der gespeicherten Schriftgr��en zur�ck
        __declspec( dllexport ) int getAnzahlSchriftgr��en() const;
        // Gibt einen Array mit den gespeicherten Schriftgr��en zur�ck
        // Der Array sollte nicht ver�ndert werden
        __declspec( dllexport ) unsigned char *getSchriftGr��en() const;
        // Gibt die Anzahl an gespeicherten Zeichen in einer Schriftgr��e zur�ck
        //  sg: Die Schriftgr��e, von der die Anzahl der ZEichen ermittelt werden soll
        //  return: Die Anzahl der Zeichen.
        __declspec( dllexport ) unsigned char getAnzahlBuchstaben( int sg );
        // Gibt einen Array mit Buchstaben einer bestimmten Schriftgr��e zur�ck
        //  sg: Die Schriftgr��e
        //  return: Der Array mit den ASCII codes der Zeichen. 0, falls die Schriftgr��e nicht gefunden wurde.
        __declspec( dllexport ) unsigned char *getBuchstaben( int sg );
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) LTDSDatei *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) LTDSDatei *release();
    };
#endif
    // Bit Funktionen 

    // gibt 1-bits in gewinschter anzahl zur�ck.
    //  a: Die Anzahl der Bits, die 1 sein sollen
    //  return: 32 Bits, wobei die einser Bits von rechts beginnen
    __declspec( dllexport ) int Bits( int a );
    // Gibt zur�ck, wie viele Bits ben�tigt werden um eine Zahl darzustellen
    //  c: Die Zahl, die dargestellt werden soll
    //  return: Die Anzahl der ben�tigten Bits
    __declspec( dllexport ) int getBits( char c );
}
#endif