Bild.h 29 KB

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