Schrift.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. #ifndef Schrift_H
  2. #define Schrift_H
  3. #include "Critical.h"
  4. #include "Punkt.h"
  5. #include "ReferenceCounter.h"
  6. #include <functional>
  7. namespace Framework
  8. {
  9. class Bild; //! Bild.h
  10. class Text; //! Text.h
  11. class Buchstabe; //! aus dieser Datei
  12. class Alphabet; //! aus dieser Datei
  13. class Schrift; //! aus dieser Datei
  14. //! Speichert die Alphawerte eines Zeichens einer bestimmten Schrift
  15. //! Die anderen Farbwerte werden durch die Schriftfarbe bestimmt. Daher nur die Alpha werte.
  16. class Buchstabe : public virtual ReferenceCounter
  17. {
  18. private:
  19. Punkt size;
  20. unsigned char *alpha;
  21. int schriftSize;
  22. public:
  23. //! Erstellt ein neues leeres Zeichnung
  24. DLLEXPORT Buchstabe();
  25. //! Löscht das Zeichnung
  26. DLLEXPORT ~Buchstabe();
  27. //! Erstellt einen neuen Buchstaben mit bestimmter Größe
  28. //! \param size Die Größe des Buchstabens in Pixel
  29. DLLEXPORT void NeuBuchstabe( Punkt &size );
  30. //! Setzt den Alphawert eines bestimmten Pixels
  31. //! \param pos Die position des Pixels
  32. //! \param alpha Der Wert des Pixels
  33. DLLEXPORT void setPixel( Punkt &pos, unsigned char alpha );
  34. //! Setzt den Alphawert eines bestimmten Pixels
  35. //! \param x die x Position des Pixels
  36. //! \param y die y Position des Pixels
  37. //! \param alpha Der Wert des Pixels
  38. DLLEXPORT void setPixel( int x, int y, unsigned char alpha );
  39. //! Setzt den Alphawert eines bestimmten Pixels
  40. //! \param i der Index des Pixels. Er berechnet sich durch x + y * breite und geht von 0 bis breite * höhe - 1
  41. //! \param alpha Der Wert des Pixels
  42. DLLEXPORT void setPixel( int i, unsigned char alpha );
  43. //! Setzt die Schriftgröße, zu der der Buchstabe gehört
  44. //! \param sg Die Schriftgröße des Buchstabens.
  45. DLLEXPORT void setSchriftSize( int sg );
  46. //! Gibt die Schriftgröße zurück, zu der der Buchstabe gehört
  47. DLLEXPORT int getSchriftSize() const;
  48. //! Gibt die alpha Werte des Buchstabens als array zurück wobei die werte Zeilenweise hintereinander stehen
  49. DLLEXPORT unsigned char *getBuff() const;
  50. //! Gibt die Größe des Buchstabens in Pixeln nicht skalliert zurück.
  51. DLLEXPORT const Punkt &getSize() const;
  52. //! Gibt die Breite des Buchstabens in Pixeln zurück
  53. DLLEXPORT int getBreite() const;
  54. //! Gibt die Höhe des Buchstabens in Pixeln zurück
  55. DLLEXPORT int getHeight() const;
  56. };
  57. //! Speichert alle Buchstaben der selben Schriftgröße.
  58. //! Wird von der Schrift klasse verwendet
  59. class Alphabet : public virtual ReferenceCounter
  60. {
  61. private:
  62. Buchstabe **zeichen;
  63. int schriftSize;
  64. public:
  65. //! Erzeugt ein leeres Zeichnung
  66. DLLEXPORT Alphabet();
  67. //! Löscht ein Zeichnung
  68. DLLEXPORT ~Alphabet();
  69. //! Löscht alle gespeicherten Zeichen
  70. DLLEXPORT void NeuAlphabet();
  71. //! Fügt dem Alphabet einen Buchstaben hinzu
  72. //! Wenn der hinzugefügte Buchstabe bereits existiert wird er überschrieben
  73. //! \param i Der ASCII code des Buchstaben, der hinzugefügt werden soll
  74. //! \param buchstabe Der Buchstabe, der hinzugefügt wird
  75. DLLEXPORT void setBuchstabe( unsigned char i, Buchstabe *buchstabe );
  76. //! Setzt die Schriftgröße des Alphabets und die der gespeicherten buchstaben
  77. //! \param gr Die Schriftgröße des Alphabets
  78. DLLEXPORT void setSchriftSize( int gr );
  79. //! Gibt den gespeicherten Buchstaben zu einem bestimmten ASCII Zeichen zurück
  80. //! \param i Der ASCII code des Zeichens
  81. //! \return Ein Zeiger zu dem Buchstaben mit erhöhtem Reference Counter
  82. DLLEXPORT Buchstabe *getBuchstabe( unsigned char i ) const;
  83. //! Gibt den gespeicherten Buchstaben zu einem bestimmten ASCII Zeichen zurück
  84. //! \param i Der ASCII code des Zeichens
  85. //! \return Ein Zeiger zu dem Buchstaben ohne erhöhtem Reference Counter
  86. DLLEXPORT Buchstabe *zBuchstabe( unsigned char i ) const;
  87. //! Prüft, ob zu einem bestimmten ASCII code ein Zeichen vorhanden ist
  88. //! \param b Der zu prüfende ASCII code
  89. //! \return (true), wenn ein Zeichen zu dem Code gefunden wurde. (false) sonnst
  90. DLLEXPORT bool hatBuchstabe( unsigned char b ) const;
  91. //! Gibt die Schriftgröße zurück, deren Zeichen in diesem Alphabet gespeichert werden
  92. DLLEXPORT int getSchriftSize() const;
  93. };
  94. //! Specihert eine Liste von Alphabeten mit verschiedener Schriftgröße.
  95. //! Wird von der Schrift Klasse verwendet, um alle Zeichen der Schriftgröße nach sortiert zu speichern.
  96. class AlphabetArray
  97. {
  98. private:
  99. AlphabetArray *next;
  100. Alphabet *This;
  101. public:
  102. //! Erzeugt eine neue Liste
  103. DLLEXPORT AlphabetArray();
  104. //! Löscht eine Liste
  105. DLLEXPORT ~AlphabetArray();
  106. //! Fügt der Liste ein Alphabet hinzu
  107. //! Wenn bereits ein Alphabet mit der selben Schriftgröße existiert, wird das Alphabet nicht hinzugefügt
  108. //! \param alphabet Das Alphabet, welches hinzugefügt werden soll
  109. //! \return (true), wenn das Alphabet hinzugefügt wurde. (false) sonnst.
  110. DLLEXPORT bool addAlphabet( Alphabet *alphabet );
  111. //! Löscht ein Alphabet bestimmter Schriftgröße aus der Liste
  112. //! \param sg Die Schriftgröße des Alphabets, welches entfernt werden soll
  113. //! \return (true), wenn ein Alphabet entfernt wurde. (false) sonnst
  114. DLLEXPORT bool removeAlphabet( int sg );
  115. //! Setzt den Zeiger auf das nächste Element der Liste auf 0
  116. DLLEXPORT void setNext0();
  117. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  118. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  119. //! \return (0), fals kein passendes Alphabet gefunden wurde
  120. DLLEXPORT Alphabet *getAlphabet( unsigned char sg ) const;
  121. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  122. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  123. //! \return (0), fals kein passendes Alphabet gefunden wurde
  124. DLLEXPORT Alphabet *zAlphabet( unsigned char sg ) const;
  125. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  126. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge wie sie der Liste hinzugefügt wurden
  127. //! \param count Hier sollte 0 übergeben werden. Gibt an auf dem wievielten Element der Liste die Funktion aufgerufen wird.
  128. //! \return (0), fals kein passendes Alphabet gefunden wurde
  129. DLLEXPORT Alphabet *getAlphabetI( int index, int count ) const;
  130. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  131. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge wie sie der Liste hinzugefügt wurden
  132. //! \param count Hier sollte 0 übergeben werden. Gibt an auf dem wievielten Element der Liste die Funktion aufgerufen wird.
  133. //! \return (0), fals kein passendes Alphabet gefunden wurde
  134. DLLEXPORT Alphabet *zAlphabetI( int index, int count ) const;
  135. //! Gibt einen Zeiger auf das nächste Element der Liste zurück
  136. DLLEXPORT AlphabetArray *getNext() const;
  137. };
  138. //! Speichert alle Buchstaben einer Schrift in verschiedenen Schriftgrößen
  139. class Schrift : public virtual ReferenceCounter
  140. {
  141. private:
  142. unsigned char alphabetAnzahl;
  143. AlphabetArray *alphabet;
  144. public:
  145. //! Erzeugt eine leere Schrift
  146. DLLEXPORT Schrift();
  147. //! Löscht ein Zeichnung
  148. DLLEXPORT ~Schrift();
  149. //! Fügt der Schrift ein Alphabet hinzu. Sollte bereits ein Alphabet der selben Schriftgröße existieren, wird das Alphabet nicht hinzugefügt
  150. //! \param alphabet Das Alphabet, welches hinzugefügt werden soll
  151. //! \return (true), wenn das Alphabet hinzugefügt wurde. (false) sonnst
  152. DLLEXPORT bool addAlphabet( Alphabet *alphabet );
  153. //! Löscht ein bestimmtes Alphabet aus der Schrift
  154. //! \param sg Die Schriftgröße, deren Alphabet entfernt werden soll
  155. DLLEXPORT void removeAlphabet( int sg );
  156. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  157. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  158. //! \return (0), fals kein passendes Alphabet gefunden wurde
  159. DLLEXPORT Alphabet *getAlphabet( int sg ) const;
  160. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  161. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  162. //! \return (0), fals kein passendes Alphabet gefunden wurde
  163. DLLEXPORT Alphabet *zAlphabet( int sg ) const;
  164. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  165. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge wie sie der Liste hinzugefügt wurden
  166. //! \return (0), fals kein passendes Alphabet gefunden wurde
  167. DLLEXPORT Alphabet *getAlphabetI( int index ) const;
  168. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  169. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge wie sie der Liste hinzugefügt wurden
  170. //! \return (0), fals kein passendes Alphabet gefunden wurde
  171. DLLEXPORT Alphabet *zAlphabetI( int index ) const;
  172. //! Gibt zurück, wie viele Alphabete (und damit Schriftgrößen) in der Schrift enthalten sind
  173. DLLEXPORT unsigned char getAlphabetAnzahl() const;
  174. };
  175. class TextRenderer : public virtual ReferenceCounter
  176. {
  177. protected:
  178. Schrift *s;
  179. int schriftSize;
  180. int zeilenAbstand;
  181. int zeichenAbstand;
  182. public:
  183. DLLEXPORT TextRenderer();
  184. DLLEXPORT TextRenderer( Schrift *schrift );
  185. DLLEXPORT virtual ~TextRenderer();
  186. DLLEXPORT void setSchriftZ( Schrift *schrift );
  187. DLLEXPORT Schrift *getSchrift();
  188. DLLEXPORT Schrift *zSchrift();
  189. //! Setzt die Schriftgröße, in der gezeichnet werden soll. Die Schrift wählt automatisch das passende Alphabet zum Zeichnen
  190. //! \param sg Die Schriftgröße
  191. DLLEXPORT void setSchriftSize( int sg );
  192. //! Setzt den Zeilenabstand, der zum zeichnen verwendet werden soll
  193. //! \param za Der Zeilenabstand zum unteren Ende der darüber liegenden zeile in Pixeln
  194. DLLEXPORT void setZeilenAbstand( int za );
  195. //! Setzt den Zeichenabstand, der zum zeichnen verwendet werden soll
  196. //! \param za Der Zeichenabstand zum unteren Ende der darüber liegenden zeile in Pixeln
  197. DLLEXPORT void setZeichenAbstand( int za );
  198. //! Fügt Zeilenumbrüche in den Text ein, so dass er bei einer vorgegebenen Breite follständig angezeigt wird
  199. //! \param zText Der text, in den die Zeilenumbrüche eingefügt werden sollen
  200. //! \param maxBreite Die Breite in Pixeln auf der der Text follständig angezeigt werden soll
  201. DLLEXPORT virtual void textFormatieren( Text *zText, int maxBreite );
  202. //! Zeichnet einen Bestimmten Text mit Cursor und einfärbung auf ein Bild
  203. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
  204. //! \param x x position des ersten zeichens
  205. //! \param y y position des ersten zeichens
  206. //! \param txt Der Text, der gezeichnet werden soll
  207. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  208. //! \param cpos Die position des Cursors im Text
  209. //! \param cf Die Farbe des Cursors
  210. //! \param fbeg Die Position des Zeichens im Text, wo die Einfärbung beginnen soll. Der Text wird von dort bis zur Cursorposition eingefärbt
  211. //! \param ff Die Hintergrund Farbe des eingefärbten Textes
  212. //! \param f Eine Funktion die für jeden Buchstaben aufgerufen wird und seine Farbe zurückgibt
  213. DLLEXPORT virtual void renderText( int x, int y, const char *txt, Bild &zRObj, std::function< int( int, int, int ) > f, int cpos = -1, int cf = 0, int fbeg = -1, int ff = 0 );
  214. //! Zeichnet einen Bestimmten Text mit Cursor und einfärbung auf ein Bild
  215. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
  216. //! \param x x position des ersten zeichens
  217. //! \param y y position des ersten zeichens
  218. //! \param txt Der Text, der gezeichnet werden soll
  219. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  220. //! \param cpos Die position des Cursors im Text
  221. //! \param cf Die Farbe des Cursors
  222. //! \param fbeg Die Position des Zeichens im Text, wo die Einfärbung beginnen soll. Der Text wird von dort bis zur Cursorposition eingefärbt
  223. //! \param ff Die Hintergrund Farbe des eingefärbten Textes
  224. //! \param f Die Farbe, in der der Text gezeichnet werden soll
  225. DLLEXPORT virtual void renderText( int x, int y, const char *txt, Bild &zRObj, int f, int cpos = -1, int cf = 0, int fbeg = -1, int ff = 0 );
  226. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  227. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
  228. //! \param x x position des ersten zeichens
  229. //! \param y y position des ersten zeichens
  230. //! \param txt Der Text, der gezeichnet werden soll
  231. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  232. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  233. //! \param underlined 1, falls der Text unterstrichen sein soll
  234. //! \param selected 1, falls das zeichen eingefärbt sein soll
  235. //! \param selectedBackgroundColor Die Hintergrund Farbe des eingefärbten Textes
  236. DLLEXPORT virtual void renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined = 0, bool selected = 0, int selectedBackgroundColor = 0 );
  237. //! Gibt die Schriftgröße zurück, die zum Zeichnen verwendet wird
  238. DLLEXPORT int getSchriftSize() const;
  239. //! Gibt den Abstand in Pixeln zum unteren Ende der darüber ligenden Zeile zurück
  240. DLLEXPORT int getZeilenabstand() const;
  241. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
  242. //! \param txt Der Text, von dem die Breite in Pixeln ermitelt werden soll
  243. DLLEXPORT virtual int getTextBreite( const char *txt ) const;
  244. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
  245. //! \param txt Der Text, von dem die Höhe in Pixeln ermitelt werden soll
  246. DLLEXPORT virtual int getTextHeight( const char *txt ) const;
  247. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Buchstaben vollständig darzustellen
  248. //! \param c Der Buchstabe, von dem die Breite in Pixeln ermitelt werden soll
  249. DLLEXPORT virtual int getCharWidth( const char c ) const;
  250. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
  251. //! \param c Der Buchstabe, von dem die Höhe in Pixeln ermitelt werden soll
  252. DLLEXPORT virtual int getCharHeight( const char c ) const;
  253. //! Gibt den Abstand in Pixeln zum unteren Ende der darüber ligenden Zeile zurück
  254. DLLEXPORT int getZeilenAbstand() const;
  255. //! Gibt den Abstand in Pixeln zum zwischen zwei zeichen auf der x Achse zurück
  256. DLLEXPORT int getZeichenAbstand() const;
  257. //! Gibt die skallierte Höhe zurück, die eine gezeichnete Zeile in Pixeln benötigt
  258. DLLEXPORT int getZeilenHeight() const;
  259. //! Ermittelt das Zeichen im Text, auf das die Maus zeigt
  260. //! \param zTxt Der Text, auf den die Maus Zeigt
  261. //! \param mausX Die X Position der Maus in Pixeln Relativ zur Position des ersten Zeichens
  262. //! \param mausY Die Y Position der Maus in Pixeln Relativ zur Position des ersten Zeichens
  263. DLLEXPORT virtual int textPos( const char *txt, int mausX, int mausY ) const;
  264. };
  265. class GravurTextRenderer : public TextRenderer
  266. {
  267. public:
  268. DLLEXPORT GravurTextRenderer();
  269. DLLEXPORT GravurTextRenderer( Schrift *schrift );
  270. DLLEXPORT virtual ~GravurTextRenderer();
  271. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  272. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
  273. //! \param x x position des ersten zeichens
  274. //! \param y y position des ersten zeichens
  275. //! \param txt Der Text, der gezeichnet werden soll
  276. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  277. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  278. //! \param underlined 1, falls der Text unterstrichen sein soll
  279. //! \param selected 1, falls das zeichen eingefärbt sein soll
  280. //! \param selectedBackgroundColor Die Hintergrund Farbe des eingefärbten Textes
  281. DLLEXPORT virtual void renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined = 0, bool selected = 0, int selectedBackgroundColor = 0 );
  282. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Buchstaben vollständig darzustellen
  283. //! \param c Der Buchstabe, von dem die Breite in Pixeln ermitelt werden soll
  284. DLLEXPORT virtual int getCharWidth( const char c ) const;
  285. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
  286. //! \param c Der Buchstabe, von dem die Höhe in Pixeln ermitelt werden soll
  287. DLLEXPORT virtual int getCharHeight( const char c ) const;
  288. };
  289. class KursivTextRenderer : public TextRenderer
  290. {
  291. public:
  292. DLLEXPORT KursivTextRenderer();
  293. DLLEXPORT KursivTextRenderer( Schrift *schrift );
  294. DLLEXPORT virtual ~KursivTextRenderer();
  295. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  296. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
  297. //! \param x x position des ersten zeichens
  298. //! \param y y position des ersten zeichens
  299. //! \param txt Der Text, der gezeichnet werden soll
  300. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  301. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  302. //! \param underlined 1, falls der Text unterstrichen sein soll
  303. //! \param selected 1, falls das zeichen eingefärbt sein soll
  304. //! \param selectedBackgroundColor Die Hintergrund Farbe des eingefärbten Textes
  305. DLLEXPORT virtual void renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined = 0, bool selected = 0, int selectedBackgroundColor = 0 );
  306. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Buchstaben vollständig darzustellen
  307. //! \param c Der Buchstabe, von dem die Breite in Pixeln ermitelt werden soll
  308. DLLEXPORT virtual int getCharWidth( const char c ) const;
  309. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
  310. //! \param c Der Buchstabe, von dem die Höhe in Pixeln ermitelt werden soll
  311. DLLEXPORT virtual int getCharHeight( const char c ) const;
  312. };
  313. }
  314. #endif