DateiSystem.cpp 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207
  1. //---Include---
  2. #include "DateiSystem.h"
  3. #include "Bild.h"
  4. #include "Text.h"
  5. #include <iostream>
  6. #ifdef WIN32
  7. #include "Fenster.h"
  8. #include "Schrift.h"
  9. #include "Fortschritt.h"
  10. #include "Globals.h"
  11. #endif
  12. #include "Datei.h"
  13. using namespace Framework;
  14. // LTDB Dateivormat
  15. // Inhalt der LTDBPixel Klasse aus Dateisystem.h
  16. // Konstruktor
  17. LTDBPixel::LTDBPixel( LTDBPixel *davor )
  18. : davor( davor ),
  19. index( 0 ),
  20. iR( 0 ),
  21. iG( 0 ),
  22. iB( 0 ),
  23. iA( 0 ),
  24. miR( 8 ),
  25. miG( 8 ),
  26. miB( 8 ),
  27. miA( 8 ),
  28. maxIndex( 1 ),
  29. änder( 0 ),
  30. änderR( 0 ),
  31. änderG( 0 ),
  32. änderB( 0 ),
  33. änderA( 0 ),
  34. komp( 0 ),
  35. R( 0 ),
  36. G( 0 ),
  37. B( 0 ),
  38. A( 0 ),
  39. ref( 1 )
  40. {
  41. }
  42. // Destruktor
  43. LTDBPixel::~LTDBPixel()
  44. {
  45. if( davor )
  46. davor->release();
  47. }
  48. // nicht constant
  49. bool LTDBPixel::addBitZuFarbe( unsigned char bit ) // Fügt den Farbwerten ein Bit hinzu
  50. {
  51. if( änderR && iR != miR ) // Das Bit gehört zu Rot
  52. {
  53. R |= ( ( bit & 0x1 ) ) << ( 7 - komp - iR );
  54. ++iR;
  55. }
  56. else if( änderG && iG != miG ) // Das Bit gehört zu Grün
  57. {
  58. G |= ( ( bit & 0x1 ) ) << ( 7 - komp - iG );
  59. ++iG;
  60. }
  61. else if( änderB && iB != miB ) // Das Bit gehört zu Blau
  62. {
  63. B |= ( ( bit & 0x1 ) ) << ( 7 - komp - iB );
  64. ++iB;
  65. }
  66. else if( änderA && iA != miA ) // Das Bit gehört zu Alpha
  67. {
  68. A |= ( ( bit & 0x1 ) ) << ( 7 - komp - iA );
  69. ++iA;
  70. }
  71. else // Das Bit gehört zum nächsten Pixel
  72. return false;
  73. return true;
  74. }
  75. char LTDBPixel::addByte( char byte, char begin ) // gibt ende des Pixels zurück, -1 wenn nicht zu ende
  76. {
  77. if( begin >= 8 || begin < 0 )
  78. return -1;
  79. for( int i = begin; i < 8; ++i )
  80. {
  81. switch( index )
  82. {
  83. case 0:
  84. // Das erste Bit eines Pixels speichert, ob sich an der Komprimierung etwas änderte
  85. änder = (bool)( ( byte >> ( 7 - i ) ) & 0x1 );
  86. if( !änder ) // Ändert sich nichts an der Komprimierung, so werden die Werte vom vorherigen Pixel übernommen
  87. {
  88. if( !davor ) // Die Datei ist beschädigt ( Der erste Pixel kann nicht von dem davor Übernemen )
  89. {
  90. #ifdef WIN32
  91. MessageBox( NULL, "Fehler, die Bilddatei ist beschädigt", "Fehler", MB_ICONERROR );
  92. #endif
  93. exit( 0 );
  94. }
  95. änderR = davor->getÄnderR();
  96. änderG = davor->getÄnderG();
  97. änderB = davor->getÄnderB();
  98. änderA = davor->getÄnderA();
  99. komp = davor->getKomp();
  100. miR -= komp, miG -= komp, miB -= komp, miA -= komp;
  101. if( !änderR )
  102. R = davor->getR();
  103. if( !änderG )
  104. G = davor->getG();
  105. if( !änderB )
  106. B = davor->getB();
  107. if( !änderA )
  108. A = davor->getA();
  109. maxIndex += ( änderR + änderG + änderB + änderA ) * ( 8 - komp ); // Bestimmung der Länge
  110. // des Pixels in Bits. Jede Farbe hat von grund auf 8 Bits, durch komprimierung kanns kleiner sein
  111. }
  112. else
  113. maxIndex += 7; // Da der Pixel nicht die Werte des vorherigen übernimmt, wird er um 7 Bits größer
  114. break;
  115. case 1: // Das zweite Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  116. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  117. änderR = (bool)( ( byte >> ( 7 - i ) ) & 0x1 );
  118. else
  119. {
  120. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  121. return i;
  122. }
  123. break;
  124. case 2: // Das dritte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  125. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  126. änderG = (bool)( ( byte >> ( 7 - i ) ) & 0x1 );
  127. else
  128. {
  129. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  130. return i;
  131. }
  132. break;
  133. case 3: // Das vierte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  134. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  135. änderB = (bool)( ( byte >> ( 7 - i ) ) & 0x1 );
  136. else
  137. {
  138. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  139. return i;
  140. }
  141. break;
  142. case 4: // Das fünfte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  143. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  144. änderA = (bool)( ( byte >> ( 7 - i ) ) & 0x1 );
  145. else
  146. {
  147. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  148. return i;
  149. }
  150. break;
  151. case 5: // Das sechste Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  152. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  153. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & 0x1 ) << 2;
  154. else
  155. {
  156. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  157. return i;
  158. }
  159. break;
  160. case 6: // Das siebte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  161. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  162. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & 0x1 ) << 1;
  163. else
  164. {
  165. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  166. return i;
  167. }
  168. break;
  169. case 7: // Das achte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  170. if( änder ) // Das Bit gehört zu den 7 Komprimierungsbits
  171. {
  172. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & 0x1 );
  173. // Das war das letzte Komprimierungsbit
  174. // Komprimierung auswerten
  175. miR -= komp, miG -= komp, miB -= komp, miA -= komp;
  176. if( !änderR )
  177. R = davor->getR();
  178. if( !änderG )
  179. G = davor->getG();
  180. if( !änderB )
  181. B = davor->getB();
  182. if( !änderA )
  183. A = davor->getA();
  184. maxIndex += ( änderR + änderG + änderB + änderA ) * ( 8 - komp ); // Bitlänge des Pixels
  185. }
  186. else
  187. {
  188. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  189. return i;
  190. }
  191. break;
  192. default: // Die restlichen Bits speichern alle die Farbwerte des Pixels
  193. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  194. return i;
  195. break;
  196. }
  197. ++index;
  198. if( index >= maxIndex )
  199. {
  200. if( davor )
  201. {
  202. if( änderR )
  203. R = davor->getR() + R;
  204. if( änderG )
  205. G = davor->getG() + G;
  206. if( änderB )
  207. B = davor->getB() + B;
  208. if( änderA )
  209. A = davor->getA() + A;
  210. davor = davor->release();
  211. }
  212. return i + 1;
  213. }
  214. }
  215. return -1;
  216. }
  217. void LTDBPixel::setFarbe( int f ) // setzt die Farbe des Pixels
  218. { // Da diese Funktion aufgerufen wird, möchte man die Klasse nun zum speichern verwenden
  219. // Werte zurücksetzen, fals mit der Klasse schon geladen oder gespeichert wurde
  220. index = 0, maxIndex = 1;
  221. änder = 0, änderR = 0, änderG = 0, änderB = 0, änderA = 0, komp = 0;
  222. iR = 0, iG = 0, iB = 0, iA = 0;
  223. miR = 8, miG = 8, miB = 8, miA = 8;
  224. // Farbwerte setzen
  225. R = (unsigned char)( f >> 16 );
  226. G = (unsigned char)( f >> 8 );
  227. B = (unsigned char)f;
  228. A = (unsigned char)( f >> 24 );
  229. }
  230. void LTDBPixel::komprimieren() // Komprimiert den Pixel
  231. {
  232. maxIndex = 1;
  233. if( !davor )
  234. {// Das ist der erste Pixel
  235. änder = 1;
  236. änderR = 1;
  237. änderG = 1;
  238. änderB = 1;
  239. änderA = 1;
  240. maxIndex += 7;
  241. miR = getBits( R );
  242. miG = getBits( G );
  243. miB = getBits( B );
  244. miA = getBits( A );
  245. }
  246. else
  247. { // Es wird die differenz zum vorrigen Pixel gespeichert
  248. miR = getBits( R - davor->getR() );
  249. miG = getBits( G - davor->getG() );
  250. miB = getBits( B - davor->getB() );
  251. miA = getBits( A - davor->getA() );
  252. änderR = R != davor->getR();
  253. änderG = G != davor->getG();
  254. änderB = B != davor->getB();
  255. änderA = A != davor->getA();
  256. }// Prüfen ob sich etwas ändert
  257. if( !miR && änderR )
  258. ++miR;
  259. if( !miG && änderG )
  260. ++miG;
  261. if( !miB && änderB )
  262. ++miB;
  263. if( !miA && änderA )
  264. ++miA;
  265. int k = ( miR > miG ? miR : miG );
  266. k = ( k > miB ? k : miB );
  267. k = ( k > miA ? k : miA );
  268. miR = k, miG = k, miB = k, miA = k;
  269. komp = 8 - k;
  270. maxIndex += ( änderR + änderG + änderB + änderA ) * ( k );
  271. if( davor )
  272. {
  273. if( änderR != davor->getÄnderR() ||
  274. änderG != davor->getÄnderG() ||
  275. änderB != davor->getÄnderB() ||
  276. änderA != davor->getÄnderA() ||
  277. komp != davor->getKomp() )
  278. { // Es ändert sich etwas
  279. änder = 1;
  280. maxIndex += 7;
  281. }
  282. else
  283. { // Es ändert sich nichts
  284. änder = 0;
  285. }
  286. }
  287. }
  288. bool LTDBPixel::getNextFarbeBit( char &byte, int i ) // Speichert das nächste Farbbit in byte
  289. {
  290. unsigned char RR = R;
  291. unsigned char GG = G;
  292. unsigned char BB = B;
  293. unsigned char AA = A;
  294. if( davor )
  295. {
  296. RR -= davor->getR();
  297. GG -= davor->getG();
  298. BB -= davor->getB();
  299. AA -= davor->getA();
  300. }
  301. if( änderR && iR != miR ) // Das Bit gehört zu Rot
  302. {
  303. byte |= ( ( RR >> ( 7 - komp - iR ) ) & 0x1 ) << ( 7 - i );
  304. ++iR;
  305. }
  306. else if( änderG && iG != miG ) // Das Bit gehört zu Grün
  307. {
  308. byte |= ( ( GG >> ( 7 - komp - iG ) ) & 0x1 ) << ( 7 - i );
  309. ++iG;
  310. }
  311. else if( änderB && iB != miB ) // Das Bit gehört zu Blau
  312. {
  313. byte |= ( ( BB >> ( 7 - komp - iB ) ) & 0x1 ) << ( 7 - i );
  314. ++iB;
  315. }
  316. else if( änderA && iA != miA ) // Das Bit gehört zu Alpha
  317. {
  318. byte |= ( ( AA >> ( 7 - komp - iA ) ) & 0x1 ) << ( 7 - i );
  319. ++iA;
  320. }
  321. else // Der Pixel ist bereits zu ende
  322. return false;
  323. return true;
  324. }
  325. char LTDBPixel::getNextByte( char &byte, int begin ) // Gibt die nächsten Bits Zurück, -1 wenn der Pixel nicht zu ende ist
  326. {
  327. // bbegin gibt an wohin in die byte-variable geschrieben werden soll
  328. // die Funktion gibt das ende des Pixels in der byte-variable zurück
  329. // -1 heißt, dass der Pixel nicht zu ende ist
  330. for( int i = begin; i < 8; ++i )
  331. {
  332. switch( index )
  333. {
  334. case 0: // Das erste Bit des Pixels speichert, ob sich etwas an der Komprimierung ändert
  335. byte |= ( (int)änder & 0x1 ) << ( 7 - i );
  336. break;
  337. case 1: // Das zweite Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  338. if( änder ) // Komprimierung
  339. byte |= ( (int)änderR & 0x1 ) << ( 7 - i );
  340. else // Farbe
  341. {
  342. if( !getNextFarbeBit( byte, i ) )
  343. return i;
  344. }
  345. break;
  346. case 2: // Das dritte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  347. if( änder ) // Komprimierung
  348. byte |= ( (int)änderG & 0x1 ) << ( 7 - i );
  349. else // Farbe
  350. {
  351. if( !getNextFarbeBit( byte, i ) )
  352. return i;
  353. }
  354. break;
  355. case 3: // Das vierte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  356. if( änder ) // Komprimierung
  357. byte |= ( (int)änderB & 0x1 ) << ( 7 - i );
  358. else // Farbe
  359. {
  360. if( !getNextFarbeBit( byte, i ) )
  361. return i;
  362. }
  363. break;
  364. case 4: // Das fünfte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  365. if( änder ) // Komprimierung
  366. byte |= ( (int)änderA & 0x1 ) << ( 7 - i );
  367. else // Farbe
  368. {
  369. if( !getNextFarbeBit( byte, i ) )
  370. return i;
  371. }
  372. break;
  373. case 5: // Das sechste Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  374. if( änder ) // Komprimierung
  375. byte |= ( ( komp >> 2 ) & 0x1 ) << ( 7 - i );
  376. else // Farbe
  377. {
  378. if( !getNextFarbeBit( byte, i ) )
  379. return i;
  380. }
  381. break;
  382. case 6: // Das siebte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  383. if( änder ) // Komprimierung
  384. byte |= ( ( komp >> 1 ) & 0x1 ) << ( 7 - i );
  385. else // Farbe
  386. {
  387. if( !getNextFarbeBit( byte, i ) )
  388. return i;
  389. }
  390. break;
  391. case 7: // Das sechste Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  392. if( änder ) // Komprimierung
  393. byte |= ( komp & 0x1 ) << ( 7 - i );
  394. else // Farbe
  395. {
  396. if( !getNextFarbeBit( byte, i ) )
  397. return i;
  398. }
  399. break;
  400. default: // Die restlichen Bits speichern die Farbe des Pixels
  401. if( !getNextFarbeBit( byte, i ) )
  402. return i;
  403. break;
  404. }
  405. ++index;
  406. if( index >= maxIndex )
  407. {
  408. if( davor )
  409. davor = davor->release();
  410. return i + 1;
  411. }
  412. }
  413. return -1;
  414. }
  415. // constant
  416. int LTDBPixel::zuFarbe() const // gibt den Pixel als Farbe zurück
  417. {
  418. return ( ( (int)R << 16 ) | ( (int)G << 8 ) | (int)B | ( (int)A << 24 ) );
  419. }
  420. bool LTDBPixel::getÄnderR() const
  421. {
  422. return änderR;
  423. }
  424. bool LTDBPixel::getÄnderG() const
  425. {
  426. return änderG;
  427. }
  428. bool LTDBPixel::getÄnderB() const
  429. {
  430. return änderB;
  431. }
  432. bool LTDBPixel::getÄnderA() const
  433. {
  434. return änderA;
  435. }
  436. unsigned char LTDBPixel::getKomp() const
  437. {
  438. return komp;
  439. }
  440. unsigned char LTDBPixel::getR() const // gibt Rot zurück
  441. {
  442. return R;
  443. }
  444. unsigned char LTDBPixel::getG() const // gibt Grün zurück
  445. {
  446. return G;
  447. }
  448. unsigned char LTDBPixel::getB() const // gibt Blau zurück
  449. {
  450. return B;
  451. }
  452. unsigned char LTDBPixel::getA() const // gibt Alpha zurück
  453. {
  454. return A;
  455. }
  456. // Reference Counting
  457. LTDBPixel *LTDBPixel::getThis()
  458. {
  459. ++ref;
  460. return this;
  461. }
  462. LTDBPixel *LTDBPixel::release()
  463. {
  464. --ref;
  465. if( ref < 1 )
  466. delete this;
  467. return 0;
  468. }
  469. // Inhalt der LTDBDateiKopf Klasse aus Dateisystem.h
  470. // konstructor
  471. LTDBDateiKopf::LTDBDateiKopf()
  472. : bilder( new RCArray< Text >() ),
  473. pos( new Array< __int64 >() ),
  474. bAnzahl( 0 ),
  475. ref( 1 )
  476. {
  477. }
  478. // destructor
  479. LTDBDateiKopf::~LTDBDateiKopf()
  480. {
  481. bilder->release();
  482. pos->release();
  483. }
  484. // nicht constant
  485. void LTDBDateiKopf::removeBild( int i )
  486. {
  487. if( i >= bAnzahl )
  488. return;
  489. bilder->lösche( i );
  490. pos->lösche( i );
  491. --bAnzahl;
  492. }
  493. void LTDBDateiKopf::removeBild( Text *txt )
  494. {
  495. int i = -1;
  496. for( int ii = 0; ii < bAnzahl; ++ii )
  497. {
  498. Text *b = bilder->z( ii );
  499. if( b->istGleich( txt->getText() ) )
  500. {
  501. i = ii;
  502. break;
  503. }
  504. }
  505. txt->release();
  506. if( i == -1 )
  507. return;
  508. bilder->lösche( i );
  509. pos->lösche( i );
  510. --bAnzahl;
  511. }
  512. void LTDBDateiKopf::addBild( Text *txt )
  513. {
  514. bilder->add( txt, bAnzahl );
  515. pos->add( 0, bAnzahl );
  516. ++bAnzahl;
  517. }
  518. void LTDBDateiKopf::setBildPos( int i, __int64 pos )
  519. {
  520. this->pos->set( pos, i );
  521. }
  522. void LTDBDateiKopf::setBildPos( Text *txt, __int64 pos )
  523. {
  524. int i = -1;
  525. for( int ii = 0; ii < bAnzahl; ++ii )
  526. {
  527. Text *b = bilder->z( ii );
  528. if( b->istGleich( txt->getText() ) )
  529. {
  530. i = ii;
  531. break;
  532. }
  533. }
  534. txt->release();
  535. if( i == -1 )
  536. return;
  537. this->pos->set( pos, i );
  538. }
  539. void LTDBDateiKopf::laden( FBalken *f, std::ifstream *inF )
  540. {
  541. if( inF->is_open() && inF->good() )
  542. {
  543. char b = 0;
  544. inF->read( &b, 1 );
  545. bAnzahl = b << 8;
  546. inF->read( &b, 1 );
  547. bAnzahl |= b & 0xFF;
  548. #ifdef WIN32
  549. if( f )
  550. {
  551. f->reset();
  552. f->setAktionAnzahl( bAnzahl );
  553. }
  554. #endif
  555. bilder->leeren();
  556. pos->leeren();
  557. for( int i = 0; i < bAnzahl; ++i )
  558. {
  559. LTDBKopf *kpf = new LTDBKopf();
  560. kpf->laden( inF ); // bildname und halbe datei position
  561. bilder->set( kpf->getTitel(), i ); // setzt titel
  562. Punkt gr = kpf->getGröße();
  563. kpf->release();
  564. char p[ 5 ];
  565. inF->read( (char *)p, 5 ); // andere hälfte der Dateiposition
  566. unsigned __int64 position = ( ( (__int64)gr.x << 52 ) & 0xFFF0000000000000 ) |
  567. ( ( (__int64)gr.y << 40 ) & 0xFFF0000000000 ) |
  568. ( ( (__int64)p[ 0 ] << 32 ) & 0xFF00000000 ) |
  569. ( ( (__int64)p[ 1 ] << 24 ) & 0xFF000000 ) |
  570. ( ( (__int64)p[ 2 ] << 16 ) & 0xFF0000 ) |
  571. ( ( (__int64)p[ 3 ] << 8 ) & 0xFF00 ) |
  572. ( (__int64)p[ 4 ] & 0xFF );
  573. pos->set( position, i ); // setzt position
  574. #ifdef WIN32
  575. if( f )
  576. f->aktionPlus();
  577. #endif
  578. }
  579. }
  580. }
  581. // constant
  582. void LTDBDateiKopf::speichern( std::ofstream *outF ) const
  583. {
  584. if( outF->is_open() && outF->good() )
  585. {
  586. char b = bAnzahl >> 8;
  587. outF->write( &b, 1 );
  588. b = (char)bAnzahl;
  589. outF->write( &b, 1 );
  590. for( int i = 0; i < bAnzahl; ++i )
  591. {
  592. LTDBKopf *kpf = new LTDBKopf();
  593. __int64 position = pos->get( i );
  594. kpf->Init( bilder->get( i ), Punkt( position >> 52, position >> 40 ) );
  595. kpf->speichern( outF );
  596. kpf->release();
  597. char p[] = { (char)( position >> 32 ), (char)( position >> 24 ), (char)( position >> 16 ), (char)( position >> 8 ), (char)( position ) };
  598. outF->write( (char *)p, 5 );
  599. }
  600. }
  601. }
  602. Text *LTDBDateiKopf::getBild( int i ) const
  603. {
  604. return bilder->get( i );
  605. }
  606. Text *LTDBDateiKopf::zBild( int i ) const
  607. {
  608. return bilder->z( i );
  609. }
  610. __int64 LTDBDateiKopf::getBildPosition( Text *txt ) const
  611. {
  612. int i = -1;
  613. for( int ii = 0; ii < bAnzahl; ++ii )
  614. {
  615. Text *b = bilder->z( ii );
  616. if( b->istGleich( txt->getText() ) )
  617. {
  618. i = ii;
  619. break;
  620. }
  621. }
  622. txt->release();
  623. if( i == -1 )
  624. return -1;
  625. return pos->get( i );
  626. }
  627. __int64 LTDBDateiKopf::getBildPosition( int index ) const
  628. {
  629. return pos->get( index );
  630. }
  631. int LTDBDateiKopf::getBildIndex( Text *txt ) const
  632. {
  633. int i = -1;
  634. for( int ii = 0; ii < bAnzahl; ++ii )
  635. {
  636. Text *b = bilder->z( ii );
  637. if( b->istGleich( txt->getText() ) )
  638. {
  639. i = ii;
  640. break;
  641. }
  642. }
  643. txt->release();
  644. return i;
  645. }
  646. int LTDBDateiKopf::getbAnzahl() const
  647. {
  648. return bAnzahl;
  649. }
  650. RCArray< Text > *LTDBDateiKopf::zBildListe() const
  651. {
  652. return bilder;
  653. }
  654. // Reference Counting
  655. LTDBDateiKopf *LTDBDateiKopf::getThis()
  656. {
  657. ++ref;
  658. return this;
  659. }
  660. LTDBDateiKopf *LTDBDateiKopf::release()
  661. {
  662. --ref;
  663. if( ref == 0 )
  664. delete this;
  665. return 0;
  666. }
  667. // Inhalt der LTDBKopf Klasse aus DateiSystem.h
  668. // Konstruktor
  669. LTDBKopf::LTDBKopf()
  670. : ref( 1 )
  671. {
  672. }
  673. // nicht constant
  674. void LTDBKopf::laden( std::ifstream *f ) // Lät die Daten aus einer Datei
  675. {
  676. if( f->is_open() )
  677. {
  678. a = 0;
  679. b = 0;
  680. c = 0;
  681. char aa = 0;
  682. f->read( &aa, 1 );
  683. int tl = ( aa >> 4 ) & Bits( 4 );
  684. int BitAnzahl = 4 + tl * 5 + 24;
  685. f->seekg( -1, std::ios::cur );
  686. int Bytes = BitAnzahl / 8;
  687. if( ( (float)BitAnzahl / 8.0f ) != Bytes )
  688. ++Bytes;
  689. char byte = 0;
  690. for( int i = 0; i < Bytes; ++i )
  691. {
  692. f->read( &byte, 1 );
  693. setBits( i * 8, i * 8 + 8, byte );
  694. }
  695. }
  696. }
  697. int LTDBKopf::Init( Text *t, const Punkt &g ) // Befüllt die Daten
  698. {
  699. a = 0;
  700. b = 0;
  701. c = 0;
  702. int tl = t->getLänge();
  703. if( tl > 15 )
  704. tl = 15;
  705. char *titel = new char[ tl ];
  706. int übersp = 0;
  707. for( int i = 0; i < tl; ++i )
  708. {
  709. titel[ i - übersp ] = t->getText()[ i ];
  710. if( titel[ i - übersp ] > 96 && titel[ i - übersp ] < 123 )
  711. titel[ i - übersp ] -= 96;
  712. else if( titel[ i - übersp ] > 64 && titel[ i - übersp ] < 91 )
  713. titel[ i - übersp ] -= 64;
  714. else if( titel[ i - übersp ] == 'ü' || titel[ i - übersp ] == 'Ü' )
  715. titel[ i - übersp ] = 27;
  716. else if( titel[ i - übersp ] == 'ö' || titel[ i - übersp ] == 'Ö' )
  717. titel[ i - übersp ] = 28;
  718. else if( titel[ i - übersp ] == 'ä' || titel[ i - übersp ] == 'Ä' )
  719. titel[ i - übersp ] = 29;
  720. else if( titel[ i - übersp ] == 'ß' )
  721. titel[ i - übersp ] = 30;
  722. else if( titel[ i - übersp ] == '.' )
  723. titel[ i - übersp ] = 31;
  724. else
  725. ++übersp;
  726. }
  727. a = (__int64)( ( tl - übersp ) & Bits( 4 ) ) << 60;
  728. int BeginBit = 4;
  729. for( int i = 0; i < tl - übersp; ++i )
  730. {
  731. BeginBit += 5;
  732. switch( i )
  733. {
  734. case 0:
  735. a |= (__int64)( titel[ i ] & 31 ) << 55; // ersten Buchstaben speichern
  736. break;
  737. case 1:
  738. a |= (__int64)( titel[ i ] & 31 ) << 50; // zweiten Buchstaben speichern
  739. break;
  740. case 2:
  741. a |= (__int64)( titel[ i ] & 31 ) << 45; // dritten Buchstaben speichern
  742. break;
  743. case 3:
  744. a |= (__int64)( titel[ i ] & 31 ) << 40; // vierten Buchstaben speichern
  745. break;
  746. case 4:
  747. a |= (__int64)( titel[ i ] & 31 ) << 35; // fünften Buchstaben speichern
  748. break;
  749. case 5:
  750. a |= (__int64)( titel[ i ] & 31 ) << 30; // sechsten Buchstaben speichern
  751. break;
  752. case 6:
  753. a |= (__int64)( titel[ i ] & 31 ) << 25; // siebten Buchstaben speichern
  754. break;
  755. case 7:
  756. a |= (__int64)( titel[ i ] & 31 ) << 20; // achten Buchstaben speichern
  757. break;
  758. case 8:
  759. a |= (__int64)( titel[ i ] & 31 ) << 15; // neunten Buchstaben speichern
  760. break;
  761. case 9:
  762. a |= (__int64)( titel[ i ] & 31 ) << 10; // zenten Buchstaben speichern
  763. break;
  764. case 10:
  765. a |= (__int64)( titel[ i ] & 31 ) << 5; // elften Buchstaben speichern
  766. break;
  767. case 11:
  768. a |= (__int64)( titel[ i ] & 31 ); // zwölften Buchstaben speichern
  769. break;
  770. case 12:
  771. b |= (__int32)( titel[ i ] & 31 ) << 27; // dreizenten Buchstaben speichern
  772. break;
  773. case 13:
  774. b |= (__int32)( titel[ i ] & 31 ) << 22; // vierzenten Buchstaben speichern
  775. break;
  776. case 14:
  777. b |= (__int32)( titel[ i ] & 31 ) << 17; // fünfzenten Buchstaben speichern
  778. break;
  779. }
  780. }
  781. __int16 grx = g.x & Bits( 12 );
  782. __int16 gry = g.y & Bits( 12 );
  783. int EndBit = BeginBit + 24;
  784. setBits( BeginBit, EndBit - 12, grx );
  785. setBits( BeginBit + 12, EndBit, gry );
  786. t->release();
  787. delete[]titel;
  788. return übersp;
  789. }
  790. void LTDBKopf::setBits( int BeginBit, int EndBit, __int16 bits )
  791. {
  792. if( EndBit - BeginBit > 16 )
  793. EndBit = BeginBit + 16;
  794. if( BeginBit < 64 )
  795. {
  796. if( EndBit < 64 )
  797. {
  798. a |= ( (__int64)bits & Bits( EndBit - BeginBit ) ) << ( ( 64 - BeginBit ) - ( EndBit - BeginBit ) );
  799. }
  800. else
  801. {
  802. a |= ( ( (__int64)bits >> ( EndBit - 64 ) ) & Bits( 64 - BeginBit ) );
  803. b |= ( (__int32)bits & Bits( EndBit - 64 ) ) << ( 32 - ( EndBit - 64 ) );
  804. }
  805. }
  806. else
  807. {
  808. if( BeginBit < 96 )
  809. {
  810. if( EndBit < 96 )
  811. {
  812. b |= ( (__int32)bits & Bits( EndBit - BeginBit ) ) << ( ( 96 - BeginBit ) - ( EndBit - BeginBit ) );
  813. }
  814. else
  815. {
  816. b |= ( ( (__int32)bits >> ( EndBit - 96 ) ) & Bits( 96 - BeginBit ) );
  817. c |= ( ( (__int8)bits & Bits( EndBit - 96 ) ) << ( 8 - ( EndBit - 96 ) ) );
  818. }
  819. }
  820. else
  821. {
  822. c |= ( ( (__int8)bits & Bits( EndBit - BeginBit ) ) << ( 8 - ( EndBit - BeginBit ) ) );
  823. }
  824. }
  825. }
  826. // constant
  827. void LTDBKopf::speichern( std::ofstream *f ) const // Speichert die Daten in eine Datei
  828. {
  829. if( f->is_open() )
  830. {
  831. int bits = 4/*Titellänge*/ + getTitelLänge() * 5/*Titel*/ + 24/*Bildgröße*/;
  832. int bytes = bits / 8; // Bytelänge des Dateikopfes
  833. if( ( (float)bits / 8.0f ) != bytes )
  834. ++bytes;
  835. char c = 0;
  836. for( int i = 0; i < bytes; ++i )
  837. {
  838. c = (char)getBits( i * 8, i * 8 + 8 );
  839. f->write( &c, 1 );
  840. }
  841. }
  842. }
  843. int LTDBKopf::getTitelLänge() const // gibt die länge des Bildnamens zurück
  844. {
  845. return a >> 60 & Bits( 4 ); // Die Länge des Titels wird in den ersten 4 Bits der Tatei gespeichert
  846. }
  847. Text *LTDBKopf::getTitel() const // gibt den Namen des Bildes zurück
  848. {
  849. Text *ret = new Text( "" );
  850. char c[ 2 ];
  851. c[ 1 ] = '\0';
  852. int l = getTitelLänge();
  853. for( int i = 0; i < l; ++i )
  854. {
  855. c[ 0 ] = 0;
  856. switch( i )
  857. {
  858. case 0:
  859. c[ 0 ] = ( a >> 55 ) & 31; // ersten Buchstaben holen
  860. break;
  861. case 1:
  862. c[ 0 ] = ( a >> 50 ) & 31; // zweiten Buchstaben holen
  863. break;
  864. case 2:
  865. c[ 0 ] = ( a >> 45 ) & 31; // dritten Buchstaben holen
  866. break;
  867. case 3:
  868. c[ 0 ] = ( a >> 40 ) & 31; // vierten Buchstaben holen
  869. break;
  870. case 4:
  871. c[ 0 ] = ( a >> 35 ) & 31; // fünften Buchstaben holen
  872. break;
  873. case 5:
  874. c[ 0 ] = ( a >> 30 ) & 31; // sechsten Buchstaben holen
  875. break;
  876. case 6:
  877. c[ 0 ] = ( a >> 25 ) & 31; // siebten Buchstaben holen
  878. break;
  879. case 7:
  880. c[ 0 ] = ( a >> 20 ) & 31; // achten Buchstaben holen
  881. break;
  882. case 8:
  883. c[ 0 ] = ( a >> 15 ) & 31; // neunten Buchstaben holen
  884. break;
  885. case 9:
  886. c[ 0 ] = ( a >> 10 ) & 31; // zenten Buchstaben holen
  887. break;
  888. case 10:
  889. c[ 0 ] = ( a >> 5 ) & 31; // elften Buchstaben holen
  890. break;
  891. case 11:
  892. c[ 0 ] = a & 31; // zwölften Buchstaben holen
  893. break;
  894. case 12:
  895. c[ 0 ] = ( b >> 27 ) & 31; // dreizenten Buchstaben holen
  896. break;
  897. case 13:
  898. c[ 0 ] = ( b >> 22 ) & 31; // vierzenten Buchstaben holen
  899. break;
  900. case 14:
  901. c[ 0 ] = ( b >> 17 ) & 31; // fünfzenten Buchstaben holen
  902. break;
  903. }
  904. if( c[ 0 ] == 27 )
  905. c[ 0 ] = 'ü';
  906. else if( c[ 0 ] == 28 )
  907. c[ 0 ] = 'ö';
  908. else if( c[ 0 ] == 29 )
  909. c[ 0 ] = 'ä';
  910. else if( c[ 0 ] == 30 )
  911. c[ 0 ] = 'ß';
  912. else if( c[ 0 ] == 31 )
  913. c[ 0 ] = '.';
  914. else
  915. c[ 0 ] += 96;
  916. ret->anhängen( c );
  917. }
  918. return ret;
  919. }
  920. Punkt LTDBKopf::getGröße() const // gibt die Größe des Bildes zurück
  921. {
  922. int BeginBit = 4/*Titellänge*/ + getTitelLänge() * 5/*Titel*/;
  923. int EndBit = BeginBit + 24;
  924. __int16 grx = getBits( BeginBit, EndBit - 12 );
  925. __int16 gry = getBits( BeginBit + 12, EndBit );
  926. return Punkt( (int)( grx & Bits( 12 ) ), (int)( gry & Bits( 12 ) ) );
  927. }
  928. __int16 LTDBKopf::getBits( int begin, int ende )const // gibt die Bits von begin bis ende zurück( ohne ende );
  929. {
  930. if( ende < begin )
  931. return 0;
  932. if( ende - begin > 16 )
  933. ende = begin + 16;
  934. __int16 ret = 0;
  935. if( begin < 64 )
  936. {
  937. if( ende < 64 )
  938. {
  939. ret = (__int16)( a >> ( ( 64 - begin ) - ( ende - begin ) ) & Bits( ende - begin ) );
  940. }
  941. else
  942. {
  943. ret = (__int16)( ( a & Bits( 64 - begin ) ) << ( ende - 64 ) );
  944. ret |= (__int16)( ( b >> ( 32 - ( ende - 64 ) ) ) & Bits( ende - 64 ) );
  945. }
  946. }
  947. else
  948. {
  949. if( begin < 96 )
  950. {
  951. if( ende < 96 )
  952. {
  953. ret = (__int16)( b >> ( ( 96 - begin ) - ( ende - begin ) ) & Bits( ende - begin ) );
  954. }
  955. else
  956. {
  957. ret = (__int16)( ( b & Bits( 96 - begin ) ) << ( ende - 96 ) );
  958. ret |= (__int16)( ( c >> ( 8 - ( ende - 96 ) ) ) & Bits( ende - 96 ) );
  959. }
  960. }
  961. else
  962. {
  963. ret = (__int16)( c >> ( ( 104 - begin ) - ( ende - begin ) ) & Bits( ende - begin ) );
  964. }
  965. }
  966. return ret;
  967. }
  968. // Reference Counting
  969. LTDBKopf *LTDBKopf::getThis()
  970. {
  971. ++ref;
  972. return this;
  973. }
  974. LTDBKopf *LTDBKopf::release()
  975. {
  976. --ref;
  977. if( ref < 1 )
  978. delete this;
  979. return 0;
  980. }
  981. // Inhalt der LTDBKörper Klasse aus Dateisystem.h
  982. // Konstruktor
  983. LTDBKörper::LTDBKörper()
  984. : gr( 0, 0 ),
  985. b( new Bild() ),
  986. ref( 1 )
  987. {
  988. }
  989. LTDBKörper::LTDBKörper( LTDBKopf *k ) // ruft Init auf
  990. : gr( 0, 0 ),
  991. b( new Bild() ),
  992. ref( 1 )
  993. {
  994. init( k );
  995. }
  996. // Destruktor
  997. LTDBKörper::~LTDBKörper()
  998. {
  999. b->release();
  1000. }
  1001. // nicht constant
  1002. void LTDBKörper::init( LTDBKopf k ) // Initialisiert, wird vor dem laden benötigt
  1003. {
  1004. gr = k.getGröße();
  1005. int l = k.getTitelLänge();
  1006. l = 4 + l * 5 + 24;
  1007. dateiLänge = ( l / 8.0 == l ) ? ( l / 8 ) : ( l / 8 + 1 );
  1008. }
  1009. void LTDBKörper::init( LTDBKopf *k ) // Initialisiert, wird vor dem laden benötigt
  1010. {
  1011. gr = k->getGröße();
  1012. int l = k->getTitelLänge();
  1013. l = 4 + l * 5 + 24;
  1014. dateiLänge = ( l / 8.0 == l ) ? ( l / 8 ) : ( l / 8 + 1 );
  1015. k->release();
  1016. }
  1017. void LTDBKörper::laden( FBalken *zF, std::ifstream *inF ) // läd das Bild
  1018. {
  1019. b->neuBild( gr.x, gr.y, 0xFF000000 ); // neues Bild erstellen
  1020. int *buff = b->getBuffer();
  1021. int breite = b->getBreite();
  1022. char byte = 0;
  1023. int index = 0;
  1024. LTDBPixel *davor = 0; // zuletzt geladener Pixel
  1025. LTDBPixel *dieser = new LTDBPixel( 0 ); // momentan zu ladener Pixel
  1026. int begin = 0; // Pixelbegin, endposition in der byte variable
  1027. #ifdef WIN32
  1028. if( zF )
  1029. {
  1030. zF->reset();
  1031. zF->setAktionAnzahl( gr.x * gr.y );
  1032. }
  1033. #endif
  1034. while( index < gr.x * gr.y ) // für jeden Pixel
  1035. {
  1036. if( !dieser ) // wenn es nicht der erste Pixel ist
  1037. dieser = new LTDBPixel( davor->getThis() );
  1038. int ende = -1;
  1039. while( ende < 0 ) // Pixel laden
  1040. {
  1041. if( begin == 0 )
  1042. inF->read( &byte, 1 );
  1043. ende = dieser->addByte( byte, begin ); // byte auswerten
  1044. begin = 0;
  1045. }
  1046. begin = ende;
  1047. if( begin == 8 )
  1048. begin = 0;
  1049. buff[ ( index % gr.x ) + ( index / gr.x ) * breite ] = dieser->zuFarbe();
  1050. if( davor )
  1051. davor = davor->release();
  1052. davor = dieser->getThis();
  1053. dieser = dieser->release();
  1054. ++index;
  1055. #ifdef WIN32
  1056. if( zF )
  1057. zF->aktionPlus();
  1058. #endif
  1059. }
  1060. if( davor )
  1061. davor = davor->release();
  1062. }
  1063. void LTDBKörper::setBild( Bild *b ) // setzt das zu speichernde Bild
  1064. {
  1065. this->b->release();
  1066. this->b = b;
  1067. }
  1068. // constant
  1069. void LTDBKörper::speichern( FBalken *zF, std::ofstream *outF ) const // speichert Bild
  1070. {
  1071. if( outF->is_open() )
  1072. {
  1073. LTDBPixel *letzter = 0; // Letzter gespeicherter Pixel
  1074. LTDBPixel *dieser = new LTDBPixel( 0 ); // Der momentan zu speichernde Pixel
  1075. int begin = 0, ende = 0; // Pixelbeginn, endposition in der byte variable
  1076. char byte = 0; // Der nächste byte der Datei
  1077. bool w = 0;
  1078. #ifdef WIN32
  1079. if( zF )
  1080. {
  1081. zF->reset();
  1082. zF->setAktionAnzahl( gr.x * gr.y );
  1083. }
  1084. #endif
  1085. int *pBuff = b->getBuffer();
  1086. for( int i = 0; i < gr.x * gr.y; ++i ) // für jeden Pixel
  1087. {
  1088. if( !dieser ) // wenn es nicht der erste Pixel ist
  1089. dieser = new LTDBPixel( letzter->getThis() );
  1090. dieser->setFarbe( pBuff[ i ] ); // Farbe des Pixels setzen
  1091. dieser->komprimieren(); // Pixel komprimieren
  1092. ende = -1;
  1093. while( ende < 0 ) // byte befüllen
  1094. {
  1095. ende = dieser->getNextByte( byte, begin );
  1096. begin = 0;
  1097. w = 0;
  1098. if( ende == -1 || ende == 8 ) // byte speichern
  1099. {
  1100. outF->write( &byte, 1 );
  1101. w = 1;
  1102. byte = 0;
  1103. }
  1104. } // Pixel fertig
  1105. begin = ende;
  1106. if( begin == 8 )
  1107. begin = 0;
  1108. if( letzter )
  1109. letzter->release();
  1110. letzter = dieser->getThis(); // dieser wird zu letzter
  1111. dieser = dieser->release();
  1112. #ifdef WIN32
  1113. if( zF )
  1114. zF->aktionPlus();
  1115. #endif
  1116. }
  1117. if( letzter )
  1118. letzter = letzter->release();
  1119. if( !w )
  1120. {
  1121. outF->write( &byte, 1 ); // Das letzte byte speichern
  1122. }
  1123. outF->flush(); // dateistream speichern
  1124. }
  1125. }
  1126. Bild *LTDBKörper::getBild() const // gibt das geladene Bild zurück
  1127. {
  1128. return b->getThis();
  1129. }
  1130. const Punkt &LTDBKörper::getGröße() const // gibt die größe des Bildes zurück
  1131. {
  1132. return gr;
  1133. }
  1134. // Reference Counting
  1135. LTDBKörper *LTDBKörper::getThis()
  1136. {
  1137. ++ref;
  1138. return this;
  1139. }
  1140. LTDBKörper *LTDBKörper::release()
  1141. {
  1142. --ref;
  1143. if( ref < 1 )
  1144. delete this;
  1145. return 0;
  1146. }
  1147. // Inhalt det LTDBDatei Klasse aus Dateisystem.h
  1148. // Konstruktor
  1149. LTDBDatei::LTDBDatei()
  1150. : pfad( new Text() ),
  1151. datKpf( 0 ),
  1152. ref( 1 )
  1153. {
  1154. }
  1155. // Destruktor
  1156. LTDBDatei::~LTDBDatei()
  1157. {
  1158. if( pfad )
  1159. pfad->release();
  1160. if( datKpf )
  1161. datKpf->release();
  1162. }
  1163. // nicht constant
  1164. void LTDBDatei::setDatei( Text *pfad ) // Setzt den Pfad zur Datei
  1165. { // Werte der eventuellen vorherigen Datei löschen
  1166. if( datKpf )
  1167. datKpf = datKpf->release();
  1168. // Pfad setzen
  1169. this->pfad->setText( pfad->getThis() );
  1170. pfad->release();
  1171. }
  1172. void LTDBDatei::erstellen() // Erstellt die Datei
  1173. {
  1174. DateiPfadErstellen( pfad->getThis() );
  1175. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary );
  1176. int i = 0;
  1177. outF->write( (char *)&i, 2 );
  1178. delete outF;
  1179. }
  1180. void LTDBDatei::leseDaten( FBalken *f ) // Die Klasse ließt alle Bilder kurz ein, und merkt sich, an welcher stelle in der Datei was ist
  1181. { // Diese Funktion wird ein wenig Zeit in Anspruch nemen, dafüraber danach die anderen schneller machen
  1182. if( DateiExistiert( pfad->getThis() ) )
  1183. {
  1184. if( datKpf )
  1185. datKpf->release();
  1186. datKpf = new LTDBDateiKopf();
  1187. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  1188. datKpf->laden( f, inF );
  1189. delete inF;
  1190. }
  1191. }
  1192. void LTDBDatei::löschen() // Löscht die Datei
  1193. {
  1194. if( DateiExistiert( pfad->getThis() ) )
  1195. {
  1196. DateiLöschen( pfad->getThis() );
  1197. if( datKpf )
  1198. datKpf->release();
  1199. }
  1200. }
  1201. void LTDBDatei::löschen( FBalken *f, Text *name ) // Löscht ein Bild aus der Datei
  1202. {
  1203. if( DateiExistiert( pfad->getThis() ) && name )
  1204. {
  1205. if( !datKpf )
  1206. leseDaten( 0 ); // Daten einlesen
  1207. // Prüfen, ob Datei nicht vorhanden
  1208. if( !datKpf )
  1209. {
  1210. name->release();
  1211. return;
  1212. }
  1213. int index = datKpf->getBildIndex( name->getThis() );
  1214. if( index == -1 ) // das bild existiert nicht
  1215. {
  1216. name->release();
  1217. return;
  1218. }
  1219. // Zwischenspeicherpfad ermitteln
  1220. Text *pf_tmp = new Text( pfad->getText() );
  1221. char c = '0';
  1222. pf_tmp->anhängen( "0" );
  1223. for( int i = 0; DateiExistiert( pf_tmp->getThis() ); ++i )
  1224. {
  1225. c = '0' + ( i % 10 );
  1226. if( ( i % 10 ) == 0 )
  1227. pf_tmp->anhängen( "$" );
  1228. pf_tmp->ersetzen( pf_tmp->anzahlVon( '0' - ( ( i - 1 ) % 10 ) ) - 1, '0' - ( ( i - 1 ) % 10 ), c );
  1229. }
  1230. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary ); // Alte Datei öffnen
  1231. inF->seekg( 0, std::ios::end );
  1232. __int64 Datlän = inF->tellg();
  1233. inF->seekg( 0, std::ios::beg );
  1234. std::ofstream *outF = new std::ofstream( pf_tmp->getText(), std::ios::binary ); // Neue Datei öffnen
  1235. if( inF->is_open() && outF->is_open() )
  1236. {
  1237. __int64 position = datKpf->getBildPosition( index );
  1238. datKpf->removeBild( index );
  1239. datKpf->speichern( outF );
  1240. LTDBDateiKopf *kpf_tmp = new LTDBDateiKopf();
  1241. kpf_tmp->laden( 0, inF );
  1242. kpf_tmp->release();
  1243. char byte = 0;
  1244. __int64 pos_minus = inF->tellg() - outF->tellp();
  1245. for( int i = 0; i < index; ++i )
  1246. datKpf->setBildPos( i, datKpf->getBildPosition( i ) - pos_minus );
  1247. // Bytes bis zur Datei kopieren
  1248. for( __int64 i = inF->tellg(); i < position; ++i )
  1249. {
  1250. inF->read( &byte, 1 );
  1251. outF->write( &byte, 1 );
  1252. } // zu löschendes Bild überspringen
  1253. LTDBKopf *delkpf = new LTDBKopf();
  1254. delkpf->laden( inF );
  1255. LTDBKörper *delkpr = new LTDBKörper( delkpf->getThis() );
  1256. delkpr->laden( f, inF );
  1257. delkpf = delkpf->release();
  1258. delkpr = delkpr->release(); // restliche bytes kopieren
  1259. pos_minus = inF->tellg() - outF->tellp();
  1260. for( __int64 i = (__int64)inF->tellg(); i < Datlän; ++i )
  1261. {
  1262. inF->read( &byte, 1 );
  1263. outF->write( &byte, 1 );
  1264. }
  1265. for( int i = index; i < datKpf->getbAnzahl(); ++i )
  1266. datKpf->setBildPos( i, datKpf->getBildPosition( i ) - pos_minus );
  1267. outF->seekp( 0, std::ios::beg );
  1268. datKpf->speichern( outF );
  1269. inF->close();
  1270. outF->close();
  1271. DateiLöschen( pfad->getThis() );
  1272. DateiUmbenennen( pf_tmp->getThis(), pfad->getThis() );
  1273. }
  1274. delete inF;
  1275. delete outF;
  1276. pf_tmp = pf_tmp->release();
  1277. }
  1278. if( name )
  1279. name = name->release();
  1280. }
  1281. Bild *LTDBDatei::laden( FBalken *f, Text *name ) // Läd ein Bild aus der Datei
  1282. {
  1283. if( name )
  1284. {
  1285. if( !DateiExistiert( pfad->getThis() ) )
  1286. {
  1287. name->release();
  1288. return 0;
  1289. }
  1290. if( !datKpf )
  1291. leseDaten( 0 );
  1292. LTDBKopf *k_tmp = new LTDBKopf();
  1293. k_tmp->Init( name->getThis(), Punkt( 0, 0 ) );
  1294. int index = datKpf->getBildIndex( k_tmp->getTitel() );
  1295. k_tmp->release();
  1296. if( index == -1 )
  1297. { // Fehlermeldung
  1298. Text *fehler = new Text( "Das Bild " );
  1299. fehler->anhängen( name );
  1300. fehler->anhängen( " wurde nicht in der Datei\n" );
  1301. fehler->anhängen( pfad->getThis() );
  1302. fehler->anhängen( " gefunden!" );
  1303. std::cout << fehler << "\n";
  1304. return 0;
  1305. }
  1306. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  1307. // Begin der zu ladenden Datei ermitteln
  1308. __int64 position = datKpf->getBildPosition( index );
  1309. inF->seekg( position, std::ios::beg );
  1310. LTDBKopf *kpf = new LTDBKopf();
  1311. kpf->laden( inF );
  1312. Text *t = kpf->getTitel();
  1313. if( !t->istGleich( name->getThis() ) )
  1314. { // Fehlermeldung
  1315. t->release();
  1316. kpf->release();
  1317. inF->close();
  1318. delete inF;
  1319. Text *fehler = new Text( "Die Datei " );
  1320. fehler->anhängen( pfad );
  1321. fehler->anhängen( " ist ist keine gültige LTDB Datei!" );
  1322. #ifdef WIN32
  1323. WMessageBox( 0, new Text( "Fehler" ), fehler, MB_ICONERROR );
  1324. #endif
  1325. name->release();
  1326. return 0;
  1327. }
  1328. t->release();
  1329. LTDBKörper *kpr = new LTDBKörper( kpf->getThis() );
  1330. kpr->laden( f, inF ); // Bild laden
  1331. Bild *ret = kpr->getBild();
  1332. kpr->release();
  1333. kpf->release();
  1334. inF->close();
  1335. delete inF;
  1336. name->release();
  1337. return ret;
  1338. }
  1339. return 0;
  1340. }
  1341. int LTDBDatei::speichern( FBalken *f, Bild *bild, Text *name ) // Speichert ein Bild in die Datei
  1342. {
  1343. int warn = -1;
  1344. if( name && bild )
  1345. {
  1346. if( DateiExistiert( pfad->getThis() ) )
  1347. {
  1348. if( !datKpf )
  1349. leseDaten( 0 );
  1350. int index = datKpf->getBildIndex( name->getThis() );
  1351. if( index == -1 )
  1352. {
  1353. warn = 0;
  1354. LTDBKopf *kpf = new LTDBKopf();
  1355. warn = kpf->Init( name->getThis(), bild->getGröße() );
  1356. if( datKpf->getBildIndex( kpf->getTitel() ) != -1 )
  1357. {
  1358. std::cout << "Es existiert bereits ein Bild mit diesem Namen!\n";
  1359. bild->release();
  1360. name->release();
  1361. kpf->release();
  1362. return -1;
  1363. }
  1364. // zwischendateipfad suchen
  1365. Text *pf_tmp = new Text( pfad->getText() );
  1366. char c = '0';
  1367. pf_tmp->anhängen( "0" );
  1368. for( int i = 0; DateiExistiert( pf_tmp->getThis() ); ++i )
  1369. {
  1370. c = '0' + ( i % 10 );
  1371. if( ( i % 10 ) == 0 )
  1372. pf_tmp->anhängen( "$" );
  1373. pf_tmp->ersetzen( pf_tmp->anzahlVon( '0' - ( ( i - 1 ) % 10 ) ) - 1, '0' - ( ( i - 1 ) % 10 ), c );
  1374. }
  1375. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  1376. inF->seekg( 0, std::ios::end );
  1377. __int64 datLen = inF->tellg();
  1378. inF->seekg( 0, std::ios::beg );
  1379. std::ofstream *outF = new std::ofstream( pf_tmp->getText(), std::ios::binary );
  1380. datKpf->addBild( kpf->getTitel() );
  1381. index = datKpf->getBildIndex( kpf->getTitel() );
  1382. datKpf->speichern( outF );
  1383. LTDBDateiKopf *kpf_tmp = new LTDBDateiKopf();
  1384. kpf_tmp->laden( 0, inF );
  1385. kpf_tmp->release();
  1386. __int64 pos_plus = outF->tellp() - inF->tellg();
  1387. for( int i = 0; i < index; ++i )
  1388. datKpf->setBildPos( i, datKpf->getBildPosition( i ) + pos_plus );
  1389. datKpf->setBildPos( index, datLen + pos_plus );
  1390. outF->seekp( 0, std::ios::beg );
  1391. datKpf->speichern( outF );
  1392. char byte = 0;
  1393. for( __int64 i = inF->tellg(); i < datLen; ++i )
  1394. {
  1395. inF->read( &byte, 1 );
  1396. outF->write( &byte, 1 );
  1397. }
  1398. kpf->speichern( outF ); // Bild Kopf speichern
  1399. LTDBKörper *kpr = new LTDBKörper( kpf->getThis() );
  1400. kpr->setBild( bild->getThis() );
  1401. kpr->speichern( f, outF ); // Bild speichern
  1402. kpf->release();
  1403. kpr->release();
  1404. inF->close();
  1405. outF->close();
  1406. delete inF;
  1407. delete outF;
  1408. DateiLöschen( pfad->getThis() );
  1409. DateiUmbenennen( pf_tmp, pfad->getThis() );
  1410. }
  1411. }
  1412. }
  1413. if( name )
  1414. name->release();
  1415. if( bild )
  1416. bild->release();
  1417. return warn;
  1418. }
  1419. RCArray< Text > *LTDBDatei::zBildListe() // Listet alle Bilder in der datei auf
  1420. {
  1421. if( !datKpf )
  1422. leseDaten( 0 );
  1423. if( datKpf )
  1424. return datKpf->zBildListe();
  1425. return 0;
  1426. }
  1427. // constant
  1428. Text *LTDBDatei::getPfad() const // Gibt den Pfad zur Datei zurück
  1429. {
  1430. return pfad->getThis();
  1431. }
  1432. int LTDBDatei::getBildAnzahl() const
  1433. {
  1434. if( !datKpf )
  1435. return 0;
  1436. return datKpf->getbAnzahl();
  1437. }
  1438. bool LTDBDatei::istOffen() const // Prüft, ob die Datei geöffnet ist
  1439. {
  1440. if( !pfad )
  1441. return 0;
  1442. return DateiExistiert( pfad->getThis() );
  1443. }
  1444. // Reference Counting
  1445. LTDBDatei *LTDBDatei::getThis()
  1446. {
  1447. ++ref;
  1448. return this;
  1449. }
  1450. LTDBDatei *LTDBDatei::release()
  1451. {
  1452. --ref;
  1453. if( ref < 1 )
  1454. delete this;
  1455. return 0;
  1456. }
  1457. #ifdef WIN32
  1458. // LTDS Dateivormat
  1459. // Inhalt der LTDSPixel Klasse aus DateiSystem.h
  1460. // Konstruktor
  1461. LTDSPixel::LTDSPixel( LTDSPixel *davor )
  1462. : ref( 1 ),
  1463. index( 0 ),
  1464. iA( 0 ),
  1465. miA( 8 ),
  1466. maxIndex( 1 ),
  1467. änder( 0 ),
  1468. änderA( 0 ),
  1469. komp( 0 ),
  1470. alpha( 0 ),
  1471. davor( davor )
  1472. {
  1473. }
  1474. // Destruktor
  1475. LTDSPixel::~LTDSPixel()
  1476. {
  1477. if( davor )
  1478. davor->release();
  1479. }
  1480. // nicht constant
  1481. // zum Laden gedacht
  1482. bool LTDSPixel::addBitZuFarbe( unsigned char bit )
  1483. {
  1484. if( änderA && iA != miA ) // Das Bit gehört zu Alpha
  1485. {
  1486. alpha |= ( ( bit & Bits( 1 ) ) ) << ( 7 - komp - iA );
  1487. ++iA;
  1488. }
  1489. else // Das Bit gehört zum nächsten Pixel
  1490. return false;
  1491. return true;
  1492. }
  1493. char LTDSPixel::addByte( char byte, char begin ) // gibt ende des Pixels zurück, -1 wenn nicht zu ende
  1494. {
  1495. if( begin >= 8 || begin < 0 )
  1496. return -1;
  1497. for( int i = begin; i < 8; ++i )
  1498. {
  1499. switch( index )
  1500. {
  1501. case 0:
  1502. // Das erste Bit eines Pixels speichert, ob sich an der Komprimierung etwas änderte
  1503. änder = ( ( byte >> ( 7 - i ) ) & Bits( 1 ) ) == 1;
  1504. if( !änder ) // Ändert sich nichts an der Komprimierung, so werden die Werte vom vorherigen Pixel übernommen
  1505. {
  1506. if( !davor ) // Die Datei ist beschädigt ( Der erste Pixel kann nicht von dem davor Übernemen )
  1507. {
  1508. MessageBox( NULL, "Fehler, die Bilddatei ist beschädigt", "Fehler", MB_ICONERROR );
  1509. exit( 0 );
  1510. }
  1511. änderA = davor->getÄnderA();
  1512. komp = davor->getKomp();
  1513. miA -= komp;
  1514. if( !änderA )
  1515. alpha = davor->getA();
  1516. maxIndex += änderA * ( 8 - komp ); // Bestimmung der Länge
  1517. // des Pixels in Bits. Jede Farbe hat von grund auf 8 Bits, durch komprimierung kanns kleiner sein
  1518. }
  1519. else
  1520. maxIndex += 4; // Da der Pixel nicht die Werte des vorherigen übernimmt, wird er um 4 Bits größer
  1521. break;
  1522. case 1: // Das zweite Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  1523. if( änder ) // Das Bit gehört zu den 4 Komprimierungsbits
  1524. änderA = ( ( byte >> ( 7 - i ) ) & Bits( 1 ) ) == 1;
  1525. else
  1526. {
  1527. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  1528. return i;
  1529. }
  1530. break;
  1531. case 2: // Das sechste Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  1532. if( änder ) // Das Bit gehört zu den 4 Komprimierungsbits
  1533. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & Bits( 1 ) ) << 2;
  1534. else
  1535. {
  1536. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  1537. return i;
  1538. }
  1539. break;
  1540. case 3: // Das siebte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  1541. if( änder ) // Das Bit gehört zu den 4 Komprimierungsbits
  1542. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & Bits( 1 ) ) << 1;
  1543. else
  1544. {
  1545. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  1546. return i;
  1547. }
  1548. break;
  1549. case 4: // Das achte Bit eines Pixels speichert entweder die Komprimierungsart, oder schon die Farbe
  1550. if( änder ) // Das Bit gehört zu den 4 Komprimierungsbits
  1551. {
  1552. komp |= (unsigned char)( ( byte >> ( 7 - i ) ) & Bits( 1 ) );
  1553. // Das war das letzte Komprimierungsbit
  1554. // Komprimierung auswerten
  1555. miA -= komp;
  1556. if( !änderA )
  1557. alpha = davor->getA();
  1558. maxIndex += änderA * ( 8 - komp ); // Bitlänge des Pixels
  1559. }
  1560. else
  1561. {
  1562. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  1563. return i;
  1564. }
  1565. break;
  1566. default: // Die restlichen Bits speichern alle die Farbwerte des Pixels
  1567. if( !addBitZuFarbe( byte >> ( 7 - i ) ) ) // Das Bit gehört zur Farbe
  1568. return i;
  1569. break;
  1570. }
  1571. ++index;
  1572. if( index >= maxIndex )
  1573. {
  1574. if( davor )
  1575. {
  1576. if( änderA )
  1577. alpha = davor->getA() + alpha;
  1578. davor = davor->release();
  1579. }
  1580. return i + 1;
  1581. }
  1582. }
  1583. return -1;
  1584. }
  1585. // zum speichern gedacht
  1586. void LTDSPixel::setAlpha( unsigned char alpha ) // setzt die Farbe des Pixels
  1587. {
  1588. this->alpha = alpha;
  1589. }
  1590. void LTDSPixel::Komp() // Komprimiert den Pixel
  1591. {
  1592. maxIndex = 1;
  1593. if( !davor )
  1594. {// Das ist der erste Pixel
  1595. änder = 1;
  1596. änderA = 1;
  1597. maxIndex += 4;
  1598. miA = getBits( alpha );
  1599. }
  1600. else
  1601. { // Es wird die differenz zum vorrigen Pixel gespeichert
  1602. miA = getBits( alpha - davor->getA() );
  1603. if( alpha != davor->getA() )
  1604. änderA = 1;
  1605. else
  1606. änderA = 0;
  1607. }// Prüfen ob sich etwas ändert
  1608. if( !miA && änderA )
  1609. ++miA;
  1610. komp = 8 - miA;
  1611. maxIndex += änderA * miA;
  1612. if( davor )
  1613. {
  1614. if( änderA != davor->getÄnderA() ||
  1615. komp != davor->getKomp() )
  1616. { // Es ändert sich etwas
  1617. änder = 1;
  1618. maxIndex += 4;
  1619. }
  1620. else
  1621. { // Es ändert sich nichts
  1622. änder = 0;
  1623. }
  1624. }
  1625. }
  1626. bool LTDSPixel::getNextFarbeBit( char &byte, int i )
  1627. {
  1628. unsigned char AA = alpha;
  1629. if( davor )
  1630. {
  1631. AA -= davor->getA();
  1632. }
  1633. if( änderA && iA != miA ) // Das Bit gehört zu Alpha
  1634. {
  1635. byte |= ( ( AA >> ( 7 - komp - iA ) ) & Bits( 1 ) ) << ( 7 - i );
  1636. ++iA;
  1637. }
  1638. else // Der Pixel ist bereits zu ende
  1639. return false;
  1640. return true;
  1641. }
  1642. char LTDSPixel::getNextByte( char &byte, int bbegin ) // Gibt die nächsten Bits Zurück, -1 wenn der Pixel nicht zu ende ist
  1643. {
  1644. // bbegin gibt an wohin in die byte-variable geschrieben werden soll
  1645. // die Funktion gibt das ende des Pixels in der byte-variable zurück
  1646. // -1 heißt, dass der Pixel nicht zu ende ist
  1647. for( int i = bbegin; i < 8; ++i )
  1648. {
  1649. switch( index )
  1650. {
  1651. case 0: // Das erste Bit des Pixels speichert, ob sich etwas an der Komprimierung ändert
  1652. byte |= ( (int)änder & Bits( 1 ) ) << ( 7 - i );
  1653. break;
  1654. case 1: // Das zweite Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  1655. if( änder ) // Komprimierung
  1656. byte |= ( (int)änderA & Bits( 1 ) ) << ( 7 - i );
  1657. else // Farbe
  1658. {
  1659. if( !getNextFarbeBit( byte, i ) )
  1660. return i;
  1661. }
  1662. break;
  1663. case 2: // Das zweite Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  1664. if( änder ) // Komprimierung
  1665. byte |= ( ( komp >> 2 ) & Bits( 1 ) ) << ( 7 - i );
  1666. else // Farbe
  1667. {
  1668. if( !getNextFarbeBit( byte, i ) )
  1669. return i;
  1670. }
  1671. break;
  1672. case 3: // Das dritte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  1673. if( änder ) // Komprimierung
  1674. byte |= ( ( komp >> 1 ) & Bits( 1 ) ) << ( 7 - i );
  1675. else // Farbe
  1676. {
  1677. if( !getNextFarbeBit( byte, i ) )
  1678. return i;
  1679. }
  1680. break;
  1681. case 4: // Das vierte Bit des Pixels speichert entweder schon die Farbe oder die Komprimierung
  1682. if( änder ) // Komprimierung
  1683. byte |= ( komp & Bits( 1 ) ) << ( 7 - i );
  1684. else // Farbe
  1685. {
  1686. if( !getNextFarbeBit( byte, i ) )
  1687. return i;
  1688. }
  1689. break;
  1690. default: // Die restlichen Bits speichern die Farbe des Pixels
  1691. if( !getNextFarbeBit( byte, i ) )
  1692. return i;
  1693. break;
  1694. }
  1695. ++index;
  1696. if( index >= maxIndex )
  1697. {
  1698. if( davor )
  1699. davor = davor->release();
  1700. return i + 1;
  1701. }
  1702. }
  1703. return -1;
  1704. }
  1705. // constant
  1706. unsigned char LTDSPixel::getKomp() const // hat sich die Komprimierung geändert
  1707. {
  1708. return komp;
  1709. }
  1710. bool LTDSPixel::getÄnderA() const // gibt zurück, ob sich der alphawert ändert
  1711. {
  1712. return änderA;
  1713. }
  1714. unsigned char LTDSPixel::getA() const // gibt Alpha zurück
  1715. {
  1716. return alpha;
  1717. }
  1718. // Reference Counting
  1719. LTDSPixel *LTDSPixel::getThis()
  1720. {
  1721. ++ref;
  1722. return this;
  1723. }
  1724. LTDSPixel *LTDSPixel::release()
  1725. {
  1726. --ref;
  1727. if( ref == 0 )
  1728. delete this;
  1729. return 0;
  1730. }
  1731. // Inhalt der LTDSDateiKopf Klasse aus Dateisystem.h
  1732. // Konstruktor
  1733. LTDSDateiKopf::LTDSDateiKopf()
  1734. : ref( 1 ),
  1735. sganzahl( 0 ),
  1736. gr( 0 ),
  1737. pos( 0 )
  1738. {
  1739. }
  1740. // Destruktor
  1741. LTDSDateiKopf::~LTDSDateiKopf()
  1742. {
  1743. delete[]gr;
  1744. delete[]pos;
  1745. }
  1746. // nicht constant
  1747. void LTDSDateiKopf::laden( std::ifstream *inF ) // Lät aus inF
  1748. {
  1749. if( inF->good() && inF->is_open() )
  1750. {
  1751. inF->read( (char *)&sganzahl, 1 );
  1752. delete[]gr;
  1753. delete[]pos;
  1754. gr = new unsigned char[ sganzahl + 1 ];
  1755. pos = new int[ sganzahl + 1 ];
  1756. gr[ sganzahl ] = 0;
  1757. pos[ sganzahl ] = 0;
  1758. for( int i = 0; i < sganzahl; ++i )
  1759. {
  1760. inF->read( (char*)&gr[ i ], 1 );
  1761. inF->read( (char*)&pos[ i ], 4 );
  1762. }
  1763. }
  1764. }
  1765. void LTDSDateiKopf::addSG( char sg ) // Schriftgröße hinzufügen
  1766. {
  1767. ++sganzahl;
  1768. unsigned char *gr_tmp = gr;
  1769. int *pos_tmp = pos;
  1770. gr = new unsigned char[ sganzahl + 1 ];
  1771. pos = new int[ sganzahl + 1 ];
  1772. gr[ sganzahl ] = 0;
  1773. pos[ sganzahl ] = 0;
  1774. if( sganzahl - 1 > 0 )
  1775. {
  1776. memcpy( gr, gr_tmp, 1 * ( sganzahl - 1 ) );
  1777. memcpy( pos, pos_tmp, 4 * ( sganzahl - 1 ) );
  1778. }
  1779. delete[]gr_tmp;
  1780. delete[]pos_tmp;
  1781. pos[ sganzahl - 1 ] = 0;
  1782. gr[ sganzahl - 1 ] = sg;
  1783. }
  1784. void LTDSDateiKopf::removeSG( char sg ) // Schriftgröße entfernen
  1785. {
  1786. bool hatsg = 0;
  1787. int sgpos = 0;
  1788. for( int i = 0; i < sganzahl; ++i )
  1789. {
  1790. hatsg = gr[ i ] == sg;
  1791. sgpos = i;
  1792. if( hatsg )
  1793. break;
  1794. }
  1795. if( hatsg )
  1796. {
  1797. --sganzahl;
  1798. unsigned char *gr_tmp = gr;
  1799. int *pos_tmp = pos;
  1800. gr = new unsigned char[ sganzahl + 1 ];
  1801. pos = new int[ sganzahl + 1 ];
  1802. gr[ sganzahl ] = 0;
  1803. pos[ sganzahl ] = 0;
  1804. for( int i = 0; i < sgpos; ++i )
  1805. {
  1806. gr[ i ] = gr_tmp[ i ];
  1807. pos[ i ] = pos_tmp[ i ];
  1808. }
  1809. for( int i = sgpos + 1; i < sganzahl; ++i )
  1810. {
  1811. gr[ i - 1 ] = gr_tmp[ i ];
  1812. pos[ i - 1 ] = pos_tmp[ i ];
  1813. }
  1814. delete[]gr_tmp;
  1815. delete[]pos_tmp;
  1816. }
  1817. }
  1818. // constant
  1819. void LTDSDateiKopf::speichern( std::ofstream *outF ) const // Speichert nach outF
  1820. {
  1821. if( outF->is_open() && outF->good() )
  1822. {
  1823. outF->write( (char*)&sganzahl, 1 );
  1824. for( int i = 0; i < sganzahl; ++i )
  1825. {
  1826. outF->write( (char*)&gr[ i ], 1 );
  1827. outF->write( (char*)&pos[ i ], 4 );
  1828. }
  1829. }
  1830. }
  1831. unsigned char *LTDSDateiKopf::getSchriftGrößeList() const // gibt eine Liste mit gespeicherten Schriftgrößen zurück
  1832. {
  1833. return gr;
  1834. }
  1835. int *LTDSDateiKopf::getPositionList() const // gibt eine Positionsliste der gespeicherten Schriftgrößen zurück
  1836. {
  1837. return pos;
  1838. }
  1839. int LTDSDateiKopf::getSchriftGrößeAnzahl() const // gibt die Anzahl der gespeicherten Schriftgrößen zurück
  1840. {
  1841. return sganzahl;
  1842. }
  1843. // Reference Counting
  1844. LTDSDateiKopf *LTDSDateiKopf::getThis()
  1845. {
  1846. ++ref;
  1847. return this;
  1848. }
  1849. LTDSDateiKopf *LTDSDateiKopf::release()
  1850. {
  1851. --ref;
  1852. if( ref == 0 )
  1853. delete this;
  1854. return 0;
  1855. }
  1856. // Inhalt der LTDSSchriftKopf Klasse aus Dateisystem.h
  1857. // Konstruktor
  1858. LTDSSchriftKopf::LTDSSchriftKopf()
  1859. : ref( 1 ),
  1860. schriftGröße( 0 ),
  1861. zeichen( 0 ),
  1862. pos( 0 ),
  1863. zeichenAnzahl( 0 )
  1864. {
  1865. }
  1866. // Destruktor
  1867. LTDSSchriftKopf::~LTDSSchriftKopf()
  1868. {
  1869. delete[]pos;
  1870. delete[]zeichen;
  1871. }
  1872. // nicht constant
  1873. void LTDSSchriftKopf::laden( std::ifstream *inF ) // läht von inF
  1874. {
  1875. if( inF->good() && inF->is_open() )
  1876. {
  1877. inF->read( (char*)&schriftGröße, 1 );
  1878. inF->read( (char*)&zeichenAnzahl, 1 );
  1879. delete[]pos;
  1880. delete[]zeichen;
  1881. zeichen = new unsigned char[ zeichenAnzahl ];
  1882. pos = new int[ zeichenAnzahl + 1 ];
  1883. for( int i = 0; i < zeichenAnzahl; ++i )
  1884. {
  1885. inF->read( (char*)&zeichen[ i ], 1 );
  1886. inF->read( (char*)&pos[ i ], 4 );
  1887. }
  1888. pos[ zeichenAnzahl ] = 0;
  1889. }
  1890. }
  1891. void LTDSSchriftKopf::setSchriftgröße( unsigned char gr ) // setze schriftgröße
  1892. {
  1893. schriftGröße = gr;
  1894. }
  1895. void LTDSSchriftKopf::setZeichenAlphabet( Alphabet *alphabet ) // setzt die Zeichen von alphabet
  1896. {
  1897. int count = 0;
  1898. for( int i = 0; i < 256; ++i )
  1899. {
  1900. Buchstabe *zeich = alphabet->zBuchstabe( i );
  1901. if( zeich )
  1902. ++count;
  1903. }
  1904. delete[]zeichen;
  1905. delete[]pos;
  1906. zeichen = new unsigned char[ count ];
  1907. pos = new int[ count + 1 ];
  1908. pos[ count ] = 0;
  1909. zeichenAnzahl = count;
  1910. count = 0;
  1911. for( int i = 0; i < 256; ++i )
  1912. {
  1913. Buchstabe *zeich = alphabet->getBuchstabe( i );
  1914. if( zeich )
  1915. {
  1916. zeichen[ count ] = i;
  1917. pos[ count ] = 0;
  1918. ++count;
  1919. zeich->release();
  1920. }
  1921. }
  1922. schriftGröße = alphabet->getSchriftgröße();
  1923. alphabet->release();
  1924. }
  1925. void LTDSSchriftKopf::addZeichen( unsigned char zeichen ) // Zeichen hinzufügen
  1926. {
  1927. ++zeichenAnzahl;
  1928. unsigned char *zeichen_tmp = this->zeichen;
  1929. int *pos_tmp = pos;
  1930. this->zeichen = new unsigned char[ zeichenAnzahl ];
  1931. pos = new int[ zeichenAnzahl + 1 ];
  1932. if( zeichenAnzahl - 1 > 0 )
  1933. {
  1934. memcpy( this->zeichen, zeichen_tmp, 1 * ( zeichenAnzahl - 1 ) );
  1935. memcpy( pos, pos_tmp, 4 * ( zeichenAnzahl - 1 ) );
  1936. }
  1937. delete[]zeichen_tmp;
  1938. delete[]pos_tmp;
  1939. this->zeichen[ zeichenAnzahl - 1 ] = zeichen;
  1940. pos[ zeichenAnzahl - 1 ] = 0;
  1941. pos[ zeichenAnzahl ] = 0;
  1942. }
  1943. void LTDSSchriftKopf::removeZeichen( unsigned char zeich ) // Zeichen entfernen
  1944. {
  1945. bool hatZ = 0;
  1946. int zPos = 0;
  1947. for( int i = 0; i < zeichenAnzahl; ++i )
  1948. {
  1949. hatZ = zeichen[ i ] == zeich;
  1950. zPos = i;
  1951. if( hatZ )
  1952. break;
  1953. }
  1954. if( hatZ )
  1955. {
  1956. --zeichenAnzahl;
  1957. unsigned char *zeichen_tmp = zeichen;
  1958. int *pos_tmp = pos;
  1959. zeichen = new unsigned char[ zeichenAnzahl ];
  1960. pos = new int[ zeichenAnzahl + 1 ];
  1961. for( int i = 0; i < zPos; ++i )
  1962. {
  1963. zeichen[ i ] = zeichen_tmp[ i ];
  1964. pos[ i ] = pos_tmp[ i ];
  1965. }
  1966. for( int i = zPos + 1; i <= zeichenAnzahl; ++i )
  1967. {
  1968. zeichen[ i - 1 ] = zeichen_tmp[ i ];
  1969. pos[ i - 1 ] = pos_tmp[ i ];
  1970. }
  1971. pos[ zeichenAnzahl ] = 0;
  1972. delete[]zeichen_tmp;
  1973. delete[]pos_tmp;
  1974. }
  1975. }
  1976. // constant
  1977. void LTDSSchriftKopf::speichern( std::ofstream *outF ) const // speichert nach outF
  1978. {
  1979. if( outF->good() && outF->is_open() )
  1980. {
  1981. outF->write( (char*)&schriftGröße, 1 );
  1982. outF->write( (char*)&zeichenAnzahl, 1 );
  1983. for( int i = 0; i < zeichenAnzahl; ++i )
  1984. {
  1985. outF->write( (char*)&zeichen[ i ], 1 );
  1986. outF->write( (char*)&pos[ i ], 4 );
  1987. }
  1988. }
  1989. }
  1990. unsigned char LTDSSchriftKopf::getSchriftGröße() const // gibt die Schriftgröße zurück
  1991. {
  1992. return schriftGröße;
  1993. }
  1994. unsigned char LTDSSchriftKopf::getZeichenAnzahl() const // gibt die Zeichenanzahl zurück
  1995. {
  1996. return zeichenAnzahl;
  1997. }
  1998. int *LTDSSchriftKopf::getPositionen() const // gibt die Zeichenpositionen zurück
  1999. {
  2000. return pos;
  2001. }
  2002. unsigned char *LTDSSchriftKopf::getZeichen() const // gibt die zeichen zurück
  2003. {
  2004. return zeichen;
  2005. }
  2006. // Reference Counting
  2007. LTDSSchriftKopf *LTDSSchriftKopf::getThis()
  2008. {
  2009. ++ref;
  2010. return this;
  2011. }
  2012. LTDSSchriftKopf *LTDSSchriftKopf::release()
  2013. {
  2014. --ref;
  2015. if( ref == 0 )
  2016. delete this;
  2017. return 0;
  2018. }
  2019. // Inhalt der LTDSBuchstabenKopf Klasse aus Dateisystem.h
  2020. // Konstruktor
  2021. LTDSBuchstabenKopf::LTDSBuchstabenKopf()
  2022. : ref( 1 ),
  2023. zeichen( 0 ),
  2024. größe( 0, 0 )
  2025. {
  2026. }
  2027. // nicht constant
  2028. void LTDSBuchstabenKopf::laden( std::ifstream *inF ) // lät aus inF
  2029. {
  2030. if( inF->good() && inF->is_open() )
  2031. {
  2032. inF->read( (char*)&zeichen, 1 );
  2033. inF->read( (char*)&größe.x, 1 );
  2034. inF->read( (char*)&größe.y, 1 );
  2035. }
  2036. }
  2037. void LTDSBuchstabenKopf::init( unsigned char zeichen, const Punkt &größe ) // initialisierung( für speichern )
  2038. {
  2039. this->zeichen = zeichen;
  2040. this->größe = größe;
  2041. }
  2042. void LTDSBuchstabenKopf::init( unsigned char zeichen, int br, int hö )
  2043. {
  2044. this->zeichen = zeichen;
  2045. größe.x = br, größe.y = hö;
  2046. }
  2047. // constant
  2048. void LTDSBuchstabenKopf::speichern( std::ofstream *outF ) const // speichertn nach outF
  2049. {
  2050. if( outF->good() && outF->is_open() )
  2051. {
  2052. outF->write( (char*)&zeichen, 1 );
  2053. outF->write( (char*)&größe.x, 1 );
  2054. outF->write( (char*)&größe.y, 1 );
  2055. }
  2056. }
  2057. unsigned char LTDSBuchstabenKopf::getZeichen() const // gibt das Zeichen zurück
  2058. {
  2059. return zeichen;
  2060. }
  2061. int LTDSBuchstabenKopf::getBreite() const // gibt die Breite zurück
  2062. {
  2063. return größe.x;
  2064. }
  2065. int LTDSBuchstabenKopf::getHöhe() const // gibt die höhe zurück
  2066. {
  2067. return größe.y;
  2068. }
  2069. const Punkt &LTDSBuchstabenKopf::getGröße() const // gibt die Größe zurück
  2070. {
  2071. return größe;
  2072. }
  2073. // Reference Counting
  2074. LTDSBuchstabenKopf *LTDSBuchstabenKopf::getThis()
  2075. {
  2076. ++ref;
  2077. return this;
  2078. }
  2079. LTDSBuchstabenKopf *LTDSBuchstabenKopf::release()
  2080. {
  2081. --ref;
  2082. if( ref == 0 )
  2083. delete this;
  2084. return 0;
  2085. }
  2086. // Inhalt der LTDSBuchstabenKörper Klasse aus Dateisystem.h
  2087. // Konstruktor
  2088. LTDSBuchstabenKörper::LTDSBuchstabenKörper( LTDSBuchstabenKopf *kopf )
  2089. : ref( 1 ),
  2090. größe( kopf->getGröße() ),
  2091. zeichen( kopf->getZeichen() ),
  2092. buchstabe( new Buchstabe() )
  2093. {
  2094. buchstabe->NeuBuchstabe( größe );
  2095. kopf->release();
  2096. }
  2097. // Destruktor
  2098. LTDSBuchstabenKörper::~LTDSBuchstabenKörper()
  2099. {
  2100. if( buchstabe )
  2101. buchstabe->release();
  2102. }
  2103. // nicht constant
  2104. void LTDSBuchstabenKörper::setBuchstabe( Buchstabe *zeichen ) // setzt den Buchstaben
  2105. {
  2106. if( buchstabe )
  2107. buchstabe->release();
  2108. buchstabe = zeichen;
  2109. }
  2110. void LTDSBuchstabenKörper::laden( std::ifstream *inF ) // Läht aus inF
  2111. {
  2112. if( inF->good() && inF->is_open() )
  2113. {
  2114. LTDSPixel *vorher = 0;
  2115. LTDSPixel *jetzt = new LTDSPixel( vorher );
  2116. char byte = 0;
  2117. int beg = 0;
  2118. int ende = -1;
  2119. for( int i = 0; i < größe.x * größe.y; ++i )
  2120. {
  2121. if( !jetzt ) // wenn es nicht der erste Pixel ist
  2122. jetzt = new LTDSPixel( vorher->getThis() );
  2123. int ende = -1;
  2124. while( ende < 0 ) // Pixel laden
  2125. {
  2126. if( beg == 0 )
  2127. inF->read( &byte, 1 );
  2128. ende = jetzt->addByte( byte, beg ); // byte auswerten
  2129. beg = 0;
  2130. }
  2131. beg = ende;
  2132. if( beg == 8 )
  2133. beg = 0;
  2134. if( buchstabe )
  2135. buchstabe->setPixel( i, jetzt->getA() );
  2136. if( vorher )
  2137. vorher = vorher->release();
  2138. vorher = jetzt->getThis();
  2139. jetzt = jetzt->release();
  2140. }
  2141. if( vorher )
  2142. vorher->release();
  2143. if( jetzt )
  2144. jetzt->release();
  2145. }
  2146. }
  2147. // constant
  2148. void LTDSBuchstabenKörper::speichern( std::ofstream *outF ) const // speichert nach outF
  2149. {
  2150. if( outF->good() && outF->is_open() )
  2151. {
  2152. LTDSPixel *vorher = 0; // Letzter gespeicherter Pixel
  2153. LTDSPixel *jetzt = new LTDSPixel( 0 ); // Der momentan zu speichernde Pixel
  2154. int begin = 0, ende = 0; // Pixelbeginn, endposition in der byte variable
  2155. char byte = 0; // Der nächste byte der Datei
  2156. bool w = 0;
  2157. unsigned char *alphaBuff = buchstabe->getBuff();
  2158. for( int i = 0; i < größe.x * größe.y; ++i ) // für jeden Pixel
  2159. {
  2160. if( !jetzt ) // wenn es nicht der erste Pixel ist
  2161. jetzt = new LTDSPixel( vorher->getThis() );
  2162. jetzt->setAlpha( alphaBuff[ i ] ); // Farbe des Pixels setzen
  2163. jetzt->Komp(); // Pixel komprimieren
  2164. ende = -1;
  2165. while( ende < 0 ) // byte befüllen
  2166. {
  2167. ende = jetzt->getNextByte( byte, begin );
  2168. begin = 0;
  2169. w = 0;
  2170. if( ende == -1 || ende == 8 ) // byte speichern
  2171. {
  2172. outF->write( &byte, 1 );
  2173. w = 1;
  2174. byte = 0;
  2175. }
  2176. } // Pixel fertig
  2177. begin = ende;
  2178. if( begin == 8 )
  2179. begin = 0;
  2180. if( vorher )
  2181. vorher->release();
  2182. vorher = jetzt->getThis(); // dieser wird zu letzter
  2183. jetzt = jetzt->release();
  2184. }
  2185. if( vorher )
  2186. vorher = vorher->release();
  2187. if( !w )
  2188. {
  2189. outF->write( &byte, 1 ); // Das letzte byte speichern
  2190. }
  2191. outF->flush(); // dateistream speichern
  2192. }
  2193. }
  2194. Buchstabe *LTDSBuchstabenKörper::getBuchstabe() const // gibt den Buchstaben zurück
  2195. {
  2196. return buchstabe->getThis();
  2197. }
  2198. unsigned char LTDSBuchstabenKörper::getZeichen() const // gibt das Zeichen zurück
  2199. {
  2200. return zeichen;
  2201. }
  2202. // Reference Counting
  2203. LTDSBuchstabenKörper *LTDSBuchstabenKörper::getThis()
  2204. {
  2205. ++ref;
  2206. return this;
  2207. }
  2208. LTDSBuchstabenKörper *LTDSBuchstabenKörper::release()
  2209. {
  2210. --ref;
  2211. if( ref == 0 )
  2212. delete this;
  2213. return 0;
  2214. }
  2215. // Inhalt der LTDSDatei Klasse aus DAteisystem.h
  2216. // Konstruktor
  2217. LTDSDatei::LTDSDatei()
  2218. : ref( 1 ),
  2219. pfad( new Text() ),
  2220. dateiKopf( 0 )
  2221. {
  2222. }
  2223. // Destruktor
  2224. LTDSDatei::~LTDSDatei()
  2225. {
  2226. if( dateiKopf )
  2227. dateiKopf->release();
  2228. pfad->release();
  2229. }
  2230. // nicht constant
  2231. void LTDSDatei::setPfad( Text *txt ) // setzt den Pfad zur Datei
  2232. {
  2233. if( dateiKopf )
  2234. dateiKopf = dateiKopf->release();
  2235. pfad->setText( txt->getText() );
  2236. txt->release();
  2237. }
  2238. void LTDSDatei::leseDaten() // ließt den Dateikopf
  2239. {
  2240. if( !DateiExistiert( pfad->getThis() ) )
  2241. return;
  2242. if( dateiKopf )
  2243. dateiKopf->release();
  2244. dateiKopf = new LTDSDateiKopf();
  2245. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  2246. dateiKopf->laden( inF );
  2247. inF->close();
  2248. delete inF;
  2249. }
  2250. void LTDSDatei::addSchriftgröße( Alphabet *alphabet ) // fügt eine Schriftgröße hinzu
  2251. {
  2252. if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob die Datei existiert
  2253. return;
  2254. if( !dateiKopf ) // prüfen, ob der Dateikopf schon gelesen wurde
  2255. leseDaten();
  2256. int sgröße = alphabet->getSchriftgröße(); // Schriftgröße die hinzugefügt werden soll
  2257. unsigned char *sglist = dateiKopf->getSchriftGrößeList(); // Liste von bereits vorhandenen Schriftgrößen
  2258. unsigned char sganzahl = dateiKopf->getSchriftGrößeAnzahl(); // Anzahl der bereits vorhandenen Schriftgrößen
  2259. for( int i = 0; i < sganzahl; ++i ) // prüfen, ob die Schriftgröße bereits existiert
  2260. {
  2261. if( sglist[ i ] == sgröße )
  2262. {
  2263. alphabet->release();
  2264. return;
  2265. }
  2266. }
  2267. dateiKopf->addSG( sgröße ); // Schriftgröße dem Dateikopf hinzufügen
  2268. int *sgPosList = dateiKopf->getPositionList(); // Liste mit positionen der Schriftgrößen
  2269. sglist = dateiKopf->getSchriftGrößeList(); // Liste von bereits vorhandenen Schriftgrößen
  2270. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary ); // alte Datei
  2271. pfad->anhängen( "0" );
  2272. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary ); // neue Datei
  2273. dateiKopf->speichern( outF ); // Dateikopf in neue datei speichern
  2274. inF->seekg( 1 + 5 * sganzahl, std::ios::beg ); // Position der ersten Schriftgröße in der alten Datei
  2275. for( int i = 0; i < sganzahl; ++i ) // Buchstabenpositionen aller Schriftgrößen aktualisieren
  2276. {
  2277. LTDSSchriftKopf *sgKpf_tmp = new LTDSSchriftKopf(); // Schriftgrößen Kopf
  2278. sgKpf_tmp->laden( inF ); // aus alter Datei laden
  2279. int *zeichP_tmp = sgKpf_tmp->getPositionen(); // Zeichenpositionen der Schriftgröße
  2280. unsigned char zeichA_tmp = sgKpf_tmp->getZeichenAnzahl(); // Anzahl von Zeichen der Schriftgröße
  2281. for( int i1 = 0; i1 < zeichA_tmp; ++i1 )
  2282. zeichP_tmp[ i1 ] += 5; // Buchstabenpositionen aktualisieren
  2283. sgKpf_tmp->speichern( outF ); // Schriftgröße Kopf in neue Datei speichern
  2284. int beginByte = (int)inF->tellg(); // Die restlichen bytes bis zur nächsten Schriftgröße in neue Datei kopieren
  2285. int endByte = sgPosList[ i + 1 ];
  2286. if( !endByte )
  2287. {
  2288. inF->seekg( 0, std::ios::end );
  2289. endByte = (int)inF->tellg();
  2290. inF->seekg( beginByte, std::ios::beg );
  2291. }
  2292. char byte;
  2293. for( int i1 = beginByte; i1 < endByte; ++i1 ) // Kopiervorgang
  2294. {
  2295. inF->read( &byte, 1 );
  2296. outF->write( &byte, 1 );
  2297. }
  2298. sgKpf_tmp->release();
  2299. }
  2300. inF->close(); // Alte datei schließen
  2301. sgPosList[ sganzahl ] = (int)outF->tellp();
  2302. outF->seekp( 0, std::ios::beg );
  2303. for( int i = 0; i < sganzahl; ++i ) // Positionen im Dateikopf aktualisieren
  2304. sgPosList[ i ] += 5;
  2305. dateiKopf->speichern( outF ); // aktualisierter Dateikopf speichern
  2306. outF->seekp( sgPosList[ sganzahl ], std::ios::beg );
  2307. LTDSSchriftKopf *sgkopf = new LTDSSchriftKopf(); // Kopf der neuen Schriftgröße
  2308. sgkopf->setZeichenAlphabet( alphabet->getThis() ); // Kopf der Schriftgröße initialisieren
  2309. sgkopf->speichern( outF ); // Kopf der Schriftgröße speichern
  2310. int *BuchstabenPosList = sgkopf->getPositionen(); // positionen der verschiedenen Zeichen in der Datei( nuch 0 )
  2311. int count = 0;
  2312. for( int i = 0; i < 256; ++i )
  2313. {
  2314. Buchstabe *zeich = alphabet->getBuchstabe( i );
  2315. if( zeich )
  2316. {
  2317. BuchstabenPosList[ count ] = (int)outF->tellp(); // position des Zeichens setzen
  2318. LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Zeichenkopf
  2319. zeichKpf->init( i, zeich->getBreite(), zeich->getHöhe() );
  2320. zeichKpf->speichern( outF ); // Zeichenkopf speichern
  2321. LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Zeichenkörper
  2322. zeichKpf->release();
  2323. zeichKörp->setBuchstabe( zeich->getThis() );
  2324. zeichKörp->speichern( outF ); // Zeichenkörper speichern
  2325. zeich->release();
  2326. ++count;
  2327. }
  2328. }
  2329. outF->seekp( sgPosList[ sganzahl ], std::ios::beg );
  2330. sgkopf->speichern( outF ); // aktualisierter Schriftgrößen Kopf speichern
  2331. outF->close();
  2332. Text *pfad2 = new Text();
  2333. pfad2->setText( pfad->getText() );
  2334. pfad->löschen( pfad->getLänge() - 1, pfad->getLänge() );
  2335. DateiLöschen( pfad->getThis() ); // Alte datei Löschen
  2336. DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei nach alte umbenennen
  2337. pfad2->release(); // Speicher freigeben
  2338. sgkopf->release();
  2339. delete inF;
  2340. delete outF;
  2341. alphabet->release();
  2342. }
  2343. void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen ) // Fügt einer Schriftgröße einen Buchstaben hinzu
  2344. {
  2345. if( !DateiExistiert( pfad->getThis() ) ) // prüfen ob Datei existiert
  2346. {
  2347. zeich->release();
  2348. return;
  2349. }
  2350. if( !dateiKopf ) // prüfen, ob der DAteikopf geladen wurde
  2351. leseDaten();
  2352. unsigned char *sgList = dateiKopf->getSchriftGrößeList(); // Liste mit Schriftgrößen aus der Datei
  2353. int *sgPosList = dateiKopf->getPositionList(); // Liste mit Schriftgrößen positionen aus Datei
  2354. unsigned char sgAnzahl = dateiKopf->getSchriftGrößeAnzahl(); // Anzahl von Schriftgrößen aus der Datei
  2355. int sgNum = -1;
  2356. for( int i = 0; i < sgAnzahl; ++i ) // Position der richtigen Schriftgröße ermitteln
  2357. {
  2358. if( sgList[ i ] == gr )
  2359. {
  2360. sgNum = i;
  2361. break;
  2362. }
  2363. }
  2364. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary ); // Alte Datei
  2365. pfad->anhängen( "0" );
  2366. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary ); // Neue Datei
  2367. inF->seekg( 1 + 5 * sgAnzahl, std::ios::beg );
  2368. if( sgNum == -1 ) // Die Schriftgröße existiert noch nicht und wird erstellt
  2369. {
  2370. dateiKopf->addSG( gr ); // Schriftgröße dem Dateikopf hinzufügen
  2371. sgPosList = dateiKopf->getPositionList();
  2372. sgList = dateiKopf->getSchriftGrößeList();
  2373. dateiKopf->speichern( outF ); // Dateikopf speichern
  2374. inF->seekg( 1 + 5 * sgAnzahl, std::ios::beg ); // Position der ersten Schriftgröße in der alten Datei
  2375. for( int i = 0; i < sgAnzahl; ++i ) // Buchstabenpositionen aller Schriftgrößen aktualisieren
  2376. {
  2377. LTDSSchriftKopf *sgKpf_tmp = new LTDSSchriftKopf(); // Schriftgrößen Kopf
  2378. sgKpf_tmp->laden( inF ); // aus alter Datei laden
  2379. int *zeichP_tmp = sgKpf_tmp->getPositionen(); // Zeichenpositionen der Schriftgröße
  2380. unsigned char zeichA_tmp = sgKpf_tmp->getZeichenAnzahl(); // Anzahl von Zeichen der Schriftgröße
  2381. for( int i1 = 0; i1 < zeichA_tmp; ++i1 )
  2382. zeichP_tmp[ i1 ] += 5; // Buchstabenpositionen aktualisieren
  2383. sgKpf_tmp->speichern( outF ); // Schriftgröße Kopf in neue Datei speichern
  2384. int beginByte = (int)inF->tellg(); // Die restlichen bytes bis zur nächsten Schriftgröße in neue Datei kopieren
  2385. int endByte = sgPosList[ i + 1 ];
  2386. if( i + 1 >= sgAnzahl )
  2387. {
  2388. inF->seekg( 0, std::ios::end );
  2389. endByte = (int)inF->tellg();
  2390. inF->seekg( beginByte, std::ios::beg );
  2391. }
  2392. char byte;
  2393. for( int i1 = beginByte; i1 < endByte; ++i1 ) // Kopiervorgang
  2394. {
  2395. inF->read( &byte, 1 );
  2396. outF->write( &byte, 1 );
  2397. }
  2398. sgKpf_tmp->release();
  2399. }
  2400. sgPosList[ sgAnzahl ] = (int)outF->tellp();
  2401. outF->seekp( 0, std::ios::beg );
  2402. for( int i = 0; i < sgAnzahl; ++i ) // Positionen im Dateikopf aktualisieren
  2403. sgPosList[ i ] += 5;
  2404. dateiKopf->speichern( outF ); // aktualisierter Dateikopf speichern
  2405. outF->seekp( sgPosList[ sgAnzahl ], std::ios::beg );
  2406. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf(); // Schriftgröße Kopf initialisiern
  2407. sgKpf->setSchriftgröße( gr );
  2408. sgKpf->addZeichen( zeichen );
  2409. sgKpf->getPositionen()[ 0 ] = (int)outF->tellp() + 7;
  2410. sgKpf->speichern( outF ); // Schriftgröße Kopf speichern
  2411. sgKpf->release();
  2412. LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Buchstabenkopf
  2413. zeichKpf->init( zeichen, zeich->getGröße() );
  2414. zeichKpf->speichern( outF ); // Buchstabenkopf speichern
  2415. LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Buchstabenkörper
  2416. zeichKpf->release();
  2417. zeichKörp->setBuchstabe( zeich->getThis() );
  2418. zeichKörp->speichern( outF ); // Buchstabenkörper speichern
  2419. zeichKörp->release();
  2420. }
  2421. else
  2422. {
  2423. dateiKopf->speichern( outF ); // Dateikopf speichern
  2424. int beginByte = 1 + 5 * sgAnzahl; // Die restlichen bytes bis zur nächsten Schriftgröße in neue Datei kopieren
  2425. int endByte = sgPosList[ sgNum ];
  2426. char byte;
  2427. for( int i1 = beginByte; i1 < endByte; ++i1 ) // Kopiervorgang bis zur angegebenen größe
  2428. {
  2429. inF->read( &byte, 1 );
  2430. outF->write( &byte, 1 );
  2431. }
  2432. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf(); // Schriftgröße Kopf
  2433. sgKpf->laden( inF );
  2434. for( int i = 0; i < sgKpf->getZeichenAnzahl(); ++i )
  2435. sgKpf->getPositionen()[ i ] += 5;
  2436. sgKpf->addZeichen( zeichen );
  2437. int indexPlus = 5;
  2438. int zeichenPos = sgPosList[ sgNum + 1 ]; // position des neuen Zeichens
  2439. if( sgNum + 1 >= sgAnzahl )
  2440. {
  2441. int tmp = (int)inF->tellg();
  2442. inF->seekg( 0, std::ios::end );
  2443. zeichenPos = (int)inF->tellg();
  2444. inF->seekg( tmp, std::ios::beg );
  2445. }
  2446. zeichenPos += indexPlus;
  2447. sgKpf->getPositionen()[ sgKpf->getZeichenAnzahl() - 1 ] = zeichenPos;
  2448. sgKpf->speichern( outF ); // Schriftgröße Kopf speichern
  2449. sgKpf->release();
  2450. for( int i = (int)inF->tellg() + indexPlus; i < zeichenPos; ++i ) // Kopiervorgang bis zum Zeichenbeginn
  2451. {
  2452. inF->read( &byte, 1 );
  2453. outF->write( &byte, 1 );
  2454. }
  2455. LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Zeichenkopf
  2456. zeichKpf->init( zeichen, zeich->getGröße() );
  2457. zeichKpf->speichern( outF ); // Zeichenkopf speichern
  2458. LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Zeichenkörper
  2459. zeichKpf->release();
  2460. zeichKörp->setBuchstabe( zeich->getThis() );
  2461. zeichKörp->speichern( outF ); // Zeichenkörper speichern
  2462. zeichKörp->release();
  2463. int nowPos = (int)outF->tellp();
  2464. indexPlus += nowPos - zeichenPos;
  2465. for( int i = sgNum + 1; i < sgAnzahl; ++i ) // Dateikopf aktualisieren
  2466. sgPosList[ i ] += indexPlus;
  2467. outF->seekp( 0, std::ios::beg );
  2468. dateiKopf->speichern( outF ); // Dateikopf speichern
  2469. outF->seekp( nowPos, std::ios::beg );
  2470. for( int i = sgNum + 1; i < sgAnzahl; ++i ) // Restliche Schriftgrößen aktualisieren
  2471. {
  2472. LTDSSchriftKopf *sgKpf_tmp = new LTDSSchriftKopf(); // Schriftgrößen Kopf
  2473. sgKpf_tmp->laden( inF ); // aus alter Datei laden
  2474. int *zeichP_tmp = sgKpf_tmp->getPositionen(); // Zeichenpositionen der Schriftgröße
  2475. unsigned char zeichA_tmp = sgKpf_tmp->getZeichenAnzahl(); // Anzahl von Zeichen der Schriftgröße
  2476. for( int i1 = 0; i1 < zeichA_tmp; ++i1 )
  2477. zeichP_tmp[ i1 ] += indexPlus; // Buchstabenpositionen aktualisieren
  2478. sgKpf_tmp->speichern( outF ); // Schriftgröße Kopf in neue Datei speichern
  2479. int beginByte = (int)inF->tellg(); // Die restlichen bytes bis zur nächsten Schriftgröße in neue Datei kopieren
  2480. int endByte = sgPosList[ i + 1 ];
  2481. if( i + 1 >= sgAnzahl )
  2482. {
  2483. inF->seekg( 0, std::ios::end );
  2484. endByte = (int)inF->tellg();
  2485. inF->seekg( beginByte, std::ios::beg );
  2486. }
  2487. char byte;
  2488. for( int i1 = beginByte; i1 < endByte; ++i1 ) // Kopiervorgang
  2489. {
  2490. inF->read( &byte, 1 );
  2491. outF->write( &byte, 1 );
  2492. }
  2493. sgKpf_tmp->release();
  2494. }
  2495. }
  2496. inF->close();
  2497. outF->close();
  2498. Text *pfad2 = new Text( pfad->getText() );
  2499. pfad->löschen( pfad->getLänge() - 1, pfad->getLänge() );
  2500. DateiLöschen( pfad->getThis() ); // Alte Datei löschen
  2501. DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // Neue Datei in alte umbenennen
  2502. pfad2->release();// Speicher freigeben
  2503. delete inF;
  2504. delete outF;
  2505. zeich->release();
  2506. }
  2507. void LTDSDatei::löscheSchrifrGröße( int gr ) // Löscht eine Schriftgröße aus der Datei
  2508. {
  2509. if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob Datei existiert
  2510. return;
  2511. if( !dateiKopf ) // prüfen, ob der Dateikopf geladen wurde
  2512. leseDaten();
  2513. unsigned char *sgList = dateiKopf->getSchriftGrößeList(); // Liste mit Schriftgrößen
  2514. unsigned char sgAnzahl = dateiKopf->getSchriftGrößeAnzahl(); // Anzahl der Schriftgrößen
  2515. int sgNum = -1;
  2516. for( int i = 0; i < sgAnzahl; ++i ) // zu löschende Schriftgröße suchen
  2517. {
  2518. if( sgList[ i ] == gr )
  2519. {
  2520. sgNum = i;
  2521. break;
  2522. }
  2523. }
  2524. if( sgNum == -1 ) // Die Schriftgröße ist nicht vorhanden
  2525. return;
  2526. int *sgPosList = dateiKopf->getPositionList(); // Liste von Positionen der Schriftgrößen
  2527. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary ); // alte Datei
  2528. pfad->anhängen( "0" );
  2529. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary ); // neue Datei
  2530. outF->seekp( 1 + 5 * ( sgAnzahl - 1 ), std::ios::beg );
  2531. inF->seekg( 1 + 5 * sgAnzahl, std::ios::beg );
  2532. for( int i = 0; i < sgNum; ++i ) // Schriftgrößen vor der zu löschenden Schriftgröße aktualisieren
  2533. {
  2534. LTDSSchriftKopf *sgKpf_tmp = new LTDSSchriftKopf(); // Schriftgrößen Kopf
  2535. sgKpf_tmp->laden( inF ); // Schriftgrößen Kopf laden
  2536. int *zeichPosLTmp = sgKpf_tmp->getPositionen(); // Zeichenpositionen
  2537. unsigned char zeichATmp = sgKpf_tmp->getZeichenAnzahl(); // Zeichenanzahl
  2538. for( int i1 = 0; i1 < zeichATmp; ++i1 ) // Position der Zeichen um 5 bytes zurücksetzen
  2539. zeichPosLTmp[ i1 ] -= 5;
  2540. sgKpf_tmp->speichern( outF ); // speichern in Neue Datei
  2541. char byte = 0;
  2542. for( int i1 = (int)inF->tellg(); i1 < sgPosList[ i + 1 ]; ++i1 ) // Den Körper des Zeichens Kopieren
  2543. {
  2544. inF->read( &byte, 1 );
  2545. outF->write( &byte, 1 );
  2546. }
  2547. sgKpf_tmp->release();
  2548. }
  2549. int indexMinus = 5 + sgPosList[ sgNum + 1 ] - (int)inF->tellg();
  2550. inF->seekg( sgPosList[ sgNum + 1 ], std::ios::beg );
  2551. for( int i = sgNum + 1; i < sgAnzahl; ++i ) // Die Schriftgröße nach der zu löschenden Schriftgröße
  2552. {
  2553. LTDSSchriftKopf *sgKpf_tmp = new LTDSSchriftKopf(); // Schriftgrößen Kopf
  2554. sgKpf_tmp->laden( inF ); // Schriftgrößen Kopf laden
  2555. int *zeichPosLTmp = sgKpf_tmp->getPositionen(); // Zeichenpositionen
  2556. unsigned char zeichATmp = sgKpf_tmp->getZeichenAnzahl(); // Zeichenanzahl
  2557. for( int i1 = 0; i1 < zeichATmp; ++i1 ) // Position der Zeichen aktualisieren
  2558. zeichPosLTmp[ i1 ] -= indexMinus;
  2559. sgKpf_tmp->speichern( outF ); // speichern in Neue Datei
  2560. char byte = 0;
  2561. int BeginByte = (int)inF->tellg();
  2562. int EndByte = sgPosList[ i + 1 ];
  2563. if( !EndByte )
  2564. {
  2565. inF->seekg( 0, std::ios::end );
  2566. EndByte = (int)inF->tellg();
  2567. inF->seekg( BeginByte, std::ios::beg );
  2568. }
  2569. for( int i1 = BeginByte; i1 < EndByte; ++i1 ) // Den Körper des Zeichens Kopieren
  2570. {
  2571. inF->read( &byte, 1 );
  2572. outF->write( &byte, 1 );
  2573. }
  2574. }
  2575. for( int i = 0; i < sgNum; ++i ) // Dateikopf aktualisieren
  2576. sgPosList[ i ] -= 5;
  2577. for( int i = sgNum + 1; i < sgAnzahl; ++i )
  2578. sgPosList[ i ] -= indexMinus;
  2579. dateiKopf->removeSG( gr );
  2580. outF->seekp( 0, std::ios::beg );
  2581. dateiKopf->speichern( outF ); // Dateikopf speichern
  2582. inF->close();
  2583. outF->close();
  2584. Text *pfad2 = new Text( pfad->getText() );
  2585. pfad->löschen( pfad->getLänge() - 1, pfad->getLänge() );
  2586. DateiLöschen( pfad->getThis() ); // alte Datei löschen
  2587. DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei zu alter umbenennen
  2588. pfad2->release();
  2589. delete inF;
  2590. delete outF;
  2591. }
  2592. void LTDSDatei::löscheBuchstabe( int gr, unsigned char zeichen ) // Löscht einen Buchstaben aus der Datei
  2593. {
  2594. if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob die Datei existiert
  2595. return;
  2596. if( !dateiKopf ) // prüfen, ob der Dateikopf gelesen wurde
  2597. leseDaten();
  2598. unsigned char *sgList = dateiKopf->getSchriftGrößeList(); // Liste mit Schriftgrößen
  2599. unsigned char sgAnzahl = dateiKopf->getSchriftGrößeAnzahl(); // Anzahl der Schriftgrößen
  2600. int *sgPosList = dateiKopf->getPositionList(); // Liste mit Positionen der Schriftgrößen
  2601. int sgNum = -1;
  2602. for( int i = 0; i < sgAnzahl; ++i ) // Schriftgröße suchen
  2603. {
  2604. if( sgList[ i ] == gr )
  2605. {
  2606. sgNum = i;
  2607. break;
  2608. }
  2609. }
  2610. if( sgNum == -1 ) // Schriftgröße nicht gefunden
  2611. return;
  2612. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary ); // alte Datei
  2613. pfad->anhängen( "0" );
  2614. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary ); // neue Datei
  2615. int indexMinus = 0;
  2616. inF->seekg( 1 + 5 * sgAnzahl, std::ios::beg );
  2617. dateiKopf->speichern( outF ); // DateiKopf peichern
  2618. for( int i = 0; i < sgAnzahl; ++i )
  2619. {
  2620. LTDSSchriftKopf *sgKopf = new LTDSSchriftKopf(); // Schriftkopf
  2621. sgKopf->laden( inF ); // Schriftkopf laden
  2622. unsigned char sgZeichAnzahl = sgKopf->getZeichenAnzahl(); // Zeichenanzahl
  2623. unsigned char *sgZeichenList = sgKopf->getZeichen(); // Zeichen Liste
  2624. int *sgZPosList = sgKopf->getPositionen(); // Positions Liste
  2625. if( i == sgNum ) // Zeichen befindet sich in dieser Schriftgröße
  2626. {
  2627. int sgZNum = -1;
  2628. for( int i1 = 0; i1 < sgZeichAnzahl; ++i1 ) // Zeichen suchen
  2629. {
  2630. if( sgZeichenList[ i1 ] == zeichen )
  2631. {
  2632. sgZNum = i1;
  2633. break;
  2634. }
  2635. }
  2636. if( sgZNum == -1 ) // Zeichen nicht gefunden
  2637. {
  2638. sgKopf->release();
  2639. inF->close();
  2640. outF->close();
  2641. delete inF;
  2642. delete outF;
  2643. DateiLöschen( pfad->getThis() );
  2644. pfad->löschen( pfad->getLänge() - 1, pfad->getLänge() );
  2645. return; // abbruch
  2646. }
  2647. outF->seekp( 2 + 5 * ( sgZeichAnzahl - 1 ), std::ios::cur );
  2648. indexMinus += 5;
  2649. for( int i1 = 0; i1 < sgZNum; ++i1 ) // Zeichen vor dem zu löschenden Zeichen
  2650. {
  2651. char byte = 0;
  2652. for( int i2 = sgZPosList[ i1 ]; i2 < sgZPosList[ i1 + 1 ]; ++i2 ) // Kopieren
  2653. {
  2654. inF->read( &byte, 1 );
  2655. outF->write( &byte, 1 );
  2656. }
  2657. sgZPosList[ i1 ] -= indexMinus; // Schriftgröße Kopf aktualisieren
  2658. }
  2659. if( !sgZPosList[ sgZNum + 1 ] )
  2660. {
  2661. int endByte = sgPosList[ i + 1 ];
  2662. if( !endByte )
  2663. {
  2664. int beginByte = (int)inF->tellg();
  2665. inF->seekg( 0, std::ios::end );
  2666. endByte = (int)inF->tellg();
  2667. inF->seekg( beginByte, std::ios::beg );
  2668. }
  2669. indexMinus += endByte - sgZPosList[ sgZNum ];
  2670. }
  2671. else
  2672. indexMinus += sgZPosList[ sgZNum + 1 ] - sgZPosList[ sgZNum ];
  2673. if( sgZNum + 1 < sgZeichAnzahl )
  2674. inF->seekg( sgZPosList[ sgZNum + 1 ], std::ios::beg );
  2675. for( int i1 = sgZNum + 1; i1 < sgZeichAnzahl; ++i1 ) // Zeichen nach dem gelöschten Zeichen
  2676. {
  2677. int beginByte = (int)inF->tellg();
  2678. int endByte = sgZPosList[ i1 + 1 ];
  2679. if( !endByte )
  2680. {
  2681. inF->seekg( 0, std::ios::end );
  2682. endByte = (int)inF->tellg();
  2683. inF->seekg( beginByte, std::ios::beg );
  2684. }
  2685. char byte = 0;
  2686. for( int i2 = beginByte; i2 < endByte; ++i2 ) // Kopieren
  2687. {
  2688. inF->read( &byte, 1 );
  2689. outF->write( &byte, 1 );
  2690. }
  2691. sgZPosList[ i1 ] -= indexMinus; // Schriftgröße Kopf aktualisieren
  2692. }
  2693. sgKopf->removeZeichen( zeichen );
  2694. }
  2695. else
  2696. {
  2697. for( int i1 = 0; i1 < sgZeichAnzahl; ++i1 ) // Schriftgröße Kopf aktualisieren
  2698. sgZPosList[ i ] -= indexMinus;
  2699. sgKopf->speichern( outF ); // Schriftgröße Kopf speichern
  2700. int beginByte = (int)inF->tellg();
  2701. int endByte = sgPosList[ i + 1 ];
  2702. if( !endByte )
  2703. {
  2704. inF->seekg( 0, std::ios::end );
  2705. endByte = (int)inF->tellg();
  2706. inF->seekg( beginByte, std::ios::beg );
  2707. }
  2708. char byte;
  2709. for( int i1 = beginByte; i1 < endByte; ++i1 ) // Kopieren
  2710. {
  2711. inF->read( &byte, 1 );
  2712. outF->write( &byte, 1 );
  2713. }
  2714. sgPosList[ i ] -= indexMinus;
  2715. }
  2716. outF->seekp( sgPosList[ i ], std::ios::beg );
  2717. sgKopf->speichern( outF ); // Schriftgröße Kopf speichern
  2718. outF->seekp( sgPosList[ i + 1 ], std::ios::beg );
  2719. sgKopf->release();
  2720. }
  2721. inF->close();
  2722. outF->close();
  2723. Text *pfad2 = new Text( pfad->getText() );
  2724. pfad->löschen( pfad->getLänge() - 1, pfad->getLänge() );
  2725. DateiLöschen( pfad->getThis() ); // alte Datei löschen
  2726. DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei nach alte umbenennen
  2727. pfad2->release(); // Speicher freigeben
  2728. delete inF;
  2729. delete outF;
  2730. }
  2731. void LTDSDatei::löscheDatei() // Löscht die gesamte Datei
  2732. {
  2733. if( !DateiExistiert( pfad->getThis() ) )
  2734. return;
  2735. if( !dateiKopf )
  2736. leseDaten();
  2737. DateiLöschen( pfad->getThis() );
  2738. }
  2739. void LTDSDatei::erstelleDatei() // erstellt die Datei
  2740. {
  2741. DateiPfadErstellen( pfad->getThis() );
  2742. if( dateiKopf )
  2743. dateiKopf->release();
  2744. dateiKopf = new LTDSDateiKopf();
  2745. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary );
  2746. dateiKopf->speichern( outF );
  2747. outF->close();
  2748. delete outF;
  2749. }
  2750. void LTDSDatei::speicherSchrift( Schrift *schrift ) // Speichert die übergebene Schrift
  2751. {
  2752. if( !DateiExistiert( pfad->getThis() ) )
  2753. {
  2754. schrift->release();
  2755. return;
  2756. }
  2757. löscheDatei();
  2758. if( dateiKopf )
  2759. dateiKopf->release();
  2760. dateiKopf = new LTDSDateiKopf();
  2761. for( int i = 0; i < schrift->getAlphabetAnzahl(); ++i )
  2762. {
  2763. Alphabet *alp = schrift->getAlphabetI( i );
  2764. if( alp )
  2765. {
  2766. dateiKopf->addSG( alp->getSchriftgröße() );
  2767. alp->release();
  2768. }
  2769. }
  2770. std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary );
  2771. dateiKopf->speichern( outF );
  2772. for( int i = 0; i < schrift->getAlphabetAnzahl(); ++i )
  2773. {
  2774. dateiKopf->getPositionList()[ i ] = (int)outF->tellp();
  2775. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf();
  2776. sgKpf->setZeichenAlphabet( schrift->getAlphabetI( i ) );
  2777. sgKpf->speichern( outF );
  2778. Alphabet *alp = schrift->getAlphabetI( i );
  2779. for( int i1 = 0; i1 < sgKpf->getZeichenAnzahl(); ++i1 )
  2780. {
  2781. sgKpf->getPositionen()[ i1 ] = (int)outF->tellp();
  2782. LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf();
  2783. Buchstabe *zeichen = alp->getBuchstabe( sgKpf->getZeichen()[ i1 ] );
  2784. zeichKpf->init( sgKpf->getZeichen()[ i1 ], zeichen->getBreite(), zeichen->getHöhe() );
  2785. zeichKpf->speichern( outF );
  2786. LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() );
  2787. zeichKörp->setBuchstabe( zeichen->getThis() );
  2788. zeichKörp->speichern( outF );
  2789. zeichKörp->release();
  2790. zeichen->release();
  2791. zeichKpf->release();
  2792. }
  2793. alp->release();
  2794. int p = (int)outF->tellp();
  2795. outF->seekp( dateiKopf->getPositionList()[ i ], std::ios::beg );
  2796. sgKpf->speichern( outF );
  2797. outF->seekp( p, std::ios::beg );
  2798. sgKpf->release();
  2799. }
  2800. outF->seekp( 0, std::ios::beg );
  2801. dateiKopf->speichern( outF );
  2802. outF->close();
  2803. delete outF;
  2804. schrift->release();
  2805. }
  2806. // constant
  2807. Schrift *LTDSDatei::ladeSchrift() // gibt die geladene Schrift zurück
  2808. {
  2809. if( !DateiExistiert( pfad->getThis() ) )
  2810. return 0;
  2811. if( !dateiKopf )
  2812. return 0;
  2813. Schrift *ret = new Schrift();
  2814. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  2815. inF->seekg( dateiKopf->getPositionList()[ 0 ], std::ios::beg );
  2816. for( int i = 0; i < dateiKopf->getSchriftGrößeAnzahl(); ++i )
  2817. {
  2818. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf();
  2819. sgKpf->laden( inF );
  2820. Alphabet *alphabet = new Alphabet();
  2821. alphabet->setSchriftgröße( sgKpf->getSchriftGröße() );
  2822. alphabet->setDrawSchriftgröße( sgKpf->getSchriftGröße() );
  2823. for( int i1 = 0; i1 < sgKpf->getZeichenAnzahl(); ++i1 )
  2824. {
  2825. LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf();
  2826. zeichKpf->laden( inF );
  2827. LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() );
  2828. zeichKörp->laden( inF );
  2829. alphabet->setBuchstabe( zeichKpf->getZeichen(), zeichKörp->getBuchstabe() );
  2830. zeichKörp->release();
  2831. zeichKpf->release();
  2832. }
  2833. ret->addAlphabet( alphabet->getThis() );
  2834. alphabet->release();
  2835. sgKpf->release();
  2836. }
  2837. inF->close();
  2838. delete inF;
  2839. return ret;
  2840. }
  2841. Alphabet *LTDSDatei::ladeAlphabet( int schriftgröße ) // gibt eine geladene Schrift nur mit der angegebenen Schriftgröße zurück
  2842. {
  2843. if( !DateiExistiert( pfad->getThis() ) )
  2844. return 0;
  2845. if( !dateiKopf )
  2846. return 0;
  2847. Alphabet *ret = 0;
  2848. int sgNum = -1;
  2849. for( int i = 0; i < dateiKopf->getSchriftGrößeAnzahl(); ++i )
  2850. {
  2851. if( dateiKopf->getSchriftGrößeList()[ i ] == schriftgröße )
  2852. {
  2853. sgNum = i;
  2854. break;
  2855. }
  2856. }
  2857. if( sgNum == -1 )
  2858. return 0;
  2859. ret = new Alphabet();
  2860. ret->NeuAlphabet();
  2861. ret->setSchriftgröße( schriftgröße );
  2862. ret->setDrawSchriftgröße( schriftgröße );
  2863. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  2864. inF->seekg( dateiKopf->getPositionList()[ sgNum ], std::ios::beg );
  2865. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf();
  2866. sgKpf->laden( inF );
  2867. for( int i = 0; i < sgKpf->getZeichenAnzahl(); ++i )
  2868. {
  2869. LTDSBuchstabenKopf *sgZKpf = new LTDSBuchstabenKopf();
  2870. sgZKpf->laden( inF );
  2871. LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( sgZKpf->getThis() );
  2872. sgZKörp->laden( inF );
  2873. ret->setBuchstabe( sgZKpf->getZeichen(), sgZKörp->getBuchstabe() );
  2874. sgZKörp->release();
  2875. sgZKpf->release();
  2876. }
  2877. sgKpf->release();
  2878. inF->close();
  2879. delete inF;
  2880. return ret;
  2881. }
  2882. Buchstabe *LTDSDatei::ladeBuchstabe( int schriftgröße, unsigned char zeichen )// Läd einen bestimmten Buchstaben
  2883. {
  2884. if( !DateiExistiert( pfad->getThis() ) )
  2885. return 0;
  2886. if( !dateiKopf )
  2887. return 0;
  2888. Buchstabe *ret = 0;
  2889. int sgNum = -1;
  2890. for( int i = 0; i < dateiKopf->getSchriftGrößeAnzahl(); ++i )
  2891. {
  2892. if( dateiKopf->getSchriftGrößeList()[ i ] == schriftgröße )
  2893. {
  2894. sgNum = i;
  2895. break;
  2896. }
  2897. }
  2898. if( sgNum == -1 )
  2899. return 0;
  2900. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  2901. inF->seekg( dateiKopf->getPositionList()[ sgNum ], std::ios::beg );
  2902. LTDSSchriftKopf *sgKpf = new LTDSSchriftKopf();
  2903. sgKpf->laden( inF );
  2904. int sgZNum = -1;
  2905. for( int i = 0; i < sgKpf->getZeichenAnzahl(); ++i )
  2906. {
  2907. if( sgKpf->getZeichen()[ i ] == zeichen )
  2908. {
  2909. sgZNum = i;
  2910. break;
  2911. }
  2912. }
  2913. if( sgZNum != -1 )
  2914. {
  2915. inF->seekg( sgKpf->getPositionen()[ sgZNum ], std::ios::beg );
  2916. LTDSBuchstabenKopf *sgZKpf = new LTDSBuchstabenKopf();
  2917. sgZKpf->laden( inF );
  2918. LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( sgZKpf->getThis() );
  2919. sgZKörp->laden( inF );
  2920. ret = sgZKörp->getBuchstabe();
  2921. sgZKörp->release();
  2922. sgZKpf->release();
  2923. }
  2924. sgKpf->release();
  2925. inF->close();
  2926. delete inF;
  2927. if( ret )
  2928. {
  2929. ret->setSchriftGröße( schriftgröße );
  2930. ret->setDrawSchriftGröße( schriftgröße );
  2931. }
  2932. return ret;
  2933. }
  2934. Text *LTDSDatei::getPfad() const // gibt den Dateipfad zurück
  2935. {
  2936. return pfad->getThis();
  2937. }
  2938. int LTDSDatei::getAnzahlSchriftgrößen() const // gibt die Anzahl der Schriftgrößen aus der Datei zurück
  2939. {
  2940. if( !DateiExistiert( pfad->getThis() ) )
  2941. return 0;
  2942. if( !dateiKopf )
  2943. return 0;
  2944. return dateiKopf->getSchriftGrößeAnzahl();
  2945. }
  2946. unsigned char *LTDSDatei::getSchriftGrößen() const // gibt einen Array von Schriftgrößen zurück
  2947. {
  2948. if( !DateiExistiert( pfad->getThis() ) )
  2949. return 0;
  2950. if( !dateiKopf )
  2951. return 0;
  2952. return dateiKopf->getSchriftGrößeList();
  2953. }
  2954. unsigned char LTDSDatei::getAnzahlBuchstaben( int sg ) // gibt die anzahl gespeicherter Buchstaben einer Schriftgröße zurück
  2955. {
  2956. if( !DateiExistiert( pfad->getThis() ) )
  2957. return 0;
  2958. if( !dateiKopf )
  2959. return 0;
  2960. int ret = 0;
  2961. unsigned char *größen = dateiKopf->getSchriftGrößeList();
  2962. unsigned char granzahl = dateiKopf->getSchriftGrößeAnzahl();
  2963. int grpos = -1;
  2964. for( int i = 0; i < granzahl; ++i )
  2965. {
  2966. if( größen[ i ] == sg )
  2967. {
  2968. grpos = i;
  2969. break;
  2970. }
  2971. }
  2972. if( grpos != -1 )
  2973. {
  2974. int *grposlist = dateiKopf->getPositionList();
  2975. LTDSSchriftKopf *sgkpf = new LTDSSchriftKopf();
  2976. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  2977. inF->seekg( grposlist[ grpos ], std::ios::beg );
  2978. sgkpf->laden( inF );
  2979. ret = sgkpf->getZeichenAnzahl();
  2980. sgkpf->release();
  2981. inF->close();
  2982. delete inF;
  2983. }
  2984. return ret;
  2985. }
  2986. unsigned char *LTDSDatei::getBuchstaben( int sg ) // gibt einen Array von Buchstaben einer Schriftgröße zurück
  2987. {
  2988. if( !DateiExistiert( pfad->getThis() ) )
  2989. return 0;
  2990. if( !dateiKopf )
  2991. return 0;
  2992. unsigned char *ret = 0;
  2993. unsigned char *größen = dateiKopf->getSchriftGrößeList();
  2994. unsigned char granzahl = dateiKopf->getSchriftGrößeAnzahl();
  2995. int grpos = -1;
  2996. for( int i = 0; i < granzahl; ++i )
  2997. {
  2998. if( größen[ i ] == sg )
  2999. {
  3000. grpos = i;
  3001. break;
  3002. }
  3003. }
  3004. if( grpos != -1 )
  3005. {
  3006. int *grposlist = dateiKopf->getPositionList();
  3007. LTDSSchriftKopf *sgkpf = new LTDSSchriftKopf();
  3008. std::ifstream *inF = new std::ifstream( pfad->getText(), std::ios::binary );
  3009. inF->seekg( grposlist[ grpos ], std::ios::beg );
  3010. sgkpf->laden( inF );
  3011. int anz = sgkpf->getZeichenAnzahl();
  3012. ret = new unsigned char[ anz ];
  3013. for( int i = 0; i < anz; ++i )
  3014. ret[ i ] = sgkpf->getZeichen()[ i ];
  3015. sgkpf->release();
  3016. inF->close();
  3017. delete inF;
  3018. }
  3019. return ret;
  3020. }
  3021. // Reference Counting
  3022. LTDSDatei *LTDSDatei::getThis()
  3023. {
  3024. ++ref;
  3025. return this;
  3026. }
  3027. LTDSDatei *LTDSDatei::release()
  3028. {
  3029. --ref;
  3030. if( ref == 0 )
  3031. delete this;
  3032. return 0;
  3033. }
  3034. #endif
  3035. // Bit Funktionen
  3036. int Framework::Bits( int a ) // gibt 1-bits in gewinschter anzahl zurück
  3037. {
  3038. int ret = 0;
  3039. for( int i = 0; i < a; ++i )
  3040. {
  3041. ret <<= 1;
  3042. ++ret;
  3043. }
  3044. return ret;
  3045. }
  3046. int Framework::getBits( char c ) // gibt zurück, wie viele Bits c benötigt
  3047. {
  3048. int ret = 0;
  3049. for( int i = 0; ( c & (char)Bits( i ) ) != c; ++i )
  3050. ++ret;
  3051. return ret;
  3052. }