Schrift.h 18 KB

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