Schrift.cpp 25 KB

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