Bild.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  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; //! from this file
  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. //! Manages an image as an array of pixel colors in A8R8G8B8 format
  17. //! that can be drawn to
  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. //! private
  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. //! Constructor
  93. //! \param options 1 if the image should create buffers for drawing,
  94. //! such as for temporary drawing area boundaries and
  95. //! transparency filters
  96. //! Uses about 50 kb more memory per image
  97. DLLEXPORT Bild(bool options = 0);
  98. //! Destructor
  99. DLLEXPORT ~Bild();
  100. //! Checks whether a rectangle is fully or partially within the drawing
  101. //! area.
  102. //! return 0 if the rectangle is not in the drawing area, 1 otherwise
  103. DLLEXPORT bool isAreaDrawable(int x, int y, int width, int height);
  104. //! If this flag is set, when alpha blending and the previous color
  105. //! is 0, the new color is only copied with its alpha value.
  106. //! This is useful for use in the 3D screen, where the drawn image
  107. //! is later displayed using alpha blending. The flag is set
  108. //! automatically in the 3D screen
  109. DLLEXPORT void setAlpha3D(bool erlaubt);
  110. //! Sets the minimum transparency of everything drawn next,
  111. //! until the corresponding releaseAlpha() call is made.
  112. DLLEXPORT void setAlpha(unsigned char alpha);
  113. //! Removes the last alpha limit set with setAlpha()
  114. DLLEXPORT void releaseAlpha();
  115. //! Setzt einen Zeiger auf die Pixel, in die gezeichnet werden soll
  116. //! \param buffer Ein Array mit den A8R8G8B8 Farbwerten
  117. //! \param deleteBuffer 1, fals der Array vom Bild geloescht werden soll
  118. //! \param breite Die Breite in Pixeln
  119. //! \param height Die Hoehe in Pixeln
  120. DLLEXPORT void setPixelBuffer(
  121. int* buffer, bool deleteBuffer, int breite, int height);
  122. //! Erstellt ein neues Bild
  123. //! \param breite Die Breite des Bildes in Pixeln
  124. //! \param hoehe Die Hoehe des Bildes in Pixeln
  125. //! \param fillColor Die startfarbe, auf die alle Pixel gesetzt werden
  126. DLLEXPORT void neuBild(int breite, int height, int fillColor);
  127. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  128. //! Beachtet nicht die begrenzung der Zeichnenflaeche und das Skroll
  129. //! Offset \param x Die X Koordinate des Pixels \param y Die Y
  130. //! Koordinate des Pixels \param f Die Farbe in A8R8G8B8 Format, die
  131. //! geblendet werden soll
  132. DLLEXPORT void alphaPixel2D(int x, int y, int f);
  133. DLLEXPORT void alphaPixel3D(int x, int y, int f);
  134. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  135. //! Beachtet nicht die begrenzung der Zeichnenflaeche und das Skroll
  136. //! Offset \param i Der Index des Pixels im Pixel Array \param f Die
  137. //! Farbe in A8R8G8B8 Format, die geblendet werden soll
  138. DLLEXPORT void alphaPixel2D(int i, int f);
  139. DLLEXPORT void alphaPixel3D(int i, int f);
  140. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  141. //! \param x Die X Koordinate des Pixels
  142. //! \param y Die Y Koordinate des Pixels
  143. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  144. DLLEXPORT void alphaPixelDP2D(int x, int y, int f);
  145. DLLEXPORT void alphaPixelDP3D(int x, int y, int f);
  146. //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
  147. //! \param i Der Index des Pixels im Pixel Array
  148. //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
  149. DLLEXPORT void alphaPixelDP2D(int i, int f);
  150. DLLEXPORT void alphaPixelDP3D(int i, int f);
  151. //! Setzt die Farbe eines besimmten Pixels
  152. //! \param x Die X Koordinate des Pixels
  153. //! \param y Die Y Koordinate des Pixels
  154. //! \param f Die neue Farbe in A8R8G8B8 Format
  155. DLLEXPORT void setPixelDP(int x, int y, int f);
  156. //! Setzt die Farbe eines besimmten Pixels
  157. //! \param i Der Index des Pixels im Pixel Array
  158. //! \param f Die neue Farbe in A8R8G8B8 Format
  159. DLLEXPORT void setPixelDP(int i, int f);
  160. //! Setzt die Farbe aller Pixel des Bildes
  161. //! \param f Die neue Farbe
  162. DLLEXPORT void setFarbe(int f);
  163. //! Setzt die Farben aller Pixel in einem Rechteck
  164. //! \param x Die X Koordinate
  165. //! \param y Die Y Koordinate
  166. //! \param b Die Breite des Rechtecks
  167. //! \param h Die Hoehe des Rechtecks
  168. //! \param fc Die Farbe im A8R8G8B8 Format
  169. DLLEXPORT void fillRegion(int x, int y, int b, int h, int fc);
  170. //! Blendet eine Farbe mit Alphablending in einem Rechteck
  171. //! \param x Die X Koordinate
  172. //! \param y Die Y Koordinate
  173. //! \param b Die Breite des Rechtecks
  174. //! \param h Die Hoehe des Rechtecks
  175. //! \param fc Die Farbe im A8R8G8B8 Format
  176. DLLEXPORT void alphaRegion(int x, int y, int b, int h, int fc);
  177. //! Zeichnet eine horizontale Linie
  178. //! \param x Die X Koordinate des Startpunktes der Linie
  179. //! \param y Die Y Koordinate des Startpunktes der Linie
  180. //! \param length Die Laenge der Linie
  181. //! \param fc Die Farbe im A8R8G8B8 Format
  182. DLLEXPORT void drawLinieH(int x, int y, int length, int fc);
  183. //! Zeichnet eine vertikale Linie
  184. //! \param x Die X Koordinate des Startpunktes der Linie
  185. //! \param y Die Y Koordinate des Startpunktes der Linie
  186. //! \param length Die Laenge der Linie
  187. //! \param fc Die Farbe im A8R8G8B8 Format
  188. DLLEXPORT void drawLinieV(int x, int y, int length, int fc);
  189. //! Zeichnet eine horizontale Linie mit Alpha blending
  190. //! \param x Die X Koordinate des Startpunktes der Linie
  191. //! \param y Die Y Koordinate des Startpunktes der Linie
  192. //! \param length Die Laenge der Linie
  193. //! \param fc Die Farbe im A8R8G8B8 Format
  194. DLLEXPORT void drawLinieHAlpha(int x, int y, int length, int fc);
  195. //! Zeichnet eine vertikale Linie mit Alpha Blending
  196. //! \param x Die X Koordinate des Startpunktes der Linie
  197. //! \param y Die Y Koordinate des Startpunktes der Linie
  198. //! \param length Die Laenge der Linie
  199. //! \param fc Die Farbe im A8R8G8B8 Format
  200. DLLEXPORT void drawLinieVAlpha(int x, int y, int length, int fc);
  201. //! Zeichnet eine Linie
  202. //! \param a Der Startpunkt der Linie
  203. //! \param b der Endpunkt der Linie
  204. //! \param fc Die Farbe im A8R8G8B8 Format
  205. DLLEXPORT void drawLinieBordered(Punkt a, Punkt b, int bc, int fc);
  206. //! Zeichnet eine Linie
  207. //! \param a Der Startpunkt der Linie
  208. //! \param b der Endpunkt der Linie
  209. //! \param fc Die Farbe im A8R8G8B8 Format
  210. DLLEXPORT void drawLinieBorderedAlpha(Punkt a, Punkt b, int bc, int fc);
  211. //! Zeichnet eine Linie
  212. //! \param a Der Startpunkt der Linie
  213. //! \param b der Endpunkt der Linie
  214. //! \param fc Die Farbe im A8R8G8B8 Format
  215. DLLEXPORT void drawLinie(Punkt a, Punkt b, int fc);
  216. //! Zeichnet eine Linie mit Alpha Blending
  217. //! \param a Der Startpunkt der Linie
  218. //! \param b der Endpunkt der Linie
  219. //! \param fc Die Farbe im A8R8G8B8 Format
  220. DLLEXPORT void drawLinieAlpha(Punkt a, Punkt b, int fc);
  221. //! Fuellt einen Kreis mit einer Farbe. (Unfertig)
  222. //! \param xOff Die X Koordinate des Kreismittelpunktes
  223. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  224. //! \param r Der Radius des Kreises in Pixeln
  225. //! \param fc Die Farbe im A8R8G8B8 Format
  226. DLLEXPORT void fillCircle(int xOff, int yOff, int r, int fc);
  227. //! Zeichnet den Umriss eines Kreises
  228. //! \param xOff Die X Koordinate des Kreismittelpunktes
  229. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  230. //! \param r Der Radius des Kreises in Pixeln
  231. //! \param fc Die Farbe im A8R8G8B8 Format
  232. DLLEXPORT void drawKreis(int xOff, int yOff, int r, int fc);
  233. //! Zeichnet den Umriss eines Kreises mit Alpha Blending
  234. //! \param xOff Die X Koordinate des Kreismittelpunktes
  235. //! \param yOff Die Y Koordinate des Kreismittelpunktes
  236. //! \param r Der Radius des Kreises in Pixeln
  237. //! \param fc Die Farbe im A8R8G8B8 Format
  238. DLLEXPORT void drawKreisAlpha(int xOff, int yOff, int r, int fc);
  239. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung
  240. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in
  241. //! dem das Bild gezeichnet werden soll \param y Die Y Koordinate der
  242. //! linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden
  243. //! soll \param br Die Breite des Rechecks in dem das Bild gezeichnet
  244. //! werden soll \param hi Die Hoehe des Rechecks in dem das Bild
  245. //! gezeichnet werden soll \param zBild Das Bild, was gezeichnet werden
  246. //! soll
  247. DLLEXPORT void drawBild(
  248. 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 Hoehe des Rechecks in dem
  255. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  256. //! gezeichnet werden soll
  257. DLLEXPORT void alphaBild(
  258. int x, int y, int br, int hi, const Bild& zBild);
  259. //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha
  260. //! blending \param x Die X Koordinate der linken oberen Ecke des
  261. //! Rechtecks in dem das Bild gezeichnet werden soll \param y Die Y
  262. //! Koordinate der linken oberen Ecke des Rechtecks in dem das Bild
  263. //! gezeichnet werden soll \param br Die Breite des Rechecks in dem das
  264. //! Bild gezeichnet werden soll \param hi Die Hoehe des Rechecks in dem
  265. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  266. //! gezeichnet werden soll
  267. DLLEXPORT void alphaBildAssoz(
  268. int x, int y, int br, int hi, const Bild& zBild);
  269. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes
  270. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  271. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  272. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  273. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  274. //! das Bild gezeichnet werden soll \param hi Die Hoehe des Rechecks in
  275. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  276. //! gezeichnet werden soll
  277. DLLEXPORT void drawBild90(
  278. int x, int y, int br, int hi, const Bild& zBild);
  279. //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes
  280. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  281. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  282. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  283. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  284. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  285. //! Die Hoehe des Rechecks in dem das Bild gezeichnet werden soll \param
  286. //! zBild Das Bild, was gezeichnet werden soll
  287. DLLEXPORT void alphaBild90(
  288. int x, int y, int br, int hi, const Bild& zBild);
  289. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes
  290. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  291. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  292. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  293. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  294. //! das Bild gezeichnet werden soll \param hi Die Hoehe des Rechecks in
  295. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  296. //! gezeichnet werden soll
  297. DLLEXPORT void drawBild180(
  298. int x, int y, int br, int hi, const Bild& zBild);
  299. //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes
  300. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  301. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  302. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  303. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  304. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  305. //! Die Hoehe des Rechecks in dem das Bild gezeichnet werden soll \param
  306. //! zBild Das Bild, was gezeichnet werden soll
  307. DLLEXPORT void alphaBild180(
  308. int x, int y, int br, int hi, const Bild& zBild);
  309. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes
  310. //! Feld ohne Skallierung \param x Die X Koordinate der linken oberen
  311. //! Ecke des Rechtecks in dem das Bild gezeichnet werden soll \param y
  312. //! Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das
  313. //! Bild gezeichnet werden soll \param br Die Breite des Rechecks in dem
  314. //! das Bild gezeichnet werden soll \param hi Die Hoehe des Rechecks in
  315. //! dem das Bild gezeichnet werden soll \param zBild Das Bild, was
  316. //! gezeichnet werden soll
  317. DLLEXPORT void drawBild270(
  318. int x, int y, int br, int hi, const Bild& zBild);
  319. //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes
  320. //! Feld ohne Skallierung mit alpha Blending \param x Die X Koordinate
  321. //! der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet
  322. //! werden soll \param y Die Y Koordinate der linken oberen Ecke des
  323. //! Rechtecks in dem das Bild gezeichnet werden soll \param br Die
  324. //! Breite des Rechecks in dem das Bild gezeichnet werden soll \param hi
  325. //! Die Hoehe des Rechecks in dem das Bild gezeichnet werden soll \param
  326. //! zBild Das Bild, was gezeichnet werden soll
  327. DLLEXPORT void alphaBild270(
  328. int x, int y, int br, int hi, const Bild& zBild);
  329. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung
  330. //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in
  331. //! dem das Bild gezeichnet werden soll \param y Die Y Koordinate der
  332. //! linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden
  333. //! soll \param br Die Breite des Rechecks in dem das Bild gezeichnet
  334. //! werden soll \param hi Die Hoehe des Rechecks in dem das Bild
  335. //! gezeichnet werden soll \param zBild Das Bild, was gezeichnet werden
  336. //! soll
  337. DLLEXPORT void drawBildSkall(
  338. int x, int y, int br, int hi, const Bild& zBild);
  339. //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung mit Alpha
  340. //! Blending \param x Die X Koordinate der linken oberen Ecke des
  341. //! Rechtecks in dem das Bild gezeichnet werden soll \param y Die Y
  342. //! Koordinate der linken oberen Ecke des Rechtecks in dem das Bild
  343. //! gezeichnet werden soll \param br Die Breite des Rechecks in dem das
  344. //! Bild gezeichnet werden soll \param hi Die Hoehe des Rechecks in dem
  345. //! das Bild gezeichnet werden soll \param zBild Das Bild, was
  346. //! gezeichnet werden soll
  347. DLLEXPORT void alphaBildSkall(
  348. int x, int y, int br, int hi, const Bild& zBild);
  349. //! Fuellt ein Dreieck mit einer bestimmten Farbe
  350. //! \param a Eine Ecke des Dreiecks
  351. //! \param b Eine Ecke des Dreiecks
  352. //! \param c Eine Ecke des Dreiecks
  353. //! \param farbe die Farbe im A8R8G8B8 Format
  354. DLLEXPORT void drawDreieck(Punkt a, Punkt b, Punkt c, int farbe);
  355. //! Fuellt ein Dreieck mit einer bestimmten Textur
  356. //! \param a Eine Ecke des Dreiecks
  357. //! \param b Eine Ecke des Dreiecks
  358. //! \param c Eine Ecke des Dreiecks
  359. //! \param ta Die Koordinaten von a in der Textur
  360. //! \param tb Die Koordinaten von b in der Textur
  361. //! \param tc Die Koordinaten von c in der Textur
  362. //! \param textur Das Bild, was als Textur verwendet werden soll
  363. DLLEXPORT void drawDreieckTextur(Punkt a,
  364. Punkt b,
  365. Punkt c,
  366. Punkt ta,
  367. Punkt tb,
  368. Punkt tc,
  369. const Bild& textur);
  370. //! Fuellt ein Dreieck mit einer bestimmten Farbe mit alpha blending
  371. //! \param a Eine Ecke des Dreiecks
  372. //! \param b Eine Ecke des Dreiecks
  373. //! \param c Eine Ecke des Dreiecks
  374. //! \param farbe die Farbe im A8R8G8B8 Format
  375. DLLEXPORT void drawDreieckAlpha(Punkt a, Punkt b, Punkt c, int farbe);
  376. //! Fuellt ein Dreieck mit einer bestimmten Textur mit alpha blending
  377. //! \param a Eine Ecke des Dreiecks
  378. //! \param b Eine Ecke des Dreiecks
  379. //! \param c Eine Ecke des Dreiecks
  380. //! \param ta Die Koordinaten von a in der Textur
  381. //! \param tb Die Koordinaten von b in der Textur
  382. //! \param tc Die Koordinaten von c in der Textur
  383. //! \param textur Das Bild, was als Textur verwendet werden soll
  384. DLLEXPORT void drawDreieckTexturAlpha(Punkt a,
  385. Punkt b,
  386. Punkt c,
  387. Punkt ta,
  388. Punkt tb,
  389. Punkt tc,
  390. const Bild& textur);
  391. //! Ersetzt eine bestimmte Farbe durch Transparenz
  392. DLLEXPORT void replaceColorWithAlpha(int color);
  393. //! Begrenzt die Zeichenflaeche in die bis zum naechsten aufruf von
  394. //! releaseDrawOptions() gezeichnet werden kann. Alles ausserhalb der
  395. //! Flaeche wird automatisch ignoriert. Wenn die Zeichenflaeche ueber den
  396. //! Rand einer bestehenden Zeichenflaeche hinausragt, wird sie
  397. //! automatisch auf die bestehende Zeichnenflaeche beschnitten. \param
  398. //! pos Die Koordinaten der linken oberen Ecke der Zeichenflaeche \param
  399. //! gr Die Groesse der Zeichenflaeche \return 1, falls die neue
  400. //! Zeichenflaeche ganz oder teilweise innerhalb der bestehenden
  401. //! Zeichenflaeche ligt. Wenn 0 zurueckgegeben wird, wurde die
  402. //! Zeichenflaeche nicht gesetzt und es braucht nicht
  403. //! releaseDrawOptions() aufgerufen werden
  404. DLLEXPORT bool setDrawOptions(const Punkt& pos, const Punkt& gr);
  405. //! Begrenzt die Zeichenflaeche in die bis zum naechsten aufruf von
  406. //! releaseDrawOptions() gezeichnet werden kann. Alles ausserhalb der
  407. //! Flaeche wird automatisch ignoriert. Wenn die Zeichenflaeche ueber den
  408. //! Rand einer bestehenden Zeichenflaeche hinausragt, wird sie
  409. //! automatisch auf die bestehende Zeichnenflaeche beschnitten. \param x
  410. //! Die X Koordinate der linken oberen Ecke der Zeichenflaeche \param y
  411. //! Die X Koordinate der linken oberen Ecke der Zeichenflaeche \param br
  412. //! Die Breite der Zeichenflaeche \param hi Die Hoehe der Zeichenflaeche
  413. //! \return 1, falls die neue Zeichenflaeche ganz oder teilweise
  414. //! innerhalb der bestehenden Zeichenflaeche ligt. Wenn 0 zurueckgegeben
  415. //! wird, wurde die Zeichenflaeche nicht gesetzt und es braucht nicht
  416. //! releaseDrawOptions() aufgerufen werden
  417. DLLEXPORT bool setDrawOptions(int x, int y, int br, int hi);
  418. //! Begrenzt die Zeichenflaeche in die bis zum naechsten aufruf von
  419. //! releaseDrawOptions() gezeichnet werden kann. Alles ausserhalb der
  420. //! Flaeche wird automatisch ignoriert. Wenn die Zeichenflaeche darf ueber
  421. //! den Rand einer bestehenden Zeichenflaeche hinausragen \param pos Die
  422. //! Koordinaten der linken oberen Ecke der Zeichenflaeche \param gr Die
  423. //! Groesse der Zeichenflaeche \return 1, falls die neue Zeichenflaeche ganz
  424. //! oder teilweise innerhalb des Bildes ligt. Wenn 0 zurueckgegeben wird,
  425. //! wurde die Zeichenflaeche nicht gesetzt und es braucht nicht
  426. //! releaseDrawOptions() aufgerufen werden
  427. DLLEXPORT bool setDrawOptionsErzwingen(
  428. const Punkt& pos, const Punkt& gr);
  429. //! Begrenzt die Zeichenflaeche in die bis zum naechsten aufruf von
  430. //! releaseDrawOptions() gezeichnet werden kann. Alles ausserhalb der
  431. //! Flaeche wird automatisch ignoriert. Wenn die Zeichenflaeche darf ueber
  432. //! den Rand einer bestehenden Zeichenflaeche hinausragen \param x Die X
  433. //! Koordinate der linken oberen Ecke der Zeichenflaeche \param y Die X
  434. //! Koordinate der linken oberen Ecke der Zeichenflaeche \param br Die
  435. //! Breite der Zeichenflaeche \param hi Die Hoehe der Zeichenflaeche
  436. //! \return 1, falls die neue Zeichenflaeche ganz oder teilweise
  437. //! innerhalb des Bildes ligt. Wenn 0 zurueckgegeben wird, wurde die
  438. //! Zeichenflaeche nicht gesetzt und es braucht nicht
  439. //! releaseDrawOptions() aufgerufen werden
  440. DLLEXPORT bool setDrawOptionsErzwingen(int x, int y, int br, int hi);
  441. //! Setzt neue Draw options auf bildgroesse
  442. DLLEXPORT void setDrawOptionsReset();
  443. //! Setzt Koordinaten, die bei den Zeichenfunktionen von den Positionen
  444. //! abgezogen werden Vorher sollte eine Zeichenflaeche mit SetDrawOptions
  445. //! gesetzt worden sein. Die Werte werden mit dem aufruf von
  446. //! releaseDrawOptions() wieder zurueckgesetzt. \param xOff Ein Wert, der
  447. //! von allen X Koordinaten abgezogen wird \param yOff Ein Wert, der von
  448. //! allen Y Koordinaten abgezogen wird
  449. DLLEXPORT void addScrollOffset(int xOff, int yOff);
  450. //! Entfernt die als letztes gesetzte begrenzung der Zeichenflaeche und
  451. //! alle seit dem gesetzten Scroll Offsets Stellt die vorherige
  452. //! Zeichenflaeche und die zugehoerigen Scroll Offsets wieder her
  453. DLLEXPORT void releaseDrawOptions();
  454. //! Gibt zurueck, ob sich das Bild seit dem letzten Aufruf dieser
  455. //! Funktion veraendert hat
  456. DLLEXPORT bool getRend();
  457. //! Gibt den Array mit A8R8G8B8 Farbwerten der Pixel zurueck
  458. //! Der Index eines Pixels berechnet sich durch x + y * Bildbreite
  459. DLLEXPORT int* getBuffer() const;
  460. //! Gibt den A8R8G8B8 Farbwert eines Pixels zurueck
  461. //! \param x Die X Koordinate des Pixels
  462. //! \param y Die Y Koordinate des Pixels
  463. DLLEXPORT int getPixel(int x, int y) const;
  464. //! Gibt die Groesse des Bildes zurueck
  465. DLLEXPORT const Punkt& getSize() const;
  466. //! Gibt die Breite des Bildes zurueck
  467. DLLEXPORT int getBreite() const;
  468. //! Gibt die Hoehe des Bildes zurueck
  469. DLLEXPORT int getHeight() const;
  470. //! Gibt den aktuellen mindest Transparenz Wert zurueck
  471. DLLEXPORT unsigned char getAlpha() const;
  472. //! Gibt die Koordinaten der linken oberen Ecke der aktuellen
  473. //! Zeichenflaeche zurueck
  474. DLLEXPORT const Punkt& getDrawPos() const;
  475. //! Gibt die Groesse der aktuelen Zeichenflaeche zurueck
  476. DLLEXPORT const Punkt& getDrawGr() const;
  477. //! Gibt die Koordinaten zurueck, die zu allen Positionen vor dem
  478. //! Zeichnen hinzugefuegt werden
  479. DLLEXPORT const Punkt& getDrawOff() const;
  480. //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die
  481. //! vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
  482. //! Das ist sinnvoll fuer die Verwendung im 3DBildschirm, wo das
  483. //! Gezeichnette Bild spaeter mittels Alpha Blending angezeigt wird. Der
  484. //! Flag wird im 3DBildschirm automatisch gesetzt
  485. DLLEXPORT bool hasAlpha3D() const;
  486. //! Berechnet die durchschnittliche Farbe aller Pixel des Bildes
  487. DLLEXPORT int getAverageColor() const;
  488. };
  489. //! Eine Zeichnung des 2d GUI Frameworks, die ein Bild anzeigt.
  490. class BildZ : public ZeichnungHintergrund
  491. {
  492. public:
  493. class Style : public ZeichnungHintergrund::Style
  494. {
  495. public:
  496. //! Wenn dieser Flag gesetzt ist, wird zum Zeichnen des Bildes Alpha
  497. //! Blending verwendet
  498. static const __int64 Alpha = 0x1000;
  499. //! Wenn dieser Flag gesetzt ist, wird das Bild in die Zeichenflaeche
  500. //! skalliert
  501. static const __int64 Skalliert = 0x2000;
  502. //! Der Normale Style einer Bild Zeichnung Bestehend aus HScroll,
  503. //! Sichtbar, Erlaubt, Rahmen, VScroll
  504. static const __int64 normal
  505. = HScroll | Sichtbar | Erlaubt | Rahmen | VScroll;
  506. };
  507. private:
  508. Bild* bild;
  509. protected:
  510. //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch
  511. //! aufgerufen. \param me Das Ereignis
  512. DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;
  513. public:
  514. //! Konstruktor
  515. DLLEXPORT BildZ();
  516. //! Destruktor
  517. DLLEXPORT virtual ~BildZ();
  518. //! Setzt einen Zeiger auf das Bild, was angezeigt werden soll
  519. //! \param b Das Bild
  520. DLLEXPORT void setBildZ(Bild* b);
  521. //! Setzt das Bild, was angezeigt werden soll. Der Inhalt des Bildes
  522. //! wird Kopiert \param b Das Bild
  523. DLLEXPORT void setBild(Bild* b);
  524. //! Updated den Zeichenhintergrund
  525. //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten
  526. //! Aufruf dieser Funktion verstrichen ist \return 1, wenn das Bild neu
  527. //! gezeichnet werden muss. 0 sonnst
  528. DLLEXPORT bool tick(double tickVal) override;
  529. //! Zeichnet die Zeihnung in ein bestimmtes Bild
  530. //! \param zRObj Das Bild, in das gezeichnet werden soll
  531. DLLEXPORT void render(Bild& zRObj) override;
  532. //! Gibt das angezeigte Bild zurueck
  533. DLLEXPORT Bild* getBild() const;
  534. //! Gbt das angezeigte Bild ohne erhoehten Reference Counter zurueck
  535. DLLEXPORT Bild* zBild() const;
  536. //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das
  537. //! Original veraendert werden kann
  538. DLLEXPORT Zeichnung* dublizieren() const override;
  539. };
  540. #ifdef WIN32
  541. //! Laedt ein Bild aus einer .bmp, .jpg, .gif oder .png Datei
  542. //! \param pfad Der Pfad zur Bilddatei
  543. //! \param zError Ein Zeiger auf ein Text Objekt, in dem ein moeglicher
  544. //! Fehler zurueckgegeben wird \return Das geladene Bild
  545. DLLEXPORT Bild* ladeBild(const char* pfad, Text* zError);
  546. #endif
  547. } // namespace Framework
  548. #endif