Bild.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  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. const 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. const 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. const 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. const 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(
  249. int x, int y, int br, int hi, const Bild& zBild);
  250. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha
  251. //! blending \param x Die X Koordinate der linken oberen Ecke des
  252. //! Rechtecks in dem das Bild gezeichnet werden soll \param y Die Y
  253. //! Koordinate der linken oberen Ecke des Rechtecks in dem das Bild
  254. //! gezeichnet werden soll \param br Die Breite des Rechecks in dem das
  255. //! Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in dem
  256. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  257. //! gezeichnet werden soll
  258. DLLEXPORT void alphaBild(
  259. int x, int y, int br, int hi, const Bild& zBild);
  260. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha
  261. //! blending \param x Die X Koordinate der linken oberen Ecke des
  262. //! Rechtecks in dem das Bild gezeichnet werden soll \param y Die Y
  263. //! Koordinate der linken oberen Ecke des Rechtecks in dem das Bild
  264. //! gezeichnet werden soll \param br Die Breite des Rechecks in dem das
  265. //! Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in dem
  266. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  267. //! gezeichnet werden soll
  268. DLLEXPORT void alphaBildAssoz(
  269. int x, int y, int br, int hi, const Bild& zBild);
  270. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes
  271. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  272. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  273. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  274. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  275. //! das Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in
  276. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  277. //! gezeichnet werden soll
  278. DLLEXPORT void drawBild90(
  279. int x, int y, int br, int hi, const Bild& zBild);
  280. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes
  281. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  282. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  283. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  284. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  285. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  286. //! Die Höhe des Rechecks in dem das Bild gezeichnet werden soll \param
  287. //! zBild Das Bild, was gezeichnet werden soll
  288. DLLEXPORT void alphaBild90(
  289. int x, int y, int br, int hi, const Bild& zBild);
  290. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes
  291. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  292. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  293. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  294. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  295. //! das Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in
  296. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  297. //! gezeichnet werden soll
  298. DLLEXPORT void drawBild180(
  299. int x, int y, int br, int hi, const Bild& zBild);
  300. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes
  301. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  302. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  303. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  304. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  305. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  306. //! Die Höhe des Rechecks in dem das Bild gezeichnet werden soll \param
  307. //! zBild Das Bild, was gezeichnet werden soll
  308. DLLEXPORT void alphaBild180(
  309. int x, int y, int br, int hi, const Bild& zBild);
  310. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes
  311. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  312. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  313. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  314. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  315. //! das Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in
  316. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  317. //! gezeichnet werden soll
  318. DLLEXPORT void drawBild270(
  319. int x, int y, int br, int hi, const Bild& zBild);
  320. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes
  321. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  322. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  323. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  324. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  325. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  326. //! Die Höhe des Rechecks in dem das Bild gezeichnet werden soll \param
  327. //! zBild Das Bild, was gezeichnet werden soll
  328. DLLEXPORT void alphaBild270(
  329. int x, int y, int br, int hi, const Bild& zBild);
  330. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung
  331. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in
  332. //! dem das Bild gezeichnet werden soll \param y Die Y Koordinate der
  333. //! linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden
  334. //! soll \param br Die Breite des Rechecks in dem das Bild gezeichnet
  335. //! werden soll \param hi Die Höhe des Rechecks in dem das Bild
  336. //! gezeichnet werden soll \param zBild Das Bild, was gezeichnet werden
  337. //! soll
  338. DLLEXPORT void drawBildSkall(
  339. int x, int y, int br, int hi, const Bild& zBild);
  340. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung mit Alpha
  341. //! Blending \param x Die X Koordinate der linken oberen Ecke des
  342. //! Rechtecks in dem das Bild gezeichnet werden soll \param y Die Y
  343. //! Koordinate der linken oberen Ecke des Rechtecks in dem das Bild
  344. //! gezeichnet werden soll \param br Die Breite des Rechecks in dem das
  345. //! Bild gezeichnet werden soll \param hi Die Höhe des Rechecks in dem
  346. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  347. //! gezeichnet werden soll
  348. DLLEXPORT void alphaBildSkall(
  349. int x, int y, int br, int hi, const Bild& zBild);
  350. //! Füllt ein Dreieck mit einer bestimmten Farbe
  351. //! \param a Eine Ecke des Dreiecks
  352. //! \param b Eine Ecke des Dreiecks
  353. //! \param c Eine Ecke des Dreiecks
  354. //! \param farbe die Farbe im A8R8G8B8 Format
  355. DLLEXPORT void drawDreieck(Punkt a, Punkt b, Punkt c, int farbe);
  356. //! Füllt ein Dreieck mit einer bestimmten Textur
  357. //! \param a Eine Ecke des Dreiecks
  358. //! \param b Eine Ecke des Dreiecks
  359. //! \param c Eine Ecke des Dreiecks
  360. //! \param ta Die Koordinaten von a in der Textur
  361. //! \param tb Die Koordinaten von b in der Textur
  362. //! \param tc Die Koordinaten von c in der Textur
  363. //! \param textur Das Bild, was als Textur verwendet werden soll
  364. DLLEXPORT void drawDreieckTextur(Punkt a,
  365. Punkt b,
  366. Punkt c,
  367. Punkt ta,
  368. Punkt tb,
  369. Punkt tc,
  370. const Bild& textur);
  371. //! Füllt ein Dreieck mit einer bestimmten Farbe mit alpha blending
  372. //! \param a Eine Ecke des Dreiecks
  373. //! \param b Eine Ecke des Dreiecks
  374. //! \param c Eine Ecke des Dreiecks
  375. //! \param farbe die Farbe im A8R8G8B8 Format
  376. DLLEXPORT void drawDreieckAlpha(Punkt a, Punkt b, Punkt c, int farbe);
  377. //! Füllt ein Dreieck mit einer bestimmten Textur mit alpha blending
  378. //! \param a Eine Ecke des Dreiecks
  379. //! \param b Eine Ecke des Dreiecks
  380. //! \param c Eine Ecke des Dreiecks
  381. //! \param ta Die Koordinaten von a in der Textur
  382. //! \param tb Die Koordinaten von b in der Textur
  383. //! \param tc Die Koordinaten von c in der Textur
  384. //! \param textur Das Bild, was als Textur verwendet werden soll
  385. DLLEXPORT void drawDreieckTexturAlpha(Punkt a,
  386. Punkt b,
  387. Punkt c,
  388. Punkt ta,
  389. Punkt tb,
  390. Punkt tc,
  391. const Bild& textur);
  392. //! Ersetzt eine bestimmte Farbe durch Transparenz
  393. DLLEXPORT void replaceColorWithAlpha(int color);
  394. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von
  395. //! releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der
  396. //! Fläche wird automatisch ignoriert. Wenn die Zeichenfläche über den
  397. //! Rand einer bestehenden Zeichenfläche hinausragt, wird sie
  398. //! automatisch auf die bestehende Zeichnenfläche beschnitten. \param
  399. //! pos Die Koordinaten der linken oberen Ecke der Zeichenfläche \param
  400. //! gr Die Größe der Zeichenfläche \return 1, falls die neue
  401. //! Zeichenfläche ganz oder teilweise innerhalb der bestehenden
  402. //! Zeichenfläche ligt. Wenn 0 zurückgegeben wird, wurde die
  403. //! Zeichenfläche nicht gesetzt und es braucht nicht
  404. //! releaseDrawOptions() aufgerufen werden
  405. DLLEXPORT bool setDrawOptions(const Punkt& pos, const Punkt& gr);
  406. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von
  407. //! releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der
  408. //! Fläche wird automatisch ignoriert. Wenn die Zeichenfläche über den
  409. //! Rand einer bestehenden Zeichenfläche hinausragt, wird sie
  410. //! automatisch auf die bestehende Zeichnenfläche beschnitten. \param x
  411. //! Die X Koordinate der linken oberen Ecke der Zeichenfläche \param y
  412. //! Die X Koordinate der linken oberen Ecke der Zeichenfläche \param br
  413. //! Die Breite der Zeichenfläche \param hi Die Höhe der Zeichenfläche
  414. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise
  415. //! innerhalb der bestehenden Zeichenfläche ligt. Wenn 0 zurückgegeben
  416. //! wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht
  417. //! releaseDrawOptions() aufgerufen werden
  418. DLLEXPORT bool setDrawOptions(int x, int y, int br, int hi);
  419. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von
  420. //! releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der
  421. //! Fläche wird automatisch ignoriert. Wenn die Zeichenfläche darf über
  422. //! den Rand einer bestehenden Zeichenfläche hinausragen \param pos Die
  423. //! Koordinaten der linken oberen Ecke der Zeichenfläche \param gr Die
  424. //! Größe der Zeichenfläche \return 1, falls die neue Zeichenfläche ganz
  425. //! oder teilweise innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird,
  426. //! wurde die Zeichenfläche nicht gesetzt und es braucht nicht
  427. //! releaseDrawOptions() aufgerufen werden
  428. DLLEXPORT bool setDrawOptionsErzwingen(
  429. const Punkt& pos, const Punkt& gr);
  430. //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von
  431. //! releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der
  432. //! Fläche wird automatisch ignoriert. Wenn die Zeichenfläche darf über
  433. //! den Rand einer bestehenden Zeichenfläche hinausragen \param x Die X
  434. //! Koordinate der linken oberen Ecke der Zeichenfläche \param y Die X
  435. //! Koordinate der linken oberen Ecke der Zeichenfläche \param br Die
  436. //! Breite der Zeichenfläche \param hi Die Höhe der Zeichenfläche
  437. //! \return 1, falls die neue Zeichenfläche ganz oder teilweise
  438. //! innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird, wurde die
  439. //! Zeichenfläche nicht gesetzt und es braucht nicht
  440. //! releaseDrawOptions() aufgerufen werden
  441. DLLEXPORT bool setDrawOptionsErzwingen(int x, int y, int br, int hi);
  442. //! Setzt neue Draw options auf bildgröße
  443. DLLEXPORT void setDrawOptionsReset();
  444. //! Setzt Koordinaten, die bei den Zeichenfunktionen von den Positionen
  445. //! abgezogen werden Vorher sollte eine Zeichenfläche mit SetDrawOptions
  446. //! gesetzt worden sein. Die Werte werden mit dem aufruf von
  447. //! releaseDrawOptions() wieder zurückgesetzt. \param xOff Ein Wert, der
  448. //! von allen X Koordinaten abgezogen wird \param yOff Ein Wert, der von
  449. //! allen Y Koordinaten abgezogen wird
  450. DLLEXPORT void addScrollOffset(int xOff, int yOff);
  451. //! Entfernt die als letztes gesetzte begrenzung der Zeichenfläche und
  452. //! alle seit dem gesetzten Scroll Offsets Stellt die vorherige
  453. //! Zeichenfläche und die zugehörigen Scroll Offsets wieder her
  454. DLLEXPORT void releaseDrawOptions();
  455. //! Gibt zurück, ob sich das Bild seit dem letzten Aufruf dieser
  456. //! Funktion verändert hat
  457. DLLEXPORT bool getRend();
  458. //! Gibt den Array mit A8R8G8B8 Farbwerten der Pixel zurück
  459. //! Der Index eines Pixels berechnet sich durch x + y * Bildbreite
  460. DLLEXPORT int* getBuffer() const;
  461. //! Gibt den A8R8G8B8 Farbwert eines Pixels zurück
  462. //! \param x Die X Koordinate des Pixels
  463. //! \param y Die Y Koordinate des Pixels
  464. DLLEXPORT int getPixel(int x, int y) const;
  465. //! Gibt die Größe des Bildes zurück
  466. DLLEXPORT const Punkt& getSize() const;
  467. //! Gibt die Breite des Bildes zurück
  468. DLLEXPORT int getBreite() const;
  469. //! Gibt die Höhe des Bildes zurück
  470. DLLEXPORT int getHeight() const;
  471. //! Gibt den aktuellen mindest Transparenz Wert zurück
  472. DLLEXPORT unsigned char getAlpha() const;
  473. //! Gibt die Koordinaten der linken oberen Ecke der aktuellen
  474. //! Zeichenfläche zurück
  475. DLLEXPORT const Punkt& getDrawPos() const;
  476. //! Gibt die Größe der aktuelen Zeichenfläche zurück
  477. DLLEXPORT const Punkt& getDrawGr() const;
  478. //! Gibt die Koordinaten zurück, die zu allen Positionen vor dem
  479. //! Zeichnen hinzugefügt werden
  480. DLLEXPORT const Punkt& getDrawOff() const;
  481. //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die
  482. //! vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
  483. //! Das ist sinnvoll für die Verwendung im 3DBildschirm, wo das
  484. //! Gezeichnette Bild später mittels Alpha Blending angezeigt wird. Der
  485. //! Flag wird im 3DBildschirm automatisch gesetzt
  486. DLLEXPORT bool hasAlpha3D() const;
  487. //! Berechnet die durchschnittliche Farbe aller Pixel des Bildes
  488. DLLEXPORT int getAverageColor() const;
  489. };
  490. //! Eine Zeichnung des 2d GUI Frameworks, die ein Bild anzeigt.
  491. class BildZ : public ZeichnungHintergrund
  492. {
  493. public:
  494. class Style : public ZeichnungHintergrund::Style
  495. {
  496. public:
  497. // Wenn dieser Flag gesetzt ist, wird zum Zeichnen des Bildes Alpha
  498. // Blending verwendet
  499. static const __int64 Alpha = 0x1000;
  500. // Wenn dieser Flag gesetzt ist, wird das Bild in die Zeichenfläche
  501. // skalliert
  502. static const __int64 Skalliert = 0x2000;
  503. // Der Normale Style einer Bild Zeichnung Bestehend aus HScroll,
  504. // Sichtbar, Erlaubt, Rahmen, VScroll
  505. static const __int64 normal
  506. = HScroll | Sichtbar | Erlaubt | Rahmen | VScroll;
  507. };
  508. private:
  509. Bild* bild;
  510. protected:
  511. //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch
  512. //! aufgerufen. \param me Das Ereignis
  513. DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;
  514. public:
  515. //! Konstruktor
  516. DLLEXPORT BildZ();
  517. //! Destruktor
  518. DLLEXPORT virtual ~BildZ();
  519. //! Setzt einen Zeiger auf das Bild, was angezeigt werden soll
  520. //! \param b Das Bild
  521. DLLEXPORT void setBildZ(Bild* b);
  522. //! Setzt das Bild, was angezeigt werden soll. Der Inhalt des Bildes
  523. //! wird Kopiert \param b Das Bild
  524. DLLEXPORT void setBild(Bild* b);
  525. //! Updated den Zeichenhintergrund
  526. //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten
  527. //! Aufruf dieser Funktion verstrichen ist \return 1, wenn das Bild neu
  528. //! gezeichnet werden muss. 0 sonnst
  529. DLLEXPORT bool tick(double tickVal) override;
  530. //! Zeichnet die Zeihnung in ein bestimmtes Bild
  531. //! \param zRObj Das Bild, in das gezeichnet werden soll
  532. DLLEXPORT void render(Bild& zRObj) override;
  533. //! Gibt das angezeigte Bild zurück
  534. DLLEXPORT Bild* getBild() const;
  535. //! Gbt das angezeigte Bild ohne erhöhten Reference Counter zurück
  536. DLLEXPORT Bild* zBild() const;
  537. //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das
  538. //! Original verändert werden kann
  539. DLLEXPORT Zeichnung* dublizieren() const override;
  540. };
  541. #ifdef WIN32
  542. //! Lädt ein Bild aus einer .bmp, .jpg, .gif oder .png Datei
  543. //! \param pfad Der Pfad zur Bilddatei
  544. //! \param zError Ein Zeiger auf ein Text Objekt, in dem ein möglicher
  545. //! Fehler zurückgegeben wird \return Das geladene Bild
  546. DLLEXPORT Bild* ladeBild(const char* pfad, Text* zError);
  547. #endif
  548. } // namespace Framework
  549. #endif