Bild.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #ifndef Bild_H
  2. #define Bild_H
  3. #include "Array.h"
  4. #include "Zeichnung.h"
  5. #include "Punkt.h"
  6. namespace Framework
  7. {
  8. class Bild; //! aus dieser Datei
  9. #ifdef WIN32
  10. class VScrollBar; //! Scroll.h
  11. class HScrollBar; //! Scroll.h
  12. class Rahmen; //! Rahmen.h
  13. struct MausEreignis; //! Mausereignis.h
  14. class Text; //! Text.h
  15. #endif
  16. //! Verwaltet ein Bild als Array von Pixel Farben im A8R8G8B8 Format, in den gezeichnet werden kann
  17. class Bild : public virtual ReferenceCounter
  18. {
  19. private:
  20. int* fc;
  21. bool delFc;
  22. Punkt size;
  23. Punkt* drawOff;
  24. Punkt* dPosA;
  25. Punkt* dSizeA;
  26. int doa;
  27. unsigned char* alpha;
  28. int alphaAnzahl;
  29. bool rend;
  30. bool alpha3D;
  31. //! privat
  32. inline void alphaPixelP(int x, int y, int f);
  33. inline void alphaPixelP3D(int x, int y, int f);
  34. inline void alphaPixelP(int& fc, int f);
  35. inline void alphaPixelP3D(int& fc, int f);
  36. inline void alphaPixelAssozP(int& fc, int f);
  37. inline char getOutCode(Punkt p) const;
  38. void drawFlatDreieck(int y1, int y2, float m1, float b1, float m2, float b2, int farbe);
  39. void drawFlatDreieckTextur(int y1, int y2, double m1, double b1, double m2, double b2, double tx1, double ty1, double tx2, double ty2,
  40. double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild& textur);
  41. void drawFlatDreieckAlpha(int y1, int y2, float m1, float b1, float m2, float b2, int farbe);
  42. void drawFlatDreieckTexturAlpha(int y1, int y2, double m1, double b1, double m2, double b2, double tx1, double ty1, double tx2, double ty2,
  43. double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild& textur);
  44. void drawLinieHTextur(Vec2< double > p, double length, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild& textur);
  45. void drawLinieHTexturAlpha(Vec2< double > p, double length, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild& textur);
  46. public:
  47. //! Konstruktor
  48. //! \param options 1, wenn das Bild Buffer zum Zeichnen anlegen soll, wie zum Beispiel für temporäre Zeichnenflächen Begrenzungen und Transparenz Filter
  49. //! Verbraucht etwa 50 kb mehr Arbeitsspeicher pro Bild
  50. DLLEXPORT Bild(bool options = 0);
  51. //! Destruktor
  52. DLLEXPORT ~Bild();
  53. //! Prüft ob ein Rechteck vollständig oder teilweise in der Zeichen Fläche liegt.
  54. //! return 0, falls das Rechteck nicht in der Zeichenfläche liegt, 1 sonst
  55. DLLEXPORT bool isAreaDrawable(int x, int y, int width, int height);
  56. //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
  57. //! Das ist sinnvoll für die Verwendung im 3DBildschirm, wo das Gezeichnette Bild später mittels Alpha Blending angezeigt wird.
  58. //! Der Flag wird im 3DBildschirm automatisch gesetzt
  59. DLLEXPORT void setAlpha3D(bool erlaubt);
  60. //! Setzt die mindest Transparenz von allem was als nächstes gezeichnet wird, bis der zugehörige releaseAlpha() aufruf erfolgt.
  61. DLLEXPORT void setAlpha(unsigned char alpha);
  62. //! Entfernt die als letztes mit setAlpha() gesetzte Alpha grenze
  63. DLLEXPORT void releaseAlpha();
  64. //! Setzt einen Zeiger auf die Pixel, in die gezeichnet werden soll
  65. //! \param buffer Ein Array mit den A8R8G8B8 Farbwerten
  66. //! \param deleteBuffer 1, fals der Array vom Bild gelöscht werden soll
  67. //! \param breite Die Breite in Pixeln
  68. //! \param height Die Höhe in Pixeln
  69. DLLEXPORT void setPixelBuffer(int* buffer, bool deleteBuffer, int breite, int height);
  70. //! Erstellt ein neues Bild
  71. //! \param breite Die Breite des Bildes in Pixeln
  72. //! \param höhe Die Höhe des Bildes in Pixeln
  73. //! \param fillColor Die startfarbe, auf die alle Pixel gesetzt werden
  74. DLLEXPORT void neuBild(int breite, int height, int fillColor);
  75. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  76. //! Beachtet nicht die begrenzung der Zeichnenfläche und das Skroll Offset
  77. //! \param x Die X Koordinate des Pixels
  78. //! \param y Die Y Koordinate des Pixels
  79. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  80. DLLEXPORT void alphaPixel2D(int x, int y, int f);
  81. DLLEXPORT void alphaPixel3D(int x, int y, int f);
  82. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  83. //! Beachtet nicht die begrenzung der Zeichnenfläche und das Skroll Offset
  84. //! \param i Der Index des Pixels im Pixel Array
  85. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  86. DLLEXPORT void alphaPixel2D(int i, int f);
  87. DLLEXPORT void alphaPixel3D(int i, int f);
  88. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  89. //! \param x Die X Koordinate des Pixels
  90. //! \param y Die Y Koordinate des Pixels
  91. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  92. DLLEXPORT void alphaPixelDP2D(int x, int y, int f);
  93. DLLEXPORT void alphaPixelDP3D(int x, int y, int f);
  94. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  95. //! \param i Der Index des Pixels im Pixel Array
  96. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  97. DLLEXPORT void alphaPixelDP2D(int i, int f);
  98. DLLEXPORT void alphaPixelDP3D(int i, int f);
  99. //! Setzt die Farbe eines besimmten Pixels
  100. //! \param x Die X Koordinate des Pixels
  101. //! \param y Die Y Koordinate des Pixels
  102. //! \param f Die neue Farbe in A8R8G8B8 Format
  103. DLLEXPORT void setPixelDP(int x, int y, int f);
  104. //! Setzt die Farbe eines besimmten Pixels
  105. //! \param i Der Index des Pixels im Pixel Array
  106. //! \param f Die neue Farbe in A8R8G8B8 Format
  107. DLLEXPORT void setPixelDP(int i, int f);
  108. //! Setzt die Farbe aller Pixel des Bildes
  109. //! \param f Die neue Farbe
  110. DLLEXPORT void setFarbe(int f);
  111. //! Setzt die Farben aller Pixel in einem Rechteck
  112. //! \param x Die X Koordinate
  113. //! \param y Die Y Koordinate
  114. //! \param b Die Breite des Rechtecks
  115. //! \param h Die Höhe des Rechtecks
  116. //! \param fc Die Farbe im A8R8G8B8 Format
  117. DLLEXPORT void fillRegion(int x, int y, int b, int h, int fc);
  118. //! Blendet eine Farbe mit Alphablending in einem Rechteck
  119. //! \param x Die X Koordinate
  120. //! \param y Die Y Koordinate
  121. //! \param b Die Breite des Rechtecks
  122. //! \param h Die Höhe des Rechtecks
  123. //! \param fc Die Farbe im A8R8G8B8 Format
  124. DLLEXPORT void alphaRegion(int x, int y, int b, int h, int fc);
  125. //! Zeichnet eine horizontale Linie
  126. //! \param x Die X Koordinate des Startpunktes der Linie
  127. //! \param y Die Y Koordinate des Startpunktes der Linie
  128. //! \param length Die Länge der Linie
  129. //! \param fc Die Farbe im A8R8G8B8 Format
  130. DLLEXPORT void drawLinieH(int x, int y, int length, int fc);
  131. //! Zeichnet eine vertikale Linie
  132. //! \param x Die X Koordinate des Startpunktes der Linie
  133. //! \param y Die Y Koordinate des Startpunktes der Linie
  134. //! \param length Die Länge der Linie
  135. //! \param fc Die Farbe im A8R8G8B8 Format
  136. DLLEXPORT void drawLinieV(int x, int y, int length, int fc);
  137. //! Zeichnet eine horizontale Linie mit Alpha blending
  138. //! \param x Die X Koordinate des Startpunktes der Linie
  139. //! \param y Die Y Koordinate des Startpunktes der Linie
  140. //! \param length Die Länge der Linie
  141. //! \param fc Die Farbe im A8R8G8B8 Format
  142. DLLEXPORT void drawLinieHAlpha(int x, int y, int length, int fc);
  143. //! Zeichnet eine vertikale Linie mit Alpha Blending
  144. //! \param x Die X Koordinate des Startpunktes der Linie
  145. //! \param y Die Y Koordinate des Startpunktes der Linie
  146. //! \param length Die Länge der Linie
  147. //! \param fc Die Farbe im A8R8G8B8 Format
  148. DLLEXPORT void drawLinieVAlpha(int x, int y, int length, int fc);
  149. //! Zeichnet eine Linie
  150. //! \param a Der Startpunkt der Linie
  151. //! \param b der Endpunkt der Linie
  152. //! \param fc Die Farbe im A8R8G8B8 Format
  153. DLLEXPORT void drawLinieBordered(Punkt a, Punkt b, int bc, int fc);
  154. //! Zeichnet eine Linie
  155. //! \param a Der Startpunkt der Linie
  156. //! \param b der Endpunkt der Linie
  157. //! \param fc Die Farbe im A8R8G8B8 Format
  158. DLLEXPORT void drawLinieBorderedAlpha(Punkt a, Punkt b, int bc, int fc);
  159. //! Zeichnet eine Linie
  160. //! \param a Der Startpunkt der Linie
  161. //! \param b der Endpunkt der Linie
  162. //! \param fc Die Farbe im A8R8G8B8 Format
  163. DLLEXPORT void drawLinie(Punkt a, Punkt b, int fc);
  164. //! Zeichnet eine Linie mit Alpha Blending
  165. //! \param a Der Startpunkt der Linie
  166. //! \param b der Endpunkt der Linie
  167. //! \param fc Die Farbe im A8R8G8B8 Format
  168. DLLEXPORT void drawLinieAlpha(Punkt a, Punkt b, int fc);
  169. //! Füllt einen Kreis mit einer Farbe. (Unfertig)
  170. //! \param xOff Die X Koordinate des Kreismittelpunktes
  171. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  172. //! \param r Der Radius des Kreises in Pixeln
  173. //! \param fc Die Farbe im A8R8G8B8 Format
  174. DLLEXPORT void fillCircle(int xOff, int yOff, int r, int fc);
  175. //! Zeichnet den Umriss eines Kreises
  176. //! \param xOff Die X Koordinate des Kreismittelpunktes
  177. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  178. //! \param r Der Radius des Kreises in Pixeln
  179. //! \param fc Die Farbe im A8R8G8B8 Format
  180. DLLEXPORT void drawKreis(int xOff, int yOff, int r, int fc);
  181. //! Zeichnet den Umriss eines Kreises mit Alpha Blending
  182. //! \param xOff Die X Koordinate des Kreismittelpunktes
  183. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  184. //! \param r Der Radius des Kreises in Pixeln
  185. //! \param fc Die Farbe im A8R8G8B8 Format
  186. DLLEXPORT void drawKreisAlpha(int xOff, int yOff, int r, int fc);
  187. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung
  188. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  189. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  190. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  191. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  192. //! \param zBild Das Bild, was gezeichnet werden soll
  193. DLLEXPORT void drawBild(int x, int y, int br, int hi, Bild& zBild);
  194. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha blending
  195. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  196. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  197. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  198. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  199. //! \param zBild Das Bild, was gezeichnet werden soll
  200. DLLEXPORT void alphaBild(int x, int y, int br, int hi, Bild& zBild);
  201. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha blending
  202. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  203. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  204. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  205. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  206. //! \param zBild Das Bild, was gezeichnet werden soll
  207. DLLEXPORT void alphaBildAssoz(int x, int y, int br, int hi, Bild& zBild);
  208. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
  209. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  210. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  211. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  212. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  213. //! \param zBild Das Bild, was gezeichnet werden soll
  214. DLLEXPORT void drawBild90(int x, int y, int br, int hi, Bild& zBild);
  215. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
  216. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  217. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  218. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  219. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  220. //! \param zBild Das Bild, was gezeichnet werden soll
  221. DLLEXPORT void alphaBild90(int x, int y, int br, int hi, Bild& zBild);
  222. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
  223. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  224. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  225. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  226. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  227. //! \param zBild Das Bild, was gezeichnet werden soll
  228. DLLEXPORT void drawBild180(int x, int y, int br, int hi, Bild& zBild);
  229. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
  230. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  231. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  232. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  233. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  234. //! \param zBild Das Bild, was gezeichnet werden soll
  235. DLLEXPORT void alphaBild180(int x, int y, int br, int hi, Bild& zBild);
  236. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
  237. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  238. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  239. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  240. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  241. //! \param zBild Das Bild, was gezeichnet werden soll
  242. DLLEXPORT void drawBild270(int x, int y, int br, int hi, Bild& zBild);
  243. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
  244. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  245. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  246. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  247. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  248. //! \param zBild Das Bild, was gezeichnet werden soll
  249. DLLEXPORT void alphaBild270(int x, int y, int br, int hi, Bild& zBild);
  250. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung
  251. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  252. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  253. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  254. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  255. //! \param zBild Das Bild, was gezeichnet werden soll
  256. DLLEXPORT void drawBildSkall(int x, int y, int br, int hi, Bild& zBild);
  257. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung mit Alpha Blending
  258. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  259. //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
  260. //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
  261. //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
  262. //! \param zBild Das Bild, was gezeichnet werden soll
  263. DLLEXPORT void alphaBildSkall(int x, int y, int br, int hi, Bild& zBild);
  264. //! Füllt ein Dreieck mit einer bestimmten Farbe
  265. //! \param a Eine Ecke des Dreiecks
  266. //! \param b Eine Ecke des Dreiecks
  267. //! \param c Eine Ecke des Dreiecks
  268. //! \param farbe die Farbe im A8R8G8B8 Format
  269. DLLEXPORT void drawDreieck(Punkt a, Punkt b, Punkt c, int farbe);
  270. //! Füllt ein Dreieck mit einer bestimmten Textur
  271. //! \param a Eine Ecke des Dreiecks
  272. //! \param b Eine Ecke des Dreiecks
  273. //! \param c Eine Ecke des Dreiecks
  274. //! \param ta Die Koordinaten von a in der Textur
  275. //! \param tb Die Koordinaten von b in der Textur
  276. //! \param tc Die Koordinaten von c in der Textur
  277. //! \param textur Das Bild, was als Textur verwendet werden soll
  278. DLLEXPORT void drawDreieckTextur(Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild& textur);
  279. //! Füllt ein Dreieck mit einer bestimmten Farbe mit alpha blending
  280. //! \param a Eine Ecke des Dreiecks
  281. //! \param b Eine Ecke des Dreiecks
  282. //! \param c Eine Ecke des Dreiecks
  283. //! \param farbe die Farbe im A8R8G8B8 Format
  284. DLLEXPORT void drawDreieckAlpha(Punkt a, Punkt b, Punkt c, int farbe);
  285. //! Füllt ein Dreieck mit einer bestimmten Textur mit alpha blending
  286. //! \param a Eine Ecke des Dreiecks
  287. //! \param b Eine Ecke des Dreiecks
  288. //! \param c Eine Ecke des Dreiecks
  289. //! \param ta Die Koordinaten von a in der Textur
  290. //! \param tb Die Koordinaten von b in der Textur
  291. //! \param tc Die Koordinaten von c in der Textur
  292. //! \param textur Das Bild, was als Textur verwendet werden soll
  293. DLLEXPORT void drawDreieckTexturAlpha(Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild& textur);
  294. //! Ersetzt eine bestimmte Farbe durch Transparenz
  295. DLLEXPORT void replaceColorWithAlpha(int color);
  296. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
  297. //! Wenn die Zeichenfläche über den Rand einer bestehenden Zeichenfläche hinausragt, wird sie automatisch auf die bestehende Zeichnenfläche beschnitten.
  298. //! \param pos Die Koordinaten der linken oberen Ecke der Zeichenfläche
  299. //! \param gr Die Größe der Zeichenfläche
  300. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb der bestehenden Zeichenfläche ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
  301. DLLEXPORT bool setDrawOptions(const Punkt& pos, const Punkt& gr);
  302. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
  303. //! Wenn die Zeichenfläche über den Rand einer bestehenden Zeichenfläche hinausragt, wird sie automatisch auf die bestehende Zeichnenfläche beschnitten.
  304. //! \param x Die X Koordinate der linken oberen Ecke der Zeichenfläche
  305. //! \param y Die X Koordinate der linken oberen Ecke der Zeichenfläche
  306. //! \param br Die Breite der Zeichenfläche
  307. //! \param hi Die Höhe der Zeichenfläche
  308. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb der bestehenden Zeichenfläche ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
  309. DLLEXPORT bool setDrawOptions(int x, int y, int br, int hi);
  310. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
  311. //! Wenn die Zeichenfläche darf über den Rand einer bestehenden Zeichenfläche hinausragen
  312. //! \param pos Die Koordinaten der linken oberen Ecke der Zeichenfläche
  313. //! \param gr Die Größe der Zeichenfläche
  314. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
  315. DLLEXPORT bool setDrawOptionsErzwingen(const Punkt& pos, const Punkt& gr);
  316. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
  317. //! Wenn die Zeichenfläche darf über den Rand einer bestehenden Zeichenfläche hinausragen
  318. //! \param x Die X Koordinate der linken oberen Ecke der Zeichenfläche
  319. //! \param y Die X Koordinate der linken oberen Ecke der Zeichenfläche
  320. //! \param br Die Breite der Zeichenfläche
  321. //! \param hi Die Höhe der Zeichenfläche
  322. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
  323. DLLEXPORT bool setDrawOptionsErzwingen(int x, int y, int br, int hi);
  324. //! Setzt neue Draw options auf bildgröße
  325. DLLEXPORT void setDrawOptionsReset();
  326. //! Setzt Koordinaten, die bei den Zeichenfunktionen von den Positionen abgezogen werden
  327. //! Vorher sollte eine Zeichenfläche mit SetDrawOptions gesetzt worden sein. Die Werte werden mit dem aufruf von releaseDrawOptions() wieder zurückgesetzt.
  328. //! \param xOff Ein Wert, der von allen X Koordinaten abgezogen wird
  329. //! \param yOff Ein Wert, der von allen Y Koordinaten abgezogen wird
  330. DLLEXPORT void addScrollOffset(int xOff, int yOff);
  331. //! Entfernt die als letztes gesetzte begrenzung der Zeichenfläche und alle seit dem gesetzten Scroll Offsets
  332. //! Stellt die vorherige Zeichenfläche und die zugehörigen Scroll Offsets wieder her
  333. DLLEXPORT void releaseDrawOptions();
  334. //! Gibt zurück, ob sich das Bild seit dem letzten Aufruf dieser Funktion verändert hat
  335. DLLEXPORT bool getRend();
  336. //! Gibt den Array mit A8R8G8B8 Farbwerten der Pixel zurück
  337. //! Der Index eines Pixels berechnet sich durch x + y * Bildbreite
  338. DLLEXPORT int* getBuffer() const;
  339. //! Gibt den A8R8G8B8 Farbwert eines Pixels zurück
  340. //! \param x Die X Koordinate des Pixels
  341. //! \param y Die Y Koordinate des Pixels
  342. DLLEXPORT int getPixel(int x, int y) const;
  343. //! Gibt die Größe des Bildes zurück
  344. DLLEXPORT const Punkt& getSize() const;
  345. //! Gibt die Breite des Bildes zurück
  346. DLLEXPORT int getBreite() const;
  347. //! Gibt die Höhe des Bildes zurück
  348. DLLEXPORT int getHeight() const;
  349. //! Gibt den aktuellen mindest Transparenz Wert zurück
  350. DLLEXPORT unsigned char getAlpha() const;
  351. //! Gibt die Koordinaten der linken oberen Ecke der aktuellen Zeichenfläche zurück
  352. DLLEXPORT const Punkt& getDrawPos() const;
  353. //! Gibt die Größe der aktuelen Zeichenfläche zurück
  354. DLLEXPORT const Punkt& getDrawGr() const;
  355. //! Gibt die Koordinaten zurück, die zu allen Positionen vor dem Zeichnen hinzugefügt werden
  356. DLLEXPORT const Punkt& getDrawOff() const;
  357. //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
  358. //! Das ist sinnvoll für die Verwendung im 3DBildschirm, wo das Gezeichnette Bild später mittels Alpha Blending angezeigt wird.
  359. //! Der Flag wird im 3DBildschirm automatisch gesetzt
  360. DLLEXPORT bool hasAlpha3D();
  361. };
  362. //! Eine Zeichnung des 2d GUI Frameworks, die ein Bild anzeigt.
  363. class BildZ : public ZeichnungHintergrund
  364. {
  365. public:
  366. class Style : public ZeichnungHintergrund::Style
  367. {
  368. public:
  369. const static __int64 Alpha = 0x1000; //! Wenn dieser Flag gesetzt ist, wird zum Zeichnen des Bildes Alpha Blending verwendet
  370. const static __int64 Skalliert = 0x2000; //! Wenn dieser Flag gesetzt ist, wird das Bild in die Zeichenfläche skalliert
  371. const static __int64 normal = HScroll | Sichtbar | Erlaubt | Rahmen | VScroll; //! Der Normale Style einer Bild Zeichnung Bestehend aus HScroll, Sichtbar, Erlaubt, Rahmen, VScroll
  372. };
  373. private:
  374. Bild* bild;
  375. protected:
  376. //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
  377. //! \param me Das Ereignis
  378. DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;
  379. public:
  380. //! Konstruktor
  381. DLLEXPORT BildZ();
  382. //! Destruktor
  383. DLLEXPORT virtual ~BildZ();
  384. //! Setzt einen Zeiger auf das Bild, was angezeigt werden soll
  385. //! \param b Das Bild
  386. DLLEXPORT void setBildZ(Bild* b);
  387. //! Setzt das Bild, was angezeigt werden soll. Der Inhalt des Bildes wird Kopiert
  388. //! \param b Das Bild
  389. DLLEXPORT void setBild(Bild* b);
  390. //! Updated den Zeichenhintergrund
  391. //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser Funktion verstrichen ist
  392. //! \return 1, wenn das Bild neu gezeichnet werden muss. 0 sonnst
  393. DLLEXPORT bool tick(double tickVal) override;
  394. //! Zeichnet die Zeihnung in ein bestimmtes Bild
  395. //! \param zRObj Das Bild, in das gezeichnet werden soll
  396. DLLEXPORT void render(Bild& zRObj) override;
  397. //! Gibt das angezeigte Bild zurück
  398. DLLEXPORT Bild* getBild() const;
  399. //! Gbt das angezeigte Bild ohne erhöhten Reference Counter zurück
  400. DLLEXPORT Bild* zBild() const;
  401. //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das Original verändert werden kann
  402. DLLEXPORT Zeichnung* dublizieren() const override;
  403. };
  404. #ifdef WIN32
  405. //! Lädt ein Bild aus einer .bmp, .jpg, .gif oder .png Datei
  406. //! \param pfad Der Pfad zur Bilddatei
  407. //! \param zError Ein Zeiger auf ein Text Objekt, in dem ein möglicher Fehler zurückgegeben wird
  408. //! \return Das geladene Bild
  409. DLLEXPORT Bild* ladeBild(const char* pfad, Text* zError);
  410. #endif
  411. }
  412. #endif