Bild.cpp 89 KB

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