Bild.cpp 90 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109
  1. //---Include---
  2. #include "Bild.h"
  3. #ifdef WIN32
  4. # include <objidl.h>
  5. #endif
  6. #include "AlphaFeld.h"
  7. #include "DateiSystem.h"
  8. #include "Globals.h"
  9. #include "MausEreignis.h"
  10. #include "Rahmen.h"
  11. #include "Scroll.h"
  12. #include "Text.h"
  13. #include "ToolTip.h"
  14. #ifdef WIN32
  15. # include <gdiplus.h>
  16. # pragma comment(lib, "gdiplus.lib")
  17. #endif
  18. #ifndef WIN32
  19. # include <math.h>
  20. # include <stdlib.h>
  21. # include <string.h>
  22. # ifndef max
  23. # define max(a, b) (((a) > (b)) ? (a) : (b))
  24. # endif
  25. # ifndef min
  26. # define min(a, b) (((a) < (b)) ? (a) : (b))
  27. # endif
  28. #endif
  29. using namespace Framework;
  30. // Inhalt der Bild Klasse aus Bild.h
  31. // Konstruktor
  32. Bild::Bild(bool options)
  33. : ReferenceCounter(),
  34. fc(0),
  35. delFc(1),
  36. size(0, 0),
  37. drawOff(options ? new Punkt[2000] : new Punkt[1]),
  38. dPosA(options ? new Punkt[2000] : new Punkt[1]),
  39. dSizeA(options ? new Punkt[2000] : new Punkt[1]),
  40. doa(0),
  41. alpha(options ? new unsigned char[1000] : new unsigned char[1]),
  42. alphaAnzahl(0),
  43. rend(0),
  44. alpha3D(0)
  45. {
  46. alpha[0] = 0;
  47. }
  48. // Destruktor
  49. Bild::~Bild()
  50. {
  51. if (delFc)
  52. {
  53. delete[] fc;
  54. fc = 0;
  55. }
  56. delete[] dPosA;
  57. delete[] dSizeA;
  58. delete[] alpha;
  59. delete[] drawOff;
  60. }
  61. // privat
  62. inline void Bild::alphaPixelP(int x, int y, int f)
  63. {
  64. alphaPixelP(fc[x + y * size.x], f);
  65. }
  66. inline void Bild::alphaPixelP3D(int x, int y, int f)
  67. {
  68. alphaPixelP3D(fc[x + y * size.x], f);
  69. }
  70. inline void Bild::alphaPixelAssozP(int& fc, int f)
  71. {
  72. unsigned char* fc1 = (unsigned char*)&fc;
  73. unsigned char* fc2 = (unsigned char*)&f;
  74. unsigned char na = (unsigned char)~fc2[3];
  75. unsigned char a = (unsigned char)(fc2[3] + ((na * fc1[3]) >> 8));
  76. if (a == 0) return;
  77. fc1[2] = (unsigned char)((fc2[2] * fc2[3] + ((fc1[2] * na * fc1[3]) >> 8))
  78. / a);
  79. fc1[1] = (unsigned char)((fc2[1] * fc2[3] + ((fc1[1] * na * fc1[3]) >> 8))
  80. / a);
  81. fc1[0] = (unsigned char)((fc2[0] * fc2[3] + ((fc1[0] * na * fc1[3]) >> 8))
  82. / a);
  83. fc1[3] = a;
  84. }
  85. inline void Bild::alphaPixelP3D(int& fc, int colorb)
  86. {
  87. // alphaPixelAssozP( fc, colorb );
  88. // return;
  89. int alpha = ((colorb >> 24) & 0xFF);
  90. int na = (0x100 - alpha);
  91. fc = (((((na * (fc & 0xFF00FF)) >> 8)
  92. + ((alpha * (colorb & 0xFF00FF)) >> 8))
  93. & 0xFF00FF)
  94. | ((((na * (fc & 0x00FF00)) >> 8)
  95. + ((alpha * (colorb & 0x00FF00)) >> 8))
  96. & 0x00FF00)
  97. | ((fc & 0xFF000000)))
  98. * (fc != 0)
  99. | (fc == 0) * colorb;
  100. // unsigned char *fc1 = (unsigned char*)&fc;
  101. // unsigned char *fc2 = (unsigned char*)&colorb;
  102. // unsigned char na = 255-fc2[ 3 ];
  103. // fc1[ 3 ] = fc2[ 3 ];
  104. // fc1[ 2 ] = (unsigned char)( ( fc2[ 2 ] * fc2[ 3 ] + fc1[ 2 ] * na ) / 255
  105. // ); fc1[ 1 ] = (unsigned char)( ( fc2[ 1 ] * fc2[ 3 ] + fc1[ 1 ] * na ) /
  106. // 255 ); fc1[ 0 ] = (unsigned char)( ( fc2[ 0 ] * fc2[ 3 ] + fc1[ 0 ] * na
  107. // ) / 255 );
  108. }
  109. inline void Bild::alphaPixelP(int& fc, int colorb)
  110. {
  111. // alphaPixelAssozP( fc, colorb );
  112. // return;
  113. int alpha = ((colorb >> 24) & 0xFF);
  114. int na = (0x100 - alpha);
  115. fc = (((((na * (fc & 0xFF00FF)) >> 8)
  116. + ((alpha * (colorb & 0xFF00FF)) >> 8))
  117. & 0xFF00FF)
  118. | ((((na * (fc & 0x00FF00)) >> 8)
  119. + ((alpha * (colorb & 0x00FF00)) >> 8))
  120. & 0x00FF00)
  121. | ((fc & 0xFF000000)));
  122. // unsigned char *fc1 = (unsigned char*)&fc;
  123. // unsigned char *fc2 = (unsigned char*)&colorb;
  124. // unsigned char na = 255-fc2[ 3 ];
  125. // fc1[ 3 ] = fc2[ 3 ];
  126. // fc1[ 2 ] = (unsigned char)( ( fc2[ 2 ] * fc2[ 3 ] + fc1[ 2 ] * na ) / 255
  127. // ); fc1[ 1 ] = (unsigned char)( ( fc2[ 1 ] * fc2[ 3 ] + fc1[ 1 ] * na ) /
  128. // 255 ); fc1[ 0 ] = (unsigned char)( ( fc2[ 0 ] * fc2[ 3 ] + fc1[ 0 ] * na
  129. // ) / 255 );
  130. }
  131. char Bild::getOutCode(Punkt p) const
  132. {
  133. char ret = 0;
  134. if (p.x < dPosA[doa].x) ret = 1;
  135. if (p.x >= dSizeA[doa].x) ret = 2;
  136. if (p.y < dPosA[doa].y) ret |= 4;
  137. if (p.y >= dSizeA[doa].y) ret |= 8;
  138. return ret;
  139. }
  140. void Bild::drawFlatDreieck(
  141. int y1, int y2, float m1, float b1, float m2, float b2, int farbe)
  142. {
  143. const int yStart = max(y1, dPosA[doa].y);
  144. const int yEnd = min(y2, dSizeA[doa].y);
  145. for (int y = yStart; y < yEnd; y++)
  146. {
  147. const int xStart = max((int)(m1 * (float)y + b1 + 0.5f), dPosA[doa].x);
  148. const int xEnd = min((int)(m2 * (float)y + b2 + 0.5f), dSizeA[doa].x);
  149. for (int x = xStart; x < xEnd; x++)
  150. fc[x + y * size.x] = farbe;
  151. }
  152. }
  153. void Bild::drawFlatDreieckTextur(int y1,
  154. int y2,
  155. double m1,
  156. double b1,
  157. double m2,
  158. double b2,
  159. double tx1,
  160. double ty1,
  161. double tx2,
  162. double ty2,
  163. double tx_1o,
  164. double ty_1o,
  165. double tx_2o,
  166. double ty_2o,
  167. double txf,
  168. double tyf,
  169. const Bild& textur)
  170. {
  171. const double yStart = max(y1, dPosA[doa].y);
  172. const double yEnd = min(y2, dSizeA[doa].y);
  173. double tx_1 = tx1 + tx_1o * (yStart - y1),
  174. ty_1 = ty1 + ty_1o * (yStart - y1),
  175. tx_2 = tx2 + tx_2o * (yStart - y1),
  176. ty_2 = ty2 + ty_2o * (yStart - y1);
  177. for (double y = yStart; y < yEnd;
  178. y++, tx_1 += tx_1o, ty_1 += ty_1o, tx_2 += tx_2o, ty_2 += ty_2o)
  179. {
  180. const double xStart = m1 * y + b1;
  181. const double xEnd = m2 * y + b2;
  182. drawLinieHTextur(Vec2<double>(xStart, y),
  183. xEnd - xStart,
  184. Vec2<double>(tx_1, ty_1),
  185. Vec2<double>(tx_2, ty_2),
  186. txf,
  187. tyf,
  188. textur);
  189. }
  190. }
  191. void Bild::drawFlatDreieckAlpha(
  192. int y1, int y2, float m1, float b1, float m2, float b2, int farbe)
  193. {
  194. const int yStart = max((int)(y1 + 0.5), dPosA[doa].y);
  195. const int yEnd = min((int)(y2 + 0.5), dSizeA[doa].y);
  196. if (alpha3D)
  197. {
  198. for (int y = yStart; y < yEnd; y++)
  199. {
  200. const int xStart
  201. = max((int)(m1 * ((float)y + 0.5f) + b1 + 0.5f), dPosA[doa].x);
  202. const int xEnd
  203. = min((int)(m2 * ((float)y + 0.5) + b2 + 0.5f), dSizeA[doa].x);
  204. for (int x = xStart; x < xEnd; x++)
  205. alphaPixelP3D(fc[x + y * size.x], farbe);
  206. }
  207. }
  208. else
  209. {
  210. for (int y = yStart; y < yEnd; y++)
  211. {
  212. const int xStart
  213. = max((int)(m1 * ((float)y + 0.5f) + b1 + 0.5f), dPosA[doa].x);
  214. const int xEnd
  215. = min((int)(m2 * ((float)y + 0.5) + b2 + 0.5f), dSizeA[doa].x);
  216. for (int x = xStart; x < xEnd; x++)
  217. alphaPixelP(fc[x + y * size.x], farbe);
  218. }
  219. }
  220. }
  221. void Bild::drawFlatDreieckTexturAlpha(int y1,
  222. int y2,
  223. double m1,
  224. double b1,
  225. double m2,
  226. double b2,
  227. double tx1,
  228. double ty1,
  229. double tx2,
  230. double ty2,
  231. double tx_1o,
  232. double ty_1o,
  233. double tx_2o,
  234. double ty_2o,
  235. double txf,
  236. double tyf,
  237. const Bild& textur)
  238. {
  239. const double yStart = max(y1, dPosA[doa].y);
  240. const double yEnd = min(y2, dSizeA[doa].y);
  241. double tx_1 = tx1 + tx_1o * (yStart - y1),
  242. ty_1 = ty1 + ty_1o * (yStart - y1),
  243. tx_2 = tx2 + tx_2o * (yStart - y1),
  244. ty_2 = ty2 + ty_2o * (yStart - y1);
  245. for (double y = yStart; y < yEnd;
  246. y++, tx_1 += tx_1o, ty_1 += ty_1o, tx_2 += tx_2o, ty_2 += ty_2o)
  247. {
  248. const double xStart = m1 * y + b1;
  249. const double xEnd = m2 * y + b2;
  250. drawLinieHTexturAlpha(Vec2<double>(xStart, y),
  251. xEnd - xStart,
  252. Vec2<double>(tx_1, ty_1),
  253. Vec2<double>(tx_2, ty_2),
  254. txf,
  255. tyf,
  256. textur);
  257. }
  258. }
  259. void Bild::drawLinieHTextur(Vec2<double> p,
  260. double len,
  261. Vec2<double> ta,
  262. Vec2<double> tb,
  263. double txo,
  264. double tyo,
  265. const Bild& textur) // zeichnet eine horizontale Linie
  266. {
  267. if (alpha[alphaAnzahl] == 0xFF) return;
  268. if (alpha[alphaAnzahl])
  269. {
  270. drawLinieHTexturAlpha(p, len, ta, tb, txo, tyo, textur);
  271. return;
  272. }
  273. if (len < 0)
  274. {
  275. p.x += len;
  276. len = -len;
  277. ta.Swap(tb);
  278. }
  279. int dpx = dPosA[doa].x;
  280. int dpy = dPosA[doa].y;
  281. int dgx = dSizeA[doa].x;
  282. int dgy = dSizeA[doa].y;
  283. if (p.y < dpy || p.y >= dgy) return;
  284. double off = 0;
  285. if (p.x < dpx)
  286. {
  287. off = dpx - p.x;
  288. len -= dpx - p.x;
  289. if (len <= 0) return;
  290. p.x = dpx;
  291. }
  292. if (p.x + len >= dgx)
  293. {
  294. len -= p.x - dgx + len;
  295. if (len <= 0) return;
  296. }
  297. int br = size.x;
  298. int* fc = this->fc + (int)(p.x + (int)p.y * br);
  299. double x = ta.x + txo * off, y = ta.y + tyo * off;
  300. int* buffer = textur.getBuffer();
  301. int txtBr = textur.getBreite();
  302. for (int i = 0; i < len; ++i, ++fc)
  303. {
  304. *fc = buffer[(int)((int)(x + 0.5) + (int)(y + 0.5) * txtBr)];
  305. x += txo, y += tyo;
  306. }
  307. rend = 1;
  308. }
  309. void Bild::drawLinieHTexturAlpha(Vec2<double> p,
  310. double len,
  311. Vec2<double> ta,
  312. Vec2<double> tb,
  313. double txo,
  314. double tyo,
  315. const Bild& textur) // zeichnet eine horizontale Linie
  316. {
  317. if (alpha[alphaAnzahl] == 0xFF) return;
  318. if (len < 0)
  319. {
  320. p.x += len;
  321. len = -len;
  322. ta.Swap(tb);
  323. }
  324. int dpx = dPosA[doa].x;
  325. int dpy = dPosA[doa].y;
  326. int dgx = dSizeA[doa].x;
  327. int dgy = dSizeA[doa].y;
  328. if (p.y < dpy || p.y >= dgy) return;
  329. double off = 0;
  330. if (p.x < dpx)
  331. {
  332. off = dpx - p.x;
  333. len -= dpx - p.x;
  334. if (len <= 0) return;
  335. p.x = dpx;
  336. }
  337. if (p.x + len >= dgx)
  338. {
  339. len -= p.x - dgx + len;
  340. if (len <= 0) return;
  341. }
  342. int br = size.x;
  343. int* fc = this->fc + (int)(p.x + (int)p.y * br);
  344. double x = ta.x + txo * off, y = ta.y + tyo * off;
  345. int* buffer = textur.getBuffer();
  346. int txtBr = textur.getBreite();
  347. int f;
  348. if (alpha3D)
  349. {
  350. for (int i = 0; i < len; ++i, ++fc)
  351. {
  352. f = buffer[(int)((int)(x + 0.5) + (int)(y + 0.5) * txtBr)];
  353. if (alpha[alphaAnzahl])
  354. {
  355. unsigned char* cf = (unsigned char*)&f;
  356. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  357. * (cf[3] - alpha[alphaAnzahl]));
  358. }
  359. alphaPixelP3D(*fc, f);
  360. x += txo, y += tyo;
  361. }
  362. }
  363. else
  364. {
  365. for (int i = 0; i < len; ++i, ++fc)
  366. {
  367. f = buffer[(int)((int)(x + 0.5) + (int)(y + 0.5) * txtBr)];
  368. if (alpha[alphaAnzahl])
  369. {
  370. unsigned char* cf = (unsigned char*)&f;
  371. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  372. * (cf[3] - alpha[alphaAnzahl]));
  373. }
  374. alphaPixelP(*fc, f);
  375. x += txo, y += tyo;
  376. }
  377. }
  378. rend = 1;
  379. }
  380. // nicht constant
  381. // Prüft ob ein Rechteck vollständig oder teilweise in der Zeichen Fläche liegt.
  382. // return 0, falls das Rechteck nicht in der Zeichenfläche liegt, 1 sonst
  383. bool Bild::isAreaDrawable(int x, int y, int b, int h)
  384. {
  385. int dpx = dPosA[doa].x;
  386. int dpy = dPosA[doa].y;
  387. int dgx = dSizeA[doa].x;
  388. int dgy = dSizeA[doa].y;
  389. x += drawOff[doa].x;
  390. y += drawOff[doa].y;
  391. if (x + b < dpx || y + h < dpy || x > dgx || y > dgy) return 0;
  392. return 1;
  393. }
  394. // Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die vorheriege
  395. // Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert. Das ist sinnvoll für
  396. // die Verwendung im 3DBildschirm, wo das Gezeichnette Bild später mittels Alpha
  397. // Blending angezeigt wird
  398. void Bild::setAlpha3D(bool erlaubt)
  399. {
  400. alpha3D = erlaubt;
  401. }
  402. void Bild::setAlpha(
  403. unsigned char alpha) // setzt die Transparenz der nachfolgenden Zeichnunge
  404. {
  405. int last = this->alpha[alphaAnzahl];
  406. ++alphaAnzahl;
  407. assert(alphaAnzahl < 1000);
  408. this->alpha[alphaAnzahl]
  409. = (unsigned char)((255 - alpha) > last ? (255 - alpha) : last);
  410. }
  411. void Bild::releaseAlpha() // Löscht alpha
  412. {
  413. --alphaAnzahl;
  414. }
  415. void Bild::setPixelBuffer(int* buffer,
  416. bool deleteBuffer,
  417. int breite,
  418. int height) // setzt den Zeiger auf die Pixel des Bildes
  419. {
  420. if (delFc) delete[] fc;
  421. fc = buffer;
  422. delFc = deleteBuffer;
  423. size.x = breite;
  424. size.y = height;
  425. drawOff[0].x = 0;
  426. drawOff[0].y = 0;
  427. dPosA[0].x = 0;
  428. dPosA[0].y = 0;
  429. dSizeA[0] = size;
  430. alphaAnzahl = 0;
  431. alpha[0] = 0;
  432. doa = 0;
  433. rend = 1;
  434. }
  435. void Bild::neuBild(int breite, int height, int fillColor)
  436. {
  437. if (fc && delFc) delete[] fc;
  438. size.x = breite;
  439. size.y = height;
  440. fc = new int[size.x * size.y];
  441. setFarbe(fillColor);
  442. drawOff[0].x = 0;
  443. drawOff[0].y = 0;
  444. dPosA[0].x = 0;
  445. dPosA[0].y = 0;
  446. dSizeA[0] = size;
  447. alphaAnzahl = 0;
  448. alpha[0] = 0;
  449. doa = 0;
  450. rend = 1;
  451. }
  452. void Bild::setFarbe(int f)
  453. {
  454. if ((f & 0xFF) == ((f >> 8) & 0xFF) && (f & 0xFF) == ((f >> 16) & 0xFF)
  455. && (f & 0xFF) == ((f >> 24) & 0xFF))
  456. memset(fc, f, size.x * size.y * 4);
  457. else
  458. {
  459. for (int *i = fc, *end = i + size.x * size.y; i < end; i++)
  460. *i = f;
  461. }
  462. rend = 1;
  463. }
  464. void Bild::fillRegion(int x, int y, int b, int h, int ff)
  465. {
  466. if (alpha[alphaAnzahl] == 0xFF) return;
  467. if (alpha[alphaAnzahl])
  468. {
  469. alphaRegion(x, y, b, h, ff);
  470. return;
  471. }
  472. int dpx = dPosA[doa].x;
  473. int dpy = dPosA[doa].y;
  474. int dgx = dSizeA[doa].x;
  475. int dgy = dSizeA[doa].y;
  476. x += drawOff[doa].x;
  477. y += drawOff[doa].y;
  478. if (x + b < dpx || y + h < dpy || x > dgx || y > dgy) return;
  479. if (x < dpx)
  480. {
  481. b -= dpx - x;
  482. x = dpx;
  483. }
  484. if (y < dpy)
  485. {
  486. h -= dpy - y;
  487. y = dpy;
  488. }
  489. b = (x + b) >= dgx ? (dgx - x) : b;
  490. h = (y + h) >= dgy ? (dgy - y) : h;
  491. int* pixel = fc + y * size.x + x;
  492. int* rowEnd = pixel + b;
  493. for (int i = 0; i < h; pixel += size.x - b, ++i, rowEnd += size.x)
  494. {
  495. for (; pixel < rowEnd; ++pixel)
  496. *pixel = ff;
  497. }
  498. rend = 1;
  499. }
  500. void Bild::alphaRegion(int x, int y, int b, int h, int ff)
  501. {
  502. if (alpha[alphaAnzahl] == 0xFF) return;
  503. int dpx = dPosA[doa].x;
  504. int dpy = dPosA[doa].y;
  505. int dgx = dSizeA[doa].x;
  506. int dgy = dSizeA[doa].y;
  507. x += drawOff[doa].x;
  508. y += drawOff[doa].y;
  509. if (x + b < dpx || y + h < dpy || x > dgx || y > dgy) return;
  510. if (x < dpx)
  511. {
  512. b -= dpx - x;
  513. x = dpx;
  514. }
  515. if (y < dpy)
  516. {
  517. h -= dpy - y;
  518. y = dpy;
  519. }
  520. b = (x + b) >= dgx ? (dgx - x) : b;
  521. h = (y + h) >= dgy ? (dgy - y) : h;
  522. if (alpha[alphaAnzahl])
  523. {
  524. unsigned char* cf = (unsigned char*)&ff;
  525. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  526. * (cf[3] - alpha[alphaAnzahl]));
  527. }
  528. int* pixel = fc + y * size.x + x;
  529. int* rowEnd = pixel + b;
  530. int alpha = ((ff >> 24) & 0xFF);
  531. int na = (0x100 - alpha);
  532. int i1 = (alpha * (ff & 0xFF00FF)) >> 8;
  533. int i2 = (alpha * (ff & 0x00FF00)) >> 8;
  534. if (alpha3D)
  535. {
  536. for (int i = 0; i < h; pixel += size.x - b, ++i, rowEnd += size.x)
  537. {
  538. for (; pixel < rowEnd; ++pixel)
  539. {
  540. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  541. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2)
  542. & 0x00FF00)
  543. | ((*pixel & 0xFF000000)))
  544. * (*pixel != 0)
  545. | (*pixel == 0) * ff;
  546. }
  547. }
  548. }
  549. else
  550. {
  551. for (int i = 0; i < h; pixel += size.x - b, ++i, rowEnd += size.x)
  552. {
  553. for (; pixel < rowEnd; ++pixel)
  554. {
  555. *pixel
  556. = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  557. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  558. | ((*pixel & 0xFF000000)));
  559. }
  560. }
  561. }
  562. rend = 1;
  563. }
  564. void Bild::alphaPixel2D(int i, int f)
  565. {
  566. if (!alpha[alphaAnzahl])
  567. alphaPixelP(fc[i], f);
  568. else
  569. {
  570. unsigned char* cf = (unsigned char*)&f;
  571. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  572. * (cf[3] - alpha[alphaAnzahl]));
  573. alphaPixelP(fc[i], f);
  574. rend = 1;
  575. }
  576. }
  577. void Bild::alphaPixel3D(int i, int f)
  578. {
  579. if (!alpha[alphaAnzahl])
  580. alphaPixelP3D(fc[i], f);
  581. else
  582. {
  583. unsigned char* cf = (unsigned char*)&f;
  584. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  585. * (cf[3] - alpha[alphaAnzahl]));
  586. alphaPixelP3D(fc[i], f);
  587. rend = 1;
  588. }
  589. }
  590. void Bild::alphaPixel2D(int x, int y, int f)
  591. {
  592. if (!alpha[alphaAnzahl]) alphaPixelP(fc[x + y * size.x], f);
  593. if (alpha[alphaAnzahl] < 0xFF)
  594. {
  595. unsigned char* cf = (unsigned char*)&f;
  596. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  597. * (cf[3] - alpha[alphaAnzahl]));
  598. alphaPixelP(fc[x + y * size.x], f);
  599. rend = 1;
  600. }
  601. }
  602. void Bild::alphaPixel3D(int x, int y, int f)
  603. {
  604. if (!alpha[alphaAnzahl]) alphaPixelP3D(fc[x + y * size.x], f);
  605. if (alpha[alphaAnzahl] < 0xFF)
  606. {
  607. unsigned char* cf = (unsigned char*)&f;
  608. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  609. * (cf[3] - alpha[alphaAnzahl]));
  610. alphaPixelP3D(fc[x + y * size.x], f);
  611. rend = 1;
  612. }
  613. }
  614. void Bild::alphaPixelDP2D(int x, int y, int f)
  615. {
  616. if (alpha[alphaAnzahl] == 0xFF) return;
  617. int dpx = dPosA[doa].x;
  618. int dpy = dPosA[doa].y;
  619. int dgx = dSizeA[doa].x;
  620. int dgy = dSizeA[doa].y;
  621. x += drawOff[doa].x;
  622. y += drawOff[doa].y;
  623. if (x < dpx || y < dpy || x > dgx || y > dgy) return;
  624. if (alpha[alphaAnzahl])
  625. {
  626. unsigned char* cf = (unsigned char*)&f;
  627. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  628. * (cf[3] - alpha[alphaAnzahl]));
  629. }
  630. alphaPixelP(fc[x + y * size.x], f);
  631. rend = 1;
  632. }
  633. void Bild::alphaPixelDP3D(int x, int y, int f)
  634. {
  635. if (alpha[alphaAnzahl] == 0xFF) return;
  636. int dpx = dPosA[doa].x;
  637. int dpy = dPosA[doa].y;
  638. int dgx = dSizeA[doa].x;
  639. int dgy = dSizeA[doa].y;
  640. x += drawOff[doa].x;
  641. y += drawOff[doa].y;
  642. if (x < dpx || y < dpy || x > dgx || y > dgy) return;
  643. if (alpha[alphaAnzahl])
  644. {
  645. unsigned char* cf = (unsigned char*)&f;
  646. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  647. * (cf[3] - alpha[alphaAnzahl]));
  648. }
  649. alphaPixelP3D(fc[x + y * size.x], f);
  650. rend = 1;
  651. }
  652. void Bild::alphaPixelDP2D(int i, int f)
  653. {
  654. int x = i % size.x;
  655. int y = i / size.x;
  656. alphaPixelDP2D(x, y, f);
  657. rend = 1;
  658. }
  659. void Bild::alphaPixelDP3D(int i, int f)
  660. {
  661. int x = i % size.x;
  662. int y = i / size.x;
  663. alphaPixelDP3D(x, y, f);
  664. rend = 1;
  665. }
  666. void Bild::setPixelDP(int x, int y, int f)
  667. {
  668. if (alpha[alphaAnzahl] == 0xFF) return;
  669. if (alpha[alphaAnzahl])
  670. {
  671. if (alpha3D)
  672. alphaPixelDP3D(x, y, f);
  673. else
  674. alphaPixelDP2D(x, y, f);
  675. return;
  676. }
  677. int dpx = dPosA[doa].x;
  678. int dpy = dPosA[doa].y;
  679. int dgx = dSizeA[doa].x;
  680. int dgy = dSizeA[doa].y;
  681. x += drawOff[doa].x;
  682. y += drawOff[doa].y;
  683. if (x < dpx || y < dpy || x > dgx || y > dgy) return;
  684. fc[x + y * size.x] = f;
  685. rend = 1;
  686. }
  687. void Bild::setPixelDP(int i, int f)
  688. {
  689. int x = i % size.x;
  690. int y = i / size.x;
  691. setPixelDP(x, y, f);
  692. rend = 1;
  693. }
  694. void Bild::drawLinieH(
  695. int x, int y, int len, int f) // zeichnet eine horizontale Linie
  696. {
  697. if (alpha[alphaAnzahl] == 0xFF) return;
  698. if (alpha[alphaAnzahl])
  699. {
  700. drawLinieHAlpha(x, y, len, f);
  701. return;
  702. }
  703. int dpx = dPosA[doa].x;
  704. int dpy = dPosA[doa].y;
  705. int dgx = dSizeA[doa].x;
  706. int dgy = dSizeA[doa].y;
  707. x += drawOff[doa].x;
  708. y += drawOff[doa].y;
  709. if (y < dpy || y >= dgy) return;
  710. if (x < dpx)
  711. {
  712. len -= dpx - x;
  713. if (len <= 0) return;
  714. x = dpx;
  715. }
  716. if (x + len >= dgx)
  717. {
  718. len -= x - dgx + len;
  719. if (len <= 0) return;
  720. }
  721. int br = size.x;
  722. int* fc = this->fc + x + y * br;
  723. int pval = len < 0 ? -1 : 1;
  724. len = len > 0 ? len : -len;
  725. for (int i = 0; i < len; ++i, fc += pval)
  726. *fc = f;
  727. rend = 1;
  728. }
  729. void Bild::drawLinieV(
  730. int x, int y, int len, int f) // zeichnet eine vertikale Linie
  731. {
  732. if (alpha[alphaAnzahl] == 0xFF) return;
  733. if (alpha[alphaAnzahl])
  734. {
  735. drawLinieVAlpha(x, y, len, f);
  736. return;
  737. }
  738. int dpx = dPosA[doa].x;
  739. int dpy = dPosA[doa].y;
  740. int dgx = dSizeA[doa].x;
  741. int dgy = dSizeA[doa].y;
  742. x += drawOff[doa].x;
  743. y += drawOff[doa].y;
  744. if (x < dpx || x >= dgx) return;
  745. if (y < dpy)
  746. {
  747. len -= dpy - y;
  748. if (len <= 0) return;
  749. y = dpy;
  750. }
  751. if (y + len >= dgy)
  752. {
  753. len -= y - dgy + len;
  754. if (len < 0) return;
  755. }
  756. int br = size.x;
  757. int* fc = this->fc + x + y * br;
  758. int pval = len < 0 ? -br : br;
  759. len = len > 0 ? len : -len;
  760. for (int i = 0; i < len; ++i, fc += pval)
  761. *fc = f;
  762. rend = 1;
  763. }
  764. void Bild::drawLinieHAlpha(
  765. int x, int y, int len, int f) // zeichnet eine horizontale Linie
  766. {
  767. if (alpha[alphaAnzahl] == 0xFF) return;
  768. int dpx = dPosA[doa].x;
  769. int dpy = dPosA[doa].y;
  770. int dgx = dSizeA[doa].x;
  771. int dgy = dSizeA[doa].y;
  772. x += drawOff[doa].x;
  773. y += drawOff[doa].y;
  774. if (y < dpy || y >= dgy) return;
  775. if (x < dpx)
  776. {
  777. len -= dpx - x;
  778. if (len <= 0) return;
  779. x = dpx;
  780. }
  781. if (x + len >= dgx)
  782. {
  783. len -= x - dgx + len;
  784. if (len <= 0) return;
  785. }
  786. int br = size.x;
  787. int pval = len < 0 ? -1 : 1;
  788. len = len > 0 ? len : -len;
  789. int end = 0;
  790. if (alpha[alphaAnzahl])
  791. {
  792. unsigned char* cf = (unsigned char*)&f;
  793. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  794. * (cf[3] - alpha[alphaAnzahl]));
  795. }
  796. int alpha = ((f >> 24) & 0xFF);
  797. int na = (0x100 - alpha);
  798. int i1 = (alpha * (f & 0xFF00FF)) >> 8;
  799. int i2 = (alpha * (f & 0x00FF00)) >> 8;
  800. for (int i = x + y * br; end < len; ++end, i += pval)
  801. {
  802. fc[i] = (((((na * (fc[i] & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  803. | ((((na * (fc[i] & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  804. | ((fc[i] & 0xFF000000)))
  805. * (fc[i] != 0 || !alpha3D)
  806. | (fc[i] == 0 && alpha3D) * f;
  807. }
  808. rend = 1;
  809. }
  810. void Bild::drawLinieVAlpha(
  811. int x, int y, int len, int f) // zeichnet eine vertikale Linie
  812. {
  813. if (alpha[alphaAnzahl] == 0xFF) return;
  814. int dpx = dPosA[doa].x;
  815. int dpy = dPosA[doa].y;
  816. int dgx = dSizeA[doa].x;
  817. int dgy = dSizeA[doa].y;
  818. x += drawOff[doa].x;
  819. y += drawOff[doa].y;
  820. if (x < dpx || x >= dgx) return;
  821. if (y < dpy)
  822. {
  823. len -= dpy - y;
  824. if (len <= 0) return;
  825. y = dpy;
  826. }
  827. if (y + len >= dgy)
  828. {
  829. len -= y - dgy + len;
  830. if (len < 0) return;
  831. }
  832. int br = size.x;
  833. int pval = len < 0 ? -br : br;
  834. len = len > 0 ? len : -len;
  835. int end = 0;
  836. if (alpha[alphaAnzahl])
  837. {
  838. unsigned char* cf = (unsigned char*)&f;
  839. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  840. * (cf[3] - alpha[alphaAnzahl]));
  841. }
  842. int alpha = ((f >> 24) & 0xFF);
  843. int na = (0x100 - alpha);
  844. int i1 = (alpha * (f & 0xFF00FF)) >> 8;
  845. int i2 = (alpha * (f & 0x00FF00)) >> 8;
  846. for (int i = x + y * br; end < len; ++end, i += pval)
  847. {
  848. fc[i] = (((((na * (fc[i] & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  849. | ((((na * (fc[i] & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  850. | (fc[i] & 0xFF000000))
  851. * (fc[i] != 0 || !alpha3D)
  852. | (fc[i] == 0 && alpha3D) * f;
  853. }
  854. rend = 1;
  855. }
  856. void Bild::drawLinieBordered(Punkt a, Punkt b, int bc, int fc)
  857. {
  858. if (alpha[alphaAnzahl] == 0xFF) return;
  859. if (alpha[alphaAnzahl])
  860. {
  861. drawLinieBorderedAlpha(a, b, bc, fc);
  862. return;
  863. }
  864. a += drawOff[doa];
  865. b += drawOff[doa];
  866. char outCode1 = getOutCode(a);
  867. char outCode2 = getOutCode(b);
  868. bool ok = 0;
  869. while (1)
  870. {
  871. int xMax = dSizeA[doa].x - 1;
  872. int yMax = dSizeA[doa].y - 1;
  873. if (!(outCode1 | outCode2))
  874. {
  875. ok = 1;
  876. break;
  877. }
  878. else if (outCode1 & outCode2)
  879. break;
  880. else
  881. {
  882. int x = 0, y = 0;
  883. char outCodeOut = outCode1 ? outCode1 : outCode2;
  884. if (outCodeOut & 8)
  885. {
  886. x = (int)(a.x + (b.x - a.x) * (yMax - a.y) / (b.y - a.y) + 0.5);
  887. y = yMax;
  888. }
  889. else if (outCodeOut & 4)
  890. {
  891. x = (int)(a.x + (b.x - a.x) * (dPosA[doa].y - a.y) / (b.y - a.y)
  892. + 0.5);
  893. y = dPosA[doa].y;
  894. }
  895. else if (outCodeOut & 2)
  896. {
  897. y = (int)(a.y + (b.y - a.y) * (xMax - a.x) / (b.x - a.x) + 0.5);
  898. x = xMax;
  899. }
  900. else if (outCodeOut & 1)
  901. {
  902. y = (int)(a.y + (b.y - a.y) * (dPosA[doa].x - a.x) / (b.x - a.x)
  903. + 0.5);
  904. x = dPosA[doa].x;
  905. }
  906. if (outCodeOut == outCode1)
  907. {
  908. a.x = x;
  909. a.y = y;
  910. outCode1 = getOutCode(a);
  911. }
  912. else
  913. {
  914. b.x = x;
  915. b.y = y;
  916. outCode2 = getOutCode(b);
  917. }
  918. }
  919. }
  920. if (ok)
  921. {
  922. int xlen = b.x - a.x, axlen = abs(xlen);
  923. int ylen = b.y - a.y, aylen = abs(ylen);
  924. double xf = (double)xlen / (aylen ? aylen : 1);
  925. double yf = (double)ylen / (axlen ? axlen : 1);
  926. if (axlen > aylen)
  927. xf = xf < 0 ? -1 : 1;
  928. else
  929. yf = yf < 0 ? -1 : 1;
  930. double x = (double)a.x, y = (double)a.y;
  931. int maxP = (int)(sqrt((float)(xlen * xlen + ylen * ylen)) + 0.5);
  932. int count = 0;
  933. int maxPixel = size.x * size.y;
  934. while (
  935. !((int)(x + 0.5) == b.x && (int)(y + 0.5) == b.y) && count < maxP)
  936. {
  937. ++count;
  938. this->fc[(int)((int)(x + 0.5) + (int)(y + 0.5) * size.x)] = fc;
  939. if ((int)((int)(x - 0.5) + (int)(y + 0.5) * size.x) < maxPixel
  940. && this->fc[(int)((int)(x - 0.5) + (int)(y + 0.5) * size.x)]
  941. != fc)
  942. this->fc[(int)((int)(x - 0.5) + (int)(y + 0.5) * size.x)] = bc;
  943. if ((int)((int)(x + 1.5) + (int)(y + 0.5) * size.x) < maxPixel
  944. && this->fc[(int)((int)(x + 1.5) + (int)(y + 0.5) * size.x)]
  945. != fc)
  946. this->fc[(int)((int)(x + 1.5) + (int)(y + 0.5) * size.x)] = bc;
  947. if ((int)((int)(x + 0.5) + (int)(y - 0.5) * size.x) < maxPixel
  948. && this->fc[(int)((int)(x + 0.5) + (int)(y - 0.5) * size.x)]
  949. != fc)
  950. this->fc[(int)((int)(x + 0.5) + (int)(y - 0.5) * size.x)] = bc;
  951. if ((int)((int)(x + 0.5) + (int)(y + 1.5) * size.x) < maxPixel
  952. && this->fc[(int)((int)(x + 0.5) + (int)(y + 1.5) * size.x)]
  953. != fc)
  954. this->fc[(int)((int)(x + 0.5) + (int)(y + 1.5) * size.x)] = bc;
  955. x += xf, y += yf;
  956. }
  957. rend = 1;
  958. }
  959. }
  960. void Bild::drawLinieBorderedAlpha(Punkt a, Punkt b, int bc, int fc)
  961. {
  962. if (alpha[alphaAnzahl] == 0xFF) return;
  963. a += drawOff[doa];
  964. b += drawOff[doa];
  965. char outCode1 = getOutCode(a);
  966. char outCode2 = getOutCode(b);
  967. bool ok = 0;
  968. while (1)
  969. {
  970. int xMax = dSizeA[doa].x - 1;
  971. int yMax = dSizeA[doa].y - 1;
  972. if (!(outCode1 | outCode2))
  973. {
  974. ok = 1;
  975. break;
  976. }
  977. else if (outCode1 & outCode2)
  978. break;
  979. else
  980. {
  981. int x = 0, y = 0;
  982. char outCodeOut = outCode1 ? outCode1 : outCode2;
  983. if (outCodeOut & 8)
  984. {
  985. x = (int)(a.x + (b.x - a.x) * (yMax - a.y) / (b.y - a.y) + 0.5);
  986. y = yMax;
  987. }
  988. else if (outCodeOut & 4)
  989. {
  990. x = (int)(a.x + (b.x - a.x) * (dPosA[doa].y - a.y) / (b.y - a.y)
  991. + 0.5);
  992. y = dPosA[doa].y;
  993. }
  994. else if (outCodeOut & 2)
  995. {
  996. y = (int)(a.y + (b.y - a.y) * (xMax - a.x) / (b.x - a.x) + 0.5);
  997. x = xMax;
  998. }
  999. else if (outCodeOut & 1)
  1000. {
  1001. y = (int)(a.y + (b.y - a.y) * (dPosA[doa].x - a.x) / (b.x - a.x)
  1002. + 0.5);
  1003. x = dPosA[doa].x;
  1004. }
  1005. if (outCodeOut == outCode1)
  1006. {
  1007. a.x = x;
  1008. a.y = y;
  1009. outCode1 = getOutCode(a);
  1010. }
  1011. else
  1012. {
  1013. b.x = x;
  1014. b.y = y;
  1015. outCode2 = getOutCode(b);
  1016. }
  1017. }
  1018. }
  1019. if (ok)
  1020. {
  1021. int xlen = b.x - a.x, axlen = abs(xlen);
  1022. int ylen = b.y - a.y, aylen = abs(ylen);
  1023. double xf = (double)xlen / (aylen ? aylen : 1);
  1024. double yf = (double)ylen / (axlen ? axlen : 1);
  1025. if (axlen > aylen)
  1026. xf = xf < 0 ? -1 : 1;
  1027. else
  1028. yf = yf < 0 ? -1 : 1;
  1029. double x = (double)a.x, y = (double)a.y;
  1030. if (alpha[alphaAnzahl])
  1031. {
  1032. unsigned char* cf = (unsigned char*)&fc;
  1033. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1034. * (cf[3] - alpha[alphaAnzahl]));
  1035. }
  1036. int maxP = (int)(sqrt((float)(xlen * xlen + ylen * ylen)) + 0.5);
  1037. int alpha = ((fc >> 24) & 0xFF);
  1038. int alpha2 = ((bc >> 24) & 0xFF);
  1039. int na = (0x100 - alpha);
  1040. int na2 = (0x100 - alpha2);
  1041. int i1 = (alpha * (fc & 0xFF00FF)) >> 8;
  1042. int i2 = (alpha * (fc & 0x00FF00)) >> 8;
  1043. int j1 = (alpha2 * (bc & 0xFF00FF)) >> 8;
  1044. int j2 = (alpha2 * (bc & 0x00FF00)) >> 8;
  1045. int count = 0;
  1046. int maxPixel = size.x * size.y;
  1047. while (
  1048. !((int)(x + 0.5) == b.x && (int)(y + 0.5) == b.y) && count < maxP)
  1049. {
  1050. ++count;
  1051. if ((int)((int)(x - 0.5) + (int)(y + 0.5) * size.x) < maxPixel)
  1052. {
  1053. int& pixel = this->fc[(int)(x - 0.5) + (int)(y + 0.5) * size.x];
  1054. pixel = (((((na2 * (pixel & 0xFF00FF)) >> 8) + j1) & 0xFF00FF)
  1055. | ((((na2 * (pixel & 0x00FF00)) >> 8) + j2)
  1056. & 0x00FF00)
  1057. | (pixel & 0xFF000000))
  1058. * (pixel != 0 || !alpha3D)
  1059. | (pixel == 0 && alpha3D) * bc;
  1060. }
  1061. if ((int)((int)(x + 1.5) + (int)(y + 0.5) * size.x) < maxPixel)
  1062. {
  1063. int& pixel = this->fc[(int)(x + 1.5) + (int)(y + 0.5) * size.x];
  1064. pixel = (((((na2 * (pixel & 0xFF00FF)) >> 8) + j1) & 0xFF00FF)
  1065. | ((((na2 * (pixel & 0x00FF00)) >> 8) + j2)
  1066. & 0x00FF00)
  1067. | (pixel & 0xFF000000))
  1068. * (pixel != 0 || !alpha3D)
  1069. | (pixel == 0 && alpha3D) * bc;
  1070. }
  1071. if ((int)((int)(x + 0.5) + (int)(y - 0.5) * size.x) < maxPixel)
  1072. {
  1073. int& pixel = this->fc[(int)(x + 0.5) + (int)(y - 0.5) * size.x];
  1074. pixel = (((((na2 * (pixel & 0xFF00FF)) >> 8) + j1) & 0xFF00FF)
  1075. | ((((na2 * (pixel & 0x00FF00)) >> 8) + j2)
  1076. & 0x00FF00)
  1077. | (pixel & 0xFF000000))
  1078. * (pixel != 0 || !alpha3D)
  1079. | (pixel == 0 && alpha3D) * bc;
  1080. }
  1081. if ((int)((int)(x + 0.5) + (int)(y + 1.5) * size.x) < maxPixel)
  1082. {
  1083. int& pixel = this->fc[(int)(x + 0.5) + (int)(y + 1.5) * size.x];
  1084. pixel = (((((na2 * (pixel & 0xFF00FF)) >> 8) + j1) & 0xFF00FF)
  1085. | ((((na2 * (pixel & 0x00FF00)) >> 8) + j2)
  1086. & 0x00FF00)
  1087. | (pixel & 0xFF000000))
  1088. * (pixel != 0 || !alpha3D)
  1089. | (pixel == 0 && alpha3D) * bc;
  1090. }
  1091. x += xf, y += yf;
  1092. }
  1093. count = 0;
  1094. while (
  1095. !((int)(x + 0.5) == b.x && (int)(y + 0.5) == b.y) && count < maxP)
  1096. {
  1097. ++count;
  1098. int& pixel = this->fc[(int)(x + 0.5) + (int)(y + 0.5) * size.x];
  1099. pixel = (((((na * (pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1100. | ((((na * (pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1101. | (pixel & 0xFF000000))
  1102. * (pixel != 0 || !alpha3D)
  1103. | (pixel == 0 && alpha3D) * fc;
  1104. x += xf, y += yf;
  1105. }
  1106. rend = 1;
  1107. }
  1108. }
  1109. void Bild::drawLinie(Punkt a,
  1110. Punkt b,
  1111. int fc) // zeichnet eine Linie von Punkt( x1, y1 ) nach Punke( x2, y2 )
  1112. {
  1113. if (alpha[alphaAnzahl] == 0xFF) return;
  1114. if (alpha[alphaAnzahl])
  1115. {
  1116. drawLinieAlpha(a, b, fc);
  1117. return;
  1118. }
  1119. a += drawOff[doa];
  1120. b += drawOff[doa];
  1121. char outCode1 = getOutCode(a);
  1122. char outCode2 = getOutCode(b);
  1123. bool ok = 0;
  1124. while (1)
  1125. {
  1126. int xMax = dSizeA[doa].x - 1;
  1127. int yMax = dSizeA[doa].y - 1;
  1128. if (!(outCode1 | outCode2))
  1129. {
  1130. ok = 1;
  1131. break;
  1132. }
  1133. else if (outCode1 & outCode2)
  1134. break;
  1135. else
  1136. {
  1137. int x = 0, y = 0;
  1138. char outCodeOut = outCode1 ? outCode1 : outCode2;
  1139. if (outCodeOut & 8)
  1140. {
  1141. x = (int)(a.x + (b.x - a.x) * (yMax - a.y) / (b.y - a.y) + 0.5);
  1142. y = yMax;
  1143. }
  1144. else if (outCodeOut & 4)
  1145. {
  1146. x = (int)(a.x + (b.x - a.x) * (dPosA[doa].y - a.y) / (b.y - a.y)
  1147. + 0.5);
  1148. y = dPosA[doa].y;
  1149. }
  1150. else if (outCodeOut & 2)
  1151. {
  1152. y = (int)(a.y + (b.y - a.y) * (xMax - a.x) / (b.x - a.x) + 0.5);
  1153. x = xMax;
  1154. }
  1155. else if (outCodeOut & 1)
  1156. {
  1157. y = (int)(a.y + (b.y - a.y) * (dPosA[doa].x - a.x) / (b.x - a.x)
  1158. + 0.5);
  1159. x = dPosA[doa].x;
  1160. }
  1161. if (outCodeOut == outCode1)
  1162. {
  1163. a.x = x;
  1164. a.y = y;
  1165. outCode1 = getOutCode(a);
  1166. }
  1167. else
  1168. {
  1169. b.x = x;
  1170. b.y = y;
  1171. outCode2 = getOutCode(b);
  1172. }
  1173. }
  1174. }
  1175. if (ok)
  1176. {
  1177. int xlen = b.x - a.x, axlen = abs(xlen);
  1178. int ylen = b.y - a.y, aylen = abs(ylen);
  1179. double xf = (double)xlen / (aylen ? aylen : 1);
  1180. double yf = (double)ylen / (axlen ? axlen : 1);
  1181. if (axlen > aylen)
  1182. xf = xf < 0 ? -1 : 1;
  1183. else
  1184. yf = yf < 0 ? -1 : 1;
  1185. double x = (double)a.x, y = (double)a.y;
  1186. int maxP = (int)(sqrt((float)(xlen * xlen + ylen * ylen)) + 0.5);
  1187. int count = 0;
  1188. while (
  1189. !((int)(x + 0.5) == b.x && (int)(y + 0.5) == b.y) && count < maxP)
  1190. {
  1191. ++count;
  1192. this->fc[(int)((int)(x + 0.5) + (int)(y + 0.5) * size.x)] = fc;
  1193. x += xf, y += yf;
  1194. }
  1195. this->fc[(int)((int)(x + 0.5) + (int)(y + 0.5) * size.x)] = fc;
  1196. rend = 1;
  1197. }
  1198. }
  1199. void Bild::drawLinieAlpha(Punkt a, Punkt b, int fc)
  1200. {
  1201. if (alpha[alphaAnzahl] == 0xFF) return;
  1202. a += drawOff[doa];
  1203. b += drawOff[doa];
  1204. char outCode1 = getOutCode(a);
  1205. char outCode2 = getOutCode(b);
  1206. bool ok = 0;
  1207. while (1)
  1208. {
  1209. int xMax = dSizeA[doa].x - 1;
  1210. int yMax = dSizeA[doa].y - 1;
  1211. if (!(outCode1 | outCode2))
  1212. {
  1213. ok = 1;
  1214. break;
  1215. }
  1216. else if (outCode1 & outCode2)
  1217. break;
  1218. else
  1219. {
  1220. int x = 0, y = 0;
  1221. char outCodeOut = outCode1 ? outCode1 : outCode2;
  1222. if (outCodeOut & 8)
  1223. {
  1224. x = (int)(a.x + (b.x - a.x) * (yMax - a.y) / (b.y - a.y) + 0.5);
  1225. y = yMax;
  1226. }
  1227. else if (outCodeOut & 4)
  1228. {
  1229. x = (int)(a.x + (b.x - a.x) * (dPosA[doa].y - a.y) / (b.y - a.y)
  1230. + 0.5);
  1231. y = dPosA[doa].y;
  1232. }
  1233. else if (outCodeOut & 2)
  1234. {
  1235. y = (int)(a.y + (b.y - a.y) * (xMax - a.x) / (b.x - a.x) + 0.5);
  1236. x = xMax;
  1237. }
  1238. else if (outCodeOut & 1)
  1239. {
  1240. y = (int)(a.y + (b.y - a.y) * (dPosA[doa].x - a.x) / (b.x - a.x)
  1241. + 0.5);
  1242. x = dPosA[doa].x;
  1243. }
  1244. if (outCodeOut == outCode1)
  1245. {
  1246. a.x = x;
  1247. a.y = y;
  1248. outCode1 = getOutCode(a);
  1249. }
  1250. else
  1251. {
  1252. b.x = x;
  1253. b.y = y;
  1254. outCode2 = getOutCode(b);
  1255. }
  1256. }
  1257. }
  1258. if (ok)
  1259. {
  1260. int xlen = b.x - a.x, axlen = abs(xlen);
  1261. int ylen = b.y - a.y, aylen = abs(ylen);
  1262. double xf = (double)xlen / (aylen ? aylen : 1);
  1263. double yf = (double)ylen / (axlen ? axlen : 1);
  1264. if (axlen > aylen)
  1265. xf = xf < 0 ? -1 : 1;
  1266. else
  1267. yf = yf < 0 ? -1 : 1;
  1268. double x = (double)a.x, y = (double)a.y;
  1269. if (alpha[alphaAnzahl])
  1270. {
  1271. unsigned char* cf = (unsigned char*)&fc;
  1272. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1273. * (cf[3] - alpha[alphaAnzahl]));
  1274. }
  1275. int maxP = (int)(sqrt((float)(xlen * xlen + ylen * ylen)) + 0.5);
  1276. int count = 0;
  1277. int alpha = ((fc >> 24) & 0xFF);
  1278. int na = (0x100 - alpha);
  1279. int i1 = (alpha * (fc & 0xFF00FF)) >> 8;
  1280. int i2 = (alpha * (fc & 0x00FF00)) >> 8;
  1281. while (
  1282. !((int)(x + 0.5) == b.x && (int)(y + 0.5) == b.y) && count < maxP)
  1283. {
  1284. ++count;
  1285. int& pixel = this->fc[(int)(x + 0.5) + (int)(y + 0.5) * size.x];
  1286. pixel = (((((na * (pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1287. | ((((na * (pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1288. | (pixel & 0xFF000000))
  1289. * (pixel != 0 || !alpha3D)
  1290. | (pixel == 0 && alpha3D) * fc;
  1291. x += xf, y += yf;
  1292. }
  1293. int& pixel = this->fc[(int)(x + 0.5) + (int)(y + 0.5) * size.x];
  1294. pixel = (((((na * (pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1295. | ((((na * (pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1296. | (pixel & 0xFF000000))
  1297. * (pixel != 0 || !alpha3D)
  1298. | (pixel == 0 && alpha3D) * fc;
  1299. rend = 1;
  1300. }
  1301. }
  1302. void Bild::fillCircle(int xOff,
  1303. int yOff,
  1304. int r,
  1305. int fc) // zeichnet einen Kreis um Punkt( xOff, yOff ) mit radius r
  1306. {
  1307. if (alpha[alphaAnzahl] == 0xFF) return;
  1308. for (int i = r; i > 0; i--)
  1309. drawKreis(xOff, yOff, i, fc);
  1310. }
  1311. void Bild::drawKreis(int xOff,
  1312. int yOff,
  1313. int r,
  1314. int fc) // zeichnet einen Kreis um Punkt( xOff, yOff ) mit radius r
  1315. {
  1316. if (alpha[alphaAnzahl] == 0xFF) return;
  1317. if (alpha[alphaAnzahl])
  1318. {
  1319. drawKreisAlpha(xOff, yOff, r, fc);
  1320. return;
  1321. }
  1322. int dpx = dPosA[doa].x;
  1323. int dpy = dPosA[doa].y;
  1324. int dgx = dSizeA[doa].x;
  1325. int dgy = dSizeA[doa].y;
  1326. xOff += drawOff[doa].x;
  1327. yOff += drawOff[doa].y;
  1328. if (xOff + r < dpx || xOff - r >= dgx || yOff + r < dpy || yOff - r >= dgy)
  1329. return;
  1330. for (int a = 0; a < r; ++a)
  1331. {
  1332. int b = (int)(sqrt((float)(long)(r * r - a * a)) + 0.5);
  1333. if (xOff + a < dgx && xOff + a > dpx && yOff + b < dgy
  1334. && yOff + b > dpy)
  1335. this->fc[xOff + a + (yOff + b) * size.x] = fc;
  1336. if (xOff - a < dgx && xOff - a > dpx && yOff + b < dgy
  1337. && yOff + b > dpy)
  1338. this->fc[xOff - a + (yOff + b) * size.x] = fc;
  1339. if (xOff + a < dgx && xOff + a > dpx && yOff - b < dgy
  1340. && yOff - b > dpy)
  1341. this->fc[xOff + a + (yOff - b) * size.x] = fc;
  1342. if (xOff - a < dgx && xOff - a > dpx && yOff - b < dgy
  1343. && yOff - b > dpy)
  1344. this->fc[xOff - a + (yOff - b) * size.x] = fc;
  1345. if (xOff + b < dgx && xOff + b > dpx && yOff + a < dgy
  1346. && yOff + a > dpy)
  1347. this->fc[xOff + b + (yOff + a) * size.x] = fc;
  1348. if (xOff - b < dgx && xOff - b > dpx && yOff + a < dgy
  1349. && yOff + a > dpy)
  1350. this->fc[xOff - b + (yOff + a) * size.x] = fc;
  1351. if (xOff + b < dgx && xOff + b > dpx && yOff - a < dgy
  1352. && yOff - a > dpy)
  1353. this->fc[xOff + b + (yOff - a) * size.x] = fc;
  1354. if (xOff - b < dgx && xOff - b > dpx && yOff - a < dgy
  1355. && yOff - a > dpy)
  1356. this->fc[xOff - b + (yOff - a) * size.x] = fc;
  1357. }
  1358. rend = 1;
  1359. }
  1360. void Bild::drawKreisAlpha(int xOff, int yOff, int r, int fc)
  1361. {
  1362. if (alpha[alphaAnzahl] == 0xFF) return;
  1363. int dpx = dPosA[doa].x;
  1364. int dpy = dPosA[doa].y;
  1365. int dgx = dSizeA[doa].x;
  1366. int dgy = dSizeA[doa].y;
  1367. xOff += drawOff[doa].x;
  1368. yOff += drawOff[doa].y;
  1369. if (xOff + r < dpx || xOff - r >= dgx || yOff + r < dpy || yOff - r >= dgy)
  1370. return;
  1371. if (alpha[alphaAnzahl] < 0xFF)
  1372. {
  1373. unsigned char* cf = (unsigned char*)&fc;
  1374. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1375. * (cf[3] - alpha[alphaAnzahl]));
  1376. }
  1377. int alpha = ((fc >> 24) & 0xFF);
  1378. int na = (0x100 - alpha);
  1379. int i1 = (alpha * (fc & 0xFF00FF)) >> 8;
  1380. int i2 = (alpha * (fc & 0x00FF00)) >> 8;
  1381. for (int a = 0; a < r; ++a)
  1382. {
  1383. int b = (int)(sqrt((float)(long)(r * r - a * a)) + 0.5);
  1384. int* pixel = 0;
  1385. if (xOff + a < dgx && xOff + a > dpx && yOff + b < dgy
  1386. && yOff + b > dpy)
  1387. {
  1388. pixel = &this->fc[xOff + a + (yOff + b) * size.x];
  1389. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1390. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1391. | (*pixel & 0xFF000000))
  1392. * (*pixel != 0 || !alpha3D)
  1393. | (*pixel == 0 && alpha3D) * fc;
  1394. }
  1395. if (xOff - a < dgx && xOff - a > dpx && yOff + b < dgy
  1396. && yOff + b > dpy)
  1397. {
  1398. pixel = &this->fc[xOff - a + (yOff + b) * size.x];
  1399. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1400. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1401. | (*pixel & 0xFF000000))
  1402. * (*pixel != 0 || !alpha3D)
  1403. | (*pixel == 0 && alpha3D) * fc;
  1404. }
  1405. if (xOff + a < dgx && xOff + a > dpx && yOff - b < dgy
  1406. && yOff - b > dpy)
  1407. {
  1408. pixel = &this->fc[xOff + a + (yOff - b) * size.x];
  1409. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1410. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1411. | (*pixel & 0xFF000000))
  1412. * (*pixel != 0 || !alpha3D)
  1413. | (*pixel == 0 && alpha3D) * fc;
  1414. }
  1415. if (xOff - a < dgx && xOff - a > dpx && yOff - b < dgy
  1416. && yOff - b > dpy)
  1417. {
  1418. pixel = &this->fc[xOff - a + (yOff - b) * size.x];
  1419. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1420. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1421. | (*pixel & 0xFF000000))
  1422. * (*pixel != 0 || !alpha3D)
  1423. | (*pixel == 0 && alpha3D) * fc;
  1424. }
  1425. if (xOff + b < dgx && xOff + b > dpx && yOff + a < dgy
  1426. && yOff + a > dpy)
  1427. {
  1428. pixel = &this->fc[xOff + b + (yOff + a) * size.x];
  1429. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1430. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1431. | (*pixel & 0xFF000000))
  1432. * (*pixel != 0 || !alpha3D)
  1433. | (*pixel == 0 && alpha3D) * fc;
  1434. }
  1435. if (xOff - b < dgx && xOff - b > dpx && yOff + a < dgy
  1436. && yOff + a > dpy)
  1437. {
  1438. pixel = &this->fc[xOff - b + (yOff + a) * size.x];
  1439. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1440. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1441. | (*pixel & 0xFF000000))
  1442. * (*pixel != 0 || !alpha3D)
  1443. | (*pixel == 0 && alpha3D) * fc;
  1444. }
  1445. if (xOff + b < dgx && xOff + b > dpx && yOff - a < dgy
  1446. && yOff - a > dpy)
  1447. {
  1448. pixel = &this->fc[xOff + b + (yOff - a) * size.x];
  1449. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1450. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1451. | (*pixel & 0xFF000000))
  1452. * (*pixel != 0 || !alpha3D)
  1453. | (*pixel == 0 && alpha3D) * fc;
  1454. }
  1455. if (xOff - b < dgx && xOff - b > dpx && yOff - a < dgy
  1456. && yOff - a > dpy)
  1457. {
  1458. pixel = &this->fc[xOff - b + (yOff - a) * size.x];
  1459. *pixel = (((((na * (*pixel & 0xFF00FF)) >> 8) + i1) & 0xFF00FF)
  1460. | ((((na * (*pixel & 0x00FF00)) >> 8) + i2) & 0x00FF00)
  1461. | (*pixel & 0xFF000000))
  1462. * (*pixel != 0 || !alpha3D)
  1463. | (*pixel == 0 && alpha3D) * fc;
  1464. }
  1465. }
  1466. rend = 1;
  1467. }
  1468. void Bild::drawBild(
  1469. int x, int y, int br, int hi, const Bild& zBild) // zeichet zBild
  1470. {
  1471. if (alpha[alphaAnzahl] == 0xFF) return;
  1472. if (alpha[alphaAnzahl])
  1473. {
  1474. alphaBild(x, y, br, hi, zBild);
  1475. return;
  1476. }
  1477. int dpx = dPosA[doa].x;
  1478. int dpy = dPosA[doa].y;
  1479. int dgx = dSizeA[doa].x;
  1480. int dgy = dSizeA[doa].y;
  1481. x += drawOff[doa].x;
  1482. y += drawOff[doa].y;
  1483. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  1484. br = minInt(br, zBild.getBreite());
  1485. hi = minInt(hi, zBild.getHeight());
  1486. int xst = maxInt(dpx - x, 0);
  1487. int yst = maxInt(dpy - y, 0);
  1488. int xst2 = maxInt(x, dpx);
  1489. int yst2 = maxInt(y, dpy);
  1490. dgx = minInt(x + br, dgx);
  1491. dgy = minInt(y + hi, dgy);
  1492. int bb = zBild.getBreite();
  1493. int* ff = zBild.getBuffer();
  1494. int xx, ygr, ygr2;
  1495. for (int yy = yst2; yy < dgy; ++yy)
  1496. {
  1497. ygr = yy * size.x;
  1498. ygr2 = (yy - yst2 + yst) * bb;
  1499. for (xx = xst2; xx < dgx; ++xx)
  1500. fc[xx + ygr] = ff[(xx - xst2 + xst) + ygr2];
  1501. }
  1502. rend = 1;
  1503. }
  1504. void Bild::alphaBildAssoz(int x, int y, int br, int hi, const Bild& zBild)
  1505. {
  1506. if (alpha[alphaAnzahl] == 0xFF) return;
  1507. int dpx = dPosA[doa].x;
  1508. int dpy = dPosA[doa].y;
  1509. int dgx = dSizeA[doa].x;
  1510. int dgy = dSizeA[doa].y;
  1511. x += drawOff[doa].x;
  1512. y += drawOff[doa].y;
  1513. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  1514. br = minInt(br, zBild.getBreite());
  1515. hi = minInt(hi, zBild.getHeight());
  1516. int xst = maxInt(dpx - x, 0);
  1517. int yst = maxInt(dpy - y, 0);
  1518. int xst2 = maxInt(x, dpx);
  1519. int yst2 = maxInt(y, dpy);
  1520. dgx = minInt(x + br, dgx);
  1521. dgy = minInt(y + hi, dgy);
  1522. int bb = zBild.getBreite();
  1523. int* ff = zBild.getBuffer();
  1524. if (!alpha[alphaAnzahl])
  1525. {
  1526. int xx, ygr, ygr2;
  1527. for (int yy = yst2; yy < dgy; ++yy)
  1528. {
  1529. ygr = yy * size.x;
  1530. ygr2 = (yy - yst2 + yst) * bb;
  1531. for (xx = xst2; xx < dgx; ++xx)
  1532. alphaPixelAssozP(fc[xx + ygr], ff[(xx - xst2 + xst) + ygr2]);
  1533. }
  1534. }
  1535. else
  1536. {
  1537. int xx, ygr, ygr2;
  1538. for (int yy = yst2; yy < dgy; ++yy)
  1539. {
  1540. ygr = yy * size.x;
  1541. ygr2 = (yy - yst2 + yst) * bb;
  1542. for (xx = xst2; xx < dgx; ++xx)
  1543. {
  1544. int fc = ff[(xx - xst2 + xst) + ygr2];
  1545. unsigned char* cf = (unsigned char*)&fc;
  1546. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1547. * (cf[3] - alpha[alphaAnzahl]));
  1548. alphaPixelAssozP(this->fc[xx + ygr], fc);
  1549. }
  1550. }
  1551. }
  1552. rend = 1;
  1553. }
  1554. void Bild::alphaBild(int x, int y, int br, int hi, const Bild& zBild)
  1555. {
  1556. if (alpha[alphaAnzahl] == 0xFF) return;
  1557. int dpx = dPosA[doa].x;
  1558. int dpy = dPosA[doa].y;
  1559. int dgx = dSizeA[doa].x;
  1560. int dgy = dSizeA[doa].y;
  1561. x += drawOff[doa].x;
  1562. y += drawOff[doa].y;
  1563. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  1564. br = minInt(br, zBild.getBreite());
  1565. hi = minInt(hi, zBild.getHeight());
  1566. int xst = maxInt(dpx - x, 0);
  1567. int yst = maxInt(dpy - y, 0);
  1568. int xst2 = maxInt(x, dpx);
  1569. int yst2 = maxInt(y, dpy);
  1570. dgx = minInt(x + br, dgx);
  1571. dgy = minInt(y + hi, dgy);
  1572. int bb = zBild.getBreite();
  1573. int* ff = zBild.getBuffer();
  1574. if (!alpha[alphaAnzahl])
  1575. {
  1576. int xx, ygr, ygr2;
  1577. if (alpha3D)
  1578. {
  1579. for (int yy = yst2; yy < dgy; ++yy)
  1580. {
  1581. ygr = yy * size.x;
  1582. ygr2 = (yy - yst2 + yst) * bb;
  1583. int fci = xst2 + ygr;
  1584. int ffi = xst + ygr2;
  1585. for (xx = xst2; xx < dgx; ++xx, ++fci, ++ffi)
  1586. alphaPixelP3D(fc[fci], ff[ffi]);
  1587. }
  1588. }
  1589. else
  1590. {
  1591. for (int yy = yst2; yy < dgy; ++yy)
  1592. {
  1593. ygr = yy * size.x;
  1594. ygr2 = (yy - yst2 + yst) * bb;
  1595. int fci = xst2 + ygr;
  1596. int ffi = xst + ygr2;
  1597. for (xx = xst2; xx < dgx; ++xx, ++fci, ++ffi)
  1598. alphaPixelP(fc[fci], ff[ffi]);
  1599. }
  1600. }
  1601. }
  1602. else
  1603. {
  1604. int xx, ygr, ygr2;
  1605. if (alpha3D)
  1606. {
  1607. for (int yy = yst2; yy < dgy; ++yy)
  1608. {
  1609. ygr = yy * size.x;
  1610. ygr2 = (yy - yst2 + yst) * bb;
  1611. for (xx = xst2; xx < dgx; ++xx)
  1612. {
  1613. int fc = ff[(xx - xst2 + xst) + ygr2];
  1614. unsigned char* cf = (unsigned char*)&fc;
  1615. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1616. * (cf[3] - alpha[alphaAnzahl]));
  1617. alphaPixelP(this->fc[xx + ygr], fc);
  1618. }
  1619. }
  1620. }
  1621. else
  1622. {
  1623. for (int yy = yst2; yy < dgy; ++yy)
  1624. {
  1625. ygr = yy * size.x;
  1626. ygr2 = (yy - yst2 + yst) * bb;
  1627. for (xx = xst2; xx < dgx; ++xx)
  1628. {
  1629. int fc = ff[(xx - xst2 + xst) + ygr2];
  1630. unsigned char* cf = (unsigned char*)&fc;
  1631. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1632. * (cf[3] - alpha[alphaAnzahl]));
  1633. alphaPixelP3D(this->fc[xx + ygr], fc);
  1634. }
  1635. }
  1636. }
  1637. }
  1638. rend = 1;
  1639. }
  1640. void Bild::drawBild90(int x,
  1641. int y,
  1642. int br,
  1643. int hi,
  1644. const Bild& zBild) // Zeichnet ein um 90 Grad nach rchts gedrehtes Bild
  1645. {
  1646. if (alpha[alphaAnzahl] == 0xFF) return;
  1647. if (alpha[alphaAnzahl])
  1648. {
  1649. alphaBild90(x, y, br, hi, zBild);
  1650. return;
  1651. }
  1652. int dpx = dPosA[doa].x;
  1653. int dpy = dPosA[doa].y;
  1654. int dgx = dSizeA[doa].x;
  1655. int dgy = dSizeA[doa].y;
  1656. x += drawOff[doa].x;
  1657. y += drawOff[doa].y;
  1658. if (x + hi < dpx || y + br < dpy || x > dgx || y > dgy) return;
  1659. br = minInt(br, zBild.getHeight());
  1660. hi = minInt(hi, zBild.getBreite());
  1661. int xst = maxInt(dpx - x, 0);
  1662. int yst = maxInt(dpy - y, 0);
  1663. int xst2 = maxInt(x, dpx);
  1664. int yst2 = maxInt(y, dpy);
  1665. dgx = minInt(x + br, dgx);
  1666. dgy = minInt(y + hi, dgy);
  1667. int bb = zBild.getBreite();
  1668. int* ff = zBild.getBuffer();
  1669. int yy, xbb;
  1670. for (int xx = xst2; xx < dgx; ++xx)
  1671. {
  1672. xbb = (zBild.getHeight() - (xx - xst2 + xst + 1)) * bb;
  1673. for (yy = yst2; yy < dgy; ++yy)
  1674. fc[xx + yy * size.x] = ff[(yy - yst2 + yst) + xbb];
  1675. }
  1676. rend = 1;
  1677. }
  1678. void Bild::alphaBild90(int x, int y, int br, int hi, const Bild& zBild)
  1679. {
  1680. if (alpha[alphaAnzahl] == 0xFF) return;
  1681. int dpx = dPosA[doa].x;
  1682. int dpy = dPosA[doa].y;
  1683. int dgx = dSizeA[doa].x;
  1684. int dgy = dSizeA[doa].y;
  1685. x += drawOff[doa].x;
  1686. y += drawOff[doa].y;
  1687. if (x + hi < dpx || y + br < dpy || x > dgx || y > dgy) return;
  1688. br = minInt(br, zBild.getHeight());
  1689. hi = minInt(hi, zBild.getBreite());
  1690. int xst = maxInt(dpx - x, 0);
  1691. int yst = maxInt(dpy - y, 0);
  1692. int xst2 = maxInt(x, dpx);
  1693. int yst2 = maxInt(y, dpy);
  1694. dgx = minInt(x + br, dgx);
  1695. dgy = minInt(y + hi, dgy);
  1696. int bb = zBild.getBreite();
  1697. int* ff = zBild.getBuffer();
  1698. if (!alpha[alphaAnzahl])
  1699. {
  1700. int yy, xbb;
  1701. if (alpha3D)
  1702. {
  1703. for (int xx = xst2; xx < dgx; ++xx)
  1704. {
  1705. xbb = (zBild.getHeight() - (xx - xst2 + xst + 1)) * bb;
  1706. for (yy = yst2; yy < dgy; ++yy)
  1707. alphaPixelP3D(xx, yy, ff[(yy - yst2 + yst) + xbb]);
  1708. }
  1709. }
  1710. else
  1711. {
  1712. for (int xx = xst2; xx < dgx; ++xx)
  1713. {
  1714. xbb = (zBild.getHeight() - (xx - xst2 + xst + 1)) * bb;
  1715. for (yy = yst2; yy < dgy; ++yy)
  1716. alphaPixelP(xx, yy, ff[(yy - yst2 + yst) + xbb]);
  1717. }
  1718. }
  1719. }
  1720. else
  1721. {
  1722. int yy, xbb;
  1723. if (alpha3D)
  1724. {
  1725. for (int xx = xst2; xx < dgx; ++xx)
  1726. {
  1727. xbb = (zBild.getHeight() - (xx - xst2 + xst + 1)) * bb;
  1728. for (yy = yst2; yy < dgy; ++yy)
  1729. {
  1730. int fc = ff[(yy - yst2 + yst) + xbb];
  1731. unsigned char* cf = (unsigned char*)&fc;
  1732. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1733. * (cf[3] - alpha[alphaAnzahl]));
  1734. alphaPixelP3D(xx, yy, fc);
  1735. }
  1736. }
  1737. }
  1738. else
  1739. {
  1740. for (int xx = xst2; xx < dgx; ++xx)
  1741. {
  1742. xbb = (zBild.getHeight() - (xx - xst2 + xst + 1)) * bb;
  1743. for (yy = yst2; yy < dgy; ++yy)
  1744. {
  1745. int fc = ff[(yy - yst2 + yst) + xbb];
  1746. unsigned char* cf = (unsigned char*)&fc;
  1747. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1748. * (cf[3] - alpha[alphaAnzahl]));
  1749. alphaPixelP(xx, yy, fc);
  1750. }
  1751. }
  1752. }
  1753. }
  1754. rend = 1;
  1755. }
  1756. void Bild::drawBild180(int x,
  1757. int y,
  1758. int br,
  1759. int hi,
  1760. const Bild& zBild) // Zeichnet ein um 180 Grad nach rchts gedrehtes Bild
  1761. {
  1762. if (alpha[alphaAnzahl] == 0xFF) return;
  1763. if (alpha[alphaAnzahl])
  1764. {
  1765. alphaBild180(x, y, br, hi, zBild);
  1766. return;
  1767. }
  1768. int dpx = dPosA[doa].x;
  1769. int dpy = dPosA[doa].y;
  1770. int dgx = dSizeA[doa].x;
  1771. int dgy = dSizeA[doa].y;
  1772. x += drawOff[doa].x;
  1773. y += drawOff[doa].y;
  1774. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  1775. br = minInt(br, zBild.getBreite());
  1776. hi = minInt(hi, zBild.getHeight());
  1777. int xst = maxInt(dpx - x, 0);
  1778. int yst = maxInt(dpy - y, 0);
  1779. int xst2 = maxInt(x, dpx);
  1780. int yst2 = maxInt(y, dpy);
  1781. dgx = minInt(x + br, dgx);
  1782. dgy = minInt(y + hi, dgy);
  1783. int bb = zBild.getBreite();
  1784. int* ff = zBild.getBuffer();
  1785. int xx, ygr, ybb;
  1786. for (int yy = yst2; yy < dgy; ++yy)
  1787. {
  1788. ygr = yy * size.x;
  1789. ybb = (zBild.getHeight() - (yy - yst2 + yst + 1)) * bb;
  1790. for (xx = xst2; xx < dgx; ++xx)
  1791. fc[xx + ygr] = ff[(bb - (xx - xst2 + xst + 1)) + ybb];
  1792. }
  1793. rend = 1;
  1794. }
  1795. void Bild::alphaBild180(int x, int y, int br, int hi, const Bild& zBild)
  1796. {
  1797. if (alpha[alphaAnzahl] == 0xFF) return;
  1798. int dpx = dPosA[doa].x;
  1799. int dpy = dPosA[doa].y;
  1800. int dgx = dSizeA[doa].x;
  1801. int dgy = dSizeA[doa].y;
  1802. x += drawOff[doa].x;
  1803. y += drawOff[doa].y;
  1804. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  1805. br = minInt(br, zBild.getHeight());
  1806. hi = minInt(hi, zBild.getBreite());
  1807. int xst = maxInt(dpx - x, 0);
  1808. int yst = maxInt(dpy - y, 0);
  1809. int xst2 = maxInt(x, dpx);
  1810. int yst2 = maxInt(y, dpy);
  1811. dgx = minInt(x + br, dgx);
  1812. dgy = minInt(y + hi, dgy);
  1813. int bb = zBild.getBreite();
  1814. int* ff = zBild.getBuffer();
  1815. if (!alpha[alphaAnzahl])
  1816. {
  1817. int xx, ygr, ybb;
  1818. if (alpha3D)
  1819. {
  1820. for (int yy = yst2; yy < dgy; ++yy)
  1821. {
  1822. ygr = yy * size.x;
  1823. ybb = (zBild.getHeight() - (yy - yst2 + yst + 1)) * bb;
  1824. for (xx = xst2; xx < dgx; ++xx)
  1825. alphaPixelP3D(
  1826. fc[xx + ygr], ff[(bb - (xx - xst2 + xst + 1)) + ybb]);
  1827. }
  1828. }
  1829. else
  1830. {
  1831. for (int yy = yst2; yy < dgy; ++yy)
  1832. {
  1833. ygr = yy * size.x;
  1834. ybb = (zBild.getHeight() - (yy - yst2 + yst + 1)) * bb;
  1835. for (xx = xst2; xx < dgx; ++xx)
  1836. alphaPixelP(
  1837. fc[xx + ygr], ff[(bb - (xx - xst2 + xst + 1)) + ybb]);
  1838. }
  1839. }
  1840. }
  1841. else
  1842. {
  1843. int xx, ygr, ybb;
  1844. if (alpha3D)
  1845. {
  1846. for (int yy = yst2; yy < dgy; ++yy)
  1847. {
  1848. ygr = yy * size.x;
  1849. ybb = (zBild.getHeight() - (yy - yst2 + yst + 1)) * bb;
  1850. for (xx = xst2; xx < dgx; ++xx)
  1851. {
  1852. int fc = ff[(bb - (xx - xst2 + xst + 1)) + ybb];
  1853. unsigned char* cf = (unsigned char*)&fc;
  1854. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1855. * (cf[3] - alpha[alphaAnzahl]));
  1856. alphaPixelP3D(this->fc[xx + ygr], fc);
  1857. }
  1858. }
  1859. }
  1860. else
  1861. {
  1862. for (int yy = yst2; yy < dgy; ++yy)
  1863. {
  1864. ygr = yy * size.x;
  1865. ybb = (zBild.getHeight() - (yy - yst2 + yst + 1)) * bb;
  1866. for (xx = xst2; xx < dgx; ++xx)
  1867. {
  1868. int fc = ff[(bb - (xx - xst2 + xst + 1)) + ybb];
  1869. unsigned char* cf = (unsigned char*)&fc;
  1870. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1871. * (cf[3] - alpha[alphaAnzahl]));
  1872. alphaPixelP(this->fc[xx + ygr], fc);
  1873. }
  1874. }
  1875. }
  1876. }
  1877. rend = 1;
  1878. }
  1879. void Bild::drawBild270(int x,
  1880. int y,
  1881. int br,
  1882. int hi,
  1883. const Bild& zBild) // Zeichnet ein um 270 Grad nach rchts gedrehtes Bild
  1884. {
  1885. if (alpha[alphaAnzahl] == 0xFF) return;
  1886. if (alpha[alphaAnzahl])
  1887. {
  1888. alphaBild270(x, y, br, hi, zBild);
  1889. return;
  1890. }
  1891. int dpx = dPosA[doa].x;
  1892. int dpy = dPosA[doa].y;
  1893. int dgx = dSizeA[doa].x;
  1894. int dgy = dSizeA[doa].y;
  1895. x += drawOff[doa].x;
  1896. y += drawOff[doa].y;
  1897. if (x + hi < dpx || y + br < dpy || x > dgx || y > dgy) return;
  1898. br = minInt(br, zBild.getHeight());
  1899. hi = minInt(hi, zBild.getBreite());
  1900. int xst = maxInt(dpx - x, 0);
  1901. int yst = maxInt(dpy - y, 0);
  1902. int xst2 = maxInt(x, dpx);
  1903. int yst2 = maxInt(y, dpy);
  1904. dgx = minInt(x + br, dgx);
  1905. dgy = minInt(y + hi, dgy);
  1906. int bb = zBild.getBreite();
  1907. int* ff = zBild.getBuffer();
  1908. int yy, xbb;
  1909. for (int xx = xst2; xx < dgx; ++xx)
  1910. {
  1911. xbb = (xx - xst2 + xst) * bb;
  1912. for (yy = yst2; yy < dgy; ++yy)
  1913. fc[xx + yy * size.x] = ff[(bb - (yy - yst2 + yst + 1)) + xbb];
  1914. }
  1915. rend = 1;
  1916. }
  1917. void Bild::alphaBild270(int x, int y, int br, int hi, const Bild& zBild)
  1918. {
  1919. if (alpha[alphaAnzahl] == 0xFF) return;
  1920. int dpx = dPosA[doa].x;
  1921. int dpy = dPosA[doa].y;
  1922. int dgx = dSizeA[doa].x;
  1923. int dgy = dSizeA[doa].y;
  1924. x += drawOff[doa].x;
  1925. y += drawOff[doa].y;
  1926. if (x + hi < dpx || y + br < dpy || x > dgx || y > dgy) return;
  1927. br = minInt(br, zBild.getHeight());
  1928. hi = minInt(hi, zBild.getBreite());
  1929. int xst = maxInt(dpx - x, 0);
  1930. int yst = maxInt(dpy - y, 0);
  1931. int xst2 = maxInt(x, dpx);
  1932. int yst2 = maxInt(y, dpy);
  1933. dgx = minInt(x + br, dgx);
  1934. dgy = minInt(y + hi, dgy);
  1935. int bb = zBild.getBreite();
  1936. int* ff = zBild.getBuffer();
  1937. if (!alpha[alphaAnzahl])
  1938. {
  1939. int yy, xbb;
  1940. if (alpha3D)
  1941. {
  1942. for (int xx = xst2; xx < dgx; ++xx)
  1943. {
  1944. xbb = (xx - xst2 + xst) * bb;
  1945. for (yy = yst2; yy < dgy; ++yy)
  1946. alphaPixelP3D(
  1947. xx, yy, ff[(bb - (yy - yst2 + yst + 1)) + xbb]);
  1948. }
  1949. }
  1950. else
  1951. {
  1952. for (int xx = xst2; xx < dgx; ++xx)
  1953. {
  1954. xbb = (xx - xst2 + xst) * bb;
  1955. for (yy = yst2; yy < dgy; ++yy)
  1956. alphaPixelP(xx, yy, ff[(bb - (yy - yst2 + yst + 1)) + xbb]);
  1957. }
  1958. }
  1959. }
  1960. else
  1961. {
  1962. int yy, xbb;
  1963. if (alpha3D)
  1964. {
  1965. for (int xx = xst2; xx < dgx; ++xx)
  1966. {
  1967. xbb = (xx - xst2 + xst) * bb;
  1968. for (yy = yst2; yy < dgy; ++yy)
  1969. {
  1970. int fc = ff[(bb - (yy - yst2 + yst + 1)) + xbb];
  1971. unsigned char* cf = (unsigned char*)&fc;
  1972. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1973. * (cf[3] - alpha[alphaAnzahl]));
  1974. alphaPixelP3D(xx, yy, fc);
  1975. }
  1976. }
  1977. }
  1978. else
  1979. {
  1980. for (int xx = xst2; xx < dgx; ++xx)
  1981. {
  1982. xbb = (xx - xst2 + xst) * bb;
  1983. for (yy = yst2; yy < dgy; ++yy)
  1984. {
  1985. int fc = ff[(bb - (yy - yst2 + yst + 1)) + xbb];
  1986. unsigned char* cf = (unsigned char*)&fc;
  1987. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  1988. * (cf[3] - alpha[alphaAnzahl]));
  1989. alphaPixelP(xx, yy, fc);
  1990. }
  1991. }
  1992. }
  1993. }
  1994. rend = 1;
  1995. }
  1996. void Bild::drawBildSkall(
  1997. int x, int y, int br, int hi, const Bild& zBild) // zeichet zBild Skalliert
  1998. {
  1999. if (alpha[alphaAnzahl] == 0xFF) return;
  2000. if (alpha[alphaAnzahl])
  2001. {
  2002. alphaBildSkall(x, y, br, hi, zBild);
  2003. return;
  2004. }
  2005. int dpx = dPosA[doa].x;
  2006. int dpy = dPosA[doa].y;
  2007. int dgx = dSizeA[doa].x;
  2008. int dgy = dSizeA[doa].y;
  2009. x += drawOff[doa].x;
  2010. y += drawOff[doa].y;
  2011. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  2012. double xo = zBild.getBreite() / (double)br;
  2013. double yo = zBild.getHeight() / (double)hi;
  2014. int xst = maxInt(dpx - x, 0);
  2015. int yst = maxInt(dpy - y, 0);
  2016. int xst2 = maxInt(x, dpx);
  2017. int yst2 = maxInt(y, dpy);
  2018. dgx = minInt(x + br, dgx);
  2019. dgy = minInt(y + hi, dgy);
  2020. int bb = zBild.getBreite();
  2021. int* ff = zBild.getBuffer();
  2022. int xx, ygr, ygr2;
  2023. double xb = 0, yb = yst * yo;
  2024. for (int yy = yst2; yy < dgy; ++yy, yb += yo)
  2025. {
  2026. ygr = yy * size.x;
  2027. ygr2 = (int)((yy - yst2 + yst) * yo) * bb;
  2028. for (xx = xst2, xb = xst * xo; xx < dgx; ++xx, xb += xo)
  2029. fc[xx + ygr] = ff[(int)xb + ygr2];
  2030. }
  2031. rend = 1;
  2032. }
  2033. void Bild::alphaBildSkall(int x, int y, int br, int hi, const Bild& zBild)
  2034. {
  2035. if (alpha[alphaAnzahl] == 0xFF) return;
  2036. int dpx = dPosA[doa].x;
  2037. int dpy = dPosA[doa].y;
  2038. int dgx = dSizeA[doa].x;
  2039. int dgy = dSizeA[doa].y;
  2040. x += drawOff[doa].x;
  2041. y += drawOff[doa].y;
  2042. if (x + br < dpx || y + hi < dpy || x > dgx || y > dgy) return;
  2043. double xo = zBild.getBreite() / (double)br;
  2044. double yo = zBild.getHeight() / (double)hi;
  2045. int xst = maxInt(dpx - x, 0);
  2046. int yst = maxInt(dpy - y, 0);
  2047. int xst2 = maxInt(x, dpx);
  2048. int yst2 = maxInt(y, dpy);
  2049. dgx = minInt(x + br, dgx);
  2050. dgy = minInt(y + hi, dgy);
  2051. int bb = zBild.getBreite();
  2052. int* ff = zBild.getBuffer();
  2053. int xx, ygr, ygr2;
  2054. double xb = 0;
  2055. if (alpha3D)
  2056. {
  2057. for (int yy = yst2; yy < dgy; ++yy)
  2058. {
  2059. ygr = yy * size.x;
  2060. ygr2 = (int)((yy - yst2 + yst) * yo) * bb;
  2061. for (xx = xst2, xb = xst * xo; xx < dgx; ++xx, xb += xo)
  2062. {
  2063. int f = ff[(int)xb + ygr2];
  2064. unsigned char* cf = (unsigned char*)&f;
  2065. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  2066. * (cf[3] - alpha[alphaAnzahl]));
  2067. alphaPixelP3D(fc[xx + ygr], f);
  2068. }
  2069. }
  2070. }
  2071. else
  2072. {
  2073. for (int yy = yst2; yy < dgy; ++yy)
  2074. {
  2075. ygr = yy * size.x;
  2076. ygr2 = (int)((yy - yst2 + yst) * yo) * bb;
  2077. for (xx = xst2, xb = xst * xo; xx < dgx; ++xx, xb += xo)
  2078. {
  2079. int f = ff[(int)xb + ygr2];
  2080. unsigned char* cf = (unsigned char*)&f;
  2081. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  2082. * (cf[3] - alpha[alphaAnzahl]));
  2083. alphaPixelP(fc[xx + ygr], f);
  2084. }
  2085. }
  2086. }
  2087. rend = 1;
  2088. }
  2089. void Bild::drawDreieck(
  2090. Punkt a, Punkt b, Punkt c, int farbe) // füllt eine Dreieck aus
  2091. {
  2092. if (alpha[alphaAnzahl] == 0xFF) return;
  2093. if (alpha[alphaAnzahl])
  2094. {
  2095. drawDreieckAlpha(a, b, c, farbe);
  2096. return;
  2097. }
  2098. int dpx = dPosA[doa].x;
  2099. int dpy = dPosA[doa].y;
  2100. int dgx = dSizeA[doa].x;
  2101. int dgy = dSizeA[doa].y;
  2102. a += drawOff[doa];
  2103. b += drawOff[doa];
  2104. c += drawOff[doa];
  2105. if ((a.x < dpx && b.x < dpx && c.x < dpx)
  2106. || (a.y < dpy && b.y < dpy && c.y < dpy)
  2107. || (a.x > dgx && b.x > dgx && c.x > dgx)
  2108. || (a.y > dgy && b.y > dgy && c.y > dgy))
  2109. return;
  2110. if (b.y < a.y) a.Swap(b);
  2111. if (c.y < b.y) b.Swap(c);
  2112. if (b.y < a.y) a.Swap(b);
  2113. if (a.y == b.y)
  2114. {
  2115. if (b.x < a.x) a.Swap(b);
  2116. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2117. const float m3 = (float)(b.x - c.x) / (float)(b.y - c.y);
  2118. float b2 = (float)a.x - m2 * (float)a.y;
  2119. float b3 = (float)b.x - m3 * (float)b.y;
  2120. drawFlatDreieck(b.y, c.y, m2, b2, m3, b3, farbe);
  2121. }
  2122. else if (b.y == c.y)
  2123. {
  2124. if (c.x < b.x) b.Swap(c);
  2125. const float m1 = (float)(a.x - b.x) / (float)(a.y - b.y);
  2126. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2127. float b1 = (float)a.x - m1 * (float)a.y;
  2128. float b2 = (float)a.x - m2 * (float)a.y;
  2129. drawFlatDreieck(a.y, b.y, m1, b1, m2, b2, farbe);
  2130. }
  2131. else
  2132. {
  2133. const float m1 = (float)(a.x - b.x) / (float)(a.y - b.y);
  2134. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2135. const float m3 = (float)(b.x - c.x) / (float)(b.y - c.y);
  2136. float b1 = (float)a.x - m1 * (float)a.y;
  2137. float b2 = (float)a.x - m2 * (float)a.y;
  2138. float b3 = (float)b.x - m3 * (float)b.y;
  2139. const float qx = m2 * (float)b.y + b2;
  2140. if (qx < (float)b.x)
  2141. {
  2142. drawFlatDreieck(a.y, b.y, m2, b2, m1, b1, farbe);
  2143. drawFlatDreieck(b.y, c.y, m2, b2, m3, b3, farbe);
  2144. }
  2145. else
  2146. {
  2147. drawFlatDreieck(a.y, b.y, m1, b1, m2, b2, farbe);
  2148. drawFlatDreieck(b.y, c.y, m3, b3, m2, b2, farbe);
  2149. }
  2150. }
  2151. rend = 1;
  2152. }
  2153. void Bild::drawDreieckTextur(Punkt a,
  2154. Punkt b,
  2155. Punkt c,
  2156. Punkt ta,
  2157. Punkt tb,
  2158. Punkt tc,
  2159. const Bild& textur) // füllt eine Dreieck aus
  2160. {
  2161. if (alpha[alphaAnzahl] == 0xFF) return;
  2162. if (alpha[alphaAnzahl])
  2163. {
  2164. drawDreieckTexturAlpha(a, b, c, ta, tb, tc, textur);
  2165. return;
  2166. }
  2167. int dpx = dPosA[doa].x;
  2168. int dpy = dPosA[doa].y;
  2169. int dgx = dSizeA[doa].x;
  2170. int dgy = dSizeA[doa].y;
  2171. a += drawOff[doa];
  2172. b += drawOff[doa];
  2173. c += drawOff[doa];
  2174. if ((a.x < dpx && b.x < dpx && c.x < dpx)
  2175. || (a.y < dpy && b.y < dpy && c.y < dpy)
  2176. || (a.x > dgx && b.x > dgx && c.x > dgx)
  2177. || (a.y > dgy && b.y > dgy && c.y > dgy))
  2178. return;
  2179. if (b.y < a.y)
  2180. {
  2181. a.Swap(b);
  2182. ta.Swap(tb);
  2183. }
  2184. if (c.y < b.y)
  2185. {
  2186. b.Swap(c);
  2187. tb.Swap(tc);
  2188. }
  2189. if (b.y < a.y)
  2190. {
  2191. a.Swap(b);
  2192. ta.Swap(tb);
  2193. }
  2194. const double m1 = (double)(a.x - b.x) / (a.y - b.y);
  2195. const double m2 = (double)(a.x - c.x) / (a.y - c.y);
  2196. const double m3 = (double)(b.x - c.x) / (b.y - c.y);
  2197. double b1 = a.x - m1 * a.y;
  2198. double b2 = a.x - m2 * a.y;
  2199. double b3 = b.x - m3 * b.y;
  2200. const double qx = m2 * b.y + b2;
  2201. if (qx < b.x)
  2202. {
  2203. double tx1o, ty1o, tx2o, ty2o;
  2204. if (c.y - a.y)
  2205. {
  2206. tx1o = (double)(tc.x - ta.x) / (c.y - a.y);
  2207. ty1o = (double)(tc.y - ta.y) / (c.y - a.y);
  2208. }
  2209. else
  2210. {
  2211. tx1o = 0;
  2212. ty1o = 0;
  2213. }
  2214. if (b.y - a.y)
  2215. {
  2216. tx2o = (double)(tb.x - ta.x) / (b.y - a.y);
  2217. ty2o = (double)(tb.y - ta.y) / (b.y - a.y);
  2218. }
  2219. else
  2220. {
  2221. tx2o = 0;
  2222. ty2o = 0;
  2223. }
  2224. Vec2<double> q(ta.x + tx1o * (b.y - a.y), ta.y + ty1o * (b.y - a.y));
  2225. double txf, tyf;
  2226. if (b.x - qx)
  2227. {
  2228. txf = (tb.x - q.x) / (b.x - qx);
  2229. tyf = (tb.y - q.y) / (b.x - qx);
  2230. }
  2231. else
  2232. {
  2233. txf = 0;
  2234. tyf = 0;
  2235. }
  2236. drawFlatDreieckTextur(a.y,
  2237. b.y,
  2238. m2,
  2239. b2,
  2240. m1,
  2241. b1,
  2242. ta.x,
  2243. ta.y,
  2244. ta.x,
  2245. ta.y,
  2246. tx1o,
  2247. ty1o,
  2248. tx2o,
  2249. ty2o,
  2250. txf,
  2251. tyf,
  2252. textur);
  2253. if (c.y - b.y)
  2254. {
  2255. tx2o = (double)(tc.x - tb.x) / (c.y - b.y);
  2256. ty2o = (double)(tc.y - tb.y) / (c.y - b.y);
  2257. }
  2258. else
  2259. {
  2260. tx2o = 0;
  2261. ty2o = 0;
  2262. }
  2263. drawFlatDreieckTextur(b.y,
  2264. c.y,
  2265. m2,
  2266. b2,
  2267. m3,
  2268. b3,
  2269. q.x,
  2270. q.y,
  2271. tb.x,
  2272. tb.y,
  2273. tx1o,
  2274. ty1o,
  2275. tx2o,
  2276. ty2o,
  2277. txf,
  2278. tyf,
  2279. textur);
  2280. }
  2281. else
  2282. {
  2283. double tx1o, ty1o, tx2o, ty2o;
  2284. if (b.y - a.y)
  2285. {
  2286. tx1o = (double)(tb.x - ta.x) / (b.y - a.y);
  2287. ty1o = (double)(tb.y - ta.y) / (b.y - a.y);
  2288. }
  2289. else
  2290. {
  2291. tx1o = 0;
  2292. ty1o = 0;
  2293. }
  2294. if (c.y - a.y)
  2295. {
  2296. tx2o = (double)(tc.x - ta.x) / (c.y - a.y);
  2297. ty2o = (double)(tc.y - ta.y) / (c.y - a.y);
  2298. }
  2299. else
  2300. {
  2301. tx2o = 0;
  2302. ty2o = 0;
  2303. }
  2304. Vec2<double> q(ta.x + tx2o * (b.y - a.y), ta.y + ty2o * (b.y - a.y));
  2305. double txf, tyf;
  2306. if (qx - b.x)
  2307. {
  2308. txf = (q.x - tb.x) / (qx - b.x);
  2309. tyf = (q.y - tb.y) / (qx - b.x);
  2310. }
  2311. else
  2312. {
  2313. txf = 0;
  2314. tyf = 0;
  2315. }
  2316. drawFlatDreieckTextur(a.y,
  2317. b.y,
  2318. m1,
  2319. b1,
  2320. m2,
  2321. b2,
  2322. ta.x,
  2323. ta.y,
  2324. ta.x,
  2325. ta.y,
  2326. tx1o,
  2327. ty1o,
  2328. tx2o,
  2329. ty2o,
  2330. txf,
  2331. tyf,
  2332. textur);
  2333. if (c.y - b.y)
  2334. {
  2335. tx1o = (double)(tc.x - tb.x) / (c.y - b.y);
  2336. ty1o = (double)(tc.y - tb.y) / (c.y - b.y);
  2337. }
  2338. else
  2339. {
  2340. tx1o = 0;
  2341. ty1o = 0;
  2342. }
  2343. drawFlatDreieckTextur(b.y,
  2344. c.y,
  2345. m3,
  2346. b3,
  2347. m2,
  2348. b2,
  2349. tb.x,
  2350. tb.y,
  2351. q.x,
  2352. q.y,
  2353. tx1o,
  2354. ty1o,
  2355. tx2o,
  2356. ty2o,
  2357. txf,
  2358. tyf,
  2359. textur);
  2360. }
  2361. rend = 1;
  2362. }
  2363. void Bild::drawDreieckAlpha(
  2364. Punkt a, Punkt b, Punkt c, int farbe) // füllt eine Dreieck aus
  2365. {
  2366. if (alpha[alphaAnzahl] == 0xFF) return;
  2367. int dpx = dPosA[doa].x;
  2368. int dpy = dPosA[doa].y;
  2369. int dgx = dSizeA[doa].x;
  2370. int dgy = dSizeA[doa].y;
  2371. a += drawOff[doa];
  2372. b += drawOff[doa];
  2373. c += drawOff[doa];
  2374. if ((a.x < dpx && b.x < dpx && c.x < dpx)
  2375. || (a.y < dpy && b.y < dpy && c.y < dpy)
  2376. || (a.x > dgx && b.x > dgx && c.x > dgx)
  2377. || (a.y > dgy && b.y > dgy && c.y > dgy))
  2378. return;
  2379. if (alpha[alphaAnzahl])
  2380. {
  2381. unsigned char* cf = (unsigned char*)&farbe;
  2382. cf[3] = (unsigned char)((cf[3] > alpha[alphaAnzahl])
  2383. * (cf[3] - alpha[alphaAnzahl]));
  2384. }
  2385. if (b.y < a.y) a.Swap(b);
  2386. if (c.y < b.y) b.Swap(c);
  2387. if (b.y < a.y) a.Swap(b);
  2388. if (a.y == b.y)
  2389. {
  2390. if (b.x < a.x) a.Swap(b);
  2391. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2392. const float m3 = (float)(b.x - c.x) / (float)(b.y - c.y);
  2393. float b2 = (float)a.x - m2 * (float)a.y;
  2394. float b3 = (float)b.x - m3 * (float)b.y;
  2395. drawFlatDreieckAlpha(b.y, c.y, m2, b2, m3, b3, farbe);
  2396. }
  2397. else if (b.y == c.y)
  2398. {
  2399. if (c.x < b.x) b.Swap(c);
  2400. const float m1 = (float)(a.x - b.x) / (float)(a.y - b.y);
  2401. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2402. float b1 = (float)a.x - m1 * (float)a.y;
  2403. float b2 = (float)a.x - m2 * (float)a.y;
  2404. drawFlatDreieckAlpha(a.y, b.y, m1, b1, m2, b2, farbe);
  2405. }
  2406. else
  2407. {
  2408. const float m1 = (float)(a.x - b.x) / (float)(a.y - b.y);
  2409. const float m2 = (float)(a.x - c.x) / (float)(a.y - c.y);
  2410. const float m3 = (float)(b.x - c.x) / (float)(b.y - c.y);
  2411. float b1 = (float)a.x - m1 * (float)a.y;
  2412. float b2 = (float)a.x - m2 * (float)a.y;
  2413. float b3 = (float)b.x - m3 * (float)b.y;
  2414. const float qx = m2 * (float)b.y + b2;
  2415. if (qx < (float)b.x)
  2416. {
  2417. drawFlatDreieckAlpha(a.y, b.y, m2, b2, m1, b1, farbe);
  2418. drawFlatDreieckAlpha(b.y, c.y, m2, b2, m3, b3, farbe);
  2419. }
  2420. else
  2421. {
  2422. drawFlatDreieckAlpha(a.y, b.y, m1, b1, m2, b2, farbe);
  2423. drawFlatDreieckAlpha(b.y, c.y, m3, b3, m2, b2, farbe);
  2424. }
  2425. }
  2426. rend = 1;
  2427. }
  2428. void Bild::drawDreieckTexturAlpha(Punkt a,
  2429. Punkt b,
  2430. Punkt c,
  2431. Punkt ta,
  2432. Punkt tb,
  2433. Punkt tc,
  2434. const Bild& textur) // füllt eine Dreieck aus
  2435. {
  2436. if (alpha[alphaAnzahl] == 0xFF) return;
  2437. int dpx = dPosA[doa].x;
  2438. int dpy = dPosA[doa].y;
  2439. int dgx = dSizeA[doa].x;
  2440. int dgy = dSizeA[doa].y;
  2441. a += drawOff[doa];
  2442. b += drawOff[doa];
  2443. c += drawOff[doa];
  2444. if ((a.x < dpx && b.x < dpx && c.x < dpx)
  2445. || (a.y < dpy && b.y < dpy && c.y < dpy)
  2446. || (a.x > dgx && b.x > dgx && c.x > dgx)
  2447. || (a.y > dgy && b.y > dgy && c.y > dgy))
  2448. return;
  2449. if (b.y < a.y)
  2450. {
  2451. a.Swap(b);
  2452. ta.Swap(tb);
  2453. }
  2454. if (c.y < b.y)
  2455. {
  2456. b.Swap(c);
  2457. tb.Swap(tc);
  2458. }
  2459. if (b.y < a.y)
  2460. {
  2461. a.Swap(b);
  2462. ta.Swap(tb);
  2463. }
  2464. const double m1 = (double)(a.x - b.x) / (a.y - b.y);
  2465. const double m2 = (double)(a.x - c.x) / (a.y - c.y);
  2466. const double m3 = (double)(b.x - c.x) / (b.y - c.y);
  2467. double b1 = a.x - m1 * a.y;
  2468. double b2 = a.x - m2 * a.y;
  2469. double b3 = b.x - m3 * b.y;
  2470. const double qx = m2 * b.y + b2;
  2471. if (qx < b.x)
  2472. {
  2473. double tx1o, ty1o, tx2o, ty2o;
  2474. if (c.y - a.y)
  2475. {
  2476. tx1o = (double)(tc.x - ta.x) / (c.y - a.y);
  2477. ty1o = (double)(tc.y - ta.y) / (c.y - a.y);
  2478. }
  2479. else
  2480. {
  2481. tx1o = 0;
  2482. ty1o = 0;
  2483. }
  2484. if (b.y - a.y)
  2485. {
  2486. tx2o = (double)(tb.x - ta.x) / (b.y - a.y);
  2487. ty2o = (double)(tb.y - ta.y) / (b.y - a.y);
  2488. }
  2489. else
  2490. {
  2491. tx2o = 0;
  2492. ty2o = 0;
  2493. }
  2494. Vec2<double> q(ta.x + tx1o * (b.y - a.y), ta.y + ty1o * (b.y - a.y));
  2495. double txf, tyf;
  2496. if (b.x - qx)
  2497. {
  2498. txf = (tb.x - q.x) / (b.x - qx);
  2499. tyf = (tb.y - q.y) / (b.x - qx);
  2500. }
  2501. else
  2502. {
  2503. txf = 0;
  2504. tyf = 0;
  2505. }
  2506. drawFlatDreieckTexturAlpha(a.y,
  2507. b.y,
  2508. m2,
  2509. b2,
  2510. m1,
  2511. b1,
  2512. ta.x,
  2513. ta.y,
  2514. ta.x,
  2515. ta.y,
  2516. tx1o,
  2517. ty1o,
  2518. tx2o,
  2519. ty2o,
  2520. txf,
  2521. tyf,
  2522. textur);
  2523. if (c.y - b.y)
  2524. {
  2525. tx2o = (double)(tc.x - tb.x) / (c.y - b.y);
  2526. ty2o = (double)(tc.y - tb.y) / (c.y - b.y);
  2527. }
  2528. else
  2529. {
  2530. tx2o = 0;
  2531. ty2o = 0;
  2532. }
  2533. drawFlatDreieckTexturAlpha(b.y,
  2534. c.y,
  2535. m2,
  2536. b2,
  2537. m3,
  2538. b3,
  2539. q.x,
  2540. q.y,
  2541. tb.x,
  2542. tb.y,
  2543. tx1o,
  2544. ty1o,
  2545. tx2o,
  2546. ty2o,
  2547. txf,
  2548. tyf,
  2549. textur);
  2550. }
  2551. else
  2552. {
  2553. double tx1o, ty1o, tx2o, ty2o;
  2554. if (b.y - a.y)
  2555. {
  2556. tx1o = (double)(tb.x - ta.x) / (b.y - a.y);
  2557. ty1o = (double)(tb.y - ta.y) / (b.y - a.y);
  2558. }
  2559. else
  2560. {
  2561. tx1o = 0;
  2562. ty1o = 0;
  2563. }
  2564. if (c.y - a.y)
  2565. {
  2566. tx2o = (double)(tc.x - ta.x) / (c.y - a.y);
  2567. ty2o = (double)(tc.y - ta.y) / (c.y - a.y);
  2568. }
  2569. else
  2570. {
  2571. tx2o = 0;
  2572. ty2o = 0;
  2573. }
  2574. Vec2<double> q(ta.x + tx2o * (b.y - a.y), ta.y + ty2o * (b.y - a.y));
  2575. double txf, tyf;
  2576. if (qx - b.x)
  2577. {
  2578. txf = (q.x - tb.x) / (qx - b.x);
  2579. tyf = (q.y - tb.y) / (qx - b.x);
  2580. }
  2581. else
  2582. {
  2583. txf = 0;
  2584. tyf = 0;
  2585. }
  2586. drawFlatDreieckTexturAlpha(a.y,
  2587. b.y,
  2588. m1,
  2589. b1,
  2590. m2,
  2591. b2,
  2592. ta.x,
  2593. ta.y,
  2594. ta.x,
  2595. ta.y,
  2596. tx1o,
  2597. ty1o,
  2598. tx2o,
  2599. ty2o,
  2600. txf,
  2601. tyf,
  2602. textur);
  2603. if (c.y - b.y)
  2604. {
  2605. tx1o = (double)(tc.x - tb.x) / (c.y - b.y);
  2606. ty1o = (double)(tc.y - tb.y) / (c.y - b.y);
  2607. }
  2608. else
  2609. {
  2610. tx1o = 0;
  2611. ty1o = 0;
  2612. }
  2613. drawFlatDreieckTexturAlpha(b.y,
  2614. c.y,
  2615. m3,
  2616. b3,
  2617. m2,
  2618. b2,
  2619. tb.x,
  2620. tb.y,
  2621. q.x,
  2622. q.y,
  2623. tx1o,
  2624. ty1o,
  2625. tx2o,
  2626. ty2o,
  2627. txf,
  2628. tyf,
  2629. textur);
  2630. }
  2631. rend = 1;
  2632. }
  2633. void Bild::replaceColorWithAlpha(int color)
  2634. {
  2635. int r = (color & 0xFF0000) >> 16;
  2636. int g = (color & 0xFF00) >> 8;
  2637. int b = color & 0xFF;
  2638. int dx = drawOff[doa].x, dy = drawOff[doa].y;
  2639. int xx = dPosA[doa].x, yy = dPosA[doa].y;
  2640. int bb = dSizeA[doa].x, hh = dSizeA[doa].y;
  2641. for (int y = dy + yy; y < hh; y++)
  2642. {
  2643. int ygr = y * size.x;
  2644. for (int x = dx + xx; x < bb; x++)
  2645. {
  2646. unsigned char* cf = (unsigned char*)&(fc[x + ygr]);
  2647. int abstand = (int)sqrt(
  2648. (float)((r - cf[2]) * (r - cf[2]) + (g - cf[1]) * (g - cf[1])
  2649. + (b - cf[0]) * (b - cf[0])));
  2650. if (abstand > 255) abstand = 255;
  2651. cf[3] = (unsigned char)(abstand);
  2652. }
  2653. }
  2654. }
  2655. bool Bild::setDrawOptions(
  2656. const Punkt& pos, const Punkt& gr) // setzt die Drawoptionen
  2657. {
  2658. int dx = drawOff[doa].x, dy = drawOff[doa].y;
  2659. int xx = dPosA[doa].x, yy = dPosA[doa].y;
  2660. int bb = dSizeA[doa].x, hh = dSizeA[doa].y;
  2661. if (dx + pos.x + gr.x < 0 || dy + pos.y + gr.y < 0 || dx + pos.x >= size.x
  2662. || dy + pos.y >= size.y)
  2663. return 0;
  2664. if (pos.x + gr.x + dx < xx || pos.y + gr.y + dy < yy || dx + pos.x >= bb
  2665. || dy + pos.y >= hh)
  2666. return 0;
  2667. ++doa;
  2668. assert(doa < 2000);
  2669. dPosA[doa].x = maxInt(pos.x + dx, xx);
  2670. dPosA[doa].y = maxInt(pos.y + dy, yy);
  2671. dSizeA[doa].x = minInt(pos.x + gr.x + dx, bb);
  2672. dSizeA[doa].y = minInt(pos.y + gr.y + dy, hh);
  2673. drawOff[doa].x = dx + pos.x;
  2674. drawOff[doa].y = dy + pos.y;
  2675. return 1;
  2676. }
  2677. bool Bild::setDrawOptions(int x, int y, int br, int hi)
  2678. {
  2679. int dx = drawOff[doa].x, dy = drawOff[doa].y;
  2680. int xx = dPosA[doa].x, yy = dPosA[doa].y;
  2681. int bb = dSizeA[doa].x, hh = dSizeA[doa].y;
  2682. if (dx + x + br < 0 || dy + y + hi < 0 || dx + x >= size.x
  2683. || dy + y >= size.y)
  2684. return 0;
  2685. if (x + br + dx < xx || y + hi + dy < yy || dx + x >= bb || dy + y >= hh)
  2686. return 0;
  2687. ++doa;
  2688. assert(doa < 2000);
  2689. dPosA[doa].x = maxInt(x + dx, xx);
  2690. dPosA[doa].y = maxInt(y + dy, yy);
  2691. dSizeA[doa].x = minInt(x + br + dx, bb);
  2692. dSizeA[doa].y = minInt(y + hi + dy, hh);
  2693. drawOff[doa].x = dx + x;
  2694. drawOff[doa].y = dy + y;
  2695. return 1;
  2696. }
  2697. bool Bild::setDrawOptionsErzwingen(
  2698. const Punkt& pos, const Punkt& gr) // setzt die Drawoptionen
  2699. {
  2700. int dx = drawOff[doa].x, dy = drawOff[doa].y;
  2701. if (dx + pos.x + gr.x < 0 || dy + pos.y + gr.y < 0 || dx + pos.x >= size.x
  2702. || dy + pos.y >= size.y)
  2703. return 0;
  2704. ++doa;
  2705. assert(doa < 2000);
  2706. dPosA[doa].x = maxInt(pos.x + dx, 0);
  2707. dPosA[doa].y = maxInt(pos.y + dy, 0);
  2708. dSizeA[doa].x = minInt(pos.x + gr.x + dx, size.x);
  2709. dSizeA[doa].y = minInt(pos.y + gr.y + dy, size.y);
  2710. drawOff[doa].x = dx + pos.x;
  2711. drawOff[doa].y = dy + pos.y;
  2712. return 1;
  2713. }
  2714. bool Bild::setDrawOptionsErzwingen(
  2715. int x, int y, int br, int hi) // setzt die Drawoptionen
  2716. {
  2717. int dx = drawOff[doa].x, dy = drawOff[doa].y;
  2718. if (dx + x + br < 0 || dy + y + hi < 0 || dx + x >= size.x
  2719. || dy + y >= size.y)
  2720. return 0;
  2721. ++doa;
  2722. assert(doa < 2000);
  2723. dPosA[doa].x = maxInt(x + dx, 0);
  2724. dPosA[doa].y = maxInt(y + dy, 0);
  2725. dSizeA[doa].x = minInt(x + br + dx, size.x);
  2726. dSizeA[doa].y = minInt(y + hi + dy, size.y);
  2727. drawOff[doa].x = dx + x;
  2728. drawOff[doa].y = dy + y;
  2729. return 1;
  2730. }
  2731. void Bild::setDrawOptionsReset()
  2732. {
  2733. ++doa;
  2734. dPosA[doa].x = 0;
  2735. dPosA[doa].y = 0;
  2736. dSizeA[doa].x = size.x;
  2737. dSizeA[doa].y = size.y;
  2738. drawOff[doa].x = 0;
  2739. drawOff[doa].y = 0;
  2740. }
  2741. void Bild::addScrollOffset(int xOff, int yOff) // setzt ScrollOffset
  2742. {
  2743. drawOff[doa].x -= xOff;
  2744. drawOff[doa].y -= yOff;
  2745. }
  2746. void Bild::releaseDrawOptions() // setzt die Drawoptionen zurück
  2747. {
  2748. --doa;
  2749. }
  2750. bool Bild::getRend()
  2751. {
  2752. bool ret = rend;
  2753. rend = 0;
  2754. return ret;
  2755. }
  2756. // constant
  2757. int* Bild::getBuffer() const // gibt buffer zurück
  2758. {
  2759. return fc;
  2760. }
  2761. int Bild::getPixel(int x, int y) const
  2762. {
  2763. if (x < 0 || y < 0 || x >= size.x || y >= size.y) return 0;
  2764. return fc[x + y * size.x];
  2765. }
  2766. const Punkt& Bild::getSize() const // gibt die Größe zurück
  2767. {
  2768. return size;
  2769. }
  2770. int Bild::getBreite() const // gibt die Breite zurück
  2771. {
  2772. return size.x;
  2773. }
  2774. int Bild::getHeight() const // gibt die Höhe zurück
  2775. {
  2776. return size.y;
  2777. }
  2778. unsigned char Bild::getAlpha() const // gibt den Alpha wert zurück
  2779. {
  2780. return (unsigned char)(255 - alpha[alphaAnzahl]);
  2781. }
  2782. const Punkt& Bild::getDrawPos() const
  2783. {
  2784. return dPosA[doa];
  2785. }
  2786. const Punkt& Bild::getDrawGr() const
  2787. {
  2788. return dSizeA[doa];
  2789. }
  2790. const Punkt& Bild::getDrawOff() const
  2791. {
  2792. return drawOff[doa];
  2793. }
  2794. bool Bild::hasAlpha3D() const
  2795. {
  2796. return alpha3D;
  2797. }
  2798. int Bild::getAverageColor() const
  2799. {
  2800. double a = 0;
  2801. double r = 0;
  2802. double g = 0;
  2803. double b = 0;
  2804. for (int i = 0; i < size.x * size.y; i++)
  2805. {
  2806. float currentA = (fc[i] >> 24) / 255.f;
  2807. a = a + currentA;
  2808. r = r + ((fc[i] >> 16) & 0xFF) * currentA;
  2809. g = g + ((fc[i] >> 8) & 0xFF) * currentA;
  2810. b = b + (fc[i] & 0xFF) * currentA;
  2811. }
  2812. a = a / (size.x * size.y);
  2813. r = (r / (size.x * size.y)) / a;
  2814. g = (g / (size.x * size.y)) / a;
  2815. b = (b / (size.x * size.y)) / a;
  2816. a = a * 255;
  2817. return ((((int)a) & 0xFF) << 24) | ((((int)r) & 0xFF) << 16)
  2818. | ((((int)g) & 0xFF) << 8) | (((int)b) & 0xFF);
  2819. }
  2820. // Inhalt der BildZ Klasse aus Bild.h
  2821. // Konstruktor
  2822. BildZ::BildZ()
  2823. : ZeichnungHintergrund(),
  2824. bild(0)
  2825. {
  2826. style = Style::MELockZeichnung;
  2827. mak = _ret1ME;
  2828. }
  2829. // Destruktor
  2830. BildZ::~BildZ()
  2831. {
  2832. if (bild) bild->release();
  2833. }
  2834. void BildZ::doMausEreignis(MausEreignis& me, bool userRet) // ruft Mak auf
  2835. {
  2836. if (userRet)
  2837. {
  2838. int rbr = 0;
  2839. if (hatStyle(Style::Rahmen) && rahmen) rbr = rahmen->getRBreite();
  2840. bool vs = hatStyle(Style::VScroll) && vertikalScrollBar;
  2841. bool hs = hatStyle(Style::HScroll) && horizontalScrollBar;
  2842. if (vs)
  2843. {
  2844. if (hs)
  2845. horizontalScrollBar->doMausMessage(
  2846. rbr, gr.y - rbr - 15, gr.x - rbr * 2 - 15, 15, me);
  2847. vertikalScrollBar->doMausMessage(
  2848. gr.x - rbr - 15, rbr, 15, gr.y - rbr * 2, me);
  2849. }
  2850. else if (hs)
  2851. horizontalScrollBar->doMausMessage(
  2852. rbr, gr.y - rbr - 15, gr.x - rbr * 2, 15, me);
  2853. }
  2854. me.verarbeitet = userRet;
  2855. }
  2856. // nicht constant
  2857. void BildZ::setBildZ(Bild* b) // setzt das Bild
  2858. {
  2859. if (bild) bild->release();
  2860. bild = b;
  2861. if (!vertikalScrollBar) vertikalScrollBar = new VScrollBar();
  2862. if (!horizontalScrollBar) horizontalScrollBar = new HScrollBar();
  2863. if (b)
  2864. {
  2865. horizontalScrollBar->getScrollData()->max = b->getBreite();
  2866. vertikalScrollBar->getScrollData()->max = b->getHeight();
  2867. }
  2868. rend = 1;
  2869. }
  2870. void BildZ::setBild(Bild* b)
  2871. {
  2872. if (!bild) bild = new Bild();
  2873. bild->neuBild(b->getBreite(), b->getHeight(), 0);
  2874. bild->drawBild(0, 0, b->getBreite(), b->getHeight(), *b);
  2875. if (!vertikalScrollBar) vertikalScrollBar = new VScrollBar();
  2876. if (!horizontalScrollBar) horizontalScrollBar = new HScrollBar();
  2877. horizontalScrollBar->getScrollData()->max = b->getBreite();
  2878. vertikalScrollBar->getScrollData()->max = b->getHeight();
  2879. b->release();
  2880. rend = 1;
  2881. }
  2882. bool BildZ::tick(double tickVal) // tick
  2883. {
  2884. return ZeichnungHintergrund::tick(tickVal);
  2885. }
  2886. void BildZ::render(Bild& zRObj) // zeichnet nach zRObj
  2887. {
  2888. if (hatStyle(Style::Sichtbar))
  2889. {
  2890. ZeichnungHintergrund::render(zRObj);
  2891. lockZeichnung();
  2892. if (!zRObj.setDrawOptions(innenPosition, innenSize))
  2893. {
  2894. unlockZeichnung();
  2895. return;
  2896. }
  2897. if (bild)
  2898. {
  2899. int x = 0;
  2900. int y = 0;
  2901. int br = innenSize.x;
  2902. int hi = innenSize.y;
  2903. if (!(vertikalScrollBar && hatStyle(Style::VScroll))
  2904. && !(horizontalScrollBar && hatStyle(Style::HScroll)))
  2905. {
  2906. if (hatStyle(Style::Alpha))
  2907. {
  2908. if (hatStyle(Style::Skalliert))
  2909. zRObj.alphaBildSkall(x, y, br, hi, *bild);
  2910. else
  2911. zRObj.alphaBild(x, y, br, hi, *bild);
  2912. }
  2913. else
  2914. {
  2915. if (hatStyle(Style::Skalliert))
  2916. zRObj.drawBildSkall(x, y, br, hi, *bild);
  2917. else
  2918. zRObj.drawBild(x, y, br, hi, *bild);
  2919. }
  2920. }
  2921. else
  2922. {
  2923. if (!zRObj.setDrawOptions(x, y, br, hi))
  2924. {
  2925. zRObj.releaseDrawOptions();
  2926. unlockZeichnung();
  2927. return;
  2928. }
  2929. if (hatStyle(Style::Alpha))
  2930. zRObj.alphaBild(-horizontalScrollBar->getScroll(),
  2931. -vertikalScrollBar->getScroll(),
  2932. bild->getBreite(),
  2933. bild->getHeight(),
  2934. *bild);
  2935. else
  2936. zRObj.drawBild(-horizontalScrollBar->getScroll(),
  2937. -vertikalScrollBar->getScroll(),
  2938. bild->getBreite(),
  2939. bild->getHeight(),
  2940. *bild);
  2941. zRObj.releaseDrawOptions();
  2942. }
  2943. }
  2944. zRObj.releaseDrawOptions();
  2945. unlockZeichnung();
  2946. }
  2947. }
  2948. // constant
  2949. Bild* BildZ::getBild() const // gibt das Bild zurück
  2950. {
  2951. if (bild) return dynamic_cast<Bild*>(bild->getThis());
  2952. return 0;
  2953. }
  2954. Bild* BildZ::zBild() const
  2955. {
  2956. return bild;
  2957. }
  2958. Zeichnung* BildZ::dublizieren() const // erstellt eine Kopie des Zeichnungs
  2959. {
  2960. BildZ* obj = new BildZ();
  2961. obj->setPosition(pos);
  2962. obj->setSize(gr);
  2963. obj->setMausEreignisParameter(makParam);
  2964. obj->setTastaturEreignisParameter(takParam);
  2965. obj->setMausEreignis(mak);
  2966. obj->setTastaturEreignis(tak);
  2967. if (toolTip) obj->setToolTipZ((ToolTip*)toolTip->dublizieren());
  2968. obj->setStyle(style);
  2969. obj->setHintergrundFarbe(hintergrundFarbe);
  2970. if (hintergrundFeld)
  2971. obj->setAlphaFeldZ((AlphaFeld*)hintergrundFeld->dublizieren());
  2972. if (rahmen) obj->setRahmenZ((Rahmen*)rahmen->dublizieren());
  2973. if (hintergrundBild)
  2974. obj->setHintergrundBild(
  2975. dynamic_cast<Bild*>(hintergrundBild->getThis()));
  2976. if (bild) obj->setBild(dynamic_cast<Bild*>(bild->getThis()));
  2977. obj->setStyle(style);
  2978. return obj;
  2979. }
  2980. #ifdef WIN32
  2981. Bild* Framework::ladeBild(const char* pfad, Text* zError)
  2982. {
  2983. Text p = pfad;
  2984. Text* txt = p.getTeilText(p.positionVon('.', p.anzahlVon('.') - 1));
  2985. if (!(txt->istGleich(".bmp") || txt->istGleich(".jpg")
  2986. || txt->istGleich(".gif") || txt->istGleich(".png")))
  2987. {
  2988. zError->setText("Die Angegebene Datei ist keine gueltige Bilddatei!");
  2989. txt->release();
  2990. return 0;
  2991. }
  2992. txt->release();
  2993. wchar_t* name = new wchar_t[p.getLength() + 1];
  2994. for (int i = 0; i < p.getLength(); i++)
  2995. name[i] = (wchar_t)p.getText()[i];
  2996. name[p.getLength()] = '\0';
  2997. Gdiplus::Bitmap bitmap(name);
  2998. Gdiplus::Color pix;
  2999. delete[] name;
  3000. Bild* ret = new Bild();
  3001. ret->neuBild(bitmap.GetWidth(), bitmap.GetHeight(), 0);
  3002. int* buff = ret->getBuffer();
  3003. for (unsigned int i = 0; i < bitmap.GetWidth() * bitmap.GetHeight(); i++)
  3004. {
  3005. bitmap.GetPixel(i % bitmap.GetWidth(), i / bitmap.GetWidth(), &pix);
  3006. buff[i] = pix.GetValue();
  3007. }
  3008. return ret;
  3009. }
  3010. #endif