Bild.h 29 KB

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