Schrift.cpp 21 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. #include "Schrift.h"
  2. #include "Bild.h"
  3. #include "Text.h"
  4. #include "Scroll.h"
  5. #include "Globals.h"
  6. #include <Windows.h>
  7. #include "FrameworkMath.h"
  8. using namespace Framework;
  9. // Inhalt der Buchstabe Klasse aus Schrift.h
  10. // Konstruktor
  11. Buchstabe::Buchstabe()
  12. : größe( 0, 0 ),
  13. pos( 0, 0 ),
  14. alpha( 0 ),
  15. schriftGröße( 0 ),
  16. drawSg( 0 ),
  17. ref( 1 )
  18. {
  19. }
  20. // Destruktor
  21. Buchstabe::~Buchstabe()
  22. {
  23. if( alpha )
  24. delete[]alpha;
  25. }
  26. // nicht constant
  27. void Buchstabe::NeuBuchstabe( Punkt &größe ) // Initialisierung
  28. {
  29. this->größe = größe;
  30. if( alpha )
  31. delete[]alpha;
  32. alpha = new unsigned char[ größe.x * größe.y ];
  33. ZeroMemory( alpha, größe.x * größe.y );
  34. }
  35. void Buchstabe::setPixel( Punkt &pos, unsigned char alpha ) // setzt den alphawert des Pixels
  36. {
  37. this->alpha[ pos.x + pos.y * größe.x ] = alpha;
  38. }
  39. void Buchstabe::setPixel( int x, int y, unsigned char alpha )
  40. {
  41. this->alpha[ x + y * größe.x ] = alpha;
  42. }
  43. void Buchstabe::setPixel( int i, unsigned char alpha )
  44. {
  45. this->alpha[ i ] = alpha;
  46. }
  47. void Buchstabe::setPosition( Punkt &pos ) // setzt die Buchstabenposition
  48. {
  49. this->pos = pos;
  50. }
  51. void Buchstabe::setPosition( int x, int y )
  52. {
  53. pos.x = x;
  54. pos.y = y;
  55. }
  56. void Buchstabe::setSchriftGröße( int sg ) // setzt die Schriftgröße des Buchstaben
  57. {
  58. schriftGröße = sg;
  59. }
  60. void Buchstabe::setDrawSchriftGröße( int dsg ) // setzt die Zeichengröße des Buchstaben
  61. {
  62. drawSg = dsg;
  63. }
  64. // constant
  65. const Punkt &Buchstabe::getGröße() const // gibt die Buchstabenbildgröße zurück
  66. {
  67. return größe;
  68. }
  69. int Buchstabe::getBreite() const // Buchstabenbreite
  70. {
  71. return (int)( ( (double)größe.x / (double)schriftGröße ) * (double)drawSg + 0.5 );
  72. }
  73. int Buchstabe::getHöhe() const // Buchstabenhöhe
  74. {
  75. return (int)( ( (double)größe.y / (double)schriftGröße ) *(double)drawSg + 0.5 );
  76. }
  77. int Buchstabe::getNormHöhe() const // Buchstabenhöhe
  78. {
  79. return größe.y;
  80. }
  81. unsigned char *Buchstabe::getBuff() const // gibt den Alphabuffer zurück
  82. {
  83. return alpha;
  84. }
  85. void Buchstabe::render( Bild &zRObj, int f ) const // Zeichnet nach zRObj
  86. {
  87. if( alpha )
  88. {
  89. const Punkt &zRObjGr = zRObj.getDrawGr();
  90. const Punkt &zRObjPos = zRObj.getDrawPos();
  91. const Punkt &zRObjOff = zRObj.getDrawOff();
  92. int xp = pos.x + zRObjOff.x, yp = pos.y + zRObjOff.y;
  93. int xs = xp < zRObjPos.x ? ( zRObjPos.x - xp ) : 0, ys = yp < zRObjPos.y ? ( zRObjPos.y - yp ) : 0;
  94. int b = größe.x, h = größe.y;
  95. unsigned char a2 = ( 255 - ( f >> 24 ) );
  96. f &= 0x00FFFFFF;
  97. if( schriftGröße == drawSg )
  98. {
  99. if( xp >= zRObjGr.x || yp >= zRObjGr.y || xp + b < zRObjPos.x || yp + h < zRObjPos.y )
  100. return;
  101. b = ( xp + b ) > zRObjGr.x ? ( zRObjGr.x - xp ) : b;
  102. h = ( yp + h ) > zRObjGr.y ? ( zRObjGr.y - yp ) : h;
  103. if( !a2 )
  104. {
  105. int xx, ygr = ( ys - 1 ) * größe.x, ygr2 = ( yp + ys - 1 ) * zRObj.getBreite();
  106. for( int yy = ys; yy < h; ++yy )
  107. {
  108. ygr += größe.x;
  109. ygr2 += zRObj.getBreite();
  110. for( xx = xs; xx < b; ++xx )
  111. zRObj.alphaPixel( xp + xx + ygr2, f | ( alpha[ xx + ygr ] << 24 ) );
  112. }
  113. }
  114. else
  115. {
  116. int a;
  117. int xx, ygr = ( ys - 1 ) * größe.x, ygr2 = ( yp + ys - 1 ) * zRObj.getBreite();
  118. for( int yy = ys; yy < h; ++yy )
  119. {
  120. ygr += größe.x;
  121. ygr2 += zRObj.getBreite();
  122. for( xx = xs; xx < b; ++xx )
  123. {
  124. a = alpha[ xx + ygr ] - a2;
  125. if( a > 0 )
  126. zRObj.alphaPixel( xp + xx + ygr2, f | ( a << 24 ) );
  127. }
  128. }
  129. }
  130. }
  131. else
  132. {
  133. double xoff = (double)schriftGröße / (double)drawSg,
  134. yoff = (double)schriftGröße / (double)drawSg;
  135. double x = xs * xoff, y = ys * yoff;
  136. int maxX = getBreite(), maxY = getHöhe();
  137. maxX = ( xp + maxX ) >= zRObjGr.x ? ( zRObjGr.x - xp ) : maxX;
  138. maxY = ( yp + maxY ) >= zRObjGr.y ? ( zRObjGr.y - yp ) : maxY;
  139. if( !a2 )
  140. {
  141. int dx, ygr, ygr2;
  142. for( int dy = ys; dy < maxY; ++dy )
  143. {
  144. ygr2 = ( yp + dy ) * zRObj.getBreite();
  145. ygr = (int)y * b;
  146. for( dx = xs; dx < maxX; ++dx )
  147. {
  148. zRObj.alphaPixel( xp + dx + ygr2, f | ( alpha[ (int)x + ygr ] << 24 ) );
  149. x += xoff;
  150. }
  151. x = xs;
  152. y += yoff;
  153. }
  154. }
  155. else
  156. {
  157. int a, dx, ygr, ygr2;
  158. for( int dy = ys; dy < maxY; ++dy )
  159. {
  160. ygr2 = ( yp + dy ) * zRObj.getBreite();
  161. ygr = (int)y * b;
  162. for( dx = xs; dx < maxX; ++dx )
  163. {
  164. a = alpha[ (int)x + ygr ] - a2;
  165. zRObj.alphaPixel( xp + dx + ygr2, f | ( a << 24 ) );
  166. x += xoff;
  167. }
  168. x = xs;
  169. y += yoff;
  170. }
  171. }
  172. }
  173. }
  174. }
  175. // Reference Counting
  176. Buchstabe *Buchstabe::getThis()
  177. {
  178. ++ref;
  179. return this;
  180. }
  181. Buchstabe *Buchstabe::release()
  182. {
  183. --ref;
  184. if( ref == 0 )
  185. delete this;
  186. return 0;
  187. }
  188. // Inhalt der Alphabet Klasse aus Schrift.h
  189. // Konstruktor
  190. Alphabet::Alphabet()
  191. : zeichen( new Buchstabe*[ 256 ] ),
  192. schriftGröße( 12 ),
  193. drawSchriftGröße( 12 ),
  194. pos( 0, 0 ),
  195. zeilenHöhe( 0 ),
  196. zeilenAbstand( 5 ),
  197. ref( 1 )
  198. {
  199. for( int i = 0; i < 256; ++i )
  200. zeichen[ i ] = 0;
  201. }
  202. // Destruktor
  203. Alphabet::~Alphabet()
  204. {
  205. for( int i = 0; i < 256; ++i )
  206. {
  207. if( zeichen[ i ] )
  208. zeichen[ i ]->release();
  209. }
  210. delete[]zeichen;
  211. }
  212. // nicht constant
  213. void Alphabet::NeuAlphabet() // Initialisierung
  214. {
  215. for( int i = 0; i < 256; ++i )
  216. {
  217. if( zeichen[ i ] )
  218. zeichen[ i ]->release();
  219. }
  220. for( int i = 0; i < 256; ++i )
  221. zeichen[ i ] = 0;
  222. zeilenHöhe = 0;
  223. }
  224. void Alphabet::setBuchstabe( unsigned char i, Buchstabe *buchstabe ) // setzt einen Buchstaben
  225. {
  226. if( zeichen[ i ] )
  227. zeichen[ i ]->release();
  228. zeichen[ i ] = buchstabe;
  229. if( zeichen[ i ] )
  230. {
  231. zeichen[ i ]->setSchriftGröße( schriftGröße );
  232. zeichen[ i ]->setDrawSchriftGröße( drawSchriftGröße );
  233. }
  234. zeilenHöhe = 0;
  235. for( int i = 0; i < 256; ++i )
  236. {
  237. if( zeichen[ i ] != 0 )
  238. zeilenHöhe = maxInt( zeichen[ i ]->getHöhe(), zeilenHöhe );
  239. }
  240. }
  241. void Alphabet::setSchriftgröße( int gr ) // setzt die Schriftgröße
  242. {
  243. schriftGröße = gr;
  244. for( int i = 0; i < 256; ++i )
  245. {
  246. if( zeichen[ i ] )
  247. zeichen[ i ]->setSchriftGröße( gr );
  248. }
  249. }
  250. void Alphabet::setDrawSchriftgröße( int gr ) // setzt die Zeichengröße
  251. {
  252. drawSchriftGröße = gr;
  253. for( int i = 0; i < 256; ++i )
  254. {
  255. if( zeichen[ i ] )
  256. zeichen[ i ]->setDrawSchriftGröße( gr );
  257. }
  258. }
  259. void Alphabet::setZeilenAbstand( int za ) // setzt die Zeilenhöhe( Zeilenabstand )
  260. {
  261. zeilenAbstand = za;
  262. }
  263. void Alphabet::setDrawPosition( Punkt &pos ) // setzt die Draw Position
  264. {
  265. this->pos = pos;
  266. }
  267. void Alphabet::setDrawPosition( int x, int y )
  268. {
  269. pos.x = x;
  270. pos.y = y;
  271. }
  272. // constant
  273. Buchstabe *Alphabet::getBuchstabe( unsigned char i ) const // gibt einen Buchstaben zurück
  274. {
  275. if( zeichen[ i ] )
  276. return zeichen[ i ]->getThis();
  277. return 0;
  278. }
  279. Buchstabe *Alphabet::zBuchstabe( unsigned char i ) const
  280. {
  281. return zeichen[ i ];
  282. }
  283. bool Alphabet::hatBuchstabe( unsigned char b ) const
  284. {
  285. return zeichen[ b ] != 0;
  286. }
  287. int Alphabet::getSchriftgröße() const // gibt die Schriftgröße zurück
  288. {
  289. return schriftGröße;
  290. }
  291. int Alphabet::getDrawSchriftGröße() const // gibt die Zeichengröße zurück
  292. {
  293. return drawSchriftGröße;
  294. }
  295. int Alphabet::getZeilenAbstand() const // gibt den Zeilenabstand zurück
  296. {
  297. return zeilenAbstand;
  298. }
  299. int Alphabet::getZeilenHöhe() const // gibt die Höhe des höchsten Zeichens zurück
  300. {
  301. return (int)( (double)zeilenHöhe / schriftGröße * drawSchriftGröße + 0.5 );
  302. }
  303. const Punkt &Alphabet::getPosition() const // gibt die DrawPosition zurück
  304. {
  305. return pos;
  306. }
  307. int Alphabet::getTextBreite( Text *zTxt ) const // gibt die Breite des Textes zurück
  308. {
  309. int ret = 0;
  310. int län = zTxt->getLänge();
  311. char *buff = zTxt->getText();
  312. unsigned char c = 0;
  313. int tmp = 0;
  314. for( int i = 0; i < län; ++i )
  315. {
  316. c = (unsigned char)buff[ i ];
  317. if( buff[ i ] == '\n' )
  318. {
  319. if( tmp > ret )
  320. ret = tmp;
  321. tmp = 0;
  322. }
  323. else if( buff[ i ] == '\r' )
  324. {
  325. i += 10;
  326. continue;
  327. }
  328. else if( buff[ i ] == '\t' )
  329. tmp += drawSchriftGröße;
  330. else if( buff[ i ] == ' ' )
  331. tmp += drawSchriftGröße / 2;
  332. else if( zeichen[ c ] )
  333. tmp += zeichen[ c ]->getBreite();
  334. }
  335. if( tmp > ret )
  336. ret = tmp;
  337. return ret;
  338. }
  339. int Alphabet::getTextHöhe( Text *zTxt ) const // gibt die Höhe des Textes zurück
  340. {
  341. int hö = getZeilenHöhe();
  342. return hö + ( ( hö + zeilenAbstand ) * zTxt->anzahlVon( '\n' ) );
  343. }
  344. int Alphabet::textPos( Text *zText, int mausX, int mausY ) const // gibt den Buchstaben zurück, auf den die Maus zeigt
  345. {
  346. char *buffer = zText->getText();
  347. int län = zText->getLänge();
  348. int tx = 0;
  349. int ty = 0;
  350. int sh = getZeilenHöhe();
  351. if( mausX < 0 || mausY < 0 )
  352. return -1;
  353. for( int i = 0; i < län; ++i )
  354. {
  355. if( buffer[ i ] == '\n' )
  356. {
  357. ty += sh + zeilenAbstand;
  358. tx = 0;
  359. if( mausY < ty )
  360. return i;
  361. }
  362. if( buffer[ i ] == '\t' )
  363. tx += drawSchriftGröße;
  364. if( buffer[ i ] == ' ' )
  365. tx += drawSchriftGröße / 2;
  366. if( zeichen[ (unsigned char)buffer[ i ] ] )
  367. tx += zeichen[ (unsigned char)buffer[ i ] ]->getBreite();
  368. int txpl = 0;
  369. if( zeichen[ (unsigned char)buffer[ i + 1 ] ] )
  370. txpl = zeichen[ (unsigned char)buffer[ i + 1 ] ]->getBreite() / 2;
  371. if( mausX < tx - txpl && mausY < ty + sh + zeilenAbstand )
  372. return i;
  373. }
  374. if( mausY < ty + sh + zeilenAbstand )
  375. return län;
  376. return -1;
  377. }
  378. void Alphabet::textFormatieren( Text *zText, int maxBreite, int schriftGröße ) // fügt zeilenumbrüche ein
  379. {
  380. int sg = drawSchriftGröße;
  381. setDrawSchriftgröße( schriftGröße );
  382. int zeilenHöhe = getZeilenHöhe() + getZeilenAbstand();
  383. int lastPos = -1;
  384. int län = zText->getLänge();
  385. char *txt = zText->getText();
  386. int x = 0;
  387. Text result = zText->getText();
  388. for( int i = 0; i < län; ++i )
  389. {
  390. char c = txt[ i ];
  391. if( c == ' ' )
  392. {
  393. lastPos = i;
  394. x += schriftGröße / 2;
  395. continue;
  396. }
  397. if( c == '\t' )
  398. {
  399. lastPos = i;
  400. x += schriftGröße;
  401. continue;
  402. }
  403. if( c == '\n' )
  404. {
  405. x = 0;
  406. lastPos = -1;
  407. continue;
  408. }
  409. if( c == '\r' && län - i >= 11 )
  410. {
  411. i += 10;
  412. continue;
  413. }
  414. Buchstabe *b = getBuchstabe( (unsigned)c );
  415. if( b )
  416. {
  417. x += b->getBreite();
  418. if( x > maxBreite && lastPos > -1 )
  419. {
  420. result.ersetzen( lastPos, lastPos + 1, "\n" );
  421. x = 0;
  422. i = lastPos;
  423. lastPos = -1;
  424. }
  425. b = b->release();
  426. }
  427. }
  428. zText->setText( result );
  429. setDrawSchriftgröße( sg );
  430. }
  431. void Alphabet::render( Text *zTxt, Bild &rendezRObj, int f ) const // Zeichnet txt nach rendezRObj
  432. {
  433. int zRObjBr = rendezRObj.getBreite();
  434. int zRObjHö = rendezRObj.getHöhe();
  435. int xp = pos.x;
  436. int yp = pos.y;
  437. int zh = getZeilenHöhe();
  438. if( yp + ( zh + zeilenAbstand ) * zTxt->anzahlVon( '\n' ) + zh < 0 || xp >= zRObjBr || yp >= zRObjHö )
  439. return;
  440. char *text = zTxt->getText();
  441. int län = zTxt->getLänge();
  442. for( int i = 0; i < län; ++i )
  443. {
  444. unsigned char c = text[ i ];
  445. if( c == ' ' )
  446. {
  447. xp += drawSchriftGröße / 2;
  448. continue;
  449. }
  450. if( c == '\t' )
  451. {
  452. xp += drawSchriftGröße;
  453. continue;
  454. }
  455. if( c == '\n' )
  456. {
  457. yp += zh + zeilenAbstand;
  458. xp = pos.x;
  459. continue;
  460. }
  461. if( c == '\r' && län - i >= 11 )
  462. {
  463. i += 3;
  464. Text *hex1 = zTxt->getTeilText( i, i + 6 );
  465. Text *hex2 = zTxt->getTeilText( i + 6, i + 8 );
  466. f = ( TextZuInt( hex1->getText(), 16 ) << 8 ) |
  467. ( TextZuInt( hex2->getText(), 16 ) );
  468. hex1->release();
  469. hex2->release();
  470. i += 7;
  471. continue;
  472. }
  473. if( zeichen[ c ] )
  474. {
  475. if( xp >= zRObjBr )
  476. continue;
  477. zeichen[ c ]->setPosition( xp, yp );
  478. zeichen[ c ]->render( rendezRObj, f );
  479. xp += zeichen[ c ]->getBreite();
  480. }
  481. }
  482. }
  483. void Alphabet::render( Text *zTxt, Bild &rendezRObj, int cpos, int cf, int fbeg, int ff, int f ) const
  484. {
  485. int zRObjBr = rendezRObj.getBreite();
  486. int zRObjHö = rendezRObj.getHöhe();
  487. int xp = pos.x;
  488. int yp = pos.y;
  489. int zh = getZeilenHöhe();
  490. if( yp + ( zh + zeilenAbstand ) * zTxt->anzahlVon( '\n' ) + zh < 0 || xp >= zRObjBr || yp >= zRObjHö )
  491. return;
  492. char *text = zTxt->getText();
  493. int län = zTxt->getLänge();
  494. bool färb = 0;
  495. for( int i = 0; i < län; ++i )
  496. {
  497. unsigned char c = text[ i ];
  498. if( i == fbeg )
  499. färb = !färb;
  500. if( i == cpos )
  501. {
  502. rendezRObj.drawLinieVAlpha( xp, yp, zh, cf );
  503. färb = !färb;
  504. }
  505. if( c == ' ' )
  506. {
  507. if( färb )
  508. rendezRObj.alphaRegion( xp, yp, drawSchriftGröße / 2, zh, ff );
  509. xp += drawSchriftGröße / 2;
  510. continue;
  511. }
  512. if( c == '\t' )
  513. {
  514. if( färb )
  515. rendezRObj.alphaRegion( xp, yp, drawSchriftGröße, zh, ff );
  516. xp += drawSchriftGröße;
  517. continue;
  518. }
  519. if( c == '\n' )
  520. {
  521. yp += zh + zeilenAbstand;
  522. xp = pos.x;
  523. continue;
  524. }
  525. if( c == '\r' && län - i >= 11 )
  526. {
  527. i += 3;
  528. Text *hex1 = zTxt->getTeilText( i, i + 6 );
  529. Text *hex2 = zTxt->getTeilText( i + 6, i + 8 );
  530. f = ( TextZuInt( hex1->getText(), 16 ) << 8 ) |
  531. ( TextZuInt( hex2->getText(), 16 ) );
  532. hex1->release();
  533. hex2->release();
  534. i += 7;
  535. continue;
  536. }
  537. if( zeichen[ c ] )
  538. {
  539. if( xp >= zRObjBr )
  540. continue;
  541. if( färb )
  542. {
  543. int br = zeichen[ c ]->getBreite();
  544. rendezRObj.alphaRegion( xp, yp, br, zh, ff );
  545. }
  546. zeichen[ c ]->setPosition( xp, yp );
  547. zeichen[ c ]->render( rendezRObj, f );
  548. xp += zeichen[ c ]->getBreite();
  549. }
  550. }
  551. if( län == cpos )
  552. rendezRObj.drawLinieVAlpha( xp, yp, zh, cf );
  553. }
  554. // Reference Counting
  555. Alphabet *Alphabet::getThis()
  556. {
  557. ++ref;
  558. return this;
  559. }
  560. Alphabet *Alphabet::release()
  561. {
  562. --ref;
  563. if( ref == 0 )
  564. delete this;
  565. return 0;
  566. }
  567. // Inhalt der AlphabetArray Klasse aus Schrift.h
  568. // Konstruktor
  569. AlphabetArray::AlphabetArray()
  570. : next( 0 ),
  571. This( 0 )
  572. {
  573. }
  574. // Destruktor
  575. AlphabetArray::~AlphabetArray()
  576. {
  577. if( This )
  578. This->release();
  579. delete next;
  580. }
  581. // nicht constant
  582. bool AlphabetArray::addAlphabet( Alphabet *alphabet ) // Fügt ein Alphabet hinzu
  583. {
  584. if( This )
  585. {
  586. if( This->getSchriftgröße() == alphabet->getSchriftgröße() )
  587. {
  588. alphabet->release();
  589. return false;
  590. }
  591. }
  592. else
  593. {
  594. This = alphabet;
  595. return true;
  596. }
  597. if( !next )
  598. next = new AlphabetArray();
  599. return next->addAlphabet( alphabet );
  600. }
  601. bool AlphabetArray::removeAlphabet( int sg ) // entfernt ein Alphabet
  602. {
  603. if( This )
  604. {
  605. if( This->getSchriftgröße() == sg )
  606. This = This->release();
  607. return 1;
  608. }
  609. if( !next )
  610. return 0;
  611. if( next->removeAlphabet( sg ) )
  612. {
  613. AlphabetArray *tmp = next->getNext();
  614. next->setNext0();
  615. delete next;
  616. next = tmp;
  617. }
  618. return 0;
  619. }
  620. void AlphabetArray::setDrawSchriftGröße( int sg ) // Setzt die Draw Schriftgröße aller Alphabete
  621. {
  622. if( This )
  623. This->setDrawSchriftgröße( sg );
  624. if( next )
  625. next->setDrawSchriftGröße( sg );
  626. }
  627. void AlphabetArray::setZeilenAbstand( int za ) // setzt den Zeilenabstant aller Alphabete
  628. {
  629. if( This )
  630. This->setZeilenAbstand( za );
  631. if( next )
  632. next->setZeilenAbstand( za );
  633. }
  634. void AlphabetArray::setNext0() // setzt den next Zeiger zu 0
  635. {
  636. next = 0;
  637. }
  638. // constant
  639. Alphabet *AlphabetArray::getAlphabet( unsigned char sg ) const // gibt getThis von einem Alphabet zurück
  640. {
  641. if( !This )
  642. return 0;
  643. if( This->getSchriftgröße() == sg )
  644. return This->getThis();
  645. if( next )
  646. return next->getAlphabet( sg );
  647. return 0;
  648. }
  649. Alphabet *AlphabetArray::zAlphabet( unsigned char sg ) const // gibt ein Alphabet zurück
  650. {
  651. if( !This )
  652. return 0;
  653. if( This->getSchriftgröße() == sg )
  654. return This;
  655. if( next )
  656. return next->zAlphabet( sg );
  657. return 0;
  658. }
  659. Alphabet *AlphabetArray::getAlphabetI( int index, int count ) const
  660. {
  661. if( count == index )
  662. return This->getThis();
  663. if( next )
  664. return next->getAlphabetI( index, count + 1 );
  665. return 0;
  666. }
  667. Alphabet *AlphabetArray::zAlphabetI( int index, int count ) const
  668. {
  669. if( count == index )
  670. return This;
  671. if( next )
  672. return next->zAlphabetI( index, count + 1 );
  673. return 0;
  674. }
  675. AlphabetArray *AlphabetArray::getNext() const // gibt das nächste Alphabet zurück
  676. {
  677. return next;
  678. }
  679. // Inhalt der Schrift Klasse aus Schrift.h
  680. // Konstruktor
  681. Schrift::Schrift()
  682. : alphabetAnzahl( 0 ),
  683. alphabet( new AlphabetArray() ),
  684. schriftGröße( 12 ),
  685. zeilenAbstand( 5 ),
  686. drawPos( 0, 0 ),
  687. ref( 1 )
  688. {
  689. InitializeCriticalSection( &cs );
  690. }
  691. // Destruktor
  692. Schrift::~Schrift()
  693. {
  694. delete alphabet;
  695. DeleteCriticalSection( &cs );
  696. }
  697. // nicht constant
  698. void Schrift::lock() // lockt die Schrift
  699. {
  700. EnterCriticalSection( &cs );
  701. }
  702. void Schrift::unlock() // unlockt die Schrift
  703. {
  704. LeaveCriticalSection( &cs );
  705. }
  706. bool Schrift::addAlphabet( Alphabet *alphabet ) // Fügt der Schrift ein Alphabet hinzu
  707. {
  708. lock();
  709. if( this->alphabet->addAlphabet( alphabet ) )
  710. {
  711. ++alphabetAnzahl;
  712. alphabet->setDrawSchriftgröße( schriftGröße );
  713. unlock();
  714. return true;
  715. }
  716. unlock();
  717. return false;
  718. }
  719. void Schrift::removeAlphabet( int sg ) // Entfernt ein Alphabet
  720. {
  721. lock();
  722. if( alphabet->removeAlphabet( sg ) )
  723. --alphabetAnzahl;
  724. unlock();
  725. }
  726. void Schrift::setDrawPosition( int x, int y ) // setzt die Zeichenposition
  727. {
  728. lock();
  729. drawPos.x = x;
  730. drawPos.y = y;
  731. unlock();
  732. }
  733. void Schrift::setDrawPosition( Punkt &pos )
  734. {
  735. lock();
  736. drawPos = pos;
  737. unlock();
  738. }
  739. void Schrift::setSchriftGröße( int sg ) // setzt die Schriftgröße
  740. {
  741. lock();
  742. schriftGröße = sg;
  743. alphabet->setDrawSchriftGröße( sg );
  744. unlock();
  745. }
  746. void Schrift::setZeilenAbstand( int za ) // setzt den Zeilenabstand
  747. {
  748. lock();
  749. zeilenAbstand = za;
  750. alphabet->setZeilenAbstand( za );
  751. unlock();
  752. }
  753. void Schrift::textFormatieren( Text *zText, int maxBreite, int schriftGröße ) // fügt zeilenumbrüche ein
  754. {
  755. lock();
  756. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  757. if( !drawAlphabet )
  758. {
  759. for( int i = 0; i < 256; ++i )
  760. {
  761. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  762. if( drawAlphabet )
  763. break;
  764. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  765. if( drawAlphabet )
  766. break;
  767. }
  768. }
  769. if( drawAlphabet )
  770. drawAlphabet->textFormatieren( zText, maxBreite, schriftGröße );
  771. unlock();
  772. }
  773. void Schrift::renderText( Text *zTxt, Bild &zRObj, int f ) // zeichnet txt nach zRObj
  774. {
  775. lock();
  776. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  777. if( !drawAlphabet )
  778. {
  779. for( int i = 0; i < 256; ++i )
  780. {
  781. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  782. if( drawAlphabet )
  783. break;
  784. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  785. if( drawAlphabet )
  786. break;
  787. }
  788. }
  789. if( drawAlphabet )
  790. {
  791. drawAlphabet->setDrawPosition( drawPos.x, drawPos.y );
  792. drawAlphabet->render( zTxt, zRObj, f );
  793. }
  794. unlock();
  795. }
  796. void Schrift::renderText( Text *zTxt, Bild &zRObj, int cpos, int cf, int fbeg, int ff, int f )
  797. {
  798. lock();
  799. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  800. if( !drawAlphabet )
  801. {
  802. for( int i = 0; i < 256; ++i )
  803. {
  804. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  805. if( drawAlphabet )
  806. break;
  807. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  808. if( drawAlphabet )
  809. break;
  810. }
  811. }
  812. if( drawAlphabet )
  813. {
  814. drawAlphabet->setDrawPosition( drawPos.x, drawPos.y );
  815. drawAlphabet->render( zTxt, zRObj, cpos, cf, fbeg, ff, f );
  816. }
  817. unlock();
  818. }
  819. // constant
  820. Alphabet *Schrift::getAlphabet( int sg ) const // gibt einen Alphaberarray zurück
  821. {
  822. return alphabet->getAlphabet( sg );
  823. }
  824. Alphabet *Schrift::zAlphabet( int sg ) const
  825. {
  826. return alphabet->zAlphabet( sg );
  827. }
  828. Alphabet *Schrift::getAlphabetI( int index ) const
  829. {
  830. return alphabet->getAlphabetI( index, 0 );
  831. }
  832. Alphabet *Schrift::zAlphabetI( int index ) const
  833. {
  834. return alphabet->zAlphabetI( index, 0 );
  835. }
  836. unsigned char Schrift::getAlphabetAnzahl() const // gibt die anzahl von in der Schrift enthaltenen Alphabeten zurück
  837. {
  838. return alphabetAnzahl;
  839. }
  840. int Schrift::getSchriftGröße() const // gibt die Schriftgröße zurück
  841. {
  842. return schriftGröße;
  843. }
  844. int Schrift::getZeilenabstand() const // gibt den Zeilenabstand zurück
  845. {
  846. return zeilenAbstand;
  847. }
  848. int Schrift::getDrawX() const // gibt die Zeichenposition zurück
  849. {
  850. return drawPos.x;
  851. }
  852. int Schrift::getDrawY() const
  853. {
  854. return drawPos.y;
  855. }
  856. const Punkt &Schrift::getDrawPosition() const
  857. {
  858. return drawPos;
  859. }
  860. int Schrift::getTextBreite( Text *zTxt ) const // gibt die Breite des Textes zurück
  861. {
  862. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  863. if( !drawAlphabet )
  864. {
  865. for( int i = 0; i < 256; ++i )
  866. {
  867. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  868. if( drawAlphabet )
  869. break;
  870. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  871. if( drawAlphabet )
  872. break;
  873. }
  874. }
  875. if( !drawAlphabet )
  876. return 0;
  877. return drawAlphabet->getTextBreite( zTxt );
  878. }
  879. int Schrift::getTextHöhe( Text *zTxt ) const // gibt die Höhe des Textes zurück
  880. {
  881. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  882. if( !drawAlphabet )
  883. {
  884. for( int i = 0; i < 256; ++i )
  885. {
  886. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  887. if( drawAlphabet )
  888. break;
  889. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  890. if( drawAlphabet )
  891. break;
  892. }
  893. }
  894. if( !drawAlphabet )
  895. return 0;
  896. return drawAlphabet->getTextHöhe( zTxt );
  897. }
  898. int Schrift::textPos( Text *zTxt, int mausX, int mausY ) const // gibt den Buchstaben zurück, auf den die Maus zeigt
  899. {
  900. Alphabet *drawAlphabet = alphabet->zAlphabet( schriftGröße );
  901. if( !drawAlphabet )
  902. {
  903. for( int i = 0; i < 256; ++i )
  904. {
  905. drawAlphabet = alphabet->zAlphabet( schriftGröße - i );
  906. if( drawAlphabet )
  907. break;
  908. drawAlphabet = alphabet->zAlphabet( schriftGröße + i );
  909. if( drawAlphabet )
  910. break;
  911. }
  912. }
  913. if( !drawAlphabet )
  914. return 0;
  915. return drawAlphabet->textPos( zTxt, mausX, mausY );
  916. }
  917. // Reference Counting
  918. Schrift *Schrift::getThis()
  919. {
  920. ++ref;
  921. return this;
  922. }
  923. Schrift *Schrift::release()
  924. {
  925. --ref;
  926. if( ref == 0 )
  927. delete this;
  928. return 0;
  929. }