Schrift.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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. AlphabetArray* next;
  107. Alphabet* This;
  108. public:
  109. //! Erzeugt eine neue Liste
  110. DLLEXPORT AlphabetArray();
  111. //! Löscht eine Liste
  112. DLLEXPORT ~AlphabetArray();
  113. //! Fügt der Liste ein Alphabet hinzu
  114. //! Wenn bereits ein Alphabet mit der selben Schriftgröße existiert,
  115. //! wird das Alphabet nicht hinzugefügt \param alphabet Das Alphabet,
  116. //! welches hinzugefügt werden soll \return (true), wenn das Alphabet
  117. //! hinzugefügt wurde. (false) sonnst.
  118. DLLEXPORT bool addAlphabet(Alphabet* alphabet);
  119. //! Löscht ein Alphabet bestimmter Schriftgröße aus der Liste
  120. //! \param sg Die Schriftgröße des Alphabets, welches entfernt werden
  121. //! soll \return (true), wenn ein Alphabet entfernt wurde. (false)
  122. //! sonnst
  123. DLLEXPORT bool removeAlphabet(int sg);
  124. //! Setzt den Zeiger auf das nächste Element der Liste auf 0
  125. DLLEXPORT void setNext0();
  126. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  127. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  128. //! \return (0), fals kein passendes Alphabet gefunden wurde
  129. DLLEXPORT Alphabet* getAlphabet(unsigned char sg) const;
  130. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  131. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  132. //! \return (0), fals kein passendes Alphabet gefunden wurde
  133. DLLEXPORT Alphabet* zAlphabet(unsigned char sg) const;
  134. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  135. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge
  136. //! wie sie der Liste hinzugefügt wurden \param count Hier sollte 0
  137. //! übergeben werden. Gibt an auf dem wievielten Element der Liste die
  138. //! Funktion aufgerufen wird. \return (0), fals kein passendes Alphabet
  139. //! gefunden wurde
  140. DLLEXPORT Alphabet* getAlphabetI(int index, int count) const;
  141. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  142. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge
  143. //! wie sie der Liste hinzugefügt wurden \param count Hier sollte 0
  144. //! übergeben werden. Gibt an auf dem wievielten Element der Liste die
  145. //! Funktion aufgerufen wird. \return (0), fals kein passendes Alphabet
  146. //! gefunden wurde
  147. DLLEXPORT Alphabet* zAlphabetI(int index, int count) const;
  148. //! Gibt einen Zeiger auf das nächste Element der Liste zurück
  149. DLLEXPORT AlphabetArray* getNext() const;
  150. };
  151. //! Speichert alle Buchstaben einer Schrift in verschiedenen Schriftgrößen
  152. class Schrift : public virtual ReferenceCounter
  153. {
  154. private:
  155. unsigned char alphabetAnzahl;
  156. AlphabetArray* alphabet;
  157. public:
  158. //! Erzeugt eine leere Schrift
  159. DLLEXPORT Schrift();
  160. //! Löscht ein Zeichnung
  161. DLLEXPORT ~Schrift();
  162. //! Fügt der Schrift ein Alphabet hinzu. Sollte bereits ein Alphabet der
  163. //! selben Schriftgröße existieren, wird das Alphabet nicht hinzugefügt
  164. //! \param alphabet Das Alphabet, welches hinzugefügt werden soll
  165. //! \return (true), wenn das Alphabet hinzugefügt wurde. (false) sonnst
  166. DLLEXPORT bool addAlphabet(Alphabet* alphabet);
  167. //! Löscht ein bestimmtes Alphabet aus der Schrift
  168. //! \param sg Die Schriftgröße, deren Alphabet entfernt werden soll
  169. DLLEXPORT void removeAlphabet(int sg);
  170. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  171. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  172. //! \return (0), fals kein passendes Alphabet gefunden wurde
  173. DLLEXPORT Alphabet* getAlphabet(int sg) const;
  174. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  175. //! \param sg Die Schriftgröße, dessen Alphabet gesucht werden soll
  176. //! \return (0), fals kein passendes Alphabet gefunden wurde
  177. DLLEXPORT Alphabet* zAlphabet(int sg) const;
  178. //! Gibt ein bestimmtes Alphabet mit erhöhtem Reference Counter zurück
  179. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge
  180. //! wie sie der Liste hinzugefügt wurden \return (0), fals kein
  181. //! passendes Alphabet gefunden wurde
  182. DLLEXPORT Alphabet* getAlphabetI(int index) const;
  183. //! Gibt ein bestimmtes Alphabet ohne erhöhtem Reference Counter zurück
  184. //! \param index Der Index des gesuchten Alphabets in der Reihenfolge
  185. //! wie sie der Liste hinzugefügt wurden \return (0), fals kein
  186. //! passendes Alphabet gefunden wurde
  187. DLLEXPORT Alphabet* zAlphabetI(int index) const;
  188. //! Gibt zurück, wie viele Alphabete (und damit Schriftgrößen) in der
  189. //! Schrift enthalten sind
  190. DLLEXPORT unsigned char getAlphabetAnzahl() const;
  191. };
  192. class TextRenderer : public virtual ReferenceCounter
  193. {
  194. protected:
  195. Schrift* s;
  196. int schriftSize;
  197. int zeilenAbstand;
  198. int zeichenAbstand;
  199. public:
  200. DLLEXPORT TextRenderer();
  201. DLLEXPORT TextRenderer(Schrift* schrift);
  202. DLLEXPORT virtual ~TextRenderer();
  203. DLLEXPORT void setSchriftZ(Schrift* schrift);
  204. DLLEXPORT Schrift* getSchrift();
  205. DLLEXPORT Schrift* zSchrift();
  206. //! Setzt die Schriftgröße, in der gezeichnet werden soll. Die Schrift
  207. //! wählt automatisch das passende Alphabet zum Zeichnen \param sg Die
  208. //! Schriftgröße
  209. DLLEXPORT void setSchriftSize(int sg);
  210. //! Setzt den Zeilenabstand, der zum zeichnen verwendet werden soll
  211. //! \param za Der Zeilenabstand zum unteren Ende der darüber liegenden
  212. //! zeile in Pixeln
  213. DLLEXPORT void setZeilenAbstand(int za);
  214. //! Setzt den Zeichenabstand, der zum zeichnen verwendet werden soll
  215. //! \param za Der Zeichenabstand zum unteren Ende der darüber liegenden
  216. //! zeile in Pixeln
  217. DLLEXPORT void setZeichenAbstand(int za);
  218. //! Fügt Zeilenumbrüche in den Text ein, so dass er bei einer
  219. //! vorgegebenen Breite follständig angezeigt wird \param zText Der
  220. //! text, in den die Zeilenumbrüche eingefügt werden sollen \param
  221. //! maxBreite Die Breite in Pixeln auf der der Text follständig
  222. //! angezeigt werden soll
  223. DLLEXPORT virtual void textFormatieren(Text* zText, int maxBreite);
  224. //! Zeichnet einen Bestimmten Text mit Cursor und einfärbung auf ein
  225. //! Bild Nutze (setPosition) und (setDrawSchriftGröße) um die Position
  226. //! und die Größe zu verändern \param x x position des ersten zeichens
  227. //! \param y y position des ersten zeichens
  228. //! \param txt Der Text, der gezeichnet werden soll
  229. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  230. //! \param cpos Die position des Cursors im Text
  231. //! \param cf Die Farbe des Cursors
  232. //! \param fbeg Die Position des Zeichens im Text, wo die Einfärbung
  233. //! beginnen soll. Der Text wird von dort bis zur Cursorposition
  234. //! eingefärbt \param ff Die Hintergrund Farbe des eingefärbten Textes
  235. //! \param f Eine Funktion die für jeden Buchstaben aufgerufen wird und
  236. //! seine Farbe zurückgibt
  237. DLLEXPORT virtual void renderText(int x,
  238. int y,
  239. const char* txt,
  240. Bild& zRObj,
  241. std::function<int(int, int, int)> f,
  242. int cpos = -1,
  243. int cf = 0,
  244. int fbeg = -1,
  245. int ff = 0);
  246. //! Zeichnet einen Bestimmten Text mit Cursor und einfärbung auf ein
  247. //! Bild Nutze (setPosition) und (setDrawSchriftGröße) um die Position
  248. //! und die Größe zu verändern \param x x position des ersten zeichens
  249. //! \param y y position des ersten zeichens
  250. //! \param txt Der Text, der gezeichnet werden soll
  251. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  252. //! \param cpos Die position des Cursors im Text
  253. //! \param cf Die Farbe des Cursors
  254. //! \param fbeg Die Position des Zeichens im Text, wo die Einfärbung
  255. //! beginnen soll. Der Text wird von dort bis zur Cursorposition
  256. //! eingefärbt \param ff Die Hintergrund Farbe des eingefärbten Textes
  257. //! \param f Die Farbe, in der der Text gezeichnet werden soll
  258. DLLEXPORT virtual void renderText(int x,
  259. int y,
  260. const char* txt,
  261. Bild& zRObj,
  262. int f,
  263. int cpos = -1,
  264. int cf = 0,
  265. int fbeg = -1,
  266. int ff = 0);
  267. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  268. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und
  269. //! die Größe zu verändern \param x x position des ersten zeichens
  270. //! \param y y position des ersten zeichens
  271. //! \param txt Der Text, der gezeichnet werden soll
  272. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  273. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  274. //! \param underlined 1, falls der Text unterstrichen sein soll
  275. //! \param selected 1, falls das zeichen eingefärbt sein soll
  276. //! \param selectedBackgroundColor Die Hintergrund Farbe des
  277. //! eingefärbten Textes
  278. DLLEXPORT virtual void renderChar(int& x,
  279. int y,
  280. char c,
  281. Bild& zRObj,
  282. int color,
  283. bool underlined = 0,
  284. bool selected = 0,
  285. int selectedBackgroundColor = 0);
  286. //! Gibt die Schriftgröße zurück, die zum Zeichnen verwendet wird
  287. DLLEXPORT int getSchriftSize() const;
  288. //! Gibt den Abstand in Pixeln zum unteren Ende der darüber ligenden
  289. //! Zeile zurück
  290. DLLEXPORT int getZeilenabstand() const;
  291. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text
  292. //! vollständig darzustellen \param txt Der Text, von dem die Breite in
  293. //! Pixeln ermitelt werden soll
  294. DLLEXPORT virtual int getTextBreite(const char* txt) const;
  295. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text
  296. //! vollständig darzustellen \param txt Der Text, von dem die Höhe in
  297. //! Pixeln ermitelt werden soll
  298. DLLEXPORT virtual int getTextHeight(const char* txt) const;
  299. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten
  300. //! Buchstaben vollständig darzustellen \param c Der Buchstabe, von dem
  301. //! die Breite in Pixeln ermitelt werden soll
  302. DLLEXPORT virtual int getCharWidth(const char c) const;
  303. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text
  304. //! vollständig darzustellen \param c Der Buchstabe, von dem die Höhe in
  305. //! Pixeln ermitelt werden soll
  306. DLLEXPORT virtual int getCharHeight(const char c) const;
  307. //! Gibt den Abstand in Pixeln zum unteren Ende der darüber ligenden
  308. //! Zeile zurück
  309. DLLEXPORT int getZeilenAbstand() const;
  310. //! Gibt den Abstand in Pixeln zum zwischen zwei zeichen auf der x Achse
  311. //! zurück
  312. DLLEXPORT int getZeichenAbstand() const;
  313. //! Gibt die skallierte Höhe zurück, die eine gezeichnete Zeile in
  314. //! Pixeln benötigt
  315. DLLEXPORT int getZeilenHeight() const;
  316. //! Ermittelt das Zeichen im Text, auf das die Maus zeigt
  317. //! \param zTxt Der Text, auf den die Maus Zeigt
  318. //! \param mausX Die X Position der Maus in Pixeln Relativ zur Position
  319. //! des ersten Zeichens \param mausY Die Y Position der Maus in Pixeln
  320. //! Relativ zur Position des ersten Zeichens
  321. DLLEXPORT virtual int textPos(
  322. const char* txt, int mausX, int mausY) const;
  323. };
  324. class GravurTextRenderer : public TextRenderer
  325. {
  326. public:
  327. DLLEXPORT GravurTextRenderer();
  328. DLLEXPORT GravurTextRenderer(Schrift* schrift);
  329. DLLEXPORT virtual ~GravurTextRenderer();
  330. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  331. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und
  332. //! die Größe zu verändern \param x x position des ersten zeichens
  333. //! \param y y position des ersten zeichens
  334. //! \param txt Der Text, der gezeichnet werden soll
  335. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  336. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  337. //! \param underlined 1, falls der Text unterstrichen sein soll
  338. //! \param selected 1, falls das zeichen eingefärbt sein soll
  339. //! \param selectedBackgroundColor Die Hintergrund Farbe des
  340. //! eingefärbten Textes
  341. DLLEXPORT virtual void renderChar(int& x,
  342. int y,
  343. char c,
  344. Bild& zRObj,
  345. int color,
  346. bool underlined = 0,
  347. bool selected = 0,
  348. int selectedBackgroundColor = 0);
  349. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten
  350. //! Buchstaben vollständig darzustellen \param c Der Buchstabe, von dem
  351. //! die Breite in Pixeln ermitelt werden soll
  352. DLLEXPORT virtual int getCharWidth(const char c) const;
  353. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text
  354. //! vollständig darzustellen \param c Der Buchstabe, von dem die Höhe in
  355. //! Pixeln ermitelt werden soll
  356. DLLEXPORT virtual int getCharHeight(const char c) const;
  357. };
  358. class KursivTextRenderer : public TextRenderer
  359. {
  360. public:
  361. DLLEXPORT KursivTextRenderer();
  362. DLLEXPORT KursivTextRenderer(Schrift* schrift);
  363. DLLEXPORT virtual ~KursivTextRenderer();
  364. //! Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
  365. //! Nutze (setPosition) und (setDrawSchriftGröße) um die Position und
  366. //! die Größe zu verändern \param x x position des ersten zeichens
  367. //! \param y y position des ersten zeichens
  368. //! \param txt Der Text, der gezeichnet werden soll
  369. //! \param zRObj Das Bild, auf das gezeichnet werden soll
  370. //! \param color Die Farbe, in der der Text gezeichnet werden soll
  371. //! \param underlined 1, falls der Text unterstrichen sein soll
  372. //! \param selected 1, falls das zeichen eingefärbt sein soll
  373. //! \param selectedBackgroundColor Die Hintergrund Farbe des
  374. //! eingefärbten Textes
  375. DLLEXPORT virtual void renderChar(int& x,
  376. int y,
  377. char c,
  378. Bild& zRObj,
  379. int color,
  380. bool underlined = 0,
  381. bool selected = 0,
  382. int selectedBackgroundColor = 0);
  383. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten
  384. //! Buchstaben vollständig darzustellen \param c Der Buchstabe, von dem
  385. //! die Breite in Pixeln ermitelt werden soll
  386. DLLEXPORT virtual int getCharWidth(const char c) const;
  387. //! Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text
  388. //! vollständig darzustellen \param c Der Buchstabe, von dem die Höhe in
  389. //! Pixeln ermitelt werden soll
  390. DLLEXPORT virtual int getCharHeight(const char c) const;
  391. };
  392. } // namespace Framework
  393. #endif