From 647832ed5b51a3c48fd8f5396f20cfed9838465e Mon Sep 17 00:00:00 2001 From: fgenesis Date: Thu, 14 Jun 2012 18:55:30 +0200 Subject: [PATCH 01/42] More linux file name case issues... --- BBGE/SoundManager.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/BBGE/SoundManager.cpp b/BBGE/SoundManager.cpp index f6fdc50..77311a8 100644 --- a/BBGE/SoundManager.cpp +++ b/BBGE/SoundManager.cpp @@ -925,15 +925,13 @@ bool SoundManager::playVoice(const std::string &name, SoundVoiceType svt, float if (!voicePath2.empty()) { - fn = voicePath2 + name + fileType; - stringToLower(fn); + fn = core->adjustFilenameCase(voicePath2 + name + fileType); if (exists(fn)) checkOther = false; } if (checkOther) { - fn = voicePath + name + fileType; - stringToLower(fn); + fn = core->adjustFilenameCase(voicePath + name + fileType); if (!exists(fn)) { debugLog("Could not find voice file [" + fn + "]"); @@ -1281,27 +1279,25 @@ bool SoundManager::playMusic(const std::string &name, SoundLoopType slt, SoundFa if (!name.empty() && name[0] == '.') { fn = name; - stringToLower(fn); } else { if (!audioPath2.empty()) { fn = audioPath2 + name + fileType; - stringToLower(fn); if (!exists(fn)) { fn = musicPath + name + fileType; - stringToLower(fn); } } else { fn = musicPath + name + fileType; - stringToLower(fn); } } + fn = core->adjustFilenameCase(fn); + lastMusic = name; stringToLower(lastMusic); From 319b9d09edb66a54edf29f6bae52e1f0d46b09e5 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Thu, 12 Jul 2012 03:46:18 +0000 Subject: [PATCH 02/42] Fix regression that prevented few textures from loading (Labyrinth mod icon, for example) --- BBGE/Localization.cpp | 2 +- BBGE/Texture.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index 5558e3b..2affc66 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -110,7 +110,7 @@ std::string getSystemLocale() size_t found = localeStr.find('.'); - if (found != string::npos) + if (found != std::string::npos) localeStr.resize(found); } #endif diff --git a/BBGE/Texture.cpp b/BBGE/Texture.cpp index bb74f46..df609ec 100644 --- a/BBGE/Texture.cpp +++ b/BBGE/Texture.cpp @@ -281,6 +281,9 @@ void Texture::load(std::string file) return; } + stringToLowerUserData(file); + file = core->adjustFilenameCase(file); + loadName = file; repeating = false; @@ -316,6 +319,7 @@ void Texture::load(std::string file) if (found) { file = localisePath(file); + file = core->adjustFilenameCase(file); /* std::ostringstream os; @@ -606,7 +610,7 @@ ImageTGA *Texture::TGAloadMem(void *mem, int size) // Read the width, height and bits per pixel (16, 24 or 32) bb >> width >> height >> bits; - + /* std::ostringstream os; os << "TGALoad: width: " << width << " height: " << height << " bits: " << bits; From aeb96ca2ddbdbedb35889f347c80ac56697c4046 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 13 Jul 2012 16:03:21 +0200 Subject: [PATCH 03/42] Fix russian font display & font size calculation (my bad, thx Henrik) --- ExternalLibs/glfont2/glfont2.cpp | 8 ++++---- ExternalLibs/glfont2/glfont2.h | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ExternalLibs/glfont2/glfont2.cpp b/ExternalLibs/glfont2/glfont2.cpp index 56b5abe..7cff0ff 100644 --- a/ExternalLibs/glfont2/glfont2.cpp +++ b/ExternalLibs/glfont2/glfont2.cpp @@ -195,7 +195,7 @@ int GLFont::GetEndChar (void) return header.end_char; } //******************************************************************* -void GLFont::GetCharSize (unsigned int c, std::pair *size) +void GLFont::GetCharSize (unsigned char c, std::pair *size) { //Make sure character is in range if (c < header.start_char || c > header.end_char) @@ -216,7 +216,7 @@ void GLFont::GetCharSize (unsigned int c, std::pair *size) } } //******************************************************************* -int GLFont::GetCharWidth (unsigned int c) +int GLFont::GetCharWidth (unsigned char c) { //Make sure in range if (c < header.start_char || c > header.end_char) @@ -240,7 +240,7 @@ int GLFont::GetCharWidth (unsigned int c) } } //******************************************************************* -int GLFont::GetCharHeight (unsigned int c) +int GLFont::GetCharHeight (unsigned char c) { //Make sure in range if (c < header.start_char || c > header.end_char) @@ -266,7 +266,7 @@ void GLFont::Begin (void) void GLFont::GetStringSize (const std::string &text, std::pair *size) { unsigned int i; - unsigned char c; + unsigned int c; GLFontChar *glfont_char; float width; diff --git a/ExternalLibs/glfont2/glfont2.h b/ExternalLibs/glfont2/glfont2.h index b2dc491..235869b 100644 --- a/ExternalLibs/glfont2/glfont2.h +++ b/ExternalLibs/glfont2/glfont2.h @@ -70,9 +70,9 @@ public: int GetEndChar (void); //Character size retrieval methods - void GetCharSize (unsigned int c, std::pair *size); - int GetCharWidth (unsigned int c); - int GetCharHeight (unsigned int c); + void GetCharSize (unsigned char c, std::pair *size); + int GetCharWidth (unsigned char c); + int GetCharHeight (unsigned char c); void GetStringSize (const std::string &text, std::pair *size); @@ -86,21 +86,20 @@ public: float y, const float *top_color, const float *bottom_color, float alpha, float lastAlpha) { unsigned int i; - T c; GLFontChar *glfont_char; float width, height; //Begin rendering quads glBegin(GL_QUADS); - int sz = text.size(); + unsigned int sz = text.size(); float a = 0; //Loop through characters for (i = 0; i < sz; i++) { //Make sure character is in range - c = text[i]; + unsigned int c = (unsigned char)text[i]; if (c < header.start_char || c > header.end_char) continue; From 8084a4c613fec16835db1750fb90d048048d7260 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 13 Jul 2012 16:10:07 +0200 Subject: [PATCH 04/42] Fix loading stringbank.txt form a mod when loading a saved game, and load treasures.txt from mods if it exists. --- Aquaria/Continuity.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Aquaria/Continuity.cpp b/Aquaria/Continuity.cpp index 8902916..c9dcc7c 100644 --- a/Aquaria/Continuity.cpp +++ b/Aquaria/Continuity.cpp @@ -871,10 +871,21 @@ void Continuity::loadTreasureData() { treasureData.clear(); - std::string line, gfx; + std::string line, gfx, file; int num, use; float sz; - InStream in2("data/treasures.txt"); + bool found = false; + if (dsq->mod.isActive()) + { + file = dsq->mod.getPath() + "treasures.txt"; + if(exists(file)) + found = true; + } + + if(!found) + file = "data/treasures.txt"; + + InStream in2(file.c_str()); while (std::getline(in2, line)) { std::istringstream is(line); @@ -2910,6 +2921,8 @@ void Continuity::loadFile(int slot) // Possibly mod-specific data the the continuity reset didn't catch loadSongBank(); this->worldMap.load(); + loadTreasureData(); + stringBank.load(); } void Continuity::setNaijaModel(std::string model) From d676d811372502bf31b261f8c450bfac18aca326 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 13 Jul 2012 16:11:52 +0200 Subject: [PATCH 05/42] Add achievements.txt and russian songs.xml --- files/data/achievements.txt | 54 +++++++++++++++++++++++++++++++++ files/locales/ru/data/songs.xml | 12 ++++++++ 2 files changed, 66 insertions(+) create mode 100644 files/data/achievements.txt create mode 100644 files/locales/ru/data/songs.xml diff --git a/files/data/achievements.txt b/files/data/achievements.txt new file mode 100644 index 0000000..e1a2182 --- /dev/null +++ b/files/data/achievements.txt @@ -0,0 +1,54 @@ +Super Chef +Find all the recipes in the game. +Mass Transit +Find all the Ancient Turtles. +Explorer +Travel to all the areas of Aquaria. +Healthy +Find all the health eggs. +Songstress +Learn all the songs in Aquaria. +Spirit Battle +Defeat the Priests. +Octogone +Defeat Octomun. +Rock Crab Rocked +Defeat the Rock Crab. +Boom Shrimp +Defeat the Mantis Shrimp. +Dethroned King Jelly +Defeat the King Jelly. +A New Chapter... +Reach Open Waters. +Dance Of The Forest Sprites +Reach the Sprite Cave. +Passed Through +Reach the Veil. +Romance +??? +Gullet +Enter the belly of the Whale. +Weird Fish +Discover two peculiar-looking fish... +North Pole +Reach the Frozen Veil. +Divorce +Defeat Mom and Dad. +Uniter +Rescue all the lost souls. +Bucking Bronco +Ride Ekkrit for a minute. +Combo Eater +Devour 6 creatues in a row. +Feather-mouth +Devour a Parrot. +Monkey Flinger +Fling a Monkey. +No Escape +Kill the Coward. +High Dive +Dive into the water from a certain high location... +Speed Racer +Beat the Arnassi race in less than a minute. +Mergog Defeated +Defeat Mergog diff --git a/files/locales/ru/data/songs.xml b/files/locales/ru/data/songs.xml new file mode 100644 index 0000000..76a5322 --- /dev/null +++ b/files/locales/ru/data/songs.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From b844dee736f9334a6eb0d46d24fcebba316c7e56 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 13 Jul 2012 20:40:39 +0200 Subject: [PATCH 06/42] Add glf patching utility --- tools/Makefile | 10 +++++++ tools/glfpatch.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tools/Makefile create mode 100644 tools/glfpatch.c diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 0000000..0e27b27 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,10 @@ +CC=gcc + +CFLAGS=-Wall -pedantic -pipe -O2 + +.PHONY: all + +all: glfpatch + +glfpatch: glfpatch.c + ${CC} ${CFLAGS} -o $@ $< diff --git a/tools/glfpatch.c b/tools/glfpatch.c new file mode 100644 index 0000000..c5325e0 --- /dev/null +++ b/tools/glfpatch.c @@ -0,0 +1,70 @@ +/* Conversion utility to hackpatch glf files. */ + +#include +#include +#include + +typedef struct +{ + float dx, dy; + float tx1, ty1; + float tx2, ty2; +} GLFontChar; + +typedef struct +{ + unsigned int tex; /* tex id, unused */ + unsigned int tw; /* tex width */ + unsigned int th; /* tex height */ + unsigned int sc; /* start char number */ + unsigned int ec; /* end char number */ + unsigned int chrs; /* chars cound, unused*/ +} GLFontHeader; + +#define CHR_SIZE_KOEFF_X 8.0f/256.0f +#define CHR_SIZE_KOEFF_Y 8.5f/256.0f + +int main(int argc, char **argv) +{ + unsigned int i, num_chars; + GLFontChar cc; + GLFontHeader h; + FILE *in, *out; + + + in = fopen("in.glf", "rb"); + out = fopen("out.glf", "wb"); + + if(!(in && out)) + return 1; + + fread(&h, 1, sizeof(h), in); + + /* Fix it. */ + h.tw *= 2; + h.th *= 2; + + fwrite(&h, 1, sizeof(h), out); + + num_chars = h.ec - h.sc + 1; + + + for(i = 0; i < num_chars; ++i) + { + fread(&cc, 1, sizeof(cc), in); + + /* Fix it. */ + cc.dx *= CHR_SIZE_KOEFF_X; + cc.dy *= CHR_SIZE_KOEFF_Y; + + fwrite(&cc, 1, sizeof(cc), out); + } + + /* We don't write actual image data. */ + + fclose(in); + fclose(out); + + return 0; +} + From b136da8e3b064be1bfab9bbe9c5fb3d572c6a64d Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 13 Jul 2012 21:08:30 +0200 Subject: [PATCH 07/42] Fixed up russian font glf file & changed a few pixels that were off. --- files/locales/ru/data/font-small.glf | Bin 136496 -> 5424 bytes files/locales/ru/gfx/font.png | Bin 34948 -> 42389 bytes tools/glfpatch.c | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/files/locales/ru/data/font-small.glf b/files/locales/ru/data/font-small.glf index c1a60dfde6482cac91c8ea13009cc454a91fea80..e14cdedf8d5e454aa4ccbfa2ba1da3e7f6ce2007 100644 GIT binary patch literal 5424 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 diff --git a/files/locales/ru/gfx/font.png b/files/locales/ru/gfx/font.png index e9372b11d7b279394e203360e8b808d0e9ffd835..57ff4d3a7cae00403ceda04a0d964748e0dd575b 100644 GIT binary patch literal 42389 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 G&;$S@ufvZ3 literal 34948 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGa29w(7BevL9RXp+soH$f z3=CZUna<7u0U7xv`NbLe1qzJ4}r;Fna-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd zQotaExux3<0_f3F`IFE;BUD{V}teks*4DqA25n zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^ zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(> zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp zPtUI|aA06~SW!-AK$!ao;)!p3#s zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5 zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^kJ-ZK7glHR-|Dw> zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLME}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR zQqIHMCfaNQnusv-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N) zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKwv291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@< z!^dqWx2@bRx#8&zw%hBrnRA0@Uv^IyPv2SG{JEpM)4S=k z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKiziwlTkF zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V` z{X3f1yPFp=s`|R5@n@`=I zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>rmX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-oR2DUt<2tuFSXX z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y z$`^dTc*p%aTWj03=E|P3=FRl7#OT(FffScPl`Y4#=ua!-qXb~q~g|_y|q1auI_#Qlhyd% z*O>EPr=;6HuC{$GDSqx(U;4?akhpay z#0UoRa&d7ft-9x;5Ft>a91tMT@oIrWKtRCuCI?4_7j6q86m)iN*pQT%IQQ@4pL3)4 z+ttOLtBhNj9zhUpS0!aER6^6 zm;8Avs1RAonP%lmaEzMRWs74OI8YExgVsJX9yBk|bJ%gz5~ z_W5?Nvk6{uc*C{kutv8GucHUM_O?nabo#^M5V!F5M4K6m2`Nvm>)zOKJtV!UDRFlB zq0qLgEAQh@;}y0eE#OzW?{Gn*k43dCuth~=!24=tRn|%2ZPR|pAK!HOoI<*6 z$Kvp!et`$VD;cmS6t3e!BAdoOq+hM>f8j^8H)Z^_NPr zPBWPnOuzi!#BoCC!@K7;zC5y2PB?7-v5k`h7EU^37Qdj;^L4`712gp(E+{E7(F!y9 z;;pm6STa-cmd817tBsGp=kM8VY5m{C&}zNZ(I~&bN!uT9KD0!;bg$<8>9T?omiK&l zlC{F>V&NUV)xs+*lQhmI zAK4vwDC59dhPN_{7Wz!Rt#_eeOX%VYs~0fdeXc(%>G=DD{>dN=FqKS{1h5#5vH4qAL;`n*6mpe{@DP_pF$`HV`QzEfxZ$AnLG zZD9Vnd%|PO@_p(hej6X!T;?cPyzZIw^f^D}kF;b97?g`mm*dW|JHhMD{WI*?Zf=ci z$!wjjO-sZcmNH*ne5SRmxbL>&=S8M7^KCRf&Yb*zx5WJ16_4${+n)%$e|yrm&6=g2 z>+2<-TJ`KYW6v*i>dzA6`O=5B#CU#;EqGOM(ei86!Cm)wa^5?=@U~eVm}6LQ`K0iC zBkQ+@@9&rVGMOG(ntwQ1*DGwddBDT01X1xr;(`p^lAY7S3@2$hOWAH+aoFru)kd$& zKkuiDuKazo_jHPbbI|D*TVi%y`Z+!DVHD?7RyolF<&1ZmjvRI0aHDHeOHp`t^!KdB zscBy8RNW2yl&x}BD0UYgOHMrZgR8+Nb>&;jfEmH1nIXK7rnpC&p3r32^y+KQxo^hn z)|GOXtudRwOxxq}x-4!r?p>uO3VUw_J=^pyU!~@pc0kSN`gILEWVjh8Oh0+RYX$eO zIbJ&~OK(m*xn@WGmCZ@pyrgumGfTHDlM)q8R7|`Q5-ysss>LRH(!|e+=ecg2%9Q2W z=q9q#Wd~)CZl@t8Xc!wXEjqiaJqs>6xgY&^4*Z zZ47ydJGR#^V%aEs$!@#tZM(N=>Wgd7-`W^8&iu zSia9JSNWZ>V#Dazo=n%%)5vHbACEY;pCvF6c} zmT|Mbnqlj(e9f;cYyaJH3p{KyS6f-F-Iv`}zisba*Pp@sa~%>*8y{{d^goooR;#SQ zv@wVK#w2BiWB<0C+4{psA)Mif<-Y5>C9$C&y8DjZHq5%Rt~euMY33<8flWOR8$}hf z3Lco8iS_JWIfW_fx#`zO+l{RMuW~Q-R^?!jOO`g9b?P>wS<$qqg^}G0ug^L&?L}Jr ztK5lw>v=Bkf5#BJ{Y|26CI8yY)iqo7`?FRaoc48bd(rj#Pc+vT`&qB*S9_$^>EvfbSoX1c3=-<~cuUV1k^fj@Ec65D5X*NYCU^uH_f zd&+OacTaBi-wF5~D?XRm#43wF`_e+kzYT{Kv$Fhm-&0=yUHp2`wm5Q%=SC+`4(VQ7kk*f$3EEaZZ2D@6!uSUTgHpe@)!?VB_{~ zL#M^zNzSYIZ+cjntaz(wC-ur?%@$?f$$f^gYksh3aW#A`Eake^xQ8hrjfcfy^O40{ zUcZ`h(C;RXgrBZCxAnFg zn-Ras;%EPFv5GU?+^%I5lKl)x4)Go=w!_RmqRm z39@_Bbl8nAF#fd1amNQqJC-yiYNyv>%4H#jl=r4vfA>_cGTJtAU+9K4g2lzMkqpOL17+W& zoId$Y=(EOZoh!mEXEipi-n`jwk51LQx_L%#iaC1ijyx}5{krzyP0!ccj8i5|GrvFi zR_XkIOP(p(y*amX(fgGvR$u&o#bQfh_DdOt-FI^zn1paQ=4}y@+S5A8dKTNG?Ms%( zGDdz6cwO9g;DcnU&yf}PesWpASjy%8`fQimp4F}s-zJ1!Ja==!v8l}W7tcO@FMqze z{4S#d5hpb2-%fh%Iq_V62oKY(!%JuUnx*>Z)3aLHpWFZOGO@f0I`}EmKVz+Dg!*yC z;Pd(siB_sJT%5E{Uz{QME@*-DzK6QE6mHu7FYJAh> z`mSvWJ!b4DV`aHr`Q`I;oBI>*6^6ZUf5*9Xb$awUt!vBHjJpzicKiUVHYIrNR8dw9fNlAFDWP4;8uH-aVt(d(FMbuoUlH z2X*lsa`8Ktz!NPy)L{n@8_^L$ z{w7W`UFeE$VYl1W!cS{gmj=%@J=FDjpAeJn`AxG-ie`6Oem=CKO6F3cl)t0wr1iZ0 zg0VA`v_lwPm?ane-x{j8u%<~s?p&q6KiDKw|M8q zYcRB}Hs)^*Q8W6j|AvVCx%T3>1)Ww&{k$zMmg@I1fMG&lH^c9uC2J1tjI*wH;*jJ% zmo79x&`4dZVNJ66+iLk6KZTt$5-A_CSHE-^H)!O zn5Vyd_gt<|%coDUH-0ofU)KB7^3=lBGe51V75$oY=5sA)e&jz@+v(55pZu=#*{ADu z-1_O&jN(YMV_U8V%Iwz4Tg&ur%M|Nw!~NS;-|Dzt-jLbzvO8Wj*~j+b zzFmLT{awd?EZy$uzP26vUmV#Vst~vD-#PXp%V$osx7wTbWM3NR&&_j`>!mDD-`!-m zOzcC>*^k>LU(CpZ?EZvE$n*X>fS?xoS2;!QPqY%?uPYd@}!bCkJzDD;S~?7byj z+vhC)SaLa2%{}!(Z*AnqlUWa{M3*kkvsu;Quk7x==JL+fQr9N@iR9_=zgKf<`nv3W z56|2V)O+@3i_@d)dI}r5mn5%{ceRQO7kQd{+t+X7lU)l4>EG3t^?m5R@x0{uR zH5-Z}84NfdC^T?0p0QeXHI1|G%8@U|`p-78G6Xa5oi^3{UUKBj72S&>SA_nvz51^e zIcbOD@_N(ML-W}T79N^+)ZtIuDucS;mCNEMab$Qo+b-t{yQ-9M?V~+Q z^o!|pYB*jRtj=o@PdeqX`jC<33In-?UsUSZEI+3^PIVPJ*Rw_baSyLb{qr=8fD$>lcxU)2Fx|&^obbaqBi^hEFA@ zDzDbdZM@R4a!aM#wov2O9CPzp>tyAG%eP*bd2Z%8Zs`@Wn%3)V=VT{Jn@e4~cE;-I zGO-(cQ#1?I<}zOJ>GLyH(O=72u9=T5^)<)rwakua%fq2|4JRdT1QZ64Y9tCCadRuj@KHrTS@HDM{g6P7_aA zDJE)cGIg1KaSO+ag;B;4hb1+CcTJ62kP(qPZI0Wj#;@J;PRBZZy{wax%6=h^dG7x1 zY}OCGucvGYPvu(CXe^PvNNRPg_42Cg$1;{}J0+v=igitCf7zKR#&m72*|8tiz7E@+Vn0ju+T=^Or+wyjS*1VseOCWD zF%_Hc74IIj^sOpcIP-?^*KJcSO*rSFo+-}Yw|a-}QH>WivJGbck86Hf#p2+8$F9r3 zxUjaj%)nceyTQ%1bY0+sIxdE?f0$)57U7J(3Cc{Qd z=+^N&F%y)Hcdy!PWy8jl5M;DbJ@K_io8QzajmDD-*^5JVZCi3P#O?WuuorGV?7TbE z_0pehPd=2mz1H-|S+=hH;==u#wd1E3?bt3B=_T>EWy;PpuUR3AS6&5)Ie*$`srEAV zwBWR@6`RuCZ*8~9?l`v6&nJ0@#=6cgSO12+=~={|=@F4LyM9AUiQaBr?b@o3O$XQ( z^*$_HGvQ(k_s?ZqYz*6~#Woz4n00&is>7#uTbz`Wwd(w%w!-g>M%@2vj$5wgPq?r{ zZ)t>$6L*rWqTJ?H23xr}8d#TaGBb?XlHq&0IC~4Dv})>`Zys9b)fP0~eDTuM?~8$n zZ}}3rwNI@~mfmU!YhuV)zGZG`fyl*gZ>-vGf8$&C{g|3J!;PQM`hvVF-L5gOnUj5T zu}tlT-!F1!RG(53P-1zLsOQdI@~?Nw#r?4blS)?j1|L<|({{+|`R&IBw(e&ggH{_MM+un0r)$7V#u`PKm z$ClO^j_%=Gw-&aSmKr^Za5n8``mHs$T6KBxUKhvUu892yHb34j`(lBEs_fH{Mq3GG zKaMk1M;0$PT63a9TXXT7e|KL_IcJr7H9JEwOZhKD*Sw&8yi=@&WIUL2ua=(O%s4wZ z^TvT&H#q}V7r5AlJ51oSxwJt{Vp>{)?Z=x^maLPmS>F7$XN%jVRnsoi`D(9ryDhlf zcW1hub41HF&d5dQyPnKTZk?eQ5P#P|e`Nk7;`*=ldv8n6rq@i*jOImac>diQa@cBmL95Q0lhF~*-#6-6${vqeIPVg}6ji2G z3ELc)pIFOhTCZhIE!}XP;c@+}yIIjzTQc4)`Xl;!vC7+o1zO?%et(fnohK6UY)|dW z+|xffWdnRGcU+5ay&WW)dhYU)#lD{_AJ5;?ZhLl5eDR@KOOl*f50p5huE{b#5Yu$w z<4TL{mkx7n(&bvr0z!L@oZY769S-By;huc%zpGAh_l?5Wgll$)3!OR;twLdTKp`Nv*2R6+rm= zZ{Jj-uIpYE6D}S6QKoZk|C--l8O^?SNlgv7d_AYhKq|fDU*98Hmd8d-r!Vi=xcU5X zmN2>G+s9wHI`Af5w)6C{TwM3NTt>&yUAA%3^BoD{8-CBJeQVbo(y4iI{h^01+_B?hI$*1L zL2sWN%~ zI@i&1-tG9l%8lzU?d!iND{!Up{<-cpcbl}0MTQS7)|z)mi_Az5uy}c8a$aB6rO?uK zd#v(%ICsuEHe+9BgxRqYrupk%z4E9y#TOiWXZ6#HvdBv(d6zHMyMI;1SNhnDZNKi8 zu21jDWNo{9BL055*wp{~>LPzhet)^clI-hrOwWYF`?b3}68(dRm{e!D7nK)PnJiM+gC3~B>O>BzLx7aDk{GBtug}f_$ zUVQemr1ZSSs#EsQO5fw;{y%hPNA5oz%dZ5u?9F`4cJ=EV2i{Jq_# z&F9(fybrDu3;De{WYKNU^DR-#r#HMfYbiEs-SaEGcaPb%YMraoNPKcP`sv00J_lat zndG^;N#30y79gqK*$rt-)+{m_^vh01vy2p3q({)#R+x)V8Bq(l|yL86H z_p{Dr>{%I7ePYFl-t#p*zpwRA`>`?RfY+2K`PzzW*X+M`>#6mlkCL&Xd$UdnrJv4M zKYBjTXU^wk;kE{IPB$v=3}gKN%ktKQfd97)r!}~p`*km5y6i%8S$nB@FZZl?wbH+C z8`Bz1V^$se$~7flWuB^O#%^&u^@+PKlYWZKH7^FU(Bv}rn=@<%Jp(B=R3y6Li6%CW$WkM+@M^yBk|?w zt5Ykk+T3}iDO@LZ?XO?La?$C}6#vbV*f{mtf@4pgZ}OV0b<`oab>aFyZ@uT_N?0|f zE}lIp?r+bpOH)2g3bEg1d1<5Ug_mb4j_IG>@8@PY&vV7@+~sp$EV=SsC#~nc$;YBI z3F&ICH}sxmTwgQ$Y|n=yw(mdZ%vzv#OY?fD^tKrR?$V*(i=Rs-J7^_G`q+sZX>#10 za3i_>v)p1okJLHmRaQ*V6uJM~lOuAsiY$lQiB-W@pVsMjOoiCnr}EEJ*Q*B>li^DDZ)J{P;W~zS}#FJ!0Ff&wMFF_M+_S;%5Mvv zuHDD_;fg)j^rb}-7dfj}`-)!-y!Tkf&1ug=5eCJSJCR&__IEy<{o~XVjfT&2UK?y~ z2X*L9RB$vfhV7fV-pk^Zx(LG(fzl762V15bZHm!VV^zG#w4ga-V{hTQ%Afn**IXBF zjh!O4sB)`aL+aDxN)3{n;kNC&Wh?6}745n|{onNGzUIo$xgIrXb4oVPe=ayv{V|I} zOvUH8eU+DePkc}1^f!L|v&?D7Z$Aku&5y6Ee_WpOTs-;H=Gg-4f3|FyslW2gvZeFa zD%*Wuw$#!1KyCEDD#Mp4uS3iYYQ>N4-C?yu=CWB!%-*is+g=KNo;l%br=eTCu5rq} zpJ)Hw3;(Vol`LiWJvBDBa$9;&rqzDaUc=a*cQ2V9yHfPyvPY-?S&7Sr$8=7=KW&)! zac|bK8IqjE#s}rSV{G2M-#euu>X&BW)=aTk>Q*&s?orpL+?PH7#~^5))8(qTdAaP* z>Z5KQJ$l?@-mg3H;dNVV@4RDQRvtX{VbwXC+-WoRS=sD+XBHYU&Gz(+TDAPSCX6pb zpKy8J_j9m}>0K=!u)kvMM{R$1=9eojwKzpNTk7*V9A3;+?kyl~C%asX@hj8Zpu>wD z{eIv$-Ybf@fIGn;Usvu&nZu)e^?HPX!osL*<-K-K^m|I7M|RtW)L&u z@&}WxrbkL5-M18#DL($k*x>o`^sJM=ANk$<+#398r`oeu7hblpHQem6IJ@-Ey?{gw zsp*TVCr;Ig`*_)|ZqDg2WvHA{^z75+ z6(?nqedk4Ud`Q3bazT2)zoeZub6cwaH@P2`TC(JPj_1_!#51Sw2(@W1ueFYdJvWW% za@N6@E28H8Ynjr%>{Wr2mHJ#h&(EK2HUAe|UarzwaQUUhB1PSO`;v}}UY)G0lU;22 zx@0O-g4d;WmTnKbvTuv;Xlr6pSen&KbZO)z#ob$Ibv_5;-BD~$rC*l>W`U_# zY~ym#1;Pp@YBujzueRVdu)4fo+w6E^_gdfkjY3h6b67V7FP_7;fI;I*- zWIyY(Qm}fC=mKTlx|{8{zQ|nMAeH`9Kk@5%mJ5sP%N;IDezw}h;=~xR;Bt=D)Que{ zI1Hb*T{@x3kT$pL9y9-!lauo@uY??rag)qlW^(1)9^2OunwMCdCmx+%sQg8(?eoXf zi7BirLLW@`_1^m-zijI1TUne8*(YZfo$834fAPpMqpkbq53?ujGgaO5?yE$Dbn&wDCs-UV2Q$3r z+qI&y>YQZdRM%jwRqth1te$lDT#nr1>|4^}Uz(0qxmDdfT3@U>b#9uM<&03-&F4)V z7Pp-9?Z5DLVL)pCjOD^>7~XQZRlQqutTR+E`*OtI(6_mwZ98h@6)G8DR4rDVtHqGR zR#3`k9yejjABQ`euj?_qXR_dZ&{I?HVs+X5h<&^n^N!#nr(_wnF;&Ez+E~l|H1gx) zAO`Wu9X}Zt9o}4K{qUah!>#|!T(;cdf6)Kv|Fcs?D$nbRSJ?jQp7;B-FXwNuXv;gN zyZm(@kKmaQM=;CNS`uOcM9Sn@r3M?A#F=Y#ry!X7oq~-g=y6erStB z#;={P8L~K2*Pf8sZMIWygv-phMT!tB_8?O1m3 z>Y~o#^UB-Pxny)#3eFc&d^l^>+udTvLRr>aJI5$*TrGXHtpA4}vx%^a+pVOdYNux3 zE|Wf7=6cy9*spe;-o>|4=VE`D=cU$62`&!4v@K=oU2b=q2~oW37&q`9u=P7$lgwy- zzGBAR$9C!)`41TWtnoTD>zMYXpYr;acP5xz3U=PU;^pLtTnyG;?^ZL&evvWMKVnjp zIx&6gzS{QhWozctzngOBg3Pg<#XEWp#Tc7IzgXuQE)ZqCEIMUoT95r^$%oy-45@49 zyjR+!;2WO9I-~Sd*38QF*Tv2x{fV1ut(VS}--CGOidBnDUazXiWh=Ov#nBM?@&aGC7q8`+WP!_^VzP-5 zUGFq5oZ1t7@I*q?l)cpnmv+owXPOn9a!bs1_mA~D+(%=Y;xoh8av$ZdN|#cN@_(~a zEI6W4BSiSBOjT&;&WqLm)Q@e*=|4S_L7F%FZk3bO7I6XH8_gyEu1|e%d}>hmt&TH4 z^cipHzx@zjUGmIf%YyTto=GgZt?3f1HqCjpBEu<}Qqi|DuQac<2HbIuSaoAx`gJy) zB|SyQd!rhkf9m_OO!$)e`;+zio^D+F?_6cytgptYGybn-&2pMLa~1#IRZO|R^s8eX zBX7)A*}~K#7QOuIiTL_`D_QLGCK}xk&Tf92y-wJ1!`Z{VvYKM8t4>7OFIXMiy6c54NxA3RlTQX~FvZQF*Ktmk*gt6DD+w$oNFvi78Jd%iQ+U zg1+zTI1k)s+Tm~YQI}yI`v>cvbK2r2Y)^H0Ir-|!`FsN0$(jszY>!oH&%dV~_v}=X zZTNjYo_PC&CmRJWU+fd+He7sX!o~WDKMQKr9DJW1&S8D|lq*QSUM$J#iP4cxv%klu zde`3H!F9Y%d5$xm$g6cud(x)9P+lzgH=l8Xr`w~lDRte&_s_Ea-6;EXH$xoThg^pE z(7C_t_`MIizxwQ|>^0w4a{v2~`S)YHnGWQNe92I3nU>XaT7=neF=y*Zz z@fDH1x{cBk&t7^tkM)Br5C5f&*PCD6Q`V@T`n#ARuH;pW)USKqbIzHsWnTa4$Uff) z%lH59M2RwN_Dh!gn0m$R(RmrM zl3_(r|C^R9g;yPCp4%zs-c~%WyF%N#hIC>KL~{T=4|u9ow&_Nm+cnN#L=+x7X`Y(`}z`M`Cr``?%J zZvC)k8bbt^$a|Ie<7ubAFV>v<`SPp($sExywrMU_zS}Z&*`MRacdB_W`mvt&?YPFT zQYg5nT)3uX>SgxGjE$30Y;UkW&{K`s7wDaU-ao$ZRY7x^<76LK2L7>_V(+H-*3N8u=$*Mrg;A8 z{LjZ`oPVk01KiDk)|8qu(;j6jKc{}V)kKIvgTC&N; z`n-fO-!rA^176J9{I52sUC;_^7Ir!&ZGE&P&h_2xl}8t?cQP}wwcLL2^XkSIGk$y* z*!%O`reL32<_SAK3mc&h~e2CZ&J*TNd|EHD&!Ad);S$#06!ow#+fM+np+V zxXxuaN16AI`_o=_i>uVA+uZr3*`_X@=l(_Pz>b3bil6_UU(l3WulHDq;g01gvoN`a zB!2gqM_;XxQfpab&zNxiS4>1fgCnEEHI?W6i8FH2>jkvKpOrJ}bY(sFjBA;&=*DOD z8}kIX8Vr*;FRuEsV{u8k3r|VmyPNmE1vwf4GlbKrZgFJ>!j*`bU8&uwGX*h3Y zk?lGoNlbWC+R7@f1v(b24jGIqBz~9e zt?gO;s(hzw;+gD4zU!J!#PAzBI7X1vFsL z(xbkG;Yo^igRYK!3h#!wo(>#>Vs5#NKMdR4+1p~wtA2dEJtxmzUZ6jhVV&!jNiF_Q zex7Ie<7u~_KSAz*G6SFbj*r$)zwe28zxw^WkngX)RJp(V+x)pkrrq|@-@7xOuPc1_ zbMKFj(|+X{9Xx;D_|NZ+ceYO{@}J|GbxB!odd0K*XEpQQe5?3(Zp!oR$L{REz4Ljg z=lT1LH^hto8$Pd#wtMqmp8eWxW`=h`nd?r!(PxZ#`tqEdX8C8iaD4^)Egk!!PW`iK zuP{B>{J?EU96rt^E=cy#Ie-x-@SZm*4V zy8WZN^u6_`yW&|6-#dfzpNB^8zx=Vj+h(@N_wp-yuP?h}{(8slX%&C2ZJuNE@{3|- zNZE(}ZdbIrd4hx_#!w3iB6EZAo+`1w!V%QK7*l+Rn- zVR~Rz`HrRGIOCpWcdQj!v$xL(p66NcJpI$1#N%&12{tTev{|~Zn(Y7|!}LyhtG)9k zYxkKm-r-J|9`eBV)%I|PJrf1?g)`n!FSK~GHl)v-(Pq`5U$%w6 ztETQ(7ntk%H>79xdC#X-3=cYf{af?o;Oa;1{I#9&%FBXxhMfwKa-Z|R-}}cs)&i?% z|AZOdP1{tn@y}Kpwg>rhp2to2@OGl#m1+IP4D$k>>UQfg)Gdgp%EyIooAm>dH-l@BGX=_zpasbj)tc(uG?qt7A@8M?bxOSo6HRUV@>I z_vz}TaxxQty#Dol#}wTaWj~@X@x3mo@_qMqb@lxTn~F7-owHH>`hLl;cjBM^tFHQM zA^rHBaFATTNA>3Dr&onJb8p8!dS}#7ul+7++0vT0rMJFK4w^3)`hBnV_ji+j9L{_^ zFF5t#!5J0%6*3<^I~vJgKf$QLWoxb(|GTnVH+M6}EWFi{>bdxMGMnJ{h`)J1f$?M)8o1s7D_VuH8HlLLEyyj2c^!C~O8sFuN zj^+67ct7FO?@c`B!rb~~HzuH;OG;jB{kHxc}7mHh;f7`h;eYN2; z;h%q(ADf{&FVBAcomvG2y~vkIm(zkz{SCMJUOzF2@6o!uemhN$&2SHTcYo=-{b~p1 z=N_9e{mD*y)hUPn9-FZ}#A4bKn_oNr2Y<(XMas=izn?bmN^GqAdedVy z%ijGAIP^~V-0myI`@2>yzjar>YFFjVQ-9`6*OFor9HeT8D!MDDizgjz8`eJ=2u1D z^CHcTT`AhOc$(j>+QMvxKI>PSesAs8g)G!RU9@y(ZP*k=8#j&Zr!qv1ZtYZ5wOQX$ z)w;NA@|8cH$C)M^`PeYg;ns?WiyNNDtUh_N;fw!od4@W@#k;E+YpfH$%n_abv}x8C zpPtYcr+SJWw0#aqsG8TY(dy2uNzad8U2$}J`xMT9*5^+6_j~;Fo7!$WN!?Dy-}7*I z>Xdb7k9!7d^RLkCU_aXQkKuAIXBM}yQLW{x}34b_0gl~>-(4e+wbyf zm-XAy&07?wFW>UAS|vWOW8W>r9r62{di;((O;wMtxsdcMpy_3))zZcHRxe{b&(`w4m4UH9ZNt1d zTmnDjE$3ERC$D0WyPQ>a>%p2+-8(GnwlnWlTgVr;av4ia#j%y@Bs zFE|o=r|GLx$M%qVxQ!)nGrg6949vG6n+im@hy#J_`~&loetkw=h(RWUwPW)Zkl*$ z`0oyRUZs}yWYbx}$n}-S-fAv)-mxR$U;O$*6}z7se_!$AJ<|uBMN=PMujHCk&R8R# z7+g{I#D1b-kj&Hv^*055jt8~8*vt6O{$0eTEj#vk{o60Dt-I~IYR^CU^M)RK9G|`w zl>GZ$P&ew_>1scAd(EfM_#`9hZZD2~ul_~-ekjuymPMNFYj*8adHO=3f%_^$hTQ5J zkqx`|zH-jwneP4JH^;fVS|4N2_vMx!U7QztV!r#QYZLT~`pi~KoowF_{>ZHJ;hpDM z<^Q$`TdIl%^uJku%xm-4wL>Nzums?MXSL^5so|l^G-d9s^?k3V2btNXd z^Xa}BR(sBSn%_THptvmNXIt_960h8qzt5l6_#DdcU)7;ykJ{7kJ<7A>oVJvHJZ7kI zJ@4+VS3hG;FeKlST$^9aa?iA58Mho?!Dmg;GV4dzOFwP7^LfGLZSM?HuagQB&YnO zb1!#ax?ryIr(eBi-?nE0E2Cvf|1%37*p~D^ro}N(``k8}YjZDK-npy#D9<=7@8I5O zx80HFe@{Cv-1xR#>G@%rgsjA~C3VGTHpPi?U-p0c-+7XIr7rhvL0|jau&+AnCrETCyi|x1u?XUBShwIl zd%?V2|Dw43?+H$;dpCcHli!K2{i`0{7rF4_jpqvny~%7g?*iJgnGgN()y(m{Zc+Mb zAFsYkXm)DtV~L(AWnLDgkN+Eg{b`jMpcX2#$*TDNmYXuhr!G8uyJaq8r1Fl*=T?}9 zXvmy@_}){pQ&xE4CvF$*W&5Wq#N6R4cW-RFx?N_ULg@=_3BSiVy@IU!_B3X2JwL6) zan5S-rQJn4BA+$9$Z?3?c+=SSu1(FAm6xY&+j94^<)O8Aw>+PI<7i#~svVi94}I0T z8*A=l(U5U=<~`oRiN=@Co!&BeU;pzp*$!LcPJDCKSMPWeAjq(hsV9VC$;VY8YmA=l zxi`(pQ1`m6gxskKp_XyQR=nkB4-_)Q3vnOkJ(sV$CT4Gp+H8Y;M@&=xcT8O!T;KIY zx7^iz$83f_Y!@H;dM>UnKk|FWswJ}x?=1VqH7T4SUso}=p?Ld`C2x5=oZCN7NVmNC z_{we@<#YcPN*^rXxcS`Z)#7&x^gew_ukNwlH)lfN@8Tf+w;k`K=Inl^>}wJyuFR6> zVAA_xp0YwW*K;KuYq41-Wlu%wFZbQp6XN#Z_tNHb#$5Gm+RGXBL>+6Gw4eWzFFWP$ z{OOa)BYxq}n$cydf5K%B)^ne;HPGm{s5d@(>A~q-iF3d8lb?z#TGn`?%hJsK%JZ9S zKXe)D_29ni!uL2ImH^+Pqmn(ul2#c z=v1Lpd-1mL^;XPFW>3ifC_ks>>cbf#iobVUzPR_{lmEFz_b+qIuezy|doj*sH{(4Q z6W#CYPIa?y_!V|tTV-C=g$Y|OCkh?TJgSqmnB&h+N#z~BlFMdhKPV5|ou6ve_i*CW zOdX3;pWT+sFRr^LDLFOtI=i$MIkDXJyy{^$`@#Y-L4)W}*Gk33#)Xf+ zCipo23i0}t%bSyNXC@*>|E6({^LDA9>240ntGW<@lS}$rN>%!%QqHT_k;?IDW??$ zx8zrByS**vOm7s!n-Z&^OZ-l#?Rl^16Fv7_cK*Q)_aF4c%y-@Mv#LFK;%2G*@;)=& zIo8JW&T83M^;Ej4D|RPbI`pfpqv7(ZkN-s{`F<_1>az87%(uAzR={+>x7B-<;4iA2 ziM71i;j`~QKT=!mFmGqfoDVm1ue{R?2s_`Q>iFLFAMc~HZ``K@RI&Z*p2TNaId{2@ z?K_UwCwUV0#`j)||0G6n;Ya=mK|>t z$#$1}7sx!}Y!KT!fr-iYTR%8=evaJOG3V^e{`An>J0!KQUwU%T^x^*53VwH{{yWVP z&9gny>i;$y>xX~-Z4#cIZBVl?Qm#yO%gKFWU9zkG)Y~t8U+vIZUo)Y2X8t7O{q^bR zo|Yz`*;8Emtnl0Bz3arcPnRjTH$P^h_FOf7>gPR==N9>Gc~)LD@6Xmp-@VVh-|t)S zx})Xu;TZ*XkM@W^G)g}6caqpF`;&XiRp$KO<6rkX)yHbT{y+KC9iLVG?xiffXju3? z`1pSRr*}R}&owDHf3)6v-u`=q-xto<^x*K^KI>{#-#XdJ{^e51dXs+V1^rCC{B6UN z!$D_$Go-1WpLFj2KIeBoCx3pkzQ@phqVdPO-$VYWJ+GE{Q@XNPY^Uw>J?bATPFqf{ z+kE^t>%1w(r(^A=?J|&*I40|7{XyOH_gTZIA8JFNm!<46UYy?Z)7i)3zsB1GTVMU_ zPP+86bmjHJ%ysvRKXgtxJ8#bAyvG;#D$-B-tH#=Qa=!O|^v%`s_8M=MbD1@AKjwAr zcpbSs_h!fiTMxO2Jnx$*wSa|>RSw|z0XcQlsZ=-jG?&E%7liX9=9VQpY_+h)G z*4N?`{Uw#m7f;>Y6VsW|cwV(*{`}hLKNXfoMZQTdIbS=U?SuZ)&pMl)tM3;{-u2b< z^>)Fz5gk(kKY4pitv5ZqSKsK&y7!4sy)JhPuAP==v3R9$$GtD9KXu!*zuosWh~GKK zWedaS9mciA^n+_xmBSTC}@>z}Zri#m5f8rM9inD7k-(EV&{kQ6zl*U$Z^zw?7E}k^k~)?(h0_ zofceq?3>;B`RP3et(Gj5T3dcS@(y3}55IT$hx6}E?NN`O>S^=t>y6cC8C|%=)_crY z_d_mhpWjr0ph<;wB1{kdl+LR7)*JhN-QgWK`5udWn!CpJSbK29&u2ReADg~>vcKoV zugix{ncA11%=j6VrmDE~d*Xo^bD167j;pz-$Gt7ux4AcW-saPsCr@*_T-N{3d%!+n z$AXUxi?06imYCOk&mpC6|KyWy9(r$nvQOP7lCjs1aSi*LmH$l^RX!9KTwA(9|G>^h zPnWQX*@9;cm#=;QljGtXTSb)~sYTNnuO5{ukT`sqvG&G=V20O>*{|+5Wo*3ApBhqX zZC!7~X4Cbe<=_ru**D&^{&k&n@z7(t^ip48(+XWBt9g5_lrvvoGT4{nmJ+m=W#Y?v z#*6>1^Up9zIden*x|+-Dyn7BC#kUGLwQX7Qcze3*877OUHr594U|wW=0c2njJoX3O zEdg2Nv#D_hWcYE7_PNEZ;L*#OObKikuQgV>A|jYF(1 z?0he>n95ql4bKJm1@`tVIJ`uuMZoFWeufQ7 z2lh?ca1zWlYhz$&EB?=`CaTyXu&Iy*G@&2#6JE7$De>5 z!0wsPeC5V<=IsJ=*$uR(F}~wb0J&=;1H&RyhTNU6l$iRAeu8|owe!4QgII&BOFoMY z*8`ife;~ttZDTND{31B>AAiygZID%puWvA2n6`iOn?Ib2Efac`8Qy%ehbUze0&hpT zd4OpF)U$mI58~=U4rY#Kc;%x7Vm;<)UB^zlvPNF7*#UT1s66N!rwOJ#H6)W0IsjNk=X*B|JIh%zt20k@AyQRXgr88VEl= zZqu;ukLjoC_&aOZTkKE%-E_zwlnPRGGA)u6rf@Rce!4!D^FSr%^;QP4E47h6j22Rl z|2Z}{@8r)4{)42hY|*=cX52fB-^o_ zyYlc%NmV)`WH4R%4>Q>D*%PPrB(byVFjQ)oG@W}fXZf5Ty|F*Q6Ao+4d?h1qU(C-v zqLdKOxO=nTpH)eH;AxHQiBd|R_lq%vmd~2Cvg=N)RN#;F&vqVQH=Aa9s+$#9Z4QiN zNOOO1Jf=0zKbS$li6gSxB$R!ns{^lgIoldjDP=K9aLT*JQ<}=yA+5XpTEU&18|ntT zUNS)3wQTa1Xa9Fx{1he1Aj|nXP{iP3_*qt+`W6AFuuijcu`T8fTa5NAiZ!u)%D*$KS|+9h#*3P@)0XYHEw+ER zk<)yaeQQfR-<2EK%q#cPVQelu&EUrfax3qeO8a+je&?O3O*K##Yj2jA_3XA$*ZQe1 z_Sr4l-uc4g!L1#s44}+1;pzfi<@bjfiX<)T(-hd@0n1qm(9>L_MAmxZhXZd>^yu{h;N7 zVCyIFax4eUfl;S4LeI~V>RBFjfkRbRBpZ(JsmTh7-lrc)-}>im%8%P8K5SqAN3(gE zmUd-^$IX}?&1%;SZ<*hZuI>2|ynX?niSVO@%R6HgF#P zrW`R}`RCl~KbP)*Kj0rp&t|FSA|A>n2M{S*q!S&z8cMb+<&a9yIs)Y?v9qtzlDp{?JuvN9Sj& zUI&^kSp2D6ZCSCN^8vFtr*=gI&5h8}*ixMx!eFw*rlsu3+a{%iJFIK;_;b&ftEr<=XEp7`namdD{&&#bv*H6`%J?I~a8^=JlbER^v{ z-m!V%yp3!Jrz`!;FOOR@^Qec`o!Xh_`R}S(t$mf`yK{5g46dB=-$8uSjc(0Ud1mv< z-S^qv?o9$St_L@kE?)TT#piX78(()%V~}AhxWf6_@n@aF=bxupuPr+e=|7-tZF)}y3;t)p!ki`ypwazU$fD=5#ysCCThFp+_yb}KciLF z*GRQTE-%zn>Uq2BRpj!Ct67hg>&k7qGPOeQDbN2UtAby@U2>9jc~8pIdgW!CdA{a9 zn0POB?LYpN^Dk@7mzK*-K3%D{#pj%d4S!k(hxWEUEAHQ)z8MSqNnhyb4BzV@$Ii)c z`vUKrQ#Yd)PtDwR;KZ(Ar{hzv9_Y=A_I2mF_@v`=LdZX}sf*Sv`n=s~oepC_aPP@2 zzt+iqs5!mSYYnTE*4?frS3?*dZV6*?xc1xB$}m-f-<|nTNZKE#&pRIn`hT9XvM+|& zbk}#;z5c6;=9X{2IO(!o+1#3UT^=XyhPQAq*H96R$9K1@HD|f+dR_k?+3r?zi z`8R=Y&C|e(*Ej9ItHfowz)xr4pUeiEuWNKa$|mH#J)1ZE%0?gSk8!Kt2H!jA$gRzP zH){QvRV5kAwme=tCo?eoP?D8GrmmRC-nso! z+Lw9usm#1`R3%GkwCXC~pTFH&IOz)gbqoP8#*v@+! zlJa)Nth7$$(>q(Lw#3c&>~maoO+4GYu!gX6-!}6oh90w8x1+)=@Y0rNKN&j>Uz^-m zJdZ6SYlTxe8g^YSXuo2t z?Qt#YaD1^_f$QP@50*TyTJTbn;gu@a%EEN3Ww~XS7tIV7_`Pgnyxg6SQAL*og!6);~Y9UEsiE|fKOy_<3aa`MgI`wmw38ax2%} zxLn2wrtA01>B?m;ew=B#tIYj(mDQRK2947}!71r|@0Mq!Ze3`{biizdux4*8?@#fl z7frY0mo{x_c{s5z@3G-}t*eukxZjkG@D_d4cIrW6joxPA&D!tX_j>Kgs=vEu)BR9I zvo~A9W74fxADVFekAykX3oY~KLRSAFb?~`hNK^9+_$N*vH_kkWxk5q0p-Ay|e zpPcQIZ$G-9lPA1VZ}FbDK4q^TXRZ0M{#LyC`ZX_B94eZkR@Oal@VLH0+2?7T_rYxSsfybx7gw@=T+p&>^0TygWeXo} zVQ&4c7|&=h{ZipehS04~)A*k1=WNnX*w}mI;*>*1&sVIS$@MtPw}w45b-TWWX8A-^-~8@1`l%&*9_L8STWzo=`>k%NE>HZC zB%Xk^ea$-U9X<}pQ`Mq=P4>{4KJ#@X9X|6%e+_2|KI9WvXQ5m7WgP$z2)$+Z298uYwbpBZubiP z(zoU{S;*EFZ1`w_5aWe!D;)N*8})Gerdn~{O?s|Ym(TKXu6Mu`#c6$k>wm=S)?a3c zUf#lHnD@RuNO{ipIXzWvD=v!O{}=mu?*7{jzvfgvF#a^_@Uhv(^LsVdOS>}YtgO-3 z`ZI0Ar@KOxmo~2bq>^9p=vH8Pbiz9uJA3E7KlV5zPPxobY3;N<`I4;5#EDNemNDJg z!naVpaHhlbG zt8je!IjOGSB`1HbdwyqkqwLz;>}M0||4ughdz?4#OYP2ETR$6L@t*e6K5vQ@*U_2V z1HMh!sq!T^*;Dy+THl8!qP&V)n>v4N7wvPJv$k!2X78b#CWbS?@6w8&OkK}#Vw1>@ zq}%&C3)bqEcxM-|XQfO|zqL$S`HH#JJC2Rv3-+vETFTNq$?bn$bpGj7|6BcAOg0A3 z*R9lh|4Y3#DJ$srqtDw8++kWEI$^?QzoTnEoh_Ap5`E`l81KiRgM3+=G!qZcKY-OKASzIZPX3dH+;dd_OaBUrm0zNO@x8md(sl*Q{*z zT)v-go5{TSK@*+se~r2FB$8WWO0gwZvH8K8N$N7&0(R_Xs+k}A;Z4gI%^W+mud^-- z_OCj$Zrc8Zyo>bizm@4d&5#(j_=45N4?5P|r~WQ&u$rK5@BY_puVwm`l=$OOpHImD z&im5Ib!(p1ilPNi=1C{S`$m7)(XM?`-YjyH-D~_4D&o4oz25N0tnpFU zPQ5?(rtEs~g>&zNO*uUm!_P`wHaVsvmHh1K=J!_(wKGqC=RM9}d(>9AyxzAidKx!l zc<{W9Ta4f3TPLnsdMA2v$)+>X$*<%RH`RSHdiPqhJe%>IRA;fS!rZLJmnMAwwlV!J z{k-k*OMmtBJC9D4M_K8dsx_YXZky4&*V_BjxmtF|DcH|${2IFZa`C6_>Xk3HS$7Lv z-&0r0^r~j&$6Rrbbe3P6UrcG;CLDJATl+Rk#h15q6!l6^zMl5@d=ckE-n}J%wNCra z{`a@x-`OWGniF~~-5GRdeabv8a%|q^!nO+^eWuLoI=@NeSDKsZ%i}+`>)hXNEVU~2 z_Q?Y$Yyk2c#^_@R&pPbP)&&~by{m9u_moIz? zIy8N`&P}dcrH3w;TM0_9n6cWVsbviqh*Gne5&9vE`{8uMv)ghJ}1=m=3rpzqw z^K{`*?EHJ0;rYA?;i_f7HcT|Qx?|b3`8${n>}$;vIx1FgVrbL*QsK0=V#|a{7k+=b zepzqE#K-%13p{o8G@5GXDMvVQD5e_u-R`+=^8C0;jwDmU0}d|Ga8u7lh7Io*=$~G4 zC_G%qi9<2_2vb1V^1XuRAF6@I<5=D)9WYwi91I#mJJBW#qBtaj&!r2Ieb5WmL8_@2 znJzGcPJr3Uvw(j=_Y2+mEfY#r7@C)1p22wGOoqX)qV>OP$Nd3--6TONBa z*D&k(U%P*;M~ro2Y8i5mzxC_7UF*5r=+IRu#~p8sYZ?9d#8I#bBpn#D_`F1 zxO8d5yu<%pPtH!`EM2?w&TG$z^bo7_r&CWCD7VW;R^I)>5ifi|r=gkQ9P>pf2~I@ z^M+5e=RN+m>Rf?tddumr%L9{kSQYuJKQlj_l<@CYOfS>Z^KomLUf$O__`iQtA9`ZdA00R`eKKwD?NtBkFM4D*j;6Q#iSp%rzplF^TBUR znJZ5?1MENitYiG|^hokme;{x4)Q3ivho?UM)>FcjI=z3>F+u1+ z)APT1pU0=@U3drg%2em%jKljH43RO{QRlv?n#|)Hc)51CSh@m-DFGmU6aq9*tsV3 zhirO?{GkJtY9TXBWVVC5^FA|@gnD{cL>)Ml*=!Vc@cI<%N?qH_eWnW!>ZpMZ77ChM zp^@#a#KqO1x+W%BP-xxGNspa9WWpJC2pzaK>CSGB16vu&p4HTGH`IzSyj(16#?zv5 zz1zs`R_e?LpUa+X=1f}R_3rowpT_KBoBzT*=d(WSjXQOMS>C)(w=Vvf;IX?NcAJ%7 z?=m#7HDmnYGOu=@!@fHcjrSZkx-*yMgHA&{V+H$xqvzg#*37GydVH^+aSz`E!IQ%B z>n8txe)Oz8V}duoE!?*W}*Gv%aiF95rz1VDrK<|Vde!Cd| z-(@MhGIwH4+?UOY)*{Q6)|o$f&vfXzVoTA|%LevRKmP1Cs@g4a@u9~weug;#|KA7h z-#_!wy~xUMN(|Lkzc0U9{5$nZg=E8QMjO?pmpM(dPc!Uee!$SMdd|70wma!n%KhqCwhUHIoSF7F$w-#$! zuIjUH#*U*Wi{;-5?e}N?!P;Q1a`yJ8zp_DM|D_I`WHEm?xg!2y%V%cJbbB>je(SKV zREF~m6@O%|AAcjm@cqJEzhiqpC)e>g)c4L~e(?C%rX82dFD=*q8K(c@-=fF=7X8{c zy)eU9^5y$q`(+-~pSb$P=7`pp3);0}u9tU;am(D8TJ|6yBlh~!W#YkUr>xi?7^%;R zmq`Bhq$GR!amJYb6Zz+>cm0fhdXN9=_vj^aY8TeoKYRIXtDnX8V|R)-|N6V=KuN`k z!vE8RULATrrMmpcpM8fVJ}>-Jr*L?!e~)3lr^Q?2@?&?(XMg&9bH;srqhmFC`|Bkp zyL(<2JGuRQuiRnRBmkjsV+9}mC znkUnz*{xakSwL3u_Jo?*?i*RNz59NPpW3SM?$+m5tD|b3{n{VFzsls5m&YE%=P(aUS4xQ_kVfPyPq?qDt~^M zXZ-2v{N=K*Pbm7E`&YFTNBtBxs=EKMXG3F=*z$QNINozI_^TW_|MaxcqyKF+c6y6{ z+|{hB6EQyfv0=%@c*Y;xg|FlKcf6VWyq@hr>htaVDK2?CH8%95JiT6SeCmz8abGvX z@}&#sPdc_wuXXiWso$Io?uK#fdnahT=hL2C!2fjJ(}+nm^F!v|KEu)aV9u)zr#{qQ z6O@d4Gv|3srS-j?Jln%&Tb{f=>sP(g)WwV5uoSpR-PwKh`*rQ&B0<07HQ&2tRL6fT zc^u+){QENh zPjbHGj3TX^n=gz4j=zW(Fkbj4U*to*qm|9~qSNKN&vq`VWSLr*TKc3iW3`dd+al{l9Z|hLrxZKmG98%PGI}rU!n~^euDFSX&u@4W^HAriPxJyvD{9Ai~+?i)f&D${X%gE zKCEp{-RNnxw13G*dtIjkMai6XcQgw(T=!ohcy4#-8zCOud6PTBHpcg6G+v)BxGzFK z`^%3_lhq<)8Z#7ccXx=ny*l?%OE4_;>D=3j@%>4+U+mMBeYfUS!{bY7<_*VPL~0i= z`SE6ARgLYUyNcB+Z~v>M&)e1X$WYLn|JauH&PRE7$`~hnRcFXy5Bt{Fw`uz^(U0|0 zm=e}4`I9+K;9C`AVvw^*?V`0>sl`i8wtQa^c;RqI*cE5DrpmIAITPK)J?;fnMCnM! z{+OA+@Xl^CM~OR~CuC}iL|=dN)slUC|Mrv5VlJz1z1KWA-}*^W<@$!%?>jjvd|E^| zT$)qg+j4*1w)#~^w)|5)H}|zYXTo%jl>vUMOzMMLZq^Fzf4i^m0+WNs$H0=SCPF&$ zsgW74SPz??5Y*e-Vg5wbv(jqy*@&HeFG?J>52U%X%vE3f`E=;<9jp^Me=cv#yWgAf z>a#+_e>J8@Q%by!3%qsZ->R3RscHLNDQb2h*J0h%_eo1n?p%}EAS^MjY3Bl~J)2qY z>=8L|K9s#mJ}mENHSfL51O>%(+T)Tv8s+V)#(X@c*8mZ@I$n1?t;_@AqbCJ)F?;lU?(C-XaEt#V-9C z>Fy7X-;wG_zISwjtm!Ge%RcY+rD%jK*b>TaCp#lAR&@Dd(WmFnt}32YuXFV zzia1T{vmf_M}6?I_xegk?$LTtt)KR>Ui@P!aMn0m?zmU*PhZg=`+FWHT2&tU*CAAQ z|9ru7lZJfD)W4S|J^mEBX3p&WY8!g?s3?^)X_s&R(ZSBe5TscZw{w;7y`1)~EwB71 zdUr4OXWyZq{OrQ^XOWw?-ZhSYw&ie>GLzG}s~gss_MCDgjAOkvh(+uj!` zdorKzx-I$hZp5blr~MwwC2jK)Vy;>^<9yd&UDe|+r97{HcbTw5c9~u3xpjLvRI^L| z=Sn)>=KJ93UtX^>H?5v69xruD z+|2_MO5#p)xJUOYuydZjs?{<7?Vsqz#h)^H#9M#%{i&9a^AIs|e`meizIAH4))!kH z#&7#<9=_82p8hcZ7k}*Hf^L&*wJPs#UR!y((Bbxds#4LcJQZ9)m}Mo zU4Kb36)t|adgG^xk<2dv8BfYbV{li;rO=4`H zS3HVJkg2&n(HXSgZRTyGzO27KJO5W5D%|;Q>v7KOzLLkEq{)8Xb<*l56!a-)W>Xjpkl0)OC456RF_(eo;7Mz=hTZP&W(&=F6Yk@)uFzR2G{ryIn? zh*_!Ugr}ffZHf=q=@l(b_Wh1NI*Cbu#+)LsP73e5`zPMFyM(eNd6ZfnwnBG(N-Q$m$b>>H&Ma`MZ9&VreuA^t$ z`U!#`G?(mmc`1~d#onf_H1Ei%Qt@fFm&|jVx6H^bKlSCfyO8|ee-BSvlg3UvY!}k?x1Fsh|?0Z!6-TGzCre}@uQ{8?hF3~snZMjLD zU2b~YztlqG*AfrBRr4bMIQJard~BGa@Avs3D?`2b=f79`E|lJ9s8Bd~=6_>H_j=Wi z3DZMqhr3U5MFd8gih!9q45OA7Q5gy6xRAK$RIAtzJgJ;jTR!x;2 zPBlhFmFCAC+y1wfJ(0JV#$ePIvXvXWC`S4U_^4Lu%+I2%7BO4LaDzJ``_%i}3_0mR zpn-$e?hG;vAF3J5)&JDlHhgD%lLQvdZs#_t+aKxn-=1Xy=Yhiveat&Ntp3ktuwi|` ztELKCCR1i{USjgM-+~POUeD!^pJvcwFPP=&$)VV?Mt0LOhIwosL>ct0?(b)NFq`3@ zH0W4b#gxC13^CuBD<+?G<4|nL(P7*W^@gE9V&c|?{0~GnuPgfIQB{9ri9*YSjVb00 zx(xTuecmvSDS{~>Xx;l&)%9}<-!pUm%VqrFdTevJ_4ydi2eJ(P3Q_$9p$RhiL3#F* zlzZ*`IG+ENJD=y@`Cgave9F_q&adwMHhwpkzvFowL%GtetBEQy@~58P_pr*-n~_$z zZb`|n-s79+dr95V|9CohXCCW^=)&j4h2Qx<{ZD47>L@#%@^M(r0V*I)83 zJRRQF2DosXY8F+Ki7?QGRKp5Nb|c)5>p zL-5auSLN=$*m3{dj{5C)%x4$gpUe4he(9_CHVyWx-oIlg$n@E_fBnAQzIQe~{aU;8 zIlrG|$K&GV@6Is)IHMVCA5v*5AN-EbGVzbIkHq|vKej6W&ZJ-IbPu}KVo^75BESDK zo9Y{jbz&!fc;jz8uUf~wxHSr$?*ST zX3o9Ie18K!GEBM|e`0U_vUh(uF8VdHFS)R*hVj9gJKMz%><`$#m-9g$!+9^q4ZU|Z zcbt>jP$Kx&<-=1mhX36)_m&>%E|>C5z4`9Q*ZQ#DETQX6KkTpmPgiBG*JXY1ct(2P z>F?2V-QLAA?4R&uYvyj9pWo6M{>`1t-|y90sjgf%d#Pa+$ANm$dO79~bDn&cJGuHl z^MU`WvNw)P=FOXy{y%-W&fE!yekGpy`d-HI*SaGQ4J*$*?fJ2hTl@UV3h@KNL3!Di zKK_5t@K0VdU%%qXPcw%9@(usR52Oa&ix+-9d9Ct)&IA9o=H63gusc!knUC{z{gm{Y zb^lo&=&RPgE4pJWWM9p9{J+ZgfBivf^Cld7yF_Slz20@Ro!9UEZH!$zj)U`&rC(an}-e75zuA?rCbym-oK++UV<) zEx!AwrJwhzn>S&b+jjT$9ye!CwRl~$o%8v;`Xa6a=T&OLLTbb=&%3qj=MtJSkD$4)J`@#%iA-=C&yetp=mykNzvoo1|L`Tb+wj@+S39MX-`z~@`MGu1^I*=|{lBMMJlv)6^j@^>sb+tx z*hhcvmDTN6JG^)Au^INK_Re3jD!4|J{;#fs0Tt<;`2Tlh}ZapgJhN{?`U ze>bCAulSv%K=Jv!^V>3mrY^PR{J7gJ{WdSCWh4{MX7|6L>f3eJKej;%eEgdKx2tWr zx<9z?@4?LMb2}fEG0y1-{Nt(oINE5Q@8cDmZr!impwpilo>%*}f+p3rj*q`K3^K<-f+m>#dBm8+9 zzdXy4?`x7vt%MhRxIAN8;AH=Kxf2D?>2aP957uG(ep2I#?&-oefiFMWuDN4bd`&X; z)t`CadLA!+6_@R|SLxxs?$C&ReEUu1W~Xp{aFz^}IehBy{%xmLJbs=ux9W^!uIfgG z#0zTIv*&8g*nOnyqv%fimdA{x`Ia00%_)87eT%o$Xz{vbkzRhOHs!}Szjumk-_m-f zz2D~5Cja<{x6N)^ePUku->fdZsO9c*TU*H=f86D2lP2v?FSdJKH1Ww(bD>*v9y9!N z{JAlHnZe#`3@U|c2Xp?+2#yrIkn!8ZqTH*cE=bZmJWvBR@ou5_mrg^2EU80}1<9Aoc z5go=2(VcA*tUft46#QwN+~!$)=DPO5=fU&MPMge`+q6UGz;uQ?>)!2@KCnOh>l-OU z?_V;4|9X6KU+%mt8+2Vx=wKytL%4f{`KO%RdqIvCerp$5FZW(moz8S?arsgkmDays zW-NI=GxSsW>?>0rOFFsoKgsjao?RKowk7h}(RI^y&eO^`9dqnEm&(0VqwgutZ`&0K zsZN>e#c980Uw`z3qNQgd@4gn9rYj+T>zs$qYU7HFfe(%|xqn@K(p_$9`Q*uJ{?$8v zD>M8*wYX;=*Mr{-ay&fWcQfpJ`t#1Fk|WcYEy^9=*12$Z-Z7eUtUNV^@8yHvlGmom zpL`zMA=dr#gRJSHJAD~%Pn{LICLem^oJj7H>B&0Uk3B-aZa8C{uut*&O~Ivy)l|=w z_ZaA#t^B9*h2!t8D^qpm6|=4D-NbT0%!S*h&*OQSGb?8a>!Q{wfA8mW#c!Xq*O0V- z+tak|nFxcr%=UGMc6QIqJ6aGpL3>`;jQX-A9h(C53azB%<9KpDgeC8OwzB17>(i|* z&%Y&Qw6XjVll*BGcDh4MX0Au3z@$6>BM-dz9_Rk%&chw~_g`M*l{mU3bmw;!erdv8yJK^o%=W9@Rp~OVQEBnT!l$+_Vp~n(j-Q(PWxu=0+b!zt_4^MN zi2gk;@y;P5{Ek{=y}gS`Y+Ct~KNmLpUwXP_qJq*L-NxUi1Q?B3-glVH$+vPkaO~+X2lMh3$Nu>8glpv=I#v1fw16+SO~(n9>SLQX zo_{2$lE419MSJz`A`_+esy6n1i$$)_&F$OzNUr}2!zX{wmQ7oqv@Lrb^5=Ev+#PZg ze|`{WY^pEs5moIK&Pv&1ynwle@uEoQvv-0~6F>bhe%sSj-<0ut&D~Akw0Evb5mDc` zZrKTow;iWBfBsfe(!Or!a+~LNW8Pimywas_a;NfbRiFE1n$YE+Ym_gkKY3sL$e;OQ z-qz_%x0=}+?kDbW{n9Uyck)lEkMxXahB;HZ{s<{ezEeI$>wZYm;jeRoyk;M{G-3PX zjn&uW%dFOmC+V;(lzp~o)t_mvue{&x)plPtxS-4ATfUOf)!VNFU7p=&of5dVUsG#q z!;zkp)lzq-zr2@vN#TyZ=%J{LJb%ff^CUl>;1%r^t8bgiy{%58^kLXfX`^5Ei>202 z*i{i_D}SkS2lv^!uB5QdtE?}57tr;)qP)&F=-Vx$jEXIf3i_35%@V)fcrxW}rpx7| z_^{kJVn617UHJNX@S|(r8UM&OtY5jQPV-!>PE1&J!gl^T_fzNYueK^;knH{@(jGdq z_N?HG^xC6q`x$O@XE>gB?Kt;;|8^zell%;SblaX~RI@o`9Lk?~s$6Z^r_aajXTfxd|7mdGjBi7YiQdaRjw${+Td1~6{SRFp#Li>K%efYHXZ*cb*->`#<-UiXcoJn*80yq} zPh3ytD!%#Zvqi(SAQy4PS&um%S_R&#owIwx+srj{+IepZ?KmyDa$cDZPi|($!;U4n zs+u)qIclHS99gE`6nauDHzb!H)7N@*Z<%OxrJC!O^?b z=#!pO#NFysbE2$YUwOTk_4I+$uRfm>T(4ryZTHgEN}i+<*VsMJ4&}}ou96>i7ig@vSZHF zUFFlY;`yt#>F=MyR_@et`n%y4mOQ7Ds{3YZe9wuzxUzj(i1;Ut&P{CE(Ozrr&lWzl zE7dan*OS84K8Z`0&!4nSG~a#8*MAe*<*ORM7iSh)-d{ZVSCqryjXM*Z9C{bbFLsl& zTil>6cy{p|w@)$ew+OSv7j9Hn+kCGtF#P+Jkd<94>gON(tu4bBJAqkIM>BDR_U_1e!8yyC))N=z|@Lc zPXzCsWxd^^EBW!V(%+d)iFe;$nZLw@N7Oy?yjjqnt1-G?Q@!0Pt*03YoDgAnx8k{S zzu(28K!-&c^<_syF6AdwJUFQ4qP|7euP|S|P5sK=Nl95%(%RcYx7xZ@@$&GS-khtX z;ddlLuFOJB>ps^8^T+>H>>qtn?UXi{BXqMT5He zmAPxS8qc1S{=M?o{`1KnHl20Oc%z}<7E`>#n!~2&q18IOOWRlOdfT%5-|L1~7X8P0 zp6C^QD)2sM5hD{Uck9%v4~tpKr>XW;3$E?GJug7)U3lW(vb4S7&zbIL^i&>^_^kf? z&7<>As%!Z^e?2xseQxorUYp<9mhWqV5BqD3dzTND z=biNx`S>kUSI(WFzTf=Vo%x^MwP`8E{+bHlG! z&neD-{Xg07=8u?De?m|7TMJ)$F6+5_weX)Cs-;h+8=n6c_o*Q6)E)0v|M`7w%%A%# zpM8XXd+(o+M^)aZB>(WQ_#U|9%<9*&ll$*`-0fT~zun_sjhyhi%ICi<7S_)0&zu}H z?@UGe;bhLrPkWxcch>6hUpA-m{wRoSxACbfrKjfhtIoX@>ejlAq7(U#W7xa+GsT%z;h* zB4>g-t}!tjzW!;~_jiJ+MQj(jT+9Dun}_XVd>JdbGJeUFH;;|pE|_|K?xKHNCjGKD zOthb$Bx%9>Ab!>V_wK*G*_+>yU*4nPe{yeG*CRC-?Rxu3A8h6?f}AIoi)oeNyk+V`Qg#>a*RCy`KCX-<+2Brrl@xF#qXi zamlcWtVi}UKT=I!r`?x-;Qx``J0@Pc@U(s{Mb>6HmSJzo={fe&=rsQ;(~zoiDcfvSe!F4(^xMk-vi8#nyGd`T1+IQ2V|g z)wdS={^Fd}zq#J^(FfxSy=_;R8U%8u-BJ^MtgLqY#%9rruiee959y}-kJ=OMn=rO6ZOqd#@HLZbF z&2{As+mG@Fn&8b50-L-Fco`JIdlx{LAAz@gkhCd@jA1*_vEAU?i9ySAUQgxrDoQtQ z=)UrQJ)_0xC#o$1PRF7d-mrfNIJUQ*`9aU;yLAlZOgo%h8lLJjJZHGW{GfGC;%*5C z=>v=myBXg2?EKEt@W1gUXe_RUv%#3*-UPq${l({*8p7wEtKVGm$Nc2;mu=|NTL`%H%O9ydT65g(nbJSOpd_k3mxwfXZI zKYTYlf0k)SlwG~-fyL+EPiOog+MxUCzexk~)8RzIgR#^}lJeOk)1TzVhx1G_Y3 z#TEe}w>wG)%CA0uI^+KO;JN>s4d>b)k@~>YnypL-38^^1${ZsDBoiJu;|ae$u~h` zmQ(Z@wyijyzq(JnBkaEXr1R0XckCxSo6K?9^65WE!)(E~8au-DK+Cg2R2aTA+UYCY zI-I}LkFz1RDF2qtpJzPX4$}lKEa$%0oRRqOZwDVcXiKF>CzC?&^*QJMCb?99oqS`l z-Tb0?{*Q$i&L?H`{t#=JuUW1WJ)^Znz{$fRvYX+q;2-I88vi1WeV)GRy#ImsCI`AV zd=gk#A2hc<><1{lP6}qoIV+J^el^`z^}#0A!_Kwm7=BE2ulRQAME&eP_r)0(+&q?} z+#=v~N|Yg5VCGj{_JVgw`!iiue`?IgzCZb#$Nj!D@(x>O$usQhoT|=qtdQZr=ZhLOs$^RfO0x$=Ml(Q`sZFy(L?erYFHQ7VJ(7)Grq_C|9^%^VF@?B TcLGTa3=9mOu6{1-oD!M Date: Fri, 13 Jul 2012 21:09:30 +0200 Subject: [PATCH 08/42] Little annoyances that ease debugging with MSVC --- BBGE/FmodOpenALBridge.cpp | 3 +++ win/vc90/Aquaria.vcproj | 2 +- win/vc90/BBGE.vcproj | 2 +- win/vc90/external.vcproj | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/BBGE/FmodOpenALBridge.cpp b/BBGE/FmodOpenALBridge.cpp index 1ab51b4..6db0855 100644 --- a/BBGE/FmodOpenALBridge.cpp +++ b/BBGE/FmodOpenALBridge.cpp @@ -568,6 +568,9 @@ namespace FMOD { #define SANITY_CHECK_OPENAL_CALL() #endif +// HACK: works fairly well without it. Annoying to be thrown into the debugger because all channels are full. +#undef SANITY_CHECK_OPENAL_CALL +#define SANITY_CHECK_OPENAL_CALL() // simply nasty. #define ALBRIDGE(cls,method,params,args) \ diff --git a/win/vc90/Aquaria.vcproj b/win/vc90/Aquaria.vcproj index ccd1d17..94efbb1 100644 --- a/win/vc90/Aquaria.vcproj +++ b/win/vc90/Aquaria.vcproj @@ -44,7 +44,7 @@ AdditionalIncludeDirectories=""$(SolutionDir)\..\ExternalLibs\freetype2\include\freetype\config";"$(SolutionDir)\..\ExternalLibs\gl";"$(SolutionDir)\..\ExternalLibs\glpng\zlib";"$(SolutionDir)\..\ExternalLibs\glpng\png";"$(SolutionDir)\..\ExternalLibs\libogg-1.3.0\include";"$(SolutionDir)\..\ExternalLibs\libvorbis-1.3.2\include";"$(SolutionDir)\..\ExternalLibs\freetype2\include";"$(SolutionDir)\..\ExternalLibs\FTGL\include";"$(SolutionDir)\..\ExternalLibs\SDL12\include";"$(SolutionDir)\..\ExternalLibs\AL\include";"$(SolutionDir)\..\BBGE";"$(SolutionDir)\..\ExternalLibs\lua-5.1.4\src";"$(SolutionDir)\..\ExternalLibs\lvpa\include";"$(SolutionDir)\..\ExternalLibs\lvpa";"$(SolutionDir)\..\ExternalLibs\ttvfs";"$(SolutionDir)\..\ExternalLibs"" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;GL_GLEXT_LEGACY=1;TIXML_USE_STL=1;HAVE_PUTENV=1;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;BBGE_BUILD_WINDOWS=1" MinimalRebuild="true" - BasicRuntimeChecks="3" + BasicRuntimeChecks="0" RuntimeLibrary="1" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff --git a/win/vc90/BBGE.vcproj b/win/vc90/BBGE.vcproj index f7e90a1..57b7aaa 100644 --- a/win/vc90/BBGE.vcproj +++ b/win/vc90/BBGE.vcproj @@ -45,7 +45,7 @@ AdditionalIncludeDirectories=""$(SolutionDir)\..\ExternalLibs\freetype2\include\freetype\config";"$(SolutionDir)\..\ExternalLibs\gl";"$(SolutionDir)\..\ExternalLibs\glpng\zlib";"$(SolutionDir)\..\ExternalLibs\glpng\png";"$(SolutionDir)\..\ExternalLibs\libogg-1.3.0\include";"$(SolutionDir)\..\ExternalLibs\libvorbis-1.3.2\include";"$(SolutionDir)\..\ExternalLibs\freetype2\include";"$(SolutionDir)\..\ExternalLibs\FTGL\include";"$(SolutionDir)\..\ExternalLibs\SDL12\include";"$(SolutionDir)\..\ExternalLibs\AL\include";"$(SolutionDir)\..\ExternalLibs\ttvfs";"$(SolutionDir)\..\ExternalLibs\lvpa";"$(SolutionDir)\..\ExternalLibs\lvpa\include";"$(SolutionDir)\..\ExternalLibs"" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;GL_GLEXT_LEGACY=1;TIXML_USE_STL=1;HAVE_PUTENV=1;FTGL_LIBRARY_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;BBGE_BUILD_WINDOWS=1" MinimalRebuild="true" - BasicRuntimeChecks="3" + BasicRuntimeChecks="0" RuntimeLibrary="1" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff --git a/win/vc90/external.vcproj b/win/vc90/external.vcproj index f44df45..2f78936 100644 --- a/win/vc90/external.vcproj +++ b/win/vc90/external.vcproj @@ -44,7 +44,7 @@ AdditionalIncludeDirectories=""$(SolutionDir)\..\ExternalLibs\freetype2\include\freetype\config";"$(SolutionDir)\..\ExternalLibs\gl";"$(SolutionDir)\..\ExternalLibs\glpng\zlib";"$(SolutionDir)\..\ExternalLibs\glpng\png";"$(SolutionDir)\..\ExternalLibs\libogg-1.3.0\include";"$(SolutionDir)\..\ExternalLibs\libvorbis-1.3.2\include";"$(SolutionDir)\..\ExternalLibs\freetype2\include";"$(SolutionDir)\..\ExternalLibs\FTGL\include";"$(SolutionDir)\..\ExternalLibs\SDL12\include";"$(SolutionDir)\..\ExternalLibs\ttvfs";"$(SolutionDir)\..\ExternalLibs\"" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;HAVE_FCNTL_H;FT_CONFIG_OPTION_SYSTEM_ZLIB;FTGL_LIBRARY_STATIC;FT2_BUILD_LIBRARY;GL_GLEXT_LEGACY=1;TIXML_USE_STL=1;HAVE_PUTENV=1;BBGE_BUILD_VFS=1" MinimalRebuild="true" - BasicRuntimeChecks="3" + BasicRuntimeChecks="0" RuntimeLibrary="1" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" From b0f18e90307156bf0b56d7c2934f5d05e352bc87 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 13:03:15 +0200 Subject: [PATCH 09/42] Another few-pixel fix for the rusian font --- files/locales/ru/gfx/font.png | Bin 42389 -> 42361 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/files/locales/ru/gfx/font.png b/files/locales/ru/gfx/font.png index 57ff4d3a7cae00403ceda04a0d964748e0dd575b..9adae9f43d8cfe6796716320a54fac925cee2cdc 100644 GIT binary patch delta 33093 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

-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 delta 33318 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 From e8872b09e5976012d9ca0043734a118f5501213a Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 14:34:46 +0200 Subject: [PATCH 10/42] Localise sounds, voice, and send current locale to webserver when asking for mod list --- Aquaria/Network.cpp | 4 ++++ BBGE/Localization.cpp | 7 ++++++- BBGE/Localization.h | 3 ++- BBGE/SoundManager.cpp | 24 +++++++++++++++++------- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Aquaria/Network.cpp b/Aquaria/Network.cpp index cc9f71d..6dba942 100644 --- a/Aquaria/Network.cpp +++ b/Aquaria/Network.cpp @@ -147,6 +147,10 @@ static void init() os << AQUARIA_CUSTOM_BUILD_ID; #endif + const char *loc = getUsedLocale(); + if(*loc) + os << "; Locale=" << loc; + userAgent = os.str(); if(!worker) diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index 2affc66..0833905 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -32,7 +32,12 @@ void setUsedLocale(const std::string& s) s_locale = s; } -std::string localisePath(const std::string &path, const std::string &modpath /* = "" */) +const char *getUsedLocale() +{ + return s_locale.c_str(); +} + +std::string localisePath(const std::string &path, const std::string& modpath /* = "" */) { if (s_locale.empty()) return path; diff --git a/BBGE/Localization.h b/BBGE/Localization.h index 0b67301..81adbc1 100644 --- a/BBGE/Localization.h +++ b/BBGE/Localization.h @@ -4,7 +4,8 @@ #include "Base.h" void setUsedLocale(const std::string& s); -std::string localisePath(const std::string &path, const std::string &modpath = ""); +const char *getUsedLocale(); +std::string localisePath(const std::string &path, const std::string& modpath = ""); std::string getSystemLocale(); #endif diff --git a/BBGE/SoundManager.cpp b/BBGE/SoundManager.cpp index e35c419..43c34d1 100644 --- a/BBGE/SoundManager.cpp +++ b/BBGE/SoundManager.cpp @@ -926,13 +926,17 @@ bool SoundManager::playVoice(const std::string &name, SoundVoiceType svt, float if (!voicePath2.empty()) { - fn = core->adjustFilenameCase(voicePath2 + name + fileType); + fn = voicePath2 + name + fileType; + fn = localisePath(fn); + fn = core->adjustFilenameCase(fn); if (exists(fn)) checkOther = false; } if (checkOther) { - fn = core->adjustFilenameCase(voicePath + name + fileType); + fn = voicePath + name + fileType; + fn = localisePath(fn); + fn = core->adjustFilenameCase(fn); if (!exists(fn)) { debugLog("Could not find voice file [" + fn + "]"); @@ -1519,20 +1523,26 @@ Buffer SoundManager::loadSoundIntoBank(const std::string &filename, const std::s debugLog(filename); if (slt == SFXLOAD_LOCAL && !audioPath2.empty()) { - f = core->adjustFilenameCase(audioPath2 + filename + format); + f = audioPath2 + filename + format; + f = localisePath(f); + f = core->adjustFilenameCase(f); if (!exists(f)) { - f = core->adjustFilenameCase(path + filename + format); + f = path + filename + format; + f = localisePath(f); + f = core->adjustFilenameCase(f); } } else { - f = core->adjustFilenameCase(path + filename + format); + f = path + filename + format; + f = localisePath(f); + f = core->adjustFilenameCase(f); } bool loop = false; - if (f.find("loop")!=std::string::npos) + if (filename.find("loop")!=std::string::npos) { loop = true; } @@ -1545,7 +1555,7 @@ Buffer SoundManager::loadSoundIntoBank(const std::string &filename, const std::s } else { - debugLog("returning 0"); + debugLog("returning 0"); return Buffer(); } From 636c0694035e2004a3b91afcb127a675480b6e61 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 15:00:37 +0200 Subject: [PATCH 11/42] _mods/x/locales/y/* now works --- Aquaria/Mod.cpp | 7 +++---- BBGE/Localization.cpp | 21 +++++++++++++++++++++ BBGE/Localization.h | 2 ++ BBGE/SoundManager.cpp | 4 ++-- BBGE/Texture.cpp | 2 +- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Aquaria/Mod.cpp b/Aquaria/Mod.cpp index c715bb3..85a0a91 100644 --- a/Aquaria/Mod.cpp +++ b/Aquaria/Mod.cpp @@ -98,6 +98,8 @@ void Mod::load(const std::string &p) name = p; path = baseModPath + p + "/"; + setLocalisationModPath(path); + setActive(true); TiXmlDocument d; @@ -138,11 +140,7 @@ void Mod::load(const std::string &p) } } -#if defined(BBGE_BUILD_UNIX) dsq->secondaryTexturePath = path + "graphics/"; -#else - dsq->secondaryTexturePath = "./" + path + "graphics/"; -#endif dsq->sound->audioPath2 = path + "audio/"; dsq->sound->setVoicePath2(path + "audio/"); @@ -250,6 +248,7 @@ void Mod::setActive(bool a) { if (!active) { + setLocalisationModPath(""); name = path = ""; dsq->secondaryTexturePath = ""; dsq->sound->audioPath2 = ""; diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index 0833905..e696e6e 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -26,6 +26,7 @@ static std::string _CFToStdString(CFStringRef cs) #endif static std::string s_locale; +static std::string s_modpath; void setUsedLocale(const std::string& s) { @@ -37,6 +38,26 @@ const char *getUsedLocale() return s_locale.c_str(); } +void setLocalisationModPath(const std::string& s) +{ + s_modpath = s; + stringToLower(s_modpath); +} + +// hackish +// intended to be used only for paths which are known to start with the mod path, +// but can deal with it if this is not the case +std::string localisePathInternalModpath(const std::string &path) +{ + std::string tmp = path; + stringToLower(tmp); + + if(!strncmp(tmp.c_str(), s_modpath.c_str(), s_modpath.length())) + return localisePath(path, s_modpath); + + return localisePath(path); +} + std::string localisePath(const std::string &path, const std::string& modpath /* = "" */) { if (s_locale.empty()) diff --git a/BBGE/Localization.h b/BBGE/Localization.h index 81adbc1..49df21f 100644 --- a/BBGE/Localization.h +++ b/BBGE/Localization.h @@ -5,7 +5,9 @@ void setUsedLocale(const std::string& s); const char *getUsedLocale(); +void setLocalisationModPath(const std::string& s); std::string localisePath(const std::string &path, const std::string& modpath = ""); +std::string localisePathInternalModpath(const std::string &path); std::string getSystemLocale(); #endif diff --git a/BBGE/SoundManager.cpp b/BBGE/SoundManager.cpp index 43c34d1..d9f5454 100644 --- a/BBGE/SoundManager.cpp +++ b/BBGE/SoundManager.cpp @@ -927,7 +927,7 @@ bool SoundManager::playVoice(const std::string &name, SoundVoiceType svt, float if (!voicePath2.empty()) { fn = voicePath2 + name + fileType; - fn = localisePath(fn); + fn = localisePathInternalModpath(fn); fn = core->adjustFilenameCase(fn); if (exists(fn)) checkOther = false; } @@ -1524,7 +1524,7 @@ Buffer SoundManager::loadSoundIntoBank(const std::string &filename, const std::s if (slt == SFXLOAD_LOCAL && !audioPath2.empty()) { f = audioPath2 + filename + format; - f = localisePath(f); + f = localisePathInternalModpath(f); f = core->adjustFilenameCase(f); if (!exists(f)) { diff --git a/BBGE/Texture.cpp b/BBGE/Texture.cpp index df609ec..a15e69c 100644 --- a/BBGE/Texture.cpp +++ b/BBGE/Texture.cpp @@ -318,7 +318,7 @@ void Texture::load(std::string file) if (found) { - file = localisePath(file); + file = localisePathInternalModpath(file); file = core->adjustFilenameCase(file); /* From de6927322999931686774cf6f1a06108a00fa24b Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 15:57:21 +0200 Subject: [PATCH 12/42] Localise scripts + silene debug spam in options menu --- Aquaria/DSQ.h | 6 +++--- Aquaria/Mod.cpp | 6 +++--- Aquaria/ScriptInterface.cpp | 7 ++++--- Aquaria/UserSettings.cpp | 24 ++++++++++++------------ 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index 1787b83..cd56d0e 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -258,15 +258,15 @@ public: void recache(); - std::string getBaseModPath(); + const std::string& getBaseModPath() const; bool isActive(); bool isDebugMenu(); bool hasWorldMap(); bool isEditorBlocked(); - std::string getPath(); - std::string getName(); + const std::string& getPath() const; + const std::string& getName() const; void shutdown(); bool isShuttingDown(); diff --git a/Aquaria/Mod.cpp b/Aquaria/Mod.cpp index 85a0a91..0f8b78c 100644 --- a/Aquaria/Mod.cpp +++ b/Aquaria/Mod.cpp @@ -82,7 +82,7 @@ bool Mod::loadModXML(TiXmlDocument *d, std::string modName) return d->LoadFile(baseModPath + modName + ".xml"); } -std::string Mod::getBaseModPath() +const std::string& Mod::getBaseModPath() const { refreshBaseModPath(); @@ -154,12 +154,12 @@ void Mod::load(const std::string &p) particleManager->loadParticleBank(dsq->particleBank1, dsq->particleBank2); } -std::string Mod::getPath() +const std::string& Mod::getPath() const { return path; } -std::string Mod::getName() +const std::string& Mod::getName() const { return name; } diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index 974ffe5..488b558 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -700,16 +700,17 @@ static bool findFile_helper(const char *rawname, std::string &fname) return false; if (dsq->mod.isActive()) { - fname += dsq->mod.getPath(); + fname = dsq->mod.getPath(); if(fname[fname.length() - 1] != '/') fname += '/'; fname += rawname; + fname = localisePath(fname, dsq->mod.getPath()); fname = core->adjustFilenameCase(fname); if (exists(fname)) return true; } - - fname = core->adjustFilenameCase(rawname); + fname = localisePath(rawname); + fname = core->adjustFilenameCase(fname); return exists(fname); } diff --git a/Aquaria/UserSettings.cpp b/Aquaria/UserSettings.cpp index f90af3c..b3d126b 100644 --- a/Aquaria/UserSettings.cpp +++ b/Aquaria/UserSettings.cpp @@ -535,6 +535,18 @@ void UserSettings::load(bool doApply, const std::string &overrideFile) //clearInputCodeMap(); + if (system.locale.empty()) + { + std::string loc = getSystemLocale(); + debugLog("Using autodetected system locale: " + loc); + setUsedLocale(loc); + } + else + { + debugLog("Using user config locale: " + system.locale); + setUsedLocale(system.locale); + } + if (doApply) apply(); } @@ -574,18 +586,6 @@ void UserSettings::apply() core->settings.prebufferSounds = audio.prebuffer; - if (system.locale.empty()) - { - std::string loc = getSystemLocale(); - debugLog("Using autodetected system locale: " + loc); - setUsedLocale(loc); - } - else - { - debugLog("Using user config locale: " + system.locale); - setUsedLocale(system.locale); - } - #endif } From 927928167bd1a8a0ae59db198f6156a492e946a9 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 16:54:28 +0200 Subject: [PATCH 13/42] Move key config strings into stringbank.txt --- Aquaria/DSQ.h | 2 +- Aquaria/Game.cpp | 61 ++++++++++++++++++++------------------- Aquaria/StringBank.cpp | 2 +- BBGE/Strings.cpp | 2 ++ files/data/stringbank.txt | 31 +++++++++++++++++++- 5 files changed, 65 insertions(+), 33 deletions(-) diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index cd56d0e..1acd434 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -200,7 +200,7 @@ public: StringBank(); void load(); - std::string get(int idx); + const std::string& get(int idx); protected: void _load(const std::string &file); diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index 03a732c..c81b554 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -3577,48 +3577,49 @@ void Game::createInGameMenu() group_keyConfig->addChild(kcb, PM_POINTER); int offy = -20; + +#define SB(x) dsq->continuity.stringBank.get(x) TTFText *header_action = new TTFText(&dsq->fontArialSmall); - header_action->setText("Action"); + header_action->setText(SB(2101)); header_action->position = Vector(140, 80+offy); group_keyConfig->addChild(header_action, PM_POINTER); TTFText *header_key1 = new TTFText(&dsq->fontArialSmall); - header_key1->setText("Key 1"); + header_key1->setText(SB(2102)); header_key1->position = Vector(350, 80+offy); header_key1->setAlign(ALIGN_CENTER); group_keyConfig->addChild(header_key1, PM_POINTER); TTFText *header_key2 = new TTFText(&dsq->fontArialSmall); - header_key2->setText("Key 2"); + header_key2->setText(SB(2103)); header_key2->position = Vector(475, 80+offy); header_key2->setAlign(ALIGN_CENTER); group_keyConfig->addChild(header_key2, PM_POINTER); TTFText *header_joy = new TTFText(&dsq->fontArialSmall); - header_joy->setText("Joystick"); + header_joy->setText(SB(2104)); header_joy->position = Vector(600, 80+offy); header_joy->setAlign(ALIGN_CENTER); group_keyConfig->addChild(header_joy, PM_POINTER); + addKeyConfigLine(group_keyConfig, SB(2105), "lmb", 100+offy, 0, 0, 0); + addKeyConfigLine(group_keyConfig, SB(2106), "rmb", 120+offy, 0, 0, 0); + addKeyConfigLine(group_keyConfig, SB(2107), "PrimaryAction", 140+offy); + addKeyConfigLine(group_keyConfig, SB(2108), "SecondaryAction", 160+offy); + addKeyConfigLine(group_keyConfig, SB(2109), "SwimUp", 180+offy); + addKeyConfigLine(group_keyConfig, SB(2110), "SwimDown", 200+offy); + addKeyConfigLine(group_keyConfig, SB(2111), "SwimLeft", 220+offy); + addKeyConfigLine(group_keyConfig, SB(2112), "SwimRight", 240+offy); + addKeyConfigLine(group_keyConfig, SB(2113), "Roll", 260+offy); + addKeyConfigLine(group_keyConfig, SB(2114), "Revert", 280+offy); + addKeyConfigLine(group_keyConfig, SB(2115), "WorldMap", 300+offy); + addKeyConfigLine(group_keyConfig, SB(2116), "Escape", 320+offy, 1, 0, 0); - addKeyConfigLine(group_keyConfig, "Left Mouse Equiv.", "lmb", 100+offy, 0, 0, 0); - addKeyConfigLine(group_keyConfig, "Right Mouse Equiv.", "rmb", 120+offy, 0, 0, 0); - addKeyConfigLine(group_keyConfig, "Action 1: Swim", "PrimaryAction", 140+offy); - addKeyConfigLine(group_keyConfig, "Action 2: Sing/Ability", "SecondaryAction", 160+offy); - addKeyConfigLine(group_keyConfig, "Swim Up", "SwimUp", 180+offy); - addKeyConfigLine(group_keyConfig, "Swim Down", "SwimDown", 200+offy); - addKeyConfigLine(group_keyConfig, "Swim Left", "SwimLeft", 220+offy); - addKeyConfigLine(group_keyConfig, "Swim Right", "SwimRight", 240+offy); - addKeyConfigLine(group_keyConfig, "Roll", "Roll", 260+offy); - addKeyConfigLine(group_keyConfig, "Revert", "Revert", 280+offy); - addKeyConfigLine(group_keyConfig, "WorldMap/Recipes", "WorldMap", 300+offy); - addKeyConfigLine(group_keyConfig, "Menu/Escape", "Escape", 320+offy, 1, 0, 0); - - AquariaKeyConfig* s1x = addAxesConfigLine(group_keyConfig, "Stick 1 X", "s1ax", 340+offy, 0); - AquariaKeyConfig* s1y = addAxesConfigLine(group_keyConfig, "Stick 1 Y", "s1ay", 340+offy, 130); - AquariaKeyConfig* s2x = addAxesConfigLine(group_keyConfig, "Stick 2 X", "s2ax", 340+offy, 260); - AquariaKeyConfig* s2y = addAxesConfigLine(group_keyConfig, "Stick 2 Y", "s2ay", 340+offy, 380); + AquariaKeyConfig* s1x = addAxesConfigLine(group_keyConfig, SB(2117), "s1ax", 340+offy, 0); + AquariaKeyConfig* s1y = addAxesConfigLine(group_keyConfig, SB(2118), "s1ay", 340+offy, 130); + AquariaKeyConfig* s2x = addAxesConfigLine(group_keyConfig, SB(2119), "s2ax", 340+offy, 260); + AquariaKeyConfig* s2y = addAxesConfigLine(group_keyConfig, SB(2120), "s2ay", 340+offy, 380); s1x->setDirMove(DIR_LEFT, s1x); s1x->setDirMove(DIR_RIGHT, s1y); @@ -3634,18 +3635,18 @@ void Game::createInGameMenu() offy += 20; - addKeyConfigLine(group_keyConfig, "Prev Page", "PrevPage", 340+offy); - addKeyConfigLine(group_keyConfig, "Next Page", "NextPage", 360+offy); - addKeyConfigLine(group_keyConfig, "Food Menu Cook", "CookFood", 380+offy); - addKeyConfigLine(group_keyConfig, "Food Left", "FoodLeft", 400+offy); - addKeyConfigLine(group_keyConfig, "Food Right", "FoodRight", 420+offy); - addKeyConfigLine(group_keyConfig, "Food Drop", "FoodDrop", 440+offy); + addKeyConfigLine(group_keyConfig, SB(2121), "PrevPage", 340+offy); + addKeyConfigLine(group_keyConfig, SB(2122), "NextPage", 360+offy); + addKeyConfigLine(group_keyConfig, SB(2123), "CookFood", 380+offy); + addKeyConfigLine(group_keyConfig, SB(2124), "FoodLeft", 400+offy); + addKeyConfigLine(group_keyConfig, SB(2125), "FoodRight", 420+offy); + addKeyConfigLine(group_keyConfig, SB(2126), "FoodDrop", 440+offy); - addKeyConfigLine(group_keyConfig, "Look", "Look", 460+offy); + addKeyConfigLine(group_keyConfig, SB(2127), "Look", 460+offy); - addKeyConfigLine(group_keyConfig, "Help", "ToggleHelp", 480+offy); - + addKeyConfigLine(group_keyConfig, SB(2128), "ToggleHelp", 480+offy); +#undef SB group_keyConfig->shareAlphaWithChildren = 1; group_keyConfig->followCamera = 1; diff --git a/Aquaria/StringBank.cpp b/Aquaria/StringBank.cpp index 7fe20d9..d1d144f 100644 --- a/Aquaria/StringBank.cpp +++ b/Aquaria/StringBank.cpp @@ -71,7 +71,7 @@ void StringBank::_load(const std::string &file) } } -std::string StringBank::get(int idx) +const std::string& StringBank::get(int idx) { return stringMap[idx]; } diff --git a/BBGE/Strings.cpp b/BBGE/Strings.cpp index 2c27bfe..6b1a398 100644 --- a/BBGE/Strings.cpp +++ b/BBGE/Strings.cpp @@ -138,6 +138,8 @@ std::string getInputCodeToString(int key) return ""; } +// FIXME: Move stringbank to BBGE and move these strings into it. -- fg + std::string getInputCodeToUserString(int key) { for (InputCodeMap::iterator i = inputCodeMap.begin(); i != inputCodeMap.end(); i++) diff --git a/files/data/stringbank.txt b/files/data/stringbank.txt index 21df031..ee693b8 100644 --- a/files/data/stringbank.txt +++ b/files/data/stringbank.txt @@ -205,4 +205,33 @@ 2029 |Browse mods online 2030 |Return to title 2031 Any -2032 [Achievements] \ No newline at end of file +2032 [Achievements] +2100 === for options menu === +2101 Action +2102 Key 1 +2103 Key 2 +2104 Joystick +2105 Left Mouse Equiv. +2106 Right Mouse Equiv. +2107 Action 1: Swim +2108 Action 2: Sing/Ability +2109 Swim Up +2110 Swim Down +2111 Swim Left +2112 Swim Right +2113 Roll +2114 Revert +2115 WorldMap/Recipes +2116 Menu/Escape +2117 Stick 1 X +2118 Stick 1 Y +2119 Stick 2 X +2120 Stick 2 Y +2121 Prev Page +2122 Next Page +2123 Food Menu Cook +2124 Food Left +2125 Food Right +2126 Food Drop +2127 Look +2128 Help \ No newline at end of file From 00bb39001983a6de5c573514105e7af53102b438 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 19:50:01 +0200 Subject: [PATCH 14/42] Use locale "-" to turn off locales --- BBGE/Localization.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index e696e6e..8f5f070 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -60,7 +60,7 @@ std::string localisePathInternalModpath(const std::string &path) std::string localisePath(const std::string &path, const std::string& modpath /* = "" */) { - if (s_locale.empty()) + if (s_locale.empty() || s_locale == "-") return path; const std::string fname = path.substr(modpath.length()); From 4a02a4185a84946f290211bf3d6c8d367c09d68a Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 14 Jul 2012 19:52:03 +0200 Subject: [PATCH 15/42] ru stringbank.txt update, thx KS-10! --- files/locales/ru/data/stringbank.txt | 68 ++++++++++++++++++---------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/files/locales/ru/data/stringbank.txt b/files/locales/ru/data/stringbank.txt index 444a55f..acbc7da 100644 --- a/files/locales/ru/data/stringbank.txt +++ b/files/locales/ru/data/stringbank.txt @@ -181,27 +181,47 @@ 2005 'S' - пропустить 2006 Стр. 2007 Рецепты -2008 error -2009 No Description -2010 Stopped Recording -2011 Stopped Playback -2013 health -2014 Enter Flag to Set -2015 Enter Value to Set Flag To -2016 Entity data not found! Aborting... -2017 Variables data not found! Aborting... -2018 Particle Name: -2019 Saved worldmap data to -2020 Unable to save worldmap to -2021 Unable to retrieve online mod list.|Check your connection and try again. -2022 Server error!|Bad XML, please contact server admin.|URL: -2023 Finished downloading mod -2024 Download update? -2025 Mod already exists. Re-download? -2026 This mod was installed manually,|not messing with it. -2027 |Browse installed mods -2028 |Browse & enable/disable installed patches -2029 |Browse mods online -2030 |Return to title -2031 Что -2032 [Achievements] \ No newline at end of file +2008 ошибка +2009 Нет описания +2013 здоровье +2021 Не удается получить онлайн список модов.|Проверьте ваше соединение и попробуйте снова. +2022 Ошибка на сервере! Неправильный XML, пожалуйста, обратитесь к администратору сервера.|Ссылка: +2023 Загрузка мода завершена +2024 Загрузить обновление? +2025 Мод уже скачан. Перекачать? +2026 Мод установлен вручную,|ничего не изменено +2027 |Просмотреть установленные моды +2028 |Просмотр и включение/выключение установленных патчей +2029 |Просмотреть моды онлайн +2030 |Вернуться в главное меню +2031 Любой(е) +2032 [Достижения] +2100 === для меню настроек === +2101 Действие +2102 Клавиша 1 +2103 Клавиша 2 +2104 Джойстик +2105 Аналог левой кнопки мыши +2106 Аналог правой кнопки мыши +2107 Действие 1: Плавание +2108 Действие 2: Пение/Умение +2109 Плыть вверх +2110 Плыть вниз +2111 Плыть влево +2112 Плыть вправо +2113 Вращение +2114 Первоначальная форма +2115 Карта мира/Рецепты +2116 Меню/Выход +2117 Стик 1 X +2118 Стик 1 Y +2119 Стик 2 X +2120 Стик 2 Y +2121 Предыдущая страница +2122 Следующая страница +2123 Меню приготовления еды +2124 Положить ингредиент +2125 Убрать ингредиент +2126 Выбросить ингредиент +2127 Осмотреться +2128 Помощь \ No newline at end of file From 1fe6e665e39a1d9cdb64c4b48d4026a726c4ba55 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 15 Jul 2012 21:29:05 +0200 Subject: [PATCH 16/42] Improve mod selector scolling behavior (thx MOM4Evr for pointing) --- Aquaria/ModSelector.cpp | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/Aquaria/ModSelector.cpp b/Aquaria/ModSelector.cpp index 0f93970..dd03b87 100644 --- a/Aquaria/ModSelector.cpp +++ b/Aquaria/ModSelector.cpp @@ -73,20 +73,20 @@ void ModSelectorScreen::move(int ud, bool instant /* = false */) v.data->target.y += ch; v.data->timePassed = 0; - if(v.data->target.y > 150) - v.data->target.y = 150; - else if(v.data->target.y < -grid->getUsedY() / 2) - v.data->target.y = -grid->getUsedY() / 2; + if(v.data->target.y > 200) + v.data->target.y = 200; + else if(v.data->target.y < -grid->getUsedY()) + v.data->target.y = -grid->getUsedY(); } else { Vector v2 = grid->position; v2.y += ch; // scroll down == grid pos y gets negative (grid scrolls up) - if(v2.y > 150) - grid->position.interpolateTo(Vector(v2.x, 150), t); - else if(v2.y < -grid->getUsedY() / 2) - grid->position.interpolateTo(Vector(v2.x, -grid->getUsedY() / 2), t); + if(v2.y > 200) + grid->position.interpolateTo(Vector(v2.x, 200), t); + else if(v2.y < -grid->getUsedY()) + grid->position.interpolateTo(Vector(v2.x, -grid->getUsedY()), t); else grid->position.interpolateTo(v2, t, 0, false, true); } @@ -99,7 +99,7 @@ void ModSelectorScreen::onUpdate(float dt) // mouse wheel scroll if(dsq->mouse.scrollWheelChange) { - move(dsq->mouse.scrollWheelChange); + move(dsq->mouse.scrollWheelChange * 2); } if(subFadeT >= 0) @@ -369,22 +369,11 @@ static void _FadeOutAll(RenderObject *r, float t) void ModSelectorScreen::close() { - /*for(int i = 0; i < panels.size(); ++i) - if(i != currentPanel) - panels[i]->setHidden(true);*/ - const float t = 0.5f; _FadeOutAll(this, t); //panels[currentPanel]->scale.interpolateTo(Vector(0.9f, 0.9f), t); // HMM dsq->user.save(); dsq->toggleVersionLabel(true); - - // kinda hackish - /*dlText.setHidden(true); - arrowDown.glow->setHidden(true); - arrowUp.glow->setHidden(true); - subbox.setHidden(true); - subtext.setHidden(true);*/ } JuicyProgressBar::JuicyProgressBar() : Quad(), txt(&dsq->smallFont) @@ -450,7 +439,7 @@ void BasicIcon::onUpdate(float dt) dsq->modSelectorScr->move(5, true); else dsq->modSelectorScr->move(-5, true); - core->main(FRAME_TIME); // HACK: this is necessary to correctly position the mouse on the object after mofing the panel + core->main(FRAME_TIME); // HACK: this is necessary to correctly position the mouse on the object after moving the panel setFocus(true); // re-position mouse } } From 7ac095e005ab53c13fc5218efa7a47d9502c6c17 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 22 Jul 2012 03:39:37 +0200 Subject: [PATCH 17/42] Fix a leftover hardcoded string, thx KS-10 for pointing --- Aquaria/ModDownloader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Aquaria/ModDownloader.cpp b/Aquaria/ModDownloader.cpp index edf792d..489ca89 100644 --- a/Aquaria/ModDownloader.cpp +++ b/Aquaria/ModDownloader.cpp @@ -157,7 +157,7 @@ void ModDL::GetModlist(const std::string& url, bool allowChaining, bool first) if(first) knownServers.clear(); - // Prevent recursion, self-linling, or cycle linking. + // Prevent recursion, self-linking, or cycle linking. // In theory, this allows setting up a server network // where each server links to any servers it knows, // without screwing up, but this isn't going to happen anyways. @@ -203,7 +203,7 @@ void ModDL::GetModlist(const std::string& url, bool allowChaining, bool first) { scr->globeIcon->quad->color.interpolateTo(Vector(1,1,1), 0.3f); scr->globeIcon->alpha.interpolateTo(0.5f, 0.2f, -1, true, true); - scr->dlText.setText("Retrieving online mod list..."); + scr->dlText.setText(dsq->continuity.stringBank.get(2033)); scr->dlText.alpha.stopPath(); scr->dlText.alpha.interpolateTo(1, 0.1f); } From 8bd1454eee3e1b3efbf8b2acf497a5200825cede Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 22 Jul 2012 03:40:58 +0200 Subject: [PATCH 18/42] Related stringbank.txt update, thx KS-10 --- files/data/stringbank.txt | 1 + files/locales/ru/data/stringbank.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/files/data/stringbank.txt b/files/data/stringbank.txt index ee693b8..55fc6b0 100644 --- a/files/data/stringbank.txt +++ b/files/data/stringbank.txt @@ -206,6 +206,7 @@ 2030 |Return to title 2031 Any 2032 [Achievements] +2033 Retrieving online mod list... 2100 === for options menu === 2101 Action 2102 Key 1 diff --git a/files/locales/ru/data/stringbank.txt b/files/locales/ru/data/stringbank.txt index acbc7da..d02df06 100644 --- a/files/locales/ru/data/stringbank.txt +++ b/files/locales/ru/data/stringbank.txt @@ -196,6 +196,7 @@ 2030 |Вернуться в главное меню 2031 Любой(е) 2032 [Достижения] +2033 Получение списка модов онлайн... 2100 === для меню настроек === 2101 Действие 2102 Клавиша 1 From 9c76fa7ed458b23a85afb6e25af72945f3ef3620 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 22 Jul 2012 17:53:21 +0200 Subject: [PATCH 19/42] Fix one oversight that prevented localizing scripts properly --- Aquaria/ScriptInterface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index 488b558..c188e57 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -8952,7 +8952,8 @@ void ScriptInterface::shutdown() Script *ScriptInterface::openScript(const std::string &file, bool ignoremissing /* = false */) { - std::string realFile = core->adjustFilenameCase(file); + std::string realFile = localisePath(file, dsq->mod.isActive() ? dsq->mod.getPath() : ""); + realFile = core->adjustFilenameCase(realFile); bool loadedScript = false; lua_getglobal(baseState, "_scriptvars"); From 9e4fe3809efc4b74f514c3965e4c6415abc02152 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 23 Jul 2012 05:06:01 +0200 Subject: [PATCH 20/42] Fix crash added with last commit, thx KS-10 for pointing --- Aquaria/ScriptInterface.cpp | 2 +- BBGE/Localization.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index c188e57..03858f1 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -8952,7 +8952,7 @@ void ScriptInterface::shutdown() Script *ScriptInterface::openScript(const std::string &file, bool ignoremissing /* = false */) { - std::string realFile = localisePath(file, dsq->mod.isActive() ? dsq->mod.getPath() : ""); + std::string realFile = localisePathInternalModpath(file); realFile = core->adjustFilenameCase(realFile); bool loadedScript = false; diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index 8f5f070..4669814 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -62,6 +62,8 @@ std::string localisePath(const std::string &path, const std::string& modpath /* { if (s_locale.empty() || s_locale == "-") return path; + if(path.length() < modpath.length()) + return path; const std::string fname = path.substr(modpath.length()); From 3bdb0d6bc67b0d6bc1b0bd715ff3cb24f0feba51 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 2 Sep 2012 02:27:23 +0200 Subject: [PATCH 21/42] Fix regression added in "Fix loading world map data when loading a mod's saved game" (459a41e1f6) Loading world map data would reset the visited world map tiles. Also little fix in savegame loading: Load mod data before reset, so it knows we're preparing to load a mod. --- Aquaria/Continuity.cpp | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Aquaria/Continuity.cpp b/Aquaria/Continuity.cpp index c9dcc7c..79128e6 100644 --- a/Aquaria/Continuity.cpp +++ b/Aquaria/Continuity.cpp @@ -2553,12 +2553,26 @@ void Continuity::loadFileData(int slot, TiXmlDocument &doc) void Continuity::loadFile(int slot) { dsq->user.save(); - this->reset(); - knowsSong.clear(); // Adds shield song by default, which interferes with mods that don't start with it TiXmlDocument doc; loadFileData(slot, doc); + TiXmlElement *startData = doc.FirstChildElement("StartData"); + if (startData) + { + if (startData->Attribute("mod")) + { +#ifdef AQUARIA_DEMO + exit(-1); +#else + dsq->mod.load(startData->Attribute("mod")); +#endif + } + } + + this->reset(); + knowsSong.clear(); // Adds shield song by default, which interferes with mods that don't start with it + int versionMajor=-1, versionMinor=-1, versionRevision=-1; TiXmlElement *xmlVersion = doc.FirstChildElement("Version"); if (xmlVersion) @@ -2797,7 +2811,6 @@ void Continuity::loadFile(int slot) e2 = e2->NextSiblingElement("StringFlag"); } - TiXmlElement *startData = doc.FirstChildElement("StartData"); if (startData) { int x = atoi(startData->Attribute("x")); @@ -2811,15 +2824,6 @@ void Continuity::loadFile(int slot) //dsq->continuity.naijaModel = startData->Attribute("naijaModel"); } - if (startData->Attribute("mod")) - { -#ifdef AQUARIA_DEMO - exit(-1); -#else - dsq->mod.load(startData->Attribute("mod")); -#endif - } - if (startData->Attribute("form")) { dsq->continuity.form = FormType(atoi(startData->Attribute("form"))); @@ -2917,12 +2921,6 @@ void Continuity::loadFile(int slot) dsq->game->sceneToLoad = startData->Attribute("scene"); //dsq->game->transitionToScene(); } - - // Possibly mod-specific data the the continuity reset didn't catch - loadSongBank(); - this->worldMap.load(); - loadTreasureData(); - stringBank.load(); } void Continuity::setNaijaModel(std::string model) From 5d41c93c5b61d50f6a606b06c244f19a40fc71bc Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 2 Sep 2012 02:29:12 +0200 Subject: [PATCH 22/42] Little SceneEditor on-sreen text enhancement, regarding (auto-)save --- Aquaria/Game.cpp | 18 +++++++++++++----- Aquaria/Game.h | 2 +- Aquaria/SceneEditor.cpp | 17 +++++++++++------ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index c81b554..831a1f4 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -4183,7 +4183,9 @@ bool Game::loadSceneXML(std::string scene) { //errorLog("Could not find [" + fn + "]"); //msg("Could not find map [" + fn + "]"); - debugLog("Could not find map [" + fn + "]"); + std::string s = "Could not find map [" + fn + "]"; + debugLog(s); + dsq->screenMessage(s); return false; } TiXmlDocument doc; @@ -5401,10 +5403,10 @@ bool Game::loadScene(std::string scene) */ } -void Game::saveScene(std::string scene) +bool Game::saveScene(std::string scene) { if (!this->saveFile) - return; + return false; std::string fn = getSceneFilename(scene); @@ -5464,7 +5466,7 @@ void Game::saveScene(std::string scene) saveFile->InsertEndChild(level); */ - std::ostringstream obs, obsBinary; + std::ostringstream obs; int i = 0; for (i = 0; i < obsRows.size(); i++) { @@ -5596,7 +5598,13 @@ void Game::saveScene(std::string scene) } */ - saveFile.SaveFile(fn); + bool result = saveFile.SaveFile(fn); + if (result) + debugLog("Successfully saved map: " + fn); + else + debugLog("Failed to save map: " + fn); + + return result; } void Game::warpToArea(WarpArea *area) diff --git a/Aquaria/Game.h b/Aquaria/Game.h index a505640..29ee6b1 100644 --- a/Aquaria/Game.h +++ b/Aquaria/Game.h @@ -693,7 +693,7 @@ public: ElementTemplate *getElementTemplateByIdx(int idx); - void saveScene(std::string scene); + bool saveScene(std::string scene); typedef std::vector WarpAreas; WarpAreas warpAreas; diff --git a/Aquaria/SceneEditor.cpp b/Aquaria/SceneEditor.cpp index 17d63e5..469a0d2 100644 --- a/Aquaria/SceneEditor.cpp +++ b/Aquaria/SceneEditor.cpp @@ -2593,12 +2593,15 @@ void SceneEditor::loadScene() particleManager->loadParticleBank(dsq->particleBank1, dsq->particleBank2); Shot::loadShotBank(dsq->shotBank1, dsq->shotBank2); dsq->game->loadEntityTypeList(); + dsq->loadElementEffects(); } void SceneEditor::saveScene() { - dsq->screenMessage(dsq->game->sceneName + " Saved!"); - dsq->game->saveScene(dsq->game->sceneName); + if(dsq->game->saveScene(dsq->game->sceneName)) + dsq->screenMessage(dsq->game->sceneName + " Saved!"); + else + dsq->screenMessage(dsq->game->sceneName + " FAILED to save!"); } void SceneEditor::deleteSelectedElement() @@ -3482,10 +3485,12 @@ void SceneEditor::update(float dt) autoSaveTimer = 0; std::ostringstream os; os << "auto/AUTO_" << autoSaveFile << "_" << dsq->game->sceneName; - std::string m = "Map AutoSaved to " + os.str(); - dsq->game->saveScene(os.str()); - dsq->debugLog(m); - dsq->screenMessage(m); + if(dsq->game->saveScene(os.str())) + { + std::string m = "Map AutoSaved to " + os.str(); + dsq->debugLog(m); + dsq->screenMessage(m); + } autoSaveFile++; if (autoSaveFile > vars->autoSaveFiles) From f97fe124628d60aab63d4390102d702bab50bcf5 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 2 Sep 2012 02:29:33 +0200 Subject: [PATCH 23/42] Load a mod's elementeffects.txt if provided --- Aquaria/DSQ.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Aquaria/DSQ.cpp b/Aquaria/DSQ.cpp index 61a8bbf..50433be 100644 --- a/Aquaria/DSQ.cpp +++ b/Aquaria/DSQ.cpp @@ -300,7 +300,18 @@ void DSQ::newGame() void DSQ::loadElementEffects() { - std::ifstream inFile("data/elementeffects.txt"); + bool found = false; + std::string fn; + if (dsq->mod.isActive()) + { + fn = dsq->mod.getPath() + "elementeffects.txt"; + if(exists(fn)) + found = true; + } + if(!found) + fn = "data/elementeffects.txt"; + + InStream inFile(fn.c_str()); elementEffects.clear(); std::string line; while (std::getline(inFile, line)) From 42f4c2d1e6017ae42d69670701bf2a09421f1376 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 15 Sep 2012 15:37:23 +0200 Subject: [PATCH 24/42] Hopefully fix the old "song control hint white box" problem, now also for win7. Has been working fine for XP, though. --- Aquaria/Game.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index 831a1f4..44fe96a 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -7728,9 +7728,9 @@ void Game::setControlHint(const std::string &h, bool left, bool right, bool midd Vector p = controlHint_mouseLeft->position + Vector(-100,0); - os.seekp(0); - os << "song/songslot-" << dsq->continuity.getSongSlotByType(songType) << '\0'; // ensure correct string termination across compilers - Quad *q = new Quad(os.str(), p); + char sbuf[32]; + sprintf(sbuf, "song/songslot-%d", dsq->continuity.getSongSlotByType(songType)); + Quad *q = new Quad(sbuf, p); q->followCamera = 1; q->scale = Vector(0.7, 0.7); q->alpha = 0; @@ -7743,9 +7743,8 @@ void Game::setControlHint(const std::string &h, bool left, bool right, bool midd { int note = song->notes[i]; - os.seekp(0); - os << "song/notebutton-" << note << '\0'; - Quad *q = new Quad(os.str(), p); + sprintf(sbuf, "song/notebutton-%d", note); + Quad *q = new Quad(sbuf, p); q->color = dsq->getNoteColor(note)*0.5f + Vector(1, 1, 1)*0.5f; q->followCamera = 1; q->scale = Vector(1.0, 1.0); From 82e0be355c49f4da12c4bdc7769a47ceb337afbb Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 17 Sep 2012 03:25:13 +0200 Subject: [PATCH 25/42] Fix possible crash on End key in SceneEditor (thx KS-10 for reporting). This was due to a logic bug mistaking tile indices with array indices. --- Aquaria/SceneEditor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Aquaria/SceneEditor.cpp b/Aquaria/SceneEditor.cpp index 469a0d2..bfe068d 100644 --- a/Aquaria/SceneEditor.cpp +++ b/Aquaria/SceneEditor.cpp @@ -3107,9 +3107,9 @@ void SceneEditor::selectEnd() for (int i = 0; i < dsq->game->elementTemplates.size(); i++) { ElementTemplate et = dsq->game->elementTemplates[i]; - if (et.idx < 1024 && et.idx > largest) + if (et.idx < 1024 && i > largest) { - largest = et.idx; + largest = i; } } curElement = largest; From 755cc9c50f1df7cd67995ca7bba91302d436fbd3 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 17 Sep 2012 03:32:18 +0200 Subject: [PATCH 26/42] Fix possible crash when moving the Y-axis of camera out of bounds when zoomed out. This was a regression from my earlier GridRender optimization patch. --- Aquaria/GridRender.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Aquaria/GridRender.cpp b/Aquaria/GridRender.cpp index f95ae1c..3ebcd41 100644 --- a/Aquaria/GridRender.cpp +++ b/Aquaria/GridRender.cpp @@ -108,6 +108,8 @@ void GridRender::onRender() startY = 0; if (endY >= MAX_GRID) endY = MAX_GRID-1; + if (startY > endY) + return; for (int x = startX; x <= endX; ++x) { const signed char *gridColumn = dsq->game->getGridColumn(x); From eaa7c27f821a303304ec36cd49867bfa18a70720 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 21 Sep 2012 03:02:54 +0200 Subject: [PATCH 27/42] Clear beast form eats in continuity reset. This fixes eats carrying over into mods. Also revert one related change from 84c49e5ce0 obsoleted in 3bdb0d6bc67. --- Aquaria/Continuity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Aquaria/Continuity.cpp b/Aquaria/Continuity.cpp index 79128e6..8d4190c 100644 --- a/Aquaria/Continuity.cpp +++ b/Aquaria/Continuity.cpp @@ -2571,7 +2571,6 @@ void Continuity::loadFile(int slot) } this->reset(); - knowsSong.clear(); // Adds shield song by default, which interferes with mods that don't start with it int versionMajor=-1, versionMinor=-1, versionRevision=-1; TiXmlElement *xmlVersion = doc.FirstChildElement("Version"); @@ -3249,6 +3248,7 @@ void Continuity::reset() worldMap.load(); ingredients.clear(); + naijaEats.clear(); foodSortType = 0; From dec7707562ac65ac61a9eb5b2fa8877fb77f4a8d Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 21 Sep 2012 01:28:25 +0200 Subject: [PATCH 28/42] Fix camera constrain logic for very wide resolutions. This affected all standard wide resolutions too, but wasn't noticed because the camera wasn't positioned very far off. --- Aquaria/Game.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index 44fe96a..ce2c3f9 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -9925,8 +9925,8 @@ void Game::constrainCamera() cameraOffBounds = 0; if (cameraConstrained) { - int vw2 = core->getVirtualOffX()*core->invGlobalScale; - int vh2 = core->getVirtualOffY()*core->invGlobalScale; + float vw2 = core->getVirtualOffX()*core->invGlobalScale; + float vh2 = core->getVirtualOffY()*core->invGlobalScale; if (dsq->cameraPos.x - vw2 < (cameraMin.x+1)) { @@ -9940,9 +9940,11 @@ void Game::constrainCamera() cameraOffBounds = 1; } - int scrw, scrh; - scrw = core->getVirtualWidth()*core->invGlobalScale; - scrh = 600*core->invGlobalScale; + // The camera is positioned at (0, 0) screen coordinates, which, on widescreen resolutions, + // is *not* the upper left corner. Subtract the offset to get the real position. + // HACK: One column shows through after blackness ends, adding TILE_SIZE fixes this. -- fg + float scrw = (core->getVirtualWidth()-core->getVirtualOffX()+TILE_SIZE)*core->invGlobalScale; + float scrh = 600*core->invGlobalScale; if (cameraMax.x != -1 && dsq->cameraPos.x + scrw >= cameraMax.x) { From e29d4e65bd6fde3d9d15734fbaa1427142c6eaaa Mon Sep 17 00:00:00 2001 From: fgenesis Date: Fri, 21 Sep 2012 02:18:51 +0200 Subject: [PATCH 29/42] Allow using super-wide resolutions. Super-tall resolutions break horribly, however. --- Aquaria/DSQ.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Aquaria/DSQ.cpp b/Aquaria/DSQ.cpp index 50433be..41e31d2 100644 --- a/Aquaria/DSQ.cpp +++ b/Aquaria/DSQ.cpp @@ -994,11 +994,7 @@ This build is not yet final, and as such there are a couple things lacking. They float asp = float(user.video.resx)/float(user.video.resy); - - if (asp >= 1.0f && asp < 1.8f) - { - } - else + if(asp < 1.0f) { std::ostringstream os; os << "Aspect ratio for resolution [" << user.video.resx << ", " << user.video.resy << "] not supported."; From cb745baa5e03ce1f66eca41116415509aa704e02 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 03:48:14 +0200 Subject: [PATCH 30/42] Fix crash in script warning --- Aquaria/ScriptInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index 03858f1..da05ce7 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -658,7 +658,7 @@ luaFunc(newindexWarnGlobal) { std::ostringstream os; os << "WARNING: script set global " - << lua_typename(L, -2) + << lua_typename(L, lua_type(L, -2)) << " " << varname; scriptError(L, os.str()); } From f369fa48c82cd0ed099fa9926aaf5645084c7475 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 04:49:13 +0200 Subject: [PATCH 31/42] Update libpng to 1.5.12 --- ExternalLibs/glpng/png/png.c | 40 +- ExternalLibs/glpng/png/png.h | 51 ++- ExternalLibs/glpng/png/pngconf.h | 10 +- ExternalLibs/glpng/png/pngerror.c | 67 ++-- ExternalLibs/glpng/png/pnglibconf.h | 331 ++++++++-------- ExternalLibs/glpng/png/pngpread.c | 575 ++-------------------------- ExternalLibs/glpng/png/pngpriv.h | 56 ++- ExternalLibs/glpng/png/pngread.c | 21 +- ExternalLibs/glpng/png/pngrtran.c | 22 +- ExternalLibs/glpng/png/pngrutil.c | 49 ++- ExternalLibs/glpng/png/pngset.c | 41 +- ExternalLibs/glpng/png/pngstruct.h | 22 +- ExternalLibs/glpng/png/pngtrans.c | 107 +++++- 13 files changed, 532 insertions(+), 860 deletions(-) diff --git a/ExternalLibs/glpng/png/png.c b/ExternalLibs/glpng/png/png.c index b8cfca7..4a17bda 100644 --- a/ExternalLibs/glpng/png/png.c +++ b/ExternalLibs/glpng/png/png.c @@ -1,8 +1,8 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_7 Your_png_h_is_not_version_1_5_7; +typedef png_libpng_version_1_5_12 Your_png_h_is_not_version_1_5_12; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -655,14 +655,14 @@ png_get_copyright(png_const_structp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.5.7 - December 15, 2011" PNG_STRING_NEWLINE \ - "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ + "libpng version 1.5.12 - July 11, 2012" PNG_STRING_NEWLINE \ + "Copyright (c) 1998-2012 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.5.7 - December 15, 2011\ - Copyright (c) 1998-2011 Glenn Randers-Pehrson\ + return "libpng version 1.5.12 - July 11, 2012\ + Copyright (c) 1998-2012 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; # endif @@ -969,8 +969,8 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy) * and it is certain that it becomes unstable where the end points are close * together. * - * So this code uses the perhaps slighly less optimal but more understandable - * and totally obvious approach of calculating color-scale. + * So this code uses the perhaps slightly less optimal but more + * understandable and totally obvious approach of calculating color-scale. * * This algorithm depends on the precision in white-scale and that is * (1/white-y), so we can immediately see that as white-y approaches 0 the @@ -1467,7 +1467,7 @@ static double png_pow10(int power) { int recip = 0; - double d = 1; + double d = 1.0; /* Handle negative exponent with a reciprocal at the end because * 10 is exact whereas .1 is inexact in base 2 @@ -1481,7 +1481,7 @@ png_pow10(int power) if (power > 0) { /* Decompose power bitwise. */ - double mult = 10; + double mult = 10.0; do { if (power & 1) d *= mult; @@ -1600,7 +1600,8 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { double d; - fp *= 10; + fp *= 10.0; + /* Use modf here, not floor and subtract, so that * the separation is done in one step. At the end * of the loop don't break the number into parts so @@ -1613,7 +1614,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { d = floor(fp + .5); - if (d > 9) + if (d > 9.0) { /* Rounding up to 10, handle that here. */ if (czero > 0) @@ -1621,9 +1622,10 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, --czero, d = 1; if (cdigits == 0) --clead; } + else { - while (cdigits > 0 && d > 9) + while (cdigits > 0 && d > 9.0) { int ch = *--ascii; @@ -1648,7 +1650,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, * exponent but take into account the leading * decimal point. */ - if (d > 9) /* cdigits == 0 */ + if (d > 9.0) /* cdigits == 0 */ { if (exp_b10 == (-1)) { @@ -1669,18 +1671,19 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, ++exp_b10; /* In all cases we output a '1' */ - d = 1; + d = 1.0; } } } fp = 0; /* Guarantees termination below. */ } - if (d == 0) + if (d == 0.0) { ++czero; if (cdigits == 0) ++clead; } + else { /* Included embedded zeros in the digit count. */ @@ -1708,6 +1711,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, above */ --exp_b10; } + *ascii++ = (char)(48 + (int)d), ++cdigits; } } @@ -2040,7 +2044,7 @@ png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times, } #endif -#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */ +#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gamma */ /* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ png_fixed_point png_reciprocal(png_fixed_point a) diff --git a/ExternalLibs/glpng/png/png.h b/ExternalLibs/glpng/png/png.h index 657aa5a..0106214 100644 --- a/ExternalLibs/glpng/png/png.h +++ b/ExternalLibs/glpng/png/png.h @@ -1,8 +1,8 @@ /* png.h - header file for PNG reference library * - * libpng version 1.5.7 - December 15, 2011 - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * libpng version 1.5.12 - July 11, 2012 + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.5.7 - December 15, 2011: Glenn + * libpng versions 0.97, January 1998, through 1.5.12 - July 11, 2012: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -166,6 +166,18 @@ * 1.5.7beta01-05 15 10507 15.so.15.7[.0] * 1.5.7rc01-03 15 10507 15.so.15.7[.0] * 1.5.7 15 10507 15.so.15.7[.0] + * 1.5.8beta01 15 10508 15.so.15.8[.0] + * 1.5.8rc01 15 10508 15.so.15.8[.0] + * 1.5.8 15 10508 15.so.15.8[.0] + * 1.5.9beta01-02 15 10509 15.so.15.9[.0] + * 1.5.9rc01 15 10509 15.so.15.9[.0] + * 1.5.9 15 10509 15.so.15.9[.0] + * 1.5.10beta01-05 15 10510 15.so.15.10[.0] + * 1.5.10 15 10510 15.so.15.10[.0] + * 1.5.11beta01 15 10511 15.so.15.11[.0] + * 1.5.11rc01-05 15 10511 15.so.15.11[.0] + * 1.5.11 15 10511 15.so.15.11[.0] + * 1.5.12 15 10512 15.so.15.12[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -175,7 +187,7 @@ * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcN". + * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled @@ -197,8 +209,8 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.5.7, December 15, 2011, are - * Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are + * libpng versions 1.2.6, August 15, 2004, through 1.5.12, July 11, 2012, are + * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: * @@ -309,13 +321,13 @@ * Y2K compliance in libpng: * ========================= * - * December 15, 2011 + * July 11, 2012 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.5.7 are Y2K compliant. It is my belief that + * upward through 1.5.12 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -326,7 +338,8 @@ * "png_uint_16 year" in png_time_struct. * * The string is - * "png_char time_buffer" in png_struct + * "char time_buffer[29]" in png_struct. This will be no + * longer used in libpng-1.6.0 and will be removed from libpng-1.7.0. * * There are seven time-related functions: * png.c: png_convert_to_rfc_1123() in png.c @@ -373,9 +386,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.5.7" +#define PNG_LIBPNG_VER_STRING "1.5.12" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.5.7 - December 15, 2011\n" + " libpng version 1.5.12 - July 11, 2012\n" #define PNG_LIBPNG_VER_SONUM 15 #define PNG_LIBPNG_VER_DLLNUM 15 @@ -383,7 +396,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 5 -#define PNG_LIBPNG_VER_RELEASE 7 +#define PNG_LIBPNG_VER_RELEASE 12 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -406,7 +419,7 @@ #define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with PNG_LIBPNG_BUILD_PRIVATE */ -#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA +#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE /* Careful here. At one time, Guy wanted to use 082, but that would be octal. * We must not include leading zeros. @@ -414,7 +427,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10507 /* 1.5.7 */ +#define PNG_LIBPNG_VER 10512 /* 1.5.12 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -536,7 +549,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_5_7; +typedef char* png_libpng_version_1_5_12; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -2631,6 +2644,12 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); : (png_int_32)png_get_uint_32(buf))) #endif +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, + int allowed)); +#endif + /* Maintainer: Put new public prototypes here ^, in libpng.3, and project * defs */ @@ -2640,7 +2659,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); * scripts/symbols.def as well. */ #ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(233); + PNG_EXPORT_LAST_ORDINAL(234); #endif #ifdef __cplusplus diff --git a/ExternalLibs/glpng/png/pngconf.h b/ExternalLibs/glpng/png/pngconf.h index 0ff169e..aee7915 100644 --- a/ExternalLibs/glpng/png/pngconf.h +++ b/ExternalLibs/glpng/png/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.5.7 - December 15, 2011 + * libpng version 1.5.12 - July 11, 2012 * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -25,7 +25,7 @@ #ifndef PNG_BUILDING_SYMBOL_TABLE /* PNG_NO_LIMITS_H may be used to turn off the use of the standard C * definition file for machine specific limits, this may impact the - * correctness of the definitons below (see uses of INT_MAX). + * correctness of the definitions below (see uses of INT_MAX). */ # ifndef PNG_NO_LIMITS_H # include @@ -51,8 +51,8 @@ /* This controls optimization of the reading of 16 and 32 bit values * from PNG files. It can be set on a per-app-file basis - it - * just changes whether a macro is used to the function is called. - * The library builder sets the default, if read functions are not + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not * built into the library the macro implementation is forced on. */ #ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED diff --git a/ExternalLibs/glpng/png/pngerror.c b/ExternalLibs/glpng/png/pngerror.c index 6494a0c..ef60d55 100644 --- a/ExternalLibs/glpng/png/pngerror.c +++ b/ExternalLibs/glpng/png/pngerror.c @@ -1,7 +1,7 @@ /* pngerror.c - stub functions for i/o and memory allocation * - * Last changed in libpng 1.5.7 [December 15, 2011] + * Last changed in libpng 1.5.8 [February 1, 2011] * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -281,35 +281,40 @@ void png_formatted_warning(png_structp png_ptr, png_warning_parameters p, png_const_charp message) { - /* The internal buffer is just 128 bytes - enough for all our messages, - * overflow doesn't happen because this code checks! + /* The internal buffer is just 192 bytes - enough for all our messages, + * overflow doesn't happen because this code checks! If someone figures + * out how to send us a message longer than 192 bytes, all that will + * happen is that the message will be truncated appropriately. */ - size_t i; - char msg[128]; + size_t i = 0; /* Index in the msg[] buffer: */ + char msg[192]; - for (i=0; i<(sizeof msg)-1 && *message != '\0'; ++i) + /* Each iteration through the following loop writes at most one character + * to msg[i++] then returns here to validate that there is still space for + * the trailing '\0'. It may (in the case of a parameter) read more than + * one character from message[]; it must check for '\0' and continue to the + * test if it finds the end of string. + */ + while (i<(sizeof msg)-1 && *message != '\0') { - if (*message == '@') + /* '@' at end of string is now just printed (previously it was skipped); + * it is an error in the calling code to terminate the string with @. + */ + if (p != NULL && *message == '@' && message[1] != '\0') { - int parameter = -1; - switch (*++message) - { - case '1': - parameter = 0; - break; + int parameter_char = *++message; /* Consume the '@' */ + static const char valid_parameters[] = "123456789"; + int parameter = 0; - case '2': - parameter = 1; - break; + /* Search for the parameter digit, the index in the string is the + * parameter to use. + */ + while (valid_parameters[parameter] != parameter_char && + valid_parameters[parameter] != '\0') + ++parameter; - case '\0': - continue; /* To break out of the for loop above. */ - - default: - break; - } - - if (parameter >= 0 && parameter < PNG_WARNING_PARAMETER_COUNT) + /* If the parameter digit is out of range it will just get printed. */ + if (parameter < PNG_WARNING_PARAMETER_COUNT) { /* Append this parameter */ png_const_charp parm = p[parameter]; @@ -319,28 +324,32 @@ png_formatted_warning(png_structp png_ptr, png_warning_parameters p, * that parm[] has been initialized, so there is no guarantee of a * trailing '\0': */ - for (; i<(sizeof msg)-1 && parm != '\0' && parm < pend; ++i) - msg[i] = *parm++; + while (i<(sizeof msg)-1 && *parm != '\0' && parm < pend) + msg[i++] = *parm++; + /* Consume the parameter digit too: */ ++message; continue; } /* else not a parameter and there is a character after the @ sign; just - * copy that. + * copy that. This is known not to be '\0' because of the test above. */ } /* At this point *message can't be '\0', even in the bad parameter case * above where there is a lone '@' at the end of the message string. */ - msg[i] = *message++; + msg[i++] = *message++; } /* i is always less than (sizeof msg), so: */ msg[i] = '\0'; - /* And this is the formatted message: */ + /* And this is the formatted message, it may be larger than + * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these are + * not (currently) formatted. + */ png_warning(png_ptr, msg); } #endif /* PNG_WARNINGS_SUPPORTED */ diff --git a/ExternalLibs/glpng/png/pnglibconf.h b/ExternalLibs/glpng/png/pnglibconf.h index a19053a..6c14dd6 100644 --- a/ExternalLibs/glpng/png/pnglibconf.h +++ b/ExternalLibs/glpng/png/pnglibconf.h @@ -1,189 +1,180 @@ +/* pnglibconf.h - library build configuration */ -/* libpng STANDARD API DEFINITION */ +/* libpng version 1.5.12 - July 11, 2012 */ -/* pnglibconf.h - library build configuration */ +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ -/* Libpng 1.5.7 - December 15, 2011 */ - -/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ - -/* This code is released under the libpng license. */ -/* For conditions of distribution and use, see the disclaimer */ -/* and license in png.h */ +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ /* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ /* Derived from: scripts/pnglibconf.dfa */ -/* If you edit this file by hand you must obey the rules expressed in */ -/* pnglibconf.dfa with respect to the dependencies between the following */ -/* symbols. It is much better to generate a new file using */ -/* scripts/libpngconf.mak */ - #ifndef PNGLCONF_H #define PNGLCONF_H /* settings */ -#define PNG_API_RULE 0 -#define PNG_CALLOC_SUPPORTED -#define PNG_COST_SHIFT 3 -#define PNG_DEFAULT_READ_MACROS 1 -#define PNG_GAMMA_THRESHOLD_FIXED 5000 #define PNG_MAX_GAMMA_8 11 -#define PNG_QUANTIZE_BLUE_BITS 5 -#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_CALLOC_SUPPORTED #define PNG_QUANTIZE_RED_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_API_RULE 0 +#define PNG_QUANTIZE_BLUE_BITS 5 #define PNG_sCAL_PRECISION 5 -#define PNG_USER_CHUNK_CACHE_MAX 0 -#define PNG_USER_CHUNK_MALLOC_MAX 0 -#define PNG_USER_HEIGHT_MAX 1000000 -#define PNG_USER_WIDTH_MAX 1000000 +#define PNG_COST_SHIFT 3 #define PNG_WEIGHT_SHIFT 8 +#define PNG_DEFAULT_READ_MACROS 1 #define PNG_ZBUF_SIZE 8192 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 /* end of settings */ /* options */ -#define PNG_16BIT_SUPPORTED -#define PNG_ALIGN_MEMORY_SUPPORTED -#define PNG_BENIGN_ERRORS_SUPPORTED -#define PNG_bKGD_SUPPORTED -#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -#define PNG_CHECK_cHRM_SUPPORTED -#define PNG_cHRM_SUPPORTED -#define PNG_CONSOLE_IO_SUPPORTED -#define PNG_CONVERT_tIME_SUPPORTED -#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED 1 +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED 1 +#define PNG_POINTER_INDEXING_SUPPORTED 1 +#define PNG_WARNINGS_SUPPORTED 1 +#define PNG_FLOATING_ARITHMETIC_SUPPORTED 1 +#define PNG_WRITE_SUPPORTED 1 +#define PNG_WRITE_INTERLACING_SUPPORTED 1 +#define PNG_WRITE_16BIT_SUPPORTED 1 +#define PNG_EASY_ACCESS_SUPPORTED 1 +#define PNG_ALIGN_MEMORY_SUPPORTED 1 +#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED 1 +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED 1 +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED 1 +#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED 1 +#define PNG_FIXED_POINT_SUPPORTED 1 /*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ -#define PNG_ERROR_TEXT_SUPPORTED -#define PNG_FIXED_POINT_SUPPORTED -#define PNG_FLOATING_ARITHMETIC_SUPPORTED -#define PNG_FLOATING_POINT_SUPPORTED -#define PNG_FORMAT_AFIRST_SUPPORTED -#define PNG_FORMAT_BGR_SUPPORTED -#define PNG_gAMA_SUPPORTED -#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -#define PNG_hIST_SUPPORTED -#define PNG_iCCP_SUPPORTED -#define PNG_INCH_CONVERSIONS_SUPPORTED -#define PNG_INFO_IMAGE_SUPPORTED -#define PNG_IO_STATE_SUPPORTED -#define PNG_iTXt_SUPPORTED -#define PNG_MNG_FEATURES_SUPPORTED -#define PNG_oFFs_SUPPORTED -#define PNG_pCAL_SUPPORTED -#define PNG_pHYs_SUPPORTED -#define PNG_POINTER_INDEXING_SUPPORTED -#define PNG_PROGRESSIVE_READ_SUPPORTED -#define PNG_READ_16BIT_SUPPORTED -#define PNG_READ_ALPHA_MODE_SUPPORTED -#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED -#define PNG_READ_BACKGROUND_SUPPORTED -#define PNG_READ_BGR_SUPPORTED -#define PNG_READ_bKGD_SUPPORTED -#define PNG_READ_cHRM_SUPPORTED -#define PNG_READ_COMPOSITE_NODIV_SUPPORTED -#define PNG_READ_COMPRESSED_TEXT_SUPPORTED -#define PNG_READ_EXPAND_16_SUPPORTED -#define PNG_READ_EXPAND_SUPPORTED -#define PNG_READ_FILLER_SUPPORTED -#define PNG_READ_gAMA_SUPPORTED -#define PNG_READ_GAMMA_SUPPORTED -#define PNG_READ_GRAY_TO_RGB_SUPPORTED -#define PNG_READ_hIST_SUPPORTED -#define PNG_READ_iCCP_SUPPORTED -#define PNG_READ_INTERLACING_SUPPORTED -#define PNG_READ_INT_FUNCTIONS_SUPPORTED -#define PNG_READ_INVERT_ALPHA_SUPPORTED -#define PNG_READ_INVERT_SUPPORTED -#define PNG_READ_iTXt_SUPPORTED -#define PNG_READ_oFFs_SUPPORTED -#define PNG_READ_OPT_PLTE_SUPPORTED -#define PNG_READ_PACK_SUPPORTED -#define PNG_READ_PACKSWAP_SUPPORTED -#define PNG_READ_pCAL_SUPPORTED -#define PNG_READ_pHYs_SUPPORTED -#define PNG_READ_QUANTIZE_SUPPORTED -#define PNG_READ_RGB_TO_GRAY_SUPPORTED -#define PNG_READ_sBIT_SUPPORTED -#define PNG_READ_SCALE_16_TO_8_SUPPORTED -#define PNG_READ_sCAL_SUPPORTED -#define PNG_READ_SHIFT_SUPPORTED -#define PNG_READ_sPLT_SUPPORTED -#define PNG_READ_sRGB_SUPPORTED -#define PNG_READ_STRIP_16_TO_8_SUPPORTED -#define PNG_READ_STRIP_ALPHA_SUPPORTED -#define PNG_READ_SUPPORTED -#define PNG_READ_SWAP_ALPHA_SUPPORTED -#define PNG_READ_SWAP_SUPPORTED -#define PNG_READ_tEXt_SUPPORTED -#define PNG_READ_TEXT_SUPPORTED -#define PNG_READ_tIME_SUPPORTED -#define PNG_READ_TRANSFORMS_SUPPORTED -#define PNG_READ_tRNS_SUPPORTED -#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_READ_USER_CHUNKS_SUPPORTED -#define PNG_READ_USER_TRANSFORM_SUPPORTED -#define PNG_READ_zTXt_SUPPORTED -#define PNG_SAVE_INT_32_SUPPORTED -#define PNG_sBIT_SUPPORTED -#define PNG_sCAL_SUPPORTED -#define PNG_SEQUENTIAL_READ_SUPPORTED -#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED -#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED -#define PNG_SETJMP_SUPPORTED -#define PNG_SET_USER_LIMITS_SUPPORTED -#define PNG_sPLT_SUPPORTED -#define PNG_sRGB_SUPPORTED -#define PNG_STDIO_SUPPORTED -#define PNG_tEXt_SUPPORTED -#define PNG_TEXT_SUPPORTED -#define PNG_TIME_RFC1123_SUPPORTED -#define PNG_tIME_SUPPORTED -#define PNG_tRNS_SUPPORTED -#define PNG_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_USER_CHUNKS_SUPPORTED -#define PNG_USER_LIMITS_SUPPORTED -#define PNG_USER_MEM_SUPPORTED -#define PNG_USER_TRANSFORM_INFO_SUPPORTED -#define PNG_USER_TRANSFORM_PTR_SUPPORTED -#define PNG_WARNINGS_SUPPORTED -#define PNG_WRITE_16BIT_SUPPORTED -#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED -#define PNG_WRITE_BGR_SUPPORTED -#define PNG_WRITE_bKGD_SUPPORTED -#define PNG_WRITE_cHRM_SUPPORTED -#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED -#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED -#define PNG_WRITE_FILLER_SUPPORTED -#define PNG_WRITE_FILTER_SUPPORTED -#define PNG_WRITE_FLUSH_SUPPORTED -#define PNG_WRITE_gAMA_SUPPORTED -#define PNG_WRITE_hIST_SUPPORTED -#define PNG_WRITE_iCCP_SUPPORTED -#define PNG_WRITE_INTERLACING_SUPPORTED -#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED -#define PNG_WRITE_INVERT_ALPHA_SUPPORTED -#define PNG_WRITE_INVERT_SUPPORTED -#define PNG_WRITE_iTXt_SUPPORTED -#define PNG_WRITE_oFFs_SUPPORTED -#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED -#define PNG_WRITE_PACK_SUPPORTED -#define PNG_WRITE_PACKSWAP_SUPPORTED -#define PNG_WRITE_pCAL_SUPPORTED -#define PNG_WRITE_pHYs_SUPPORTED -#define PNG_WRITE_sBIT_SUPPORTED -#define PNG_WRITE_sCAL_SUPPORTED -#define PNG_WRITE_SHIFT_SUPPORTED -#define PNG_WRITE_sPLT_SUPPORTED -#define PNG_WRITE_sRGB_SUPPORTED -#define PNG_WRITE_SUPPORTED -#define PNG_WRITE_SWAP_ALPHA_SUPPORTED -#define PNG_WRITE_SWAP_SUPPORTED -#define PNG_WRITE_tEXt_SUPPORTED -#define PNG_WRITE_TEXT_SUPPORTED -#define PNG_WRITE_tIME_SUPPORTED -#define PNG_WRITE_TRANSFORMS_SUPPORTED -#define PNG_WRITE_tRNS_SUPPORTED -#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_WRITE_USER_TRANSFORM_SUPPORTED -#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#define PNG_WRITE_zTXt_SUPPORTED -#define PNG_zTXt_SUPPORTED +#define PNG_ERROR_TEXT_SUPPORTED 1 +#define PNG_READ_SUPPORTED 1 +#define PNG_BENIGN_ERRORS_SUPPORTED 1 +#define PNG_SETJMP_SUPPORTED 1 +#define PNG_TIME_RFC1123_SUPPORTED 1 +#define PNG_WRITE_FLUSH_SUPPORTED 1 +#define PNG_MNG_FEATURES_SUPPORTED 1 +/*#undef PNG_SAFE_LIMITS_SUPPORTED*/ +#define PNG_FLOATING_POINT_SUPPORTED 1 +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED 1 +#define PNG_INCH_CONVERSIONS_SUPPORTED 1 +#define PNG_STDIO_SUPPORTED 1 +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 1 +#define PNG_USER_MEM_SUPPORTED 1 +#define PNG_IO_STATE_SUPPORTED 1 +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED 1 +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED 1 +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED 1 +#define PNG_WRITE_FILTER_SUPPORTED 1 +#define PNG_WRITE_zTXt_SUPPORTED 1 +#define PNG_WRITE_iCCP_SUPPORTED 1 +#define PNG_READ_TRANSFORMS_SUPPORTED 1 +#define PNG_READ_bKGD_SUPPORTED 1 +#define PNG_UNKNOWN_CHUNKS_SUPPORTED 1 +#define PNG_READ_sCAL_SUPPORTED 1 +#define PNG_WRITE_hIST_SUPPORTED 1 +#define PNG_READ_OPT_PLTE_SUPPORTED 1 +#define PNG_WRITE_gAMA_SUPPORTED 1 +#define PNG_READ_GRAY_TO_RGB_SUPPORTED 1 +#define PNG_WRITE_pCAL_SUPPORTED 1 +#define PNG_READ_INVERT_ALPHA_SUPPORTED 1 +#define PNG_WRITE_TRANSFORMS_SUPPORTED 1 +#define PNG_READ_ALPHA_MODE_SUPPORTED 1 +#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED 1 +#define PNG_READ_sBIT_SUPPORTED 1 +#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED 1 +#define PNG_READ_PACK_SUPPORTED 1 +#define PNG_WRITE_iTXt_SUPPORTED 1 +#define PNG_WRITE_SWAP_SUPPORTED 1 +#define PNG_READ_cHRM_SUPPORTED 1 +#define PNG_READ_STRIP_16_TO_8_SUPPORTED 1 +#define PNG_WRITE_tIME_SUPPORTED 1 +#define PNG_READ_INTERLACING_SUPPORTED 1 +#define PNG_READ_tRNS_SUPPORTED 1 +#define PNG_WRITE_pHYs_SUPPORTED 1 +#define PNG_WRITE_INVERT_SUPPORTED 1 +#define PNG_READ_RGB_TO_GRAY_SUPPORTED 1 +#define PNG_WRITE_sRGB_SUPPORTED 1 +#define PNG_READ_oFFs_SUPPORTED 1 +#define PNG_WRITE_FILLER_SUPPORTED 1 +#define PNG_WRITE_SHIFT_SUPPORTED 1 +#define PNG_PROGRESSIVE_READ_SUPPORTED 1 +#define PNG_READ_SHIFT_SUPPORTED 1 +#define PNG_CONVERT_tIME_SUPPORTED 1 +#define PNG_READ_USER_TRANSFORM_SUPPORTED 1 +#define PNG_READ_INT_FUNCTIONS_SUPPORTED 1 +#define PNG_READ_USER_CHUNKS_SUPPORTED 1 +#define PNG_READ_hIST_SUPPORTED 1 +#define PNG_READ_16BIT_SUPPORTED 1 +#define PNG_READ_SWAP_ALPHA_SUPPORTED 1 +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED 1 +#define PNG_SEQUENTIAL_READ_SUPPORTED 1 +#define PNG_READ_BACKGROUND_SUPPORTED 1 +#define PNG_READ_QUANTIZE_SUPPORTED 1 +#define PNG_READ_zTXt_SUPPORTED 1 +#define PNG_USER_LIMITS_SUPPORTED 1 +#define PNG_READ_iCCP_SUPPORTED 1 +#define PNG_READ_STRIP_ALPHA_SUPPORTED 1 +#define PNG_READ_PACKSWAP_SUPPORTED 1 +#define PNG_READ_sRGB_SUPPORTED 1 +#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED 1 +#define PNG_READ_pCAL_SUPPORTED 1 +#define PNG_WRITE_sPLT_SUPPORTED 1 +#define PNG_READ_iTXt_SUPPORTED 1 +#define PNG_READ_SWAP_SUPPORTED 1 +#define PNG_READ_tIME_SUPPORTED 1 +#define PNG_READ_pHYs_SUPPORTED 1 +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED 1 +#define PNG_READ_SCALE_16_TO_8_SUPPORTED 1 +#define PNG_WRITE_BGR_SUPPORTED 1 +#define PNG_USER_CHUNKS_SUPPORTED 1 +#define PNG_CONSOLE_IO_SUPPORTED 1 +#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED 1 +#define PNG_WRITE_PACK_SUPPORTED 1 +#define PNG_READ_FILLER_SUPPORTED 1 +#define PNG_WRITE_bKGD_SUPPORTED 1 +#define PNG_WRITE_tRNS_SUPPORTED 1 +#define PNG_READ_sPLT_SUPPORTED 1 +#define PNG_WRITE_sCAL_SUPPORTED 1 +#define PNG_WRITE_oFFs_SUPPORTED 1 +#define PNG_SET_USER_LIMITS_SUPPORTED 1 +#define PNG_WRITE_sBIT_SUPPORTED 1 +#define PNG_READ_INVERT_SUPPORTED 1 +#define PNG_WRITE_cHRM_SUPPORTED 1 +#define PNG_16BIT_SUPPORTED 1 +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED 1 +#define PNG_READ_BGR_SUPPORTED 1 +#define PNG_WRITE_PACKSWAP_SUPPORTED 1 +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED 1 +#define PNG_sCAL_SUPPORTED 1 +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED 1 +#define PNG_READ_GAMMA_SUPPORTED 1 +#define PNG_USER_TRANSFORM_INFO_SUPPORTED 1 +#define PNG_sBIT_SUPPORTED 1 +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED 1 +#define PNG_cHRM_SUPPORTED 1 +#define PNG_bKGD_SUPPORTED 1 +#define PNG_tRNS_SUPPORTED 1 +#define PNG_oFFs_SUPPORTED 1 +#define PNG_READ_EXPAND_16_SUPPORTED 1 +#define PNG_USER_TRANSFORM_PTR_SUPPORTED 1 +#define PNG_WRITE_TEXT_SUPPORTED 1 +#define PNG_READ_COMPRESSED_TEXT_SUPPORTED 1 +#define PNG_hIST_SUPPORTED 1 +#define PNG_zTXt_SUPPORTED 1 +#define PNG_iCCP_SUPPORTED 1 +#define PNG_sRGB_SUPPORTED 1 +#define PNG_pCAL_SUPPORTED 1 +#define PNG_WRITE_tEXt_SUPPORTED 1 +#define PNG_CHECK_cHRM_SUPPORTED 1 +#define PNG_READ_gAMA_SUPPORTED 1 +#define PNG_iTXt_SUPPORTED 1 +#define PNG_tIME_SUPPORTED 1 +#define PNG_READ_EXPAND_SUPPORTED 1 +#define PNG_pHYs_SUPPORTED 1 +#define PNG_READ_TEXT_SUPPORTED 1 +#define PNG_SAVE_INT_32_SUPPORTED 1 +#define PNG_sPLT_SUPPORTED 1 +#define PNG_READ_tEXt_SUPPORTED 1 +#define PNG_gAMA_SUPPORTED 1 +#define PNG_TEXT_SUPPORTED 1 +#define PNG_tEXt_SUPPORTED 1 /* end of options */ #endif /* PNGLCONF_H */ diff --git a/ExternalLibs/glpng/png/pngpread.c b/ExternalLibs/glpng/png/pngpread.c index ca7607a..39f8f6f 100644 --- a/ExternalLibs/glpng/png/pngpread.c +++ b/ExternalLibs/glpng/png/pngpread.c @@ -1,8 +1,8 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -128,30 +128,6 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr) break; } -#ifdef PNG_READ_tEXt_SUPPORTED - case PNG_READ_tEXt_MODE: - { - png_push_read_tEXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_zTXt_SUPPORTED - case PNG_READ_zTXt_MODE: - { - png_push_read_zTXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_iTXt_SUPPORTED - case PNG_READ_iTXt_MODE: - { - png_push_read_iTXt(png_ptr, info_ptr); - break; - } - -#endif case PNG_SKIP_MODE: { png_push_crc_finish(png_ptr); @@ -176,7 +152,7 @@ void /* PRIVATE */ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) { png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; + num_to_check = 8 - num_checked; if (png_ptr->buffer_size < num_to_check) { @@ -196,6 +172,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } + else { if (png_ptr->sig_bytes >= 8) @@ -305,8 +282,8 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_error(png_ptr, "Missing PLTE before IDAT"); } } - #endif + else if (chunk_name == png_PLTE) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -543,7 +520,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -556,7 +533,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -569,10 +546,11 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif + else { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -580,7 +558,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_push_save_buffer(png_ptr); return; } - png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); } png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; @@ -620,6 +598,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (png_ptr->skip_length && png_ptr->current_buffer_size) { png_size_t save_size = png_ptr->current_buffer_size; @@ -641,6 +620,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->skip_length) { if (png_ptr->buffer_size < 4) @@ -663,6 +643,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) return; ptr = buffer; + if (png_ptr->save_buffer_size) { png_size_t save_size; @@ -680,6 +661,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (length && png_ptr->current_buffer_size) { png_size_t save_size; @@ -709,6 +691,7 @@ png_push_save_buffer(png_structp png_ptr) png_bytep dp; istop = png_ptr->save_buffer_size; + for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; i < istop; i++, sp++, dp++) { @@ -716,6 +699,7 @@ png_push_save_buffer(png_structp png_ptr) } } } + if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > png_ptr->save_buffer_max) { @@ -730,8 +714,7 @@ png_push_save_buffer(png_structp png_ptr) new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; old_buffer = png_ptr->save_buffer; - png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, - (png_size_t)new_max); + png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, new_max); if (png_ptr->save_buffer == NULL) { @@ -743,6 +726,7 @@ png_push_save_buffer(png_structp png_ptr) png_free(png_ptr, old_buffer); png_ptr->save_buffer_max = new_max; } + if (png_ptr->current_buffer_size) { png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, @@ -750,6 +734,7 @@ png_push_save_buffer(png_structp png_ptr) png_ptr->save_buffer_size += png_ptr->current_buffer_size; png_ptr->current_buffer_size = 0; } + png_ptr->save_buffer_ptr = png_ptr->save_buffer; png_ptr->buffer_size = 0; } @@ -851,6 +836,7 @@ png_push_read_IDAT(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->idat_size) { if (png_ptr->buffer_size < 4) @@ -1201,6 +1187,7 @@ png_push_process_row(png_structp png_ptr) void /* PRIVATE */ png_read_push_finish_row(png_structp png_ptr) { +#ifdef PNG_READ_INTERLACING_SUPPORTED /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* Start of interlace block */ @@ -1219,6 +1206,7 @@ png_read_push_finish_row(png_structp png_ptr) * it, uncomment it here and in png.h static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; */ +#endif png_ptr->row_number++; if (png_ptr->row_number < png_ptr->num_rows) @@ -1262,525 +1250,6 @@ png_read_push_finish_row(png_structp png_ptr) #endif /* PNG_READ_INTERLACING_SUPPORTED */ } -#ifdef PNG_READ_tEXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place tEXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_tEXt_MODE; -} - -void /* PRIVATE */ -png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - png_ptr->current_text = NULL; - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place zTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - /* We can't handle zTXt chunks > 64K, since we don't have enough space - * to be able to store the uncompressed data. Actually, the threshold - * is probably around 32K, but it isn't as definite as 64K is. - */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_push_crc_skip(png_ptr, length); - return; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_zTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - png_size_t text_size, key_size; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - /* zTXt can't have zero text */ - if (text >= key + png_ptr->current_text_size) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - png_ptr->zstream.next_in = (png_bytep)text; - png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - key_size = text - key; - text_size = 0; - text = NULL; - ret = Z_STREAM_END; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) - { - if (text == NULL) - { - text = (png_charp)png_malloc(png_ptr, - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + key_size + 1)); - - png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - png_memcpy(text, key, key_size); - - text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; - - *(text + text_size) = '\0'; - } - - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc(png_ptr, text_size + - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + 1)); - - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - - png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - - if (ret != Z_STREAM_END) - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else - { - break; - } - - if (ret == Z_STREAM_END) - break; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (ret != Z_STREAM_END) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - png_ptr->current_text = NULL; - png_free(png_ptr, key); - key = text; - text += key_size; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place iTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_iTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) -{ - - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp key; - int comp_flag; - png_charp lang; - png_charp lang_key; - png_charp text; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (lang = key; *lang; lang++) - /* Empty loop */ ; - - if (lang < key + png_ptr->current_text_size - 3) - lang++; - - comp_flag = *lang++; - lang++; /* Skip comp_type, always zero */ - - for (lang_key = lang; *lang_key; lang_key++) - /* Empty loop */ ; - - lang_key++; /* Skip NUL separator */ - - text=lang_key; - - if (lang_key < key + png_ptr->current_text_size - 1) - { - for (; *text; text++) - /* Empty loop */ ; - } - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - - text_ptr->compression = comp_flag + 2; - text_ptr->key = key; - text_ptr->lang = lang; - text_ptr->lang_key = lang_key; - text_ptr->text = text; - text_ptr->text_length = 0; - text_ptr->itxt_length = png_strlen(text); - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_ptr->current_text = NULL; - - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to store iTXt chunk"); - } -} -#endif - -/* This function is called when we haven't found a handler for this - * chunk. If there isn't a problem with the chunk itself (ie a bad chunk - * name or a critical chunk), the chunk is (currently) silently ignored. - */ -void /* PRIVATE */ -png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - png_uint_32 skip = 0; - png_uint_32 chunk_name = png_ptr->chunk_name; - - if (PNG_CHUNK_CRITICAL(chunk_name)) - { -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - } - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - /* TODO: the code below is apparently just using the - * png_struct::unknown_chunk member as a temporarily variable, it should be - * possible to eliminate both it and the temporary buffer. - */ - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { -#ifdef PNG_MAX_MALLOC_64K - if (length > 65535) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - 65535; - length = 65535; - } -#endif - /* This is just a record for the user; libpng doesn't use the character - * form of the name. - */ - PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name); - - /* The following cast should be safe because of the check above. */ - png_ptr->unknown_chunk.size = (png_size_t)length; - - if (length == 0) - png_ptr->unknown_chunk.data = NULL; - - else - { - png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, - png_ptr->unknown_chunk.size); - png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, - png_ptr->unknown_chunk.size); - } - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - if (png_ptr->read_user_chunk_fn != NULL) - { - /* Callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - - if (ret == 0) - { - if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } - - else -#endif - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - - else -#endif - skip=length; - png_push_crc_skip(png_ptr, skip); -} - void /* PRIVATE */ png_push_have_info(png_structp png_ptr, png_infop info_ptr) { diff --git a/ExternalLibs/glpng/png/pngpriv.h b/ExternalLibs/glpng/png/pngpriv.h index 5f751de..a76c262 100644 --- a/ExternalLibs/glpng/png/pngpriv.h +++ b/ExternalLibs/glpng/png/pngpriv.h @@ -2,11 +2,11 @@ /* pngpriv.h - private declarations for use inside libpng * * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.7 [December 15, 2011] + * Last changed in libpng 1.5.10 [March 29, 2012] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -133,6 +133,46 @@ # define PNG_DLL_EXPORT #endif +/* SECURITY and SAFETY: + * + * By default libpng is built without any internal limits on image size, + * individual heap (png_malloc) allocations or the total amount of memory used. + * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used + * (unless individually overridden). These limits are believed to be fairly + * safe, but builders of secure systems should verify the values against the + * real system capabilities. + */ + +#ifdef PNG_SAFE_LIMITS_SUPPORTED + /* 'safe' limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000 +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000 +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 128 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 8000000 +# endif +#else + /* values for no limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 0x7fffffff +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 0x7fffffff +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 0 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 0 +# endif +#endif + /* This is used for 16 bit gamma tables - only the top level pointers are const, * this could be changed: */ @@ -426,6 +466,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ +#define PNG_HAVE_iCCP 0x4000 /* Flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 @@ -1218,10 +1259,8 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); -#endif PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_uint_32 chunk_name)); @@ -1355,6 +1394,13 @@ PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr, int color_type, int interlace_type, int compression_type, int filter_type)); +/* Added at libpng version 1.5.10 */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXTERN void png_do_check_palette_indexes PNGARG((png_structp png_ptr, + png_row_infop row_info)); +#endif + /* Free all memory used by the read (old method - NOT DLL EXPORTED) */ PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); @@ -1536,7 +1582,7 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr, #define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT) #define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK) #define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK) - + /* The actual parser. This can be called repeatedly, it updates * the index into the string and the state variable (which must * be initialzed to 0). It returns a result code, as above. There diff --git a/ExternalLibs/glpng/png/pngread.c b/ExternalLibs/glpng/png/pngread.c index e2641d5..96a2a56 100644 --- a/ExternalLibs/glpng/png/pngread.c +++ b/ExternalLibs/glpng/png/pngread.c @@ -1,8 +1,8 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -67,15 +67,11 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->user_width_max = PNG_USER_WIDTH_MAX; png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; -# ifdef PNG_USER_CHUNK_CACHE_MAX /* Added at libpng-1.2.43 and 1.4.0 */ png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; -# endif -# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX /* Added at libpng-1.2.43 and 1.4.1 */ png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; -# endif #endif #ifdef PNG_SETJMP_SUPPORTED @@ -805,6 +801,13 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Report invalid palette index; added at libng-1.5.10 */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max > png_ptr->num_palette) + png_benign_error(png_ptr, "Read palette index exceeding num_palette"); +#endif + do { png_uint_32 length = png_read_chunk_header(png_ptr); @@ -1070,12 +1073,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_free(png_ptr, png_ptr->save_buffer); #endif -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -#ifdef PNG_TEXT_SUPPORTED - png_free(png_ptr, png_ptr->current_text); -#endif /* PNG_TEXT_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - /* Save the important info out of the png_struct, in case it is * being used again. */ diff --git a/ExternalLibs/glpng/png/pngrtran.c b/ExternalLibs/glpng/png/pngrtran.c index 26083a0..8fe6dad 100644 --- a/ExternalLibs/glpng/png/pngrtran.c +++ b/ExternalLibs/glpng/png/pngrtran.c @@ -1,8 +1,8 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -1770,8 +1770,8 @@ png_init_read_transformations(png_structp png_ptr) int num_palette = png_ptr->num_palette; int i; - /*NOTE: there are other transformations that should probably be in here - * too. + /* NOTE: there are other transformations that should probably be in + * here too. */ for (i = 0; i < num_palette; i++) { @@ -1830,12 +1830,15 @@ png_init_read_transformations(png_structp png_ptr) #ifdef PNG_READ_SHIFT_SUPPORTED if ((png_ptr->transformations & PNG_SHIFT) && + !(png_ptr->transformations & PNG_EXPAND) && (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) { int i; int istop = png_ptr->num_palette; int shift = 8 - png_ptr->sig_bit.red; + png_ptr->transformations &= ~PNG_SHIFT; + /* significant bits can be in the range 1 to 7 for a meaninful result, if * the number of significant bits is 0 then no shift is done (this is an * error condition which is silently ignored.) @@ -2274,7 +2277,7 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /*NOTE: moved here in 1.5.4 (from much later in this list.) */ + /* NOTE: moved here in 1.5.4 (from much later in this list.) */ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); @@ -2296,6 +2299,13 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) png_do_unpack(row_info, png_ptr->row_buf + 1); #endif +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Added at libpng-1.5.10 */ + if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max >= 0) + png_do_check_palette_indexes(png_ptr, row_info); +#endif + #ifdef PNG_READ_BGR_SUPPORTED if (png_ptr->transformations & PNG_BGR) png_do_bgr(row_info, png_ptr->row_buf + 1); @@ -3293,7 +3303,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) if (red != green || red != blue) { rgb_error |= 1; - /*NOTE: this is the historical approach which simply + /* NOTE: this is the historical approach which simply * truncates the results. */ *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); diff --git a/ExternalLibs/glpng/png/pngrutil.c b/ExternalLibs/glpng/png/pngrutil.c index 62e9632..b9c3905 100644 --- a/ExternalLibs/glpng/png/pngrutil.c +++ b/ExternalLibs/glpng/png/pngrutil.c @@ -1,8 +1,8 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -432,15 +432,16 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, /* Now check the limits on this chunk - if the limit fails the * compressed data will be removed, the prefix will remain. */ -#ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED - if (png_ptr->user_chunk_malloc_max && + if (prefix_size >= (~(png_size_t)0) - 1 || + expanded_size >= (~(png_size_t)0) - 1 - prefix_size +#ifdef PNG_USER_LIMITS_SUPPORTED + || (png_ptr->user_chunk_malloc_max && (prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1)) #else -# ifdef PNG_USER_CHUNK_MALLOC_MAX - if ((PNG_USER_CHUNK_MALLOC_MAX > 0) && + || ((PNG_USER_CHUNK_MALLOC_MAX > 0) && prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1) -# endif #endif + ) png_warning(png_ptr, "Exceeded size limit while expanding chunk"); /* If the size is zero either there was an error and a message @@ -448,12 +449,7 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, * and we have nothing to do - the code will exit through the * error case below. */ -#if defined(PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED) || \ - defined(PNG_USER_CHUNK_MALLOC_MAX) else if (expanded_size > 0) -#else - if (expanded_size > 0) -#endif { /* Success (maybe) - really uncompress the chunk. */ png_size_t new_size = 0; @@ -1261,13 +1257,16 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place iCCP chunk"); - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + if ((png_ptr->mode & PNG_HAVE_iCCP) || (info_ptr != NULL && + (info_ptr->valid & (PNG_INFO_iCCP|PNG_INFO_sRGB)))) { png_warning(png_ptr, "Duplicate iCCP chunk"); png_crc_finish(png_ptr, length); return; } + png_ptr->mode |= PNG_HAVE_iCCP; + #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { @@ -1279,7 +1278,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, skip)) @@ -1429,7 +1428,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a * potential breakage point if the types in pngconf.h aren't exactly right. */ - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, skip)) @@ -1797,16 +1796,16 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - num = length / 2 ; - - if (num != (unsigned int)png_ptr->num_palette || num > - (unsigned int)PNG_MAX_PALETTE_LENGTH) + if (length > 2*PNG_MAX_PALETTE_LENGTH || + length != (unsigned int) (2*png_ptr->num_palette)) { png_warning(png_ptr, "Incorrect hIST chunk length"); png_crc_finish(png_ptr, length); return; } + num = length / 2 ; + for (i = 0; i < num; i++) { png_byte buf[2]; @@ -1956,7 +1955,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, 0)) @@ -2105,7 +2104,7 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ @@ -2265,7 +2264,7 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, skip)) @@ -2373,7 +2372,7 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, 0)) @@ -2504,7 +2503,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - slength = (png_size_t)length; + slength = length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); if (png_crc_finish(png_ptr, 0)) @@ -3707,7 +3706,7 @@ png_init_filter_functions_neon(png_structp pp, unsigned int bpp) { pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon; pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon; - pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = + pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth3_neon; } diff --git a/ExternalLibs/glpng/png/pngset.c b/ExternalLibs/glpng/png/pngset.c index e753ca8..fc99f5f 100644 --- a/ExternalLibs/glpng/png/pngset.c +++ b/ExternalLibs/glpng/png/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -149,7 +149,7 @@ png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point * possible for 1/gamma to overflow the limit of 21474 and this means the * gamma value must be at least 5/100000 and hence at most 20000.0. For * safety the limits here are a little narrower. The values are 0.00016 to - * 6250.0, which are truly ridiculous gammma values (and will produce + * 6250.0, which are truly ridiculous gamma values (and will produce * displays that are all black or all white.) */ if (file_gamma < 16 || file_gamma > 625000000) @@ -692,24 +692,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, */ if (info_ptr->num_text + num_text > info_ptr->max_text) { + int old_max_text = info_ptr->max_text; + int old_num_text = info_ptr->num_text; + if (info_ptr->text != NULL) { png_textp old_text; - int old_max; - old_max = info_ptr->max_text; info_ptr->max_text = info_ptr->num_text + num_text + 8; old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) { - png_free(png_ptr, old_text); + /* Restore to previous condition */ + info_ptr->max_text = old_max_text; + info_ptr->text = old_text; return(1); } - png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text * png_sizeof(png_text))); png_free(png_ptr, old_text); } @@ -721,7 +725,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) + { + /* Restore to previous condition */ + info_ptr->num_text = old_num_text; + info_ptr->max_text = old_max_text; return(1); + } info_ptr->free_me |= PNG_FREE_TEXT; } @@ -1281,4 +1290,22 @@ png_set_benign_errors(png_structp png_ptr, int allowed) png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; } #endif /* PNG_BENIGN_ERRORS_SUPPORTED */ + +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +/* Whether to report invalid palette index; added at libng-1.5.10 + * allowed - one of 0: disable; 1: enable + */ +void PNGAPI +png_set_check_for_invalid_index(png_structp png_ptr, int allowed) +{ + png_debug(1, "in png_set_check_for_invalid_index"); + + if (allowed) + png_ptr->num_palette_max = 0; + + else + png_ptr->num_palette_max = -1; +} +#endif + #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/ExternalLibs/glpng/png/pngstruct.h b/ExternalLibs/glpng/png/pngstruct.h index 4466b04..73d7114 100644 --- a/ExternalLibs/glpng/png/pngstruct.h +++ b/ExternalLibs/glpng/png/pngstruct.h @@ -1,11 +1,11 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.5 [September 22, 2011] + * Last changed in libpng 1.5.9 [February 18, 2012] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -121,6 +121,12 @@ struct png_struct_def png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ + +/* Added at libpng-1.5.10 */ +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED + int num_palette_max; /* maximum palette index found in IDAT */ +#endif + png_uint_16 num_trans; /* number of transparency values */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ @@ -211,13 +217,6 @@ struct png_struct_def int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ -# ifdef PNG_TEXT_SUPPORTED - png_size_t current_text_size; /* current size of text input data */ - png_size_t current_text_left; /* how much text left to read in input */ - png_charp current_text; /* current text chunk buffer */ - png_charp current_text_ptr; /* current location in current_text */ -# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ - #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) @@ -249,6 +248,7 @@ struct png_struct_def #endif #ifdef PNG_TIME_RFC1123_SUPPORTED + /* This is going to be unused in libpng16 and removed from libpng17 */ char time_buffer[29]; /* String to hold RFC 1123 time text */ #endif @@ -283,9 +283,7 @@ struct png_struct_def #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ - defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +#if defined(PNG_MNG_FEATURES_SUPPORTED) /* Changed from png_byte to png_uint_32 at version 1.2.0 */ png_uint_32 mng_features_permitted; #endif diff --git a/ExternalLibs/glpng/png/pngtrans.c b/ExternalLibs/glpng/png/pngtrans.c index 53d9a25..d562eb0 100644 --- a/ExternalLibs/glpng/png/pngtrans.c +++ b/ExternalLibs/glpng/png/pngtrans.c @@ -1,8 +1,8 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.5.4 [July 7, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -619,6 +619,109 @@ png_do_bgr(png_row_infop row_info, png_bytep row) } #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +/* Added at libpng-1.5.10 */ +void /* PRIVATE */ +png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info) +{ + if (png_ptr->num_palette < (1 << row_info->bit_depth) && + png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ + { + /* Calculations moved outside switch in an attempt to stop different + * compiler warnings. 'padding' is in *bits* within the last byte, it is + * an 'int' because pixel_depth becomes an 'int' in the expression below, + * and this calculation is used because it avoids warnings that other + * forms produced on either GCC or MSVC. + */ + int padding = (-row_info->pixel_depth * row_info->width) & 7; + png_bytep rp = png_ptr->row_buf + row_info->rowbytes; + + switch (row_info->bit_depth) + { + case 1: + { + /* in this case, all bytes must be 0 so we don't need + * to unpack the pixels except for the rightmost one. + */ + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp >> padding != 0) + png_ptr->num_palette_max = 1; + padding = 0; + } + + break; + } + + case 2: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 2) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 6) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 4: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 8: + { + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp > png_ptr->num_palette_max) + png_ptr->num_palette_max = (int) *rp; + } + + break; + } + + default: + break; + } + } +} +#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ + #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED From 1fdae0c128395074281a0cf4d74d5a855257bf8d Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 04:51:13 +0200 Subject: [PATCH 32/42] Replace #pragma once with #ifndef/#define pairs (to avoid warnings on gcc 2.95) --- Aquaria/AquariaMenuItem.h | 4 +++- Aquaria/AquariaProgressBar.h | 4 +++- Aquaria/AutoMap.h | 5 ++++- Aquaria/Avatar.h | 7 +++---- Aquaria/CollideEntity.h | 5 ++++- Aquaria/Entity.h | 4 +++- Aquaria/FlockEntity.h | 5 ++++- Aquaria/Game.h | 5 ++++- Aquaria/GridRender.h | 4 +++- Aquaria/Path.h | 4 +++- Aquaria/PathFinding.h | 5 +++-- Aquaria/SchoolFish.h | 4 +++- Aquaria/ScriptInterface.h | 5 ++++- Aquaria/ScriptedEntity.h | 6 +++++- Aquaria/Segmented.h | 4 +++- Aquaria/Shot.h | 4 +++- Aquaria/StatsAndAchievements.h | 5 +++-- Aquaria/TileVector.h | 4 +++- Aquaria/ToolTip.h | 5 +++-- Aquaria/UserSettings.h | 5 ++++- Aquaria/WaterFont.h | 4 +++- Aquaria/WaterSurfaceRender.h | 5 +++-- Aquaria/Web.h | 4 +++- BBGE/ActionInput.h | 5 ++++- BBGE/ActionSet.h | 5 ++++- BBGE/Base.h | 5 ++++- BBGE/BitmapFont.h | 4 +++- BBGE/BloomEffect.h | 4 +++- BBGE/Collision.h | 4 +++- BBGE/CommonEvents.h | 5 ++++- BBGE/DarkLayer.h | 4 +++- BBGE/DebugFont.h | 4 +++- BBGE/Effects.h | 4 +++- BBGE/FileVars.h | 5 ++++- BBGE/Flags.h | 4 +++- BBGE/FrameBuffer.h | 4 +++- BBGE/Gradient.h | 5 ++++- BBGE/LensFlare.h | 5 ++++- BBGE/Model.h | 5 ++++- BBGE/PointSprites.h | 5 ++++- BBGE/Precacher.h | 5 ++++- BBGE/QuadTrail.h | 5 ++++- BBGE/Rect.h | 5 ++++- BBGE/RenderObject_inline.h | 5 ++++- BBGE/RoundedRect.h | 5 ++++- BBGE/ScreenTransition.h | 4 +++- BBGE/ScriptObject.h | 5 ++++- BBGE/Shader.h | 5 ++++- BBGE/SimpleIStringStream.h | 5 ++++- BBGE/SkeletalSprite.h | 6 ++++-- BBGE/SoundManager.h | 5 ++++- BBGE/TTFFont.h | 5 ++++- 52 files changed, 184 insertions(+), 60 deletions(-) diff --git a/Aquaria/AquariaMenuItem.h b/Aquaria/AquariaMenuItem.h index c9c4ad5..161142f 100644 --- a/Aquaria/AquariaMenuItem.h +++ b/Aquaria/AquariaMenuItem.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AQUARIAMENUITEM_H +#define AQUARIAMENUITEM_H #include "../BBGE/BitmapFont.h" #include "../BBGE/Quad.h" @@ -257,3 +258,4 @@ protected: }; */ +#endif diff --git a/Aquaria/AquariaProgressBar.h b/Aquaria/AquariaProgressBar.h index 6635c11..be0a5ad 100644 --- a/Aquaria/AquariaProgressBar.h +++ b/Aquaria/AquariaProgressBar.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AQUARIAPROGRESSBAR_H +#define AQUARIAPROGRESSBAR_H #include "../BBGE/Quad.h" @@ -34,3 +35,4 @@ protected: float perc; }; +#endif diff --git a/Aquaria/AutoMap.h b/Aquaria/AutoMap.h index 29c154c..365c621 100644 --- a/Aquaria/AutoMap.h +++ b/Aquaria/AutoMap.h @@ -18,7 +18,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AUTOMAP_H +#define AUTOMAP_H + #include "../BBGE/ActionMapper.h" #include "../BBGE/RenderObject.h" @@ -47,3 +49,4 @@ protected: void onRender(); }; +#endif diff --git a/Aquaria/Avatar.h b/Aquaria/Avatar.h index fbd1448..b4232f5 100644 --- a/Aquaria/Avatar.h +++ b/Aquaria/Avatar.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AVATAR_H +#define AVATAR_H #include "../BBGE/Particles.h" #include "../BBGE/BitmapFont.h" @@ -544,6 +545,4 @@ protected: }; - - - +#endif diff --git a/Aquaria/CollideEntity.h b/Aquaria/CollideEntity.h index b2d7997..0100aae 100644 --- a/Aquaria/CollideEntity.h +++ b/Aquaria/CollideEntity.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef COLLIDEENTITY_H +#define COLLIDEENTITY_H #include "Entity.h" @@ -41,3 +42,5 @@ protected: void bounce(float ba); }; + +#endif diff --git a/Aquaria/Entity.h b/Aquaria/Entity.h index 3f468f9..cc4d125 100644 --- a/Aquaria/Entity.h +++ b/Aquaria/Entity.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef ENTITY_H +#define ENTITY_H #include "../BBGE/AnimatedSprite.h" #include "../BBGE/StateMachine.h" @@ -606,3 +607,4 @@ private: }; +#endif diff --git a/Aquaria/FlockEntity.h b/Aquaria/FlockEntity.h index e60dfb9..aa68f69 100644 --- a/Aquaria/FlockEntity.h +++ b/Aquaria/FlockEntity.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef FLOCKENTITY_H +#define FLOCKENTITY_H #include "CollideEntity.h" @@ -67,3 +68,5 @@ protected: FlockEntity *nearestFlockMate; float nearestDistance; }; + +#endif diff --git a/Aquaria/Game.h b/Aquaria/Game.h index 29ee6b1..c7789ee 100644 --- a/Aquaria/Game.h +++ b/Aquaria/Game.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef GAME_H +#define GAME_H #include "../ExternalLibs/tinyxml.h" #include "../BBGE/DebugFont.h" @@ -1249,3 +1250,5 @@ bool Game::isObstructed(const TileVector &tile, int t /* = -1 */) const { return (getGrid(tile) & t); } + +#endif diff --git a/Aquaria/GridRender.h b/Aquaria/GridRender.h index 4fed0e1..52a2c2d 100644 --- a/Aquaria/GridRender.h +++ b/Aquaria/GridRender.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef GRIDRENDER_H +#define GRIDRENDER_H #include "../BBGE/Quad.h" @@ -150,3 +151,4 @@ protected: std::vector pts; }; +#endif diff --git a/Aquaria/Path.h b/Aquaria/Path.h index d863d89..b3369a2 100644 --- a/Aquaria/Path.h +++ b/Aquaria/Path.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AQ_PATH_H +#define AQ_PATH_H #include "../BBGE/Base.h" #include "../BBGE/Particles.h" @@ -149,3 +150,4 @@ public: void parseWarpNodeData(const std::string &dataString); }; +#endif diff --git a/Aquaria/PathFinding.h b/Aquaria/PathFinding.h index b44246f..fb82b42 100644 --- a/Aquaria/PathFinding.h +++ b/Aquaria/PathFinding.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef PATHFINDING_H +#define PATHFINDING_H #include "../BBGE/Base.h" //#include "Astar.h" @@ -803,7 +804,7 @@ private: // data }; - +#endif diff --git a/Aquaria/SchoolFish.h b/Aquaria/SchoolFish.h index 3512a54..53208c7 100644 --- a/Aquaria/SchoolFish.h +++ b/Aquaria/SchoolFish.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SCHOOLFISH_H +#define SCHOOLFISH_H #include "FlockEntity.h" @@ -50,3 +51,4 @@ protected: }; +#endif diff --git a/Aquaria/ScriptInterface.h b/Aquaria/ScriptInterface.h index 9fdb0f8..bf23dca 100644 --- a/Aquaria/ScriptInterface.h +++ b/Aquaria/ScriptInterface.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SCRIPTINTERFACE_H +#define SCRIPTINTERFACE_H #include "../BBGE/Base.h" @@ -101,3 +102,5 @@ protected: lua_State *baseState; }; + +#endif diff --git a/Aquaria/ScriptedEntity.h b/Aquaria/ScriptedEntity.h index ea67712..a838728 100644 --- a/Aquaria/ScriptedEntity.h +++ b/Aquaria/ScriptedEntity.h @@ -18,7 +18,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SCRIPTEDENTITY_H +#define SCRIPTEDENTITY_H + #include "CollideEntity.h" #include "Segmented.h" #include "Hair.h" @@ -112,3 +114,5 @@ protected: void onExitState(int action); virtual void deathNotify(RenderObject *r); }; + +#endif diff --git a/Aquaria/Segmented.h b/Aquaria/Segmented.h index b1fea06..c9fb81d 100644 --- a/Aquaria/Segmented.h +++ b/Aquaria/Segmented.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SEGMENTED_H +#define SEGMENTED_H #include "../BBGE/Quad.h" @@ -53,3 +54,4 @@ protected: void onRender(); }; +#endif diff --git a/Aquaria/Shot.h b/Aquaria/Shot.h index 9ead4a1..c94d911 100644 --- a/Aquaria/Shot.h +++ b/Aquaria/Shot.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SHOT_H +#define SHOT_H #include "CollideEntity.h" #include "Segmented.h" @@ -192,3 +193,4 @@ protected: void onEndOfLife(); }; +#endif diff --git a/Aquaria/StatsAndAchievements.h b/Aquaria/StatsAndAchievements.h index 3fc0b7c..5087d11 100644 --- a/Aquaria/StatsAndAchievements.h +++ b/Aquaria/StatsAndAchievements.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef STATS_ACH_H +#define STATS_ACH_H #ifdef BBGE_BUILD_ACHIEVEMENTS_INTERNAL #include @@ -172,4 +173,4 @@ private: */ }; - +#endif diff --git a/Aquaria/TileVector.h b/Aquaria/TileVector.h index b3620f0..cc25959 100644 --- a/Aquaria/TileVector.h +++ b/Aquaria/TileVector.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef TILEVECTOR_H +#define TILEVECTOR_H #include "../BBGE/Vector.h" @@ -55,3 +56,4 @@ public: int x,y; }; +#endif diff --git a/Aquaria/ToolTip.h b/Aquaria/ToolTip.h index e822c90..73095ed 100644 --- a/Aquaria/ToolTip.h +++ b/Aquaria/ToolTip.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef TOOLTIP_H +#define TOOLTIP_H #include "../BBGE/BitmapFont.h" #include "../BBGE/Quad.h" @@ -51,4 +52,4 @@ protected: Quad *back; }; - +#endif diff --git a/Aquaria/UserSettings.h b/Aquaria/UserSettings.h index e152033..50b6c3f 100644 --- a/Aquaria/UserSettings.h +++ b/Aquaria/UserSettings.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef USERSETTINGS_H +#define USERSETTINGS_H #include @@ -182,3 +183,5 @@ public: void save(); void apply(); }; + +#endif diff --git a/Aquaria/WaterFont.h b/Aquaria/WaterFont.h index 809063f..955603e 100644 --- a/Aquaria/WaterFont.h +++ b/Aquaria/WaterFont.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef WATERFONT_H +#define WATERFONT_H #include "../BBGE/BitmapFont.h" @@ -31,3 +32,4 @@ protected: void onUpdate(float dt); }; +#endif diff --git a/Aquaria/WaterSurfaceRender.h b/Aquaria/WaterSurfaceRender.h index ba4878d..e01f7fc 100644 --- a/Aquaria/WaterSurfaceRender.h +++ b/Aquaria/WaterSurfaceRender.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef WATERSURFACERENDER_H +#define WATERSURFACERENDER_H #include "../BBGE/Quad.h" @@ -32,4 +33,4 @@ protected: void onRender(); }; - +#endif diff --git a/Aquaria/Web.h b/Aquaria/Web.h index 7f4e9bc..78762d0 100644 --- a/Aquaria/Web.h +++ b/Aquaria/Web.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef AQ_WEB_H +#define AQ_WEB_H #include "../BBGE/Quad.h" #include "Entity.h" @@ -44,3 +45,4 @@ protected: void onRender(); }; +#endif diff --git a/BBGE/ActionInput.h b/BBGE/ActionInput.h index d45a9d1..a679204 100644 --- a/BBGE/ActionInput.h +++ b/BBGE/ActionInput.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef ACTIONINPUT_H +#define ACTIONINPUT_H #include #include @@ -53,3 +54,5 @@ enum InputSetType INPUTSET_MOUSE = 3, INPUTSET_OTHER = 4 }; + +#endif diff --git a/BBGE/ActionSet.h b/BBGE/ActionSet.h index 282ee03..3d9b9a4 100644 --- a/BBGE/ActionSet.h +++ b/BBGE/ActionSet.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef ACTIONSET_H +#define ACTIONSET_H #include #include @@ -47,3 +48,5 @@ public: std::string insertInputIntoString(const std::string &string); }; + +#endif diff --git a/BBGE/Base.h b/BBGE/Base.h index 345065c..586a944 100644 --- a/BBGE/Base.h +++ b/BBGE/Base.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_BASE_H +#define BBGE_BASE_H #ifdef BBGE_BUILD_WINDOWS @@ -296,3 +297,5 @@ void openURL(const std::string &url); std::string underscoresToSpaces(const std::string &str); std::string spacesToUnderscores(const std::string &str); + +#endif diff --git a/BBGE/BitmapFont.h b/BBGE/BitmapFont.h index a8264ff..0ddfe79 100644 --- a/BBGE/BitmapFont.h +++ b/BBGE/BitmapFont.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BITMAPFONT_H +#define BITMAPFONT_H //#include "DrawText.h" #include "RenderObject.h" @@ -101,3 +102,4 @@ protected: int textWidth; }; +#endif diff --git a/BBGE/BloomEffect.h b/BBGE/BloomEffect.h index 43d2208..19503b2 100644 --- a/BBGE/BloomEffect.h +++ b/BBGE/BloomEffect.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BLOOMEFFECT_H +#define BLOOMEFFECT_H #include "RenderObject.h" #include "FrameBuffer.h" @@ -44,3 +45,4 @@ protected: bool useFrameBuffer; }; +#endif diff --git a/BBGE/Collision.h b/BBGE/Collision.h index 09df967..2d06fa4 100644 --- a/BBGE/Collision.h +++ b/BBGE/Collision.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef COLLISION_H +#define COLLISION_H #include "Base.h" @@ -142,3 +143,4 @@ public: }; */ +#endif diff --git a/BBGE/CommonEvents.h b/BBGE/CommonEvents.h index 6d8703f..e435ab8 100644 --- a/BBGE/CommonEvents.h +++ b/BBGE/CommonEvents.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef COMMONEVENTS_H +#define COMMONEVENTS_H #include "Event.h" @@ -46,3 +47,5 @@ public: private: std::string state; }; + +#endif diff --git a/BBGE/DarkLayer.h b/BBGE/DarkLayer.h index 3d37d52..a571ea7 100644 --- a/BBGE/DarkLayer.h +++ b/BBGE/DarkLayer.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef DARKLAYER_H +#define DARKLAYER_H #include "Base.h" #include "FrameBuffer.h" @@ -52,3 +53,4 @@ protected: GLuint format; }; +#endif diff --git a/BBGE/DebugFont.h b/BBGE/DebugFont.h index 00ec72a..d11c17f 100644 --- a/BBGE/DebugFont.h +++ b/BBGE/DebugFont.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef DEBUGFONT_H +#define DEBUGFONT_H #include "Core.h" #include "BaseText.h" @@ -66,3 +67,4 @@ public: virtual void buttonPress(DebugButton *db){} }; +#endif diff --git a/BBGE/Effects.h b/BBGE/Effects.h index 418427f..debf7d0 100644 --- a/BBGE/Effects.h +++ b/BBGE/Effects.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef EFFECTS_H +#define EFFECTS_H #include "Vector.h" #include "Base.h" @@ -57,4 +58,5 @@ protected: bool enabled[FXT_MAX]; }; +#endif diff --git a/BBGE/FileVars.h b/BBGE/FileVars.h index 24c90d3..166181d 100644 --- a/BBGE/FileVars.h +++ b/BBGE/FileVars.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef FILEVARS_H +#define FILEVARS_H #include "Base.h" @@ -34,3 +35,5 @@ protected: std::map floats; std::map ints; }; + +#endif diff --git a/BBGE/Flags.h b/BBGE/Flags.h index da0142f..5eb304b 100644 --- a/BBGE/Flags.h +++ b/BBGE/Flags.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_FLAGS_H +#define BBGE_FLAGS_H #ifdef BBGE_BUILD_WINDOWS typedef unsigned __int32 uint32; @@ -44,3 +45,4 @@ public: uint32 flags; }; +#endif diff --git a/BBGE/FrameBuffer.h b/BBGE/FrameBuffer.h index 67636d7..105b290 100644 --- a/BBGE/FrameBuffer.h +++ b/BBGE/FrameBuffer.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef FRAMEBUFFER_H +#define FRAMEBUFFER_H #include "Base.h" @@ -57,3 +58,4 @@ protected: bool enabled, inited; }; +#endif diff --git a/BBGE/Gradient.h b/BBGE/Gradient.h index f145e2c..8d92d5d 100644 --- a/BBGE/Gradient.h +++ b/BBGE/Gradient.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef GRADIENT_H +#define GRADIENT_H #include "RenderObject.h" @@ -37,3 +38,5 @@ protected: void onRender(); Vector ulc0, ulc1, ulc2, ulc3; }; + +#endif diff --git a/BBGE/LensFlare.h b/BBGE/LensFlare.h index 5f75718..ed88bd3 100644 --- a/BBGE/LensFlare.h +++ b/BBGE/LensFlare.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef LENSFLARE_H +#define LENSFLARE_H #include "Quad.h" @@ -34,3 +35,5 @@ protected: void onUpdate(float dt); std::vector flares; }; + +#endif diff --git a/BBGE/Model.h b/BBGE/Model.h index e732210..3b78728 100644 --- a/BBGE/Model.h +++ b/BBGE/Model.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_MODEL_H +#define BBGE_MODEL_H #include "RenderObject.h" @@ -57,3 +58,5 @@ protected: float m_lodLevel; std::string m_path; }; + +#endif diff --git a/BBGE/PointSprites.h b/BBGE/PointSprites.h index c5cf695..d80ec3b 100644 --- a/BBGE/PointSprites.h +++ b/BBGE/PointSprites.h @@ -18,7 +18,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef POINTSPRITES_H +#define POINTSPRITES_H + #include "Base.h" #ifdef BBGE_BUILD_WINDOWS @@ -34,3 +36,4 @@ public: }; #endif +#endif diff --git a/BBGE/Precacher.h b/BBGE/Precacher.h index 92f032c..87e9a05 100644 --- a/BBGE/Precacher.h +++ b/BBGE/Precacher.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef PRECACHER_H +#define PRECACHER_H #include "Quad.h" @@ -37,3 +38,5 @@ private: bool cleaned; void (*loadProgressCallback)(); }; + +#endif diff --git a/BBGE/QuadTrail.h b/BBGE/QuadTrail.h index 5051e47..9f21c6b 100644 --- a/BBGE/QuadTrail.h +++ b/BBGE/QuadTrail.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef QUADTRAIL_H +#define QUADTRAIL_H #include "RenderObject.h" @@ -60,3 +61,5 @@ protected: void onRender(); void onUpdate(float dt); }; + +#endif diff --git a/BBGE/Rect.h b/BBGE/Rect.h index efd1f58..8b3b67b 100644 --- a/BBGE/Rect.h +++ b/BBGE/Rect.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_RECT_H +#define BBGE_RECT_H #include "Vector.h" @@ -70,3 +71,5 @@ public: } int x1, y1, x2, y2; }; + +#endif diff --git a/BBGE/RenderObject_inline.h b/BBGE/RenderObject_inline.h index f4b6916..2e7af29 100644 --- a/BBGE/RenderObject_inline.h +++ b/BBGE/RenderObject_inline.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef RENDEROBJECT_INLINE_H +#define RENDEROBJECT_INLINE_H inline bool RenderObject::isOnScreen() { @@ -70,3 +71,5 @@ Vector RenderObject::getFollowCameraPosition() const return pos; } } + +#endif diff --git a/BBGE/RoundedRect.h b/BBGE/RoundedRect.h index c494a6c..5a4309b 100644 --- a/BBGE/RoundedRect.h +++ b/BBGE/RoundedRect.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef ROUNDEDRECT_H +#define ROUNDEDRECT_H #include "RenderObject.h" #include "Event.h" @@ -67,3 +68,5 @@ protected: bool mbd; bool noNested; }; + +#endif diff --git a/BBGE/ScreenTransition.h b/BBGE/ScreenTransition.h index 23e3087..c4adc14 100644 --- a/BBGE/ScreenTransition.h +++ b/BBGE/ScreenTransition.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SCREENTRANSITION_H +#define SCREENTRANSITION_H #include "RenderObject.h" @@ -46,3 +47,4 @@ protected: #endif }; +#endif diff --git a/BBGE/ScriptObject.h b/BBGE/ScriptObject.h index 7847501..08cd693 100644 --- a/BBGE/ScriptObject.h +++ b/BBGE/ScriptObject.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SCRIPTOBJECT_H +#define SCRIPTOBJECT_H enum ScriptObjectType { @@ -79,3 +80,5 @@ public: // public to allow the static compile check in ScriptInterface.cpp to work ScriptObjectType _objtype; }; + +#endif diff --git a/BBGE/Shader.h b/BBGE/Shader.h index d3cd105..1eb4cd9 100644 --- a/BBGE/Shader.h +++ b/BBGE/Shader.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_SHADER_H +#define BBGE_SHADER_H #include "Base.h" @@ -52,3 +53,5 @@ protected: static bool _wasInited; static bool _useShaders; }; + +#endif diff --git a/BBGE/SimpleIStringStream.h b/BBGE/SimpleIStringStream.h index f323c04..25aa210 100644 --- a/BBGE/SimpleIStringStream.h +++ b/BBGE/SimpleIStringStream.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SIMPLEISTRINGSTREAM_H +#define SIMPLEISTRINGSTREAM_H /* * This class implements a lightweight version of the std::istringstream @@ -730,6 +731,8 @@ inline SimpleIStringStream &SimpleIStringStream::operator>>(std::string &target) #undef VERIFY_SETUP #undef VERIFY +#endif // SIMPLEISTRINGSTREAM_H + /*************************************************************************/ /*************************************************************************/ diff --git a/BBGE/SkeletalSprite.h b/BBGE/SkeletalSprite.h index 6d2165f..518f687 100644 --- a/BBGE/SkeletalSprite.h +++ b/BBGE/SkeletalSprite.h @@ -18,7 +18,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SKELETALSPRITE_H +#define SKELETALSPRITE_H + #include "Quad.h" #include "SimpleIStringStream.h" // for 2d system only @@ -273,4 +275,4 @@ protected: void onUpdate(float dt); }; - +#endif diff --git a/BBGE/SoundManager.h b/BBGE/SoundManager.h index 00da847..83f6b77 100644 --- a/BBGE/SoundManager.h +++ b/BBGE/SoundManager.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef SOUNDMANAGER_H +#define SOUNDMANAGER_H #include #include @@ -250,3 +251,5 @@ private: }; extern SoundManager *sound; + +#endif diff --git a/BBGE/TTFFont.h b/BBGE/TTFFont.h index c2fef01..48c1791 100644 --- a/BBGE/TTFFont.h +++ b/BBGE/TTFFont.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_TTFFONT_H +#define BBGE_TTFFONT_H #include "Base.h" #include "RenderObject.h" @@ -69,3 +70,5 @@ protected: TTFFont *font; int hw,h; }; + +#endif From 31930051d59cc2f4fd119e9dcc21747e1bb50a9a Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 05:30:47 +0200 Subject: [PATCH 33/42] More compile fixes for gcc 2.95 --- Aquaria/ScriptInterface.cpp | 2 + BBGE/Base.cpp | 2 +- BBGE/Vector.h | 61 +++++++++++++-------------- ExternalLibs/ByteBuffer.h | 84 +++++++++++++++++++++++++++---------- ExternalLibs/FileAPI.cpp | 2 +- 5 files changed, 96 insertions(+), 55 deletions(-) diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index da05ce7..303e3af 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -359,6 +359,7 @@ static void scriptError(lua_State *L, const std::string& msg) // memory location, be sure this is the case before running into undefined behavior later. // - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways. // If it does not compile for some reason, comment it out, hope for the best, and go ahead. +#if !(defined(__GNUC__) && __GNUC__ <= 2) void compile_time_assertions() { #define oo(cls) offsetof(cls, _objtype) @@ -377,6 +378,7 @@ void compile_time_assertions() compile_assert(oo(Path) == oo(BaseText)); #undef oo } +#endif template static void ensureType(lua_State *L, T *& ptr, ScriptObjectType ty) diff --git a/BBGE/Base.cpp b/BBGE/Base.cpp index 29ac097..ebaa09c 100644 --- a/BBGE/Base.cpp +++ b/BBGE/Base.cpp @@ -232,7 +232,7 @@ void stringToLowerUserData(std::string &s) const size_t len = userdata.length(); const bool match = (s.length() > len) && ((s[len] == '/') || (s[len] == '\\')) && - (userdata.compare(0, len, s, 0, len) == 0); + !strncmp(userdata.c_str(), s.c_str(), len); if (!match) stringToLower(s); else diff --git a/BBGE/Vector.h b/BBGE/Vector.h index b3be3ed..9cb705b 100644 --- a/BBGE/Vector.h +++ b/BBGE/Vector.h @@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#pragma once +#ifndef BBGE_VECTOR_H +#define BBGE_VECTOR_H #include #include @@ -64,13 +65,13 @@ public: } // vecector equality - const bool operator==(const Vector &vec) const + bool operator==(const Vector &vec) const { return ((x == vec.x) && (y == vec.y) && (z == vec.z)); } // vecector inequality - const bool operator!=(const Vector &vec) const + bool operator!=(const Vector &vec) const { return !(*this == vec); } @@ -106,10 +107,6 @@ public: { return Vector(-x, -y, -z); } - bool isZero() - { - return x == 0 && y == 0 && z == 0; - } // vector decrement const Vector &operator-=(const Vector& vec) @@ -201,12 +198,12 @@ public: return Vector(y*vec.z - z*vec.y, z*vec.x - x*vec.z, x*vec.y - y*vec.x); } - Vector inline getPerpendicularLeft() + inline Vector getPerpendicularLeft() { return Vector(-y, x); } - Vector inline getPerpendicularRight() + inline Vector getPerpendicularRight() { return Vector(y, -x); } @@ -218,41 +215,41 @@ public: } // dot product - const scalar_t inline dot(const Vector &vec) const + inline scalar_t dot(const Vector &vec) const { return x*vec.x + y*vec.y + z*vec.z; } - const scalar_t inline dot2D(const Vector &vec) const + inline scalar_t dot2D(const Vector &vec) const { return x*vec.x + y*vec.y; } // dot product - const scalar_t operator%(const Vector &vec) const + scalar_t operator%(const Vector &vec) const { return x*vec.x + y*vec.x + z*vec.z; } // length of vector - const scalar_t inline getLength3D() const + inline scalar_t getLength3D() const { return (scalar_t)sqrtf(x*x + y*y + z*z); } - const scalar_t inline getLength2D() const + inline scalar_t getLength2D() const { return (scalar_t)sqrtf(x*x + y*y); } // return the unit vector - const Vector inline unitVector3D() const + inline const Vector unitVector3D() const { return (*this) * (1/getLength3D()); } // normalize this vector - void inline normalize3D() + inline void normalize3D() { if (x == 0 && y == 0 && z == 0) { @@ -264,7 +261,7 @@ public: (*this) *= 1/getLength3D(); } } - void inline normalize2D() + inline void normalize2D() { if (x == 0 && y == 0) { @@ -277,7 +274,7 @@ public: } } - const scalar_t operator!() const + scalar_t operator!() const { return sqrtf(x*x + y*y + z*z); } @@ -297,7 +294,7 @@ public: } */ - void inline setLength3D(const float l) + inline void setLength3D(const float l) { // IGNORE !! if (l == 0) @@ -312,7 +309,7 @@ public: this->z *= (l/len); } } - void inline setLength2D(const float l) + inline void setLength2D(const float l) { float len = getLength2D(); if (len == 0) @@ -328,24 +325,24 @@ public: } // return angle between two vectors - const float inline Angle(const Vector& normal) const + inline scalar_t Angle(const Vector& normal) const { return acosf(*this % normal); } /* - const scalar_t inline cheatLen() const + inline scalar_t cheatLen() const { return (x*x + y*y + z*z); } - const scalar_t inline cheatLen2D() const + inline scalar_t cheatLen2D() const { return (x*x + y*y); } - const scalar_t inline getCheatLength3D() const; + inline scalar_t getCheatLength3D() const; */ - const bool inline isLength2DIn(float radius) const + inline bool isLength2DIn(float radius) const { return (x*x + y*y) <= (radius*radius); } @@ -359,20 +356,20 @@ public: } */ - const void inline setZero() + inline void setZero() { this->x = this->y = this->z = 0; } - const float inline getSquaredLength2D() const + inline scalar_t getSquaredLength2D() const { return (x*x) + (y*y); } - const bool inline isZero() const + inline bool isZero() const { return x==0 && y==0 && z==0; } - const bool inline isNan() const + inline bool isNan() const { #ifdef BBGE_BUILD_WINDOWS return _isnan(x) || _isnan(y) || _isnan(z); @@ -383,11 +380,11 @@ public: #endif } - void inline capLength2D(const float l) + inline void capLength2D(const float l) { if (!isLength2DIn(l)) setLength2D(l); } - void inline capRotZ360() + inline void capRotZ360() { while (z > 360) z -= 360; @@ -573,3 +570,5 @@ public: Vector getRotatedVector(const Vector &vec, float rot); Vector lerp(const Vector &v1, const Vector &v2, float dt, int lerpType); + +#endif // BBGE_VECTOR_H diff --git a/ExternalLibs/ByteBuffer.h b/ExternalLibs/ByteBuffer.h index 377eede..8f8897b 100644 --- a/ExternalLibs/ByteBuffer.h +++ b/ExternalLibs/ByteBuffer.h @@ -6,6 +6,12 @@ #include #include +#if defined(__GNUC__) && __GNUC__ <= 2 +# define BB_OLD_GNUC +# include +#endif + + // ** compatibility stuff for BBGE .... ** @@ -26,7 +32,7 @@ namespace ByteBufferTools { - template inline void convert(char *val) + template inline void convert(char *val) { std::swap(*val, *(val + T - 1)); convert(val + 1); @@ -39,12 +45,21 @@ namespace ByteBufferTools convert((char *)(val)); } + inline void EndianConvertRT(char *p, unsigned int size) + { + std::reverse(p, p + size); + } + #if BB_IS_BIG_ENDIAN template inline void ToLittleEndian(T& val) { EndianConvert(&val); } + inline void ToLittleEndianRT(void *p, unsigned int size) { EndianConvertRT((char*)p, size); } template inline void ToBigEndian(T&) { } + inline void ToBigEndianRT(void *p, unsigned int size) { } #else template inline void ToLittleEndian(T&) { } + inline void ToLittleEndianRT(void *p, unsigned int size) { } template inline void ToBigEndian(T& val) { EndianConvert(&val); } + inline void ToBigEndianRT(void *p, unsigned int size) { EndianConvertRT((char*)p, size); } #endif template void ToLittleEndian(T*); // will generate link error @@ -52,8 +67,13 @@ namespace ByteBufferTools }; -#define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { append(val); return *this; } -#define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { val = read(); return *this; } +#ifdef BB_OLD_GNUC +# define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { appendT(&val, sizeof(T)); return *this; } +# define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { readT(&val, sizeof(T)); return *this; } +#else +# define BB_MAKE_WRITE_OP(T) inline ByteBuffer& operator<<(T val) { append(val); return *this; } +# define BB_MAKE_READ_OP(T) inline ByteBuffer& operator>>(T &val) { val = read(); return *this; } +#endif class ByteBuffer { @@ -241,23 +261,17 @@ public: BB_MAKE_WRITE_OP(float); BB_MAKE_WRITE_OP(double); - ByteBuffer &operator<<(bool value) - { - append((char)value); - return *this; - } - ByteBuffer &operator<<(const char *str) { append((uint8 *)str, str ? strlen(str) : 0); - append((uint8)0); + appendByte(0); return *this; } ByteBuffer &operator<<(const std::string &value) { append((uint8 *)value.c_str(), value.length()); - append((uint8)0); + appendByte(0); return *this; } @@ -271,22 +285,18 @@ public: BB_MAKE_READ_OP(float); BB_MAKE_READ_OP(double); - ByteBuffer &operator>>(bool &value) + inline uint8 operator[](uint32 pos) const { - value = read() > 0 ? true : false; - return *this; - } - - uint8 operator[](uint32 pos) - { - return read(pos); + if(pos >= size()) + BYTEBUFFER_EXCEPT(this, "operator[]", 1); + return _buf[pos]; } ByteBuffer &operator>>(std::string& value) { value.clear(); char c; - while(readable() && (c = read())) + while(readable() && (c = readByte())) value += c; return *this; } @@ -313,6 +323,7 @@ public: _rpos += sizeof(T); return r; } + template T read(uint32 pos) const { if(pos + sizeof(T) > size()) @@ -322,6 +333,20 @@ public: return val; } + inline uint8 readByte() + { + if (_rpos < size()) + return _buf[_rpos++]; + BYTEBUFFER_EXCEPT(this, "readByte", 1); + return 0; + } + + void readT(void *dest, uint32 len) + { + read(dest, len); + ByteBufferTools::ToLittleEndianRT(dest, len); + } + void read(void *dest, uint32 len) { if (_rpos + len <= size()) @@ -352,7 +377,7 @@ public: inline uint32 readable(void) const { return size() - rpos(); } inline uint32 writable(void) const { return size() - wpos(); } // free space left before realloc will occur - template void append(T value) + template inline void append(T value) { ByteBufferTools::ToLittleEndian(value); _enlargeIfReq(_wpos + sizeof(T)); @@ -362,6 +387,21 @@ public: _size = _wpos; } + inline void appendByte(uint8 value) + { + _enlargeIfReq(_wpos + 1); + _buf[_wpos++] = value; + if(_size < _wpos) + _size = _wpos; + } + + // GCC 2.95 fails with an internal error in the template function above + void appendT(const void *src, uint32 bytes) + { + append(src, bytes); + ByteBufferTools::ToLittleEndianRT(_buf + (_wpos - bytes), bytes); + } + void append(const void *src, uint32 bytes) { if (!bytes) return; @@ -382,7 +422,7 @@ public: memcpy(_buf + pos, src, bytes); } - template void put(uint32 pos, T value) + template void put(uint32 pos, const T& value) { if(pos >= size()) BYTEBUFFER_EXCEPT(this, "put", sizeof(T)); diff --git a/ExternalLibs/FileAPI.cpp b/ExternalLibs/FileAPI.cpp index 6e8ae82..02b0378 100644 --- a/ExternalLibs/FileAPI.cpp +++ b/ExternalLibs/FileAPI.cpp @@ -118,7 +118,7 @@ bool InStream::open(const char *fn) vf->dropBuf(true); return true; } - setstate(std::ios_base::failbit); + setstate(std::ios::failbit); return false; } From 8ac5cf69ab37b59881450035efab0e49735e4346 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 23 Sep 2012 05:31:29 +0200 Subject: [PATCH 34/42] Initial Haiku support --- CMakeLists.txt | 12 +++++++++-- ExternalLibs/ttvfs/VFSTools.cpp | 36 ++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aba0839..bac44f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,10 @@ IF(APPLE) SET(MACOSX TRUE) ENDIF(APPLE) +IF(CMAKE_SYSTEM_NAME STREQUAL "Haiku") + SET(HAIKU TRUE) +ENDIF() + OPTION(AQUARIA_DEVELOPER_BUILD "Developer Build?" FALSE) OPTION(AQUARIA_DEMO_BUILD "Demo Build?" FALSE) OPTION(AQUARIA_USE_VFS "Use Virtual File System? Required for some additional features." TRUE) @@ -258,9 +262,9 @@ ENDIF(WIN32) # Build Lua with Unix _setjmp/_longjmp support. -IF(UNIX) +IF(UNIX AND NOT HAIKU) ADD_DEFINITIONS(-DLUA_USE_ULONGJMP=1) -ENDIF(UNIX) +ENDIF() IF(CMAKE_COMPILER_IS_GNUCC) ADD_DEFINITIONS(-pipe -fsigned-char) @@ -627,6 +631,10 @@ IF(MACOSX) SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "-framework OpenAL") ENDIF(MACOSX) +IF(HAIKU) + SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "network") +ENDIF() + SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${SDL_LIBRARY}) SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${OPENAL_LIBRARY}) diff --git a/ExternalLibs/ttvfs/VFSTools.cpp b/ExternalLibs/ttvfs/VFSTools.cpp index 5bb5e03..6a34e28 100644 --- a/ExternalLibs/ttvfs/VFSTools.cpp +++ b/ExternalLibs/ttvfs/VFSTools.cpp @@ -17,8 +17,12 @@ # define WIN32_LEAN_AND_MEAN # include #else +# ifdef __HAIKU__ +# include +# else # include -# include +# endif +# include #endif #include @@ -49,6 +53,7 @@ void makeUppercase(std::string& s) } #if !_WIN32 +#ifdef DT_DIR static bool _IsFile(const char *path, dirent *dp) { switch(dp->d_type) @@ -93,6 +98,35 @@ static bool _IsDir(const char *path, dirent *dp) } return false; } + +#else // No DT_DIR, assume plain POSIX + +static bool _IsDir(const char *path, dirent *dp) +{ + const int len1 = strlen(path); + const int len2 = strlen(dp->d_name); + + char *pathname = (char*)alloca(len1 + 1 + len2 + 1 + 13); + strcpy (pathname, path); + + /* Avoid UNC-path "//name" on Cygwin. */ + if (len1 > 0 && pathname[len1 - 1] != '/') + strcat (pathname, "/"); + + strcat (pathname, dp->d_name); + + struct stat st; + if (stat (pathname, &st)) + return false; + return S_ISDIR (st.st_mode); +} + +static bool _IsFile(const char *path, dirent *dp) +{ + return !_IsDir(path, dp); +} +#endif + #endif // returns list of *plain* file names in given directory, From 823290201d57c1ce1a9da786668d1e305087d961 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 24 Sep 2012 02:26:39 +0200 Subject: [PATCH 35/42] Stop complaining, MSVC --- ExternalLibs/ByteBuffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalLibs/ByteBuffer.h b/ExternalLibs/ByteBuffer.h index 8f8897b..7e172d2 100644 --- a/ExternalLibs/ByteBuffer.h +++ b/ExternalLibs/ByteBuffer.h @@ -5,10 +5,10 @@ #include // for memcpy #include #include +#include #if defined(__GNUC__) && __GNUC__ <= 2 # define BB_OLD_GNUC -# include #endif From cd6d9ae2c54a82ef48b32128a1b53057d0d8892b Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 24 Sep 2012 02:27:51 +0200 Subject: [PATCH 36/42] Update libvorbis to 1.1.3 --- CMakeLists.txt | 2 +- .../libvorbis-1.3.2/include/Makefile.am | 3 - .../libvorbis-1.3.2/include/Makefile.in | 514 ------------------ .../include/vorbis/Makefile.am | 7 - .../include/vorbis/Makefile.in | 434 --------------- ExternalLibs/libvorbis-1.3.2/lib/lookups.pl | 142 ----- .../COPYING | 0 .../include/vorbis/codec.h | 0 .../include/vorbis/vorbisenc.h | 0 .../include/vorbis/vorbisfile.h | 0 .../lib/analysis.c | 0 .../lib/backends.h | 0 .../lib/barkmel.c | 0 .../lib/bitrate.c | 0 .../lib/bitrate.h | 0 .../lib/block.c | 0 .../lib/books/coupled/res_books_51.h | 0 .../lib/books/coupled/res_books_stereo.h | 0 .../lib/books/floor/floor_books.h | 0 .../lib/books/uncoupled/res_books_uncoupled.h | 0 .../lib/codebook.c | 15 +- .../lib/codebook.h | 0 .../lib/codec_internal.h | 0 .../lib/envelope.c | 0 .../lib/envelope.h | 0 .../lib/floor0.c | 7 +- .../lib/floor1.c | 5 +- .../lib/highlevel.h | 0 .../lib/info.c | 12 +- .../lib/lookup.c | 0 .../lib/lookup.h | 0 .../lib/lookup_data.h | 0 .../lib/lpc.c | 0 .../lib/lpc.h | 0 .../lib/lsp.c | 0 .../lib/lsp.h | 0 .../lib/mapping0.c | 0 .../lib/masking.h | 0 .../lib/mdct.c | 0 .../lib/mdct.h | 0 .../lib/misc.h | 0 .../lib/modes/floor_all.h | 0 .../lib/modes/psych_11.h | 0 .../lib/modes/psych_16.h | 0 .../lib/modes/psych_44.h | 0 .../lib/modes/psych_8.h | 0 .../lib/modes/residue_16.h | 0 .../lib/modes/residue_44.h | 0 .../lib/modes/residue_44p51.h | 0 .../lib/modes/residue_44u.h | 0 .../lib/modes/residue_8.h | 0 .../lib/modes/setup_11.h | 0 .../lib/modes/setup_16.h | 0 .../lib/modes/setup_22.h | 0 .../lib/modes/setup_32.h | 0 .../lib/modes/setup_44.h | 0 .../lib/modes/setup_44p51.h | 0 .../lib/modes/setup_44u.h | 0 .../lib/modes/setup_8.h | 0 .../lib/modes/setup_X.h | 0 .../lib/os.h | 0 .../lib/psy.c | 15 +- .../lib/psy.h | 0 .../lib/psytune.c | 0 .../lib/registry.c | 0 .../lib/registry.h | 0 .../lib/res0.c | 0 .../lib/scales.h | 0 .../lib/sharedbook.c | 0 .../lib/smallft.c | 0 .../lib/smallft.h | 0 .../lib/synthesis.c | 0 .../lib/tone.c | 0 .../lib/vorbisenc.c | 0 .../lib/vorbisfile.c | 0 .../lib/window.c | 0 .../lib/window.h | 0 77 files changed, 34 insertions(+), 1122 deletions(-) delete mode 100644 ExternalLibs/libvorbis-1.3.2/include/Makefile.am delete mode 100644 ExternalLibs/libvorbis-1.3.2/include/Makefile.in delete mode 100644 ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.am delete mode 100644 ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.in delete mode 100755 ExternalLibs/libvorbis-1.3.2/lib/lookups.pl rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/COPYING (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/include/vorbis/codec.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/include/vorbis/vorbisenc.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/include/vorbis/vorbisfile.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/analysis.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/backends.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/barkmel.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/bitrate.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/bitrate.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/block.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/books/coupled/res_books_51.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/books/coupled/res_books_stereo.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/books/floor/floor_books.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/books/uncoupled/res_books_uncoupled.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/codebook.c (96%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/codebook.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/codec_internal.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/envelope.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/envelope.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/floor0.c (96%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/floor1.c (99%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/highlevel.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/info.c (98%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lookup.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lookup.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lookup_data.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lpc.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lpc.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lsp.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/lsp.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/mapping0.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/masking.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/mdct.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/mdct.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/misc.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/floor_all.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/psych_11.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/psych_16.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/psych_44.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/psych_8.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/residue_16.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/residue_44.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/residue_44p51.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/residue_44u.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/residue_8.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_11.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_16.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_22.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_32.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_44.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_44p51.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_44u.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_8.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/modes/setup_X.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/os.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/psy.c (99%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/psy.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/psytune.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/registry.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/registry.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/res0.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/scales.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/sharedbook.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/smallft.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/smallft.h (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/synthesis.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/tone.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/vorbisenc.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/vorbisfile.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/window.c (100%) rename ExternalLibs/{libvorbis-1.3.2 => libvorbis-1.3.3}/lib/window.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index bac44f3..204c987 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ SET(FREETYPE2SRCDIR ${FREETYPE2DIR}/src) SET(LUADIR ${EXTLIBDIR}/lua-5.1.4) SET(LUASRCDIR ${LUADIR}/src) SET(LIBOGGDIR ${EXTLIBDIR}/libogg-1.3.0) -SET(LIBVORBISDIR ${EXTLIBDIR}/libvorbis-1.3.2) +SET(LIBVORBISDIR ${EXTLIBDIR}/libvorbis-1.3.3) SET(ZLIBDIR ${EXTLIBDIR}/glpng/zlib) SET(PNGDIR ${EXTLIBDIR}/glpng/png) diff --git a/ExternalLibs/libvorbis-1.3.2/include/Makefile.am b/ExternalLibs/libvorbis-1.3.2/include/Makefile.am deleted file mode 100644 index 0f34fab..0000000 --- a/ExternalLibs/libvorbis-1.3.2/include/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = vorbis diff --git a/ExternalLibs/libvorbis-1.3.2/include/Makefile.in b/ExternalLibs/libvorbis-1.3.2/include/Makefile.in deleted file mode 100644 index 76cf058..0000000 --- a/ExternalLibs/libvorbis-1.3.2/include/Makefile.in +++ /dev/null @@ -1,514 +0,0 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/add_cflags.m4 \ - $(top_srcdir)/m4/ogg.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG = @DEBUG@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HTLATEX = @HTLATEX@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OGG_CFLAGS = @OGG_CFLAGS@ -OGG_LIBS = @OGG_LIBS@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PDFLATEX = @PDFLATEX@ -PKG_CONFIG = @PKG_CONFIG@ -PROFILE = @PROFILE@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VE_LIB_AGE = @VE_LIB_AGE@ -VE_LIB_CURRENT = @VE_LIB_CURRENT@ -VE_LIB_REVISION = @VE_LIB_REVISION@ -VF_LIB_AGE = @VF_LIB_AGE@ -VF_LIB_CURRENT = @VF_LIB_CURRENT@ -VF_LIB_REVISION = @VF_LIB_REVISION@ -VORBIS_LIBS = @VORBIS_LIBS@ -V_LIB_AGE = @V_LIB_AGE@ -V_LIB_CURRENT = @V_LIB_CURRENT@ -V_LIB_REVISION = @V_LIB_REVISION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pthread_lib = @pthread_lib@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = vorbis -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.am b/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.am deleted file mode 100644 index dbba34e..0000000 --- a/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -## Process this file with automake to produce Makefile.in - -vorbisincludedir = $(includedir)/vorbis - -vorbisinclude_HEADERS = codec.h vorbisfile.h vorbisenc.h - - diff --git a/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.in b/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.in deleted file mode 100644 index 64a5042..0000000 --- a/ExternalLibs/libvorbis-1.3.2/include/vorbis/Makefile.in +++ /dev/null @@ -1,434 +0,0 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include/vorbis -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(vorbisinclude_HEADERS) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/add_cflags.m4 \ - $(top_srcdir)/m4/ogg.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(vorbisincludedir)" -vorbisincludeHEADERS_INSTALL = $(INSTALL_HEADER) -HEADERS = $(vorbisinclude_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEBUG = @DEBUG@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_DOXYGEN = @HAVE_DOXYGEN@ -HTLATEX = @HTLATEX@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OGG_CFLAGS = @OGG_CFLAGS@ -OGG_LIBS = @OGG_LIBS@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PDFLATEX = @PDFLATEX@ -PKG_CONFIG = @PKG_CONFIG@ -PROFILE = @PROFILE@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VE_LIB_AGE = @VE_LIB_AGE@ -VE_LIB_CURRENT = @VE_LIB_CURRENT@ -VE_LIB_REVISION = @VE_LIB_REVISION@ -VF_LIB_AGE = @VF_LIB_AGE@ -VF_LIB_CURRENT = @VF_LIB_CURRENT@ -VF_LIB_REVISION = @VF_LIB_REVISION@ -VORBIS_LIBS = @VORBIS_LIBS@ -V_LIB_AGE = @V_LIB_AGE@ -V_LIB_CURRENT = @V_LIB_CURRENT@ -V_LIB_REVISION = @V_LIB_REVISION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -pthread_lib = @pthread_lib@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -vorbisincludedir = $(includedir)/vorbis -vorbisinclude_HEADERS = codec.h vorbisfile.h vorbisenc.h -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/vorbis/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/vorbis/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-vorbisincludeHEADERS: $(vorbisinclude_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(vorbisincludedir)" || $(MKDIR_P) "$(DESTDIR)$(vorbisincludedir)" - @list='$(vorbisinclude_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(vorbisincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(vorbisincludedir)/$$f'"; \ - $(vorbisincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(vorbisincludedir)/$$f"; \ - done - -uninstall-vorbisincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(vorbisinclude_HEADERS)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(vorbisincludedir)/$$f'"; \ - rm -f "$(DESTDIR)$(vorbisincludedir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(vorbisincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-vorbisincludeHEADERS - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-vorbisincludeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool ctags distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip \ - install-vorbisincludeHEADERS installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am tags uninstall uninstall-am \ - uninstall-vorbisincludeHEADERS - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lookups.pl b/ExternalLibs/libvorbis-1.3.2/lib/lookups.pl deleted file mode 100755 index bd92df7..0000000 --- a/ExternalLibs/libvorbis-1.3.2/lib/lookups.pl +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/perl -print <<'EOD'; -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup data; generated by lookups.pl; edit there - last mod: $Id: lookups.pl 13293 2007-07-24 00:09:47Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_LOOKUP_DATA_H_ - -#ifdef FLOAT_LOOKUP -EOD - -$cos_sz=128; -$invsq_sz=32; -$invsq2exp_min=-32; -$invsq2exp_max=32; - -$fromdB_sz=35; -$fromdB_shift=5; -$fromdB2_shift=3; - -$invsq_i_shift=10; -$cos_i_shift=9; -$delta_shift=6; - -print "#define COS_LOOKUP_SZ $cos_sz\n"; -print "static float COS_LOOKUP[COS_LOOKUP_SZ+1]={\n"; - -for($i=0;$i<=$cos_sz;){ - print "\t"; - for($j=0;$j<4 && $i<=$cos_sz;$j++){ - printf "%+.13f,", cos(3.14159265358979323846*($i++)/$cos_sz) ; - } - print "\n"; -} -print "};\n\n"; - -print "#define INVSQ_LOOKUP_SZ $invsq_sz\n"; -print "static float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={\n"; - -for($i=0;$i<=$invsq_sz;){ - print "\t"; - for($j=0;$j<4 && $i<=$invsq_sz;$j++){ - my$indexmap=$i++/$invsq_sz*.5+.5; - printf "%.12f,", 1./sqrt($indexmap); - } - print "\n"; -} -print "};\n\n"; - -print "#define INVSQ2EXP_LOOKUP_MIN $invsq2exp_min\n"; -print "#define INVSQ2EXP_LOOKUP_MAX $invsq2exp_max\n"; -print "static float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\\\n". - " INVSQ2EXP_LOOKUP_MIN+1]={\n"; - -for($i=$invsq2exp_min;$i<=$invsq2exp_max;){ - print "\t"; - for($j=0;$j<4 && $i<=$invsq2exp_max;$j++){ - printf "%15.10g,", 2**($i++*-.5); - } - print "\n"; -} -print "};\n\n#endif\n\n"; - - -# 0 to -140 dB -$fromdB2_sz=1<<$fromdB_shift; -$fromdB_gran=1<<($fromdB_shift-$fromdB2_shift); -print "#define FROMdB_LOOKUP_SZ $fromdB_sz\n"; -print "#define FROMdB2_LOOKUP_SZ $fromdB2_sz\n"; -print "#define FROMdB_SHIFT $fromdB_shift\n"; -print "#define FROMdB2_SHIFT $fromdB2_shift\n"; -print "#define FROMdB2_MASK ".((1<<$fromdB_shift)-1)."\n"; - -print "static float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={\n"; - -for($i=0;$i<$fromdB_sz;){ - print "\t"; - for($j=0;$j<4 && $i<$fromdB_sz;$j++){ - printf "%15.10g,", 10**(.05*(-$fromdB_gran*$i++)); - } - print "\n"; -} -print "};\n\n"; - -print "static float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={\n"; - -for($i=0;$i<$fromdB2_sz;){ - print "\t"; - for($j=0;$j<4 && $i<$fromdB_sz;$j++){ - printf "%15.10g,", 10**(.05*(-$fromdB_gran/$fromdB2_sz*(.5+$i++))); - } - print "\n"; -} -print "};\n\n#ifdef INT_LOOKUP\n\n"; - - -$iisz=0x10000>>$invsq_i_shift; -print "#define INVSQ_LOOKUP_I_SHIFT $invsq_i_shift\n"; -print "#define INVSQ_LOOKUP_I_MASK ".(0x0ffff>>(16-$invsq_i_shift))."\n"; -print "static long INVSQ_LOOKUP_I[$iisz+1]={\n"; -for($i=0;$i<=$iisz;){ - print "\t"; - for($j=0;$j<4 && $i<=$iisz;$j++){ - my$indexmap=$i++/$iisz*.5+.5; - printf "%8d,", int(1./sqrt($indexmap)*65536.+.5); - } - print "\n"; -} -print "};\n\n"; - -$cisz=0x10000>>$cos_i_shift; -print "#define COS_LOOKUP_I_SHIFT $cos_i_shift\n"; -print "#define COS_LOOKUP_I_MASK ".(0x0ffff>>(16-$cos_i_shift))."\n"; -print "#define COS_LOOKUP_I_SZ $cisz\n"; -print "static long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={\n"; - -for($i=0;$i<=$cisz;){ - print "\t"; - for($j=0;$j<4 && $i<=$cisz;$j++){ - printf "%8d,", int(cos(3.14159265358979323846*($i++)/$cos_sz)*16384.+.5) ; - } - print "\n"; -} -print "};\n\n"; - - -print "#endif\n\n#endif\n"; - - diff --git a/ExternalLibs/libvorbis-1.3.2/COPYING b/ExternalLibs/libvorbis-1.3.3/COPYING similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/COPYING rename to ExternalLibs/libvorbis-1.3.3/COPYING diff --git a/ExternalLibs/libvorbis-1.3.2/include/vorbis/codec.h b/ExternalLibs/libvorbis-1.3.3/include/vorbis/codec.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/include/vorbis/codec.h rename to ExternalLibs/libvorbis-1.3.3/include/vorbis/codec.h diff --git a/ExternalLibs/libvorbis-1.3.2/include/vorbis/vorbisenc.h b/ExternalLibs/libvorbis-1.3.3/include/vorbis/vorbisenc.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/include/vorbis/vorbisenc.h rename to ExternalLibs/libvorbis-1.3.3/include/vorbis/vorbisenc.h diff --git a/ExternalLibs/libvorbis-1.3.2/include/vorbis/vorbisfile.h b/ExternalLibs/libvorbis-1.3.3/include/vorbis/vorbisfile.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/include/vorbis/vorbisfile.h rename to ExternalLibs/libvorbis-1.3.3/include/vorbis/vorbisfile.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/analysis.c b/ExternalLibs/libvorbis-1.3.3/lib/analysis.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/analysis.c rename to ExternalLibs/libvorbis-1.3.3/lib/analysis.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/backends.h b/ExternalLibs/libvorbis-1.3.3/lib/backends.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/backends.h rename to ExternalLibs/libvorbis-1.3.3/lib/backends.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/barkmel.c b/ExternalLibs/libvorbis-1.3.3/lib/barkmel.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/barkmel.c rename to ExternalLibs/libvorbis-1.3.3/lib/barkmel.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/bitrate.c b/ExternalLibs/libvorbis-1.3.3/lib/bitrate.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/bitrate.c rename to ExternalLibs/libvorbis-1.3.3/lib/bitrate.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/bitrate.h b/ExternalLibs/libvorbis-1.3.3/lib/bitrate.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/bitrate.h rename to ExternalLibs/libvorbis-1.3.3/lib/bitrate.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/block.c b/ExternalLibs/libvorbis-1.3.3/lib/block.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/block.c rename to ExternalLibs/libvorbis-1.3.3/lib/block.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/books/coupled/res_books_51.h b/ExternalLibs/libvorbis-1.3.3/lib/books/coupled/res_books_51.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/books/coupled/res_books_51.h rename to ExternalLibs/libvorbis-1.3.3/lib/books/coupled/res_books_51.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h b/ExternalLibs/libvorbis-1.3.3/lib/books/coupled/res_books_stereo.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h rename to ExternalLibs/libvorbis-1.3.3/lib/books/coupled/res_books_stereo.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/books/floor/floor_books.h b/ExternalLibs/libvorbis-1.3.3/lib/books/floor/floor_books.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/books/floor/floor_books.h rename to ExternalLibs/libvorbis-1.3.3/lib/books/floor/floor_books.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h b/ExternalLibs/libvorbis-1.3.3/lib/books/uncoupled/res_books_uncoupled.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h rename to ExternalLibs/libvorbis-1.3.3/lib/books/uncoupled/res_books_uncoupled.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/codebook.c b/ExternalLibs/libvorbis-1.3.3/lib/codebook.c similarity index 96% rename from ExternalLibs/libvorbis-1.3.2/lib/codebook.c rename to ExternalLibs/libvorbis-1.3.3/lib/codebook.c index 759d7b4..ecb8b68 100644 --- a/ExternalLibs/libvorbis-1.3.2/lib/codebook.c +++ b/ExternalLibs/libvorbis-1.3.3/lib/codebook.c @@ -11,7 +11,7 @@ ******************************************************************** function: basic codebook pack/unpack/code/decode operations - last mod: $Id: codebook.c 17553 2010-10-21 17:54:26Z tterribe $ + last mod: $Id: codebook.c 18183 2012-02-03 20:51:27Z xiphmont $ ********************************************************************/ @@ -248,7 +248,7 @@ static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ } /* quantized values */ - if((quantvals*s->q_quant+7>>3)>opb->storage-oggpack_bytes(opb)) + if(((quantvals*s->q_quant+7)>>3)>opb->storage-oggpack_bytes(opb)) goto _eofout; s->quantlist=_ogg_malloc(sizeof(*s->quantlist)*quantvals); for(i=0;iused_entries>0){ int step=n/book->dim; @@ -386,6 +387,7 @@ long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){ return(0); } +/* decode vector / dim granularity gaurding is done in the upper layer */ long vorbis_book_decodev_add(codebook *book,float *a,oggpack_buffer *b,int n){ if(book->used_entries>0){ int i,j,entry; @@ -431,6 +433,9 @@ long vorbis_book_decodev_add(codebook *book,float *a,oggpack_buffer *b,int n){ return(0); } +/* unlike the others, we guard against n not being an integer number + of internally rather than in the upper layer (called only by + floor0) */ long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){ if(book->used_entries>0){ int i,j,entry; @@ -440,15 +445,15 @@ long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){ entry = decode_packed_entry_number(book,b); if(entry==-1)return(-1); t = book->valuelist+entry*book->dim; - for (j=0;jdim;) + for (j=0;idim;){ a[i++]=t[j++]; + } } }else{ int i,j; for(i=0;idim;) - a[i++]=0.f; + a[i++]=0.f; } } return(0); diff --git a/ExternalLibs/libvorbis-1.3.2/lib/codebook.h b/ExternalLibs/libvorbis-1.3.3/lib/codebook.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/codebook.h rename to ExternalLibs/libvorbis-1.3.3/lib/codebook.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/codec_internal.h b/ExternalLibs/libvorbis-1.3.3/lib/codec_internal.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/codec_internal.h rename to ExternalLibs/libvorbis-1.3.3/lib/codec_internal.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/envelope.c b/ExternalLibs/libvorbis-1.3.3/lib/envelope.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/envelope.c rename to ExternalLibs/libvorbis-1.3.3/lib/envelope.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/envelope.h b/ExternalLibs/libvorbis-1.3.3/lib/envelope.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/envelope.h rename to ExternalLibs/libvorbis-1.3.3/lib/envelope.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/floor0.c b/ExternalLibs/libvorbis-1.3.3/lib/floor0.c similarity index 96% rename from ExternalLibs/libvorbis-1.3.2/lib/floor0.c rename to ExternalLibs/libvorbis-1.3.3/lib/floor0.c index 4c32e91..8e1985c 100644 --- a/ExternalLibs/libvorbis-1.3.2/lib/floor0.c +++ b/ExternalLibs/libvorbis-1.3.3/lib/floor0.c @@ -11,7 +11,7 @@ ******************************************************************** function: floor backend 0 implementation - last mod: $Id: floor0.c 17558 2010-10-22 00:24:41Z tterribe $ + last mod: $Id: floor0.c 18184 2012-02-03 20:55:12Z xiphmont $ ********************************************************************/ @@ -177,10 +177,9 @@ static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ vector */ float *lsp=_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1)); - for(j=0;jm;j+=b->dim) - if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim)==-1)goto eop; + if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m)==-1)goto eop; for(j=0;jm;){ - for(k=0;kdim;k++,j++)lsp[j]+=last; + for(k=0;jm && kdim;k++,j++)lsp[j]+=last; last=lsp[j-1]; } diff --git a/ExternalLibs/libvorbis-1.3.2/lib/floor1.c b/ExternalLibs/libvorbis-1.3.3/lib/floor1.c similarity index 99% rename from ExternalLibs/libvorbis-1.3.2/lib/floor1.c rename to ExternalLibs/libvorbis-1.3.3/lib/floor1.c index 9f3154a..d5c7ebf 100644 --- a/ExternalLibs/libvorbis-1.3.2/lib/floor1.c +++ b/ExternalLibs/libvorbis-1.3.3/lib/floor1.c @@ -11,7 +11,7 @@ ******************************************************************** function: floor backend 1 implementation - last mod: $Id: floor1.c 17555 2010-10-21 18:14:51Z tterribe $ + last mod: $Id: floor1.c 18151 2012-01-20 07:35:26Z xiphmont $ ********************************************************************/ @@ -167,6 +167,7 @@ static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ for(j=0,k=0;jpartitions;j++){ count+=info->class_dim[info->partitionclass[j]]; + if(count>VIF_POSIT) goto err_out; for(;kpostlist[k+2]=oggpack_read(opb,rangebits); if(t<0 || t>=(1<loneighbor[i-2]]&=0x7fff; fit_value[look->hineighbor[i-2]]&=0x7fff; diff --git a/ExternalLibs/libvorbis-1.3.2/lib/highlevel.h b/ExternalLibs/libvorbis-1.3.3/lib/highlevel.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/highlevel.h rename to ExternalLibs/libvorbis-1.3.3/lib/highlevel.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/info.c b/ExternalLibs/libvorbis-1.3.3/lib/info.c similarity index 98% rename from ExternalLibs/libvorbis-1.3.2/lib/info.c rename to ExternalLibs/libvorbis-1.3.3/lib/info.c index 3932480..9e944c3 100644 --- a/ExternalLibs/libvorbis-1.3.2/lib/info.c +++ b/ExternalLibs/libvorbis-1.3.3/lib/info.c @@ -11,7 +11,7 @@ ******************************************************************** function: maintain the info structure, info <-> header packets - last mod: $Id: info.c 17584 2010-11-01 19:26:16Z xiphmont $ + last mod: $Id: info.c 18186 2012-02-03 22:08:44Z xiphmont $ ********************************************************************/ @@ -31,8 +31,8 @@ #include "misc.h" #include "os.h" -#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.2" -#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20101101 (Schaufenugget)" +#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.3" +#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20120203 (Omnipresent)" /* helpers */ static int ilog2(unsigned int v){ @@ -550,7 +550,10 @@ int vorbis_commentheader_out(vorbis_comment *vc, oggpack_buffer opb; oggpack_writeinit(&opb); - if(_vorbis_pack_comment(&opb,vc)) return OV_EIMPL; + if(_vorbis_pack_comment(&opb,vc)){ + oggpack_writeclear(&opb); + return OV_EIMPL; + } op->packet = _ogg_malloc(oggpack_bytes(&opb)); memcpy(op->packet, opb.buffer, oggpack_bytes(&opb)); @@ -561,6 +564,7 @@ int vorbis_commentheader_out(vorbis_comment *vc, op->granulepos=0; op->packetno=1; + oggpack_writeclear(&opb); return 0; } diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lookup.c b/ExternalLibs/libvorbis-1.3.3/lib/lookup.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lookup.c rename to ExternalLibs/libvorbis-1.3.3/lib/lookup.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lookup.h b/ExternalLibs/libvorbis-1.3.3/lib/lookup.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lookup.h rename to ExternalLibs/libvorbis-1.3.3/lib/lookup.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lookup_data.h b/ExternalLibs/libvorbis-1.3.3/lib/lookup_data.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lookup_data.h rename to ExternalLibs/libvorbis-1.3.3/lib/lookup_data.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lpc.c b/ExternalLibs/libvorbis-1.3.3/lib/lpc.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lpc.c rename to ExternalLibs/libvorbis-1.3.3/lib/lpc.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lpc.h b/ExternalLibs/libvorbis-1.3.3/lib/lpc.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lpc.h rename to ExternalLibs/libvorbis-1.3.3/lib/lpc.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lsp.c b/ExternalLibs/libvorbis-1.3.3/lib/lsp.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lsp.c rename to ExternalLibs/libvorbis-1.3.3/lib/lsp.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/lsp.h b/ExternalLibs/libvorbis-1.3.3/lib/lsp.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/lsp.h rename to ExternalLibs/libvorbis-1.3.3/lib/lsp.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/mapping0.c b/ExternalLibs/libvorbis-1.3.3/lib/mapping0.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/mapping0.c rename to ExternalLibs/libvorbis-1.3.3/lib/mapping0.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/masking.h b/ExternalLibs/libvorbis-1.3.3/lib/masking.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/masking.h rename to ExternalLibs/libvorbis-1.3.3/lib/masking.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/mdct.c b/ExternalLibs/libvorbis-1.3.3/lib/mdct.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/mdct.c rename to ExternalLibs/libvorbis-1.3.3/lib/mdct.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/mdct.h b/ExternalLibs/libvorbis-1.3.3/lib/mdct.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/mdct.h rename to ExternalLibs/libvorbis-1.3.3/lib/mdct.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/misc.h b/ExternalLibs/libvorbis-1.3.3/lib/misc.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/misc.h rename to ExternalLibs/libvorbis-1.3.3/lib/misc.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/floor_all.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/floor_all.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/floor_all.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/floor_all.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/psych_11.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/psych_11.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/psych_11.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/psych_11.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/psych_16.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/psych_16.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/psych_16.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/psych_16.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/psych_44.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/psych_44.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/psych_44.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/psych_44.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/psych_8.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/psych_8.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/psych_8.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/psych_8.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/residue_16.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/residue_16.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/residue_16.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/residue_16.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44p51.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44p51.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44p51.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44p51.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44u.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44u.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/residue_44u.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/residue_44u.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/residue_8.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/residue_8.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/residue_8.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/residue_8.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_11.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_11.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_11.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_11.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_16.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_16.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_16.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_16.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_22.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_22.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_22.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_22.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_32.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_32.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_32.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_32.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44p51.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44p51.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44p51.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44p51.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44u.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44u.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_44u.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_44u.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_8.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_8.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_8.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_8.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/modes/setup_X.h b/ExternalLibs/libvorbis-1.3.3/lib/modes/setup_X.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/modes/setup_X.h rename to ExternalLibs/libvorbis-1.3.3/lib/modes/setup_X.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/os.h b/ExternalLibs/libvorbis-1.3.3/lib/os.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/os.h rename to ExternalLibs/libvorbis-1.3.3/lib/os.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/psy.c b/ExternalLibs/libvorbis-1.3.3/lib/psy.c similarity index 99% rename from ExternalLibs/libvorbis-1.3.2/lib/psy.c rename to ExternalLibs/libvorbis-1.3.3/lib/psy.c index 9a86151..f7a44c6 100644 --- a/ExternalLibs/libvorbis-1.3.2/lib/psy.c +++ b/ExternalLibs/libvorbis-1.3.3/lib/psy.c @@ -11,7 +11,7 @@ ******************************************************************** function: psychoacoustics not including preecho - last mod: $Id: psy.c 17569 2010-10-26 17:09:47Z xiphmont $ + last mod: $Id: psy.c 18077 2011-09-02 02:49:00Z giles $ ********************************************************************/ @@ -1020,7 +1020,9 @@ void _vp_couple_quantize_normalize(int blobno, int limit = g->coupling_pointlimit[p->vi->blockflag][blobno]; float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]]; float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]]; +#if 0 float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */ +#endif /* mdct is our raw mdct output, floor not removed. */ /* inout passes in the ifloor, passes back quantized result */ @@ -1154,27 +1156,28 @@ void _vp_couple_quantize_normalize(int blobno, reM[j] += reA[j]; qeM[j] = fabs(reM[j]); }else{ +#if 0 /* AoTuV */ /** @ M2 ** The boost problem by the combination of noise normalization and point stereo is eased. However, this is a temporary patch. by Aoyumi @ 2004/04/18 */ - /*float derate = (1.0 - de*((float)(j-limit+i) / (float)(n-limit))); - /* elliptical + float derate = (1.0 - de*((float)(j-limit+i) / (float)(n-limit))); + /* elliptical */ if(reM[j]+reA[j]<0){ reM[j] = - (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate); }else{ reM[j] = (qeM[j] = (fabs(reM[j])+fabs(reA[j]))*derate*derate); - }*/ - + } +#else /* elliptical */ if(reM[j]+reA[j]<0){ reM[j] = - (qeM[j] = fabs(reM[j])+fabs(reA[j])); }else{ reM[j] = (qeM[j] = fabs(reM[j])+fabs(reA[j])); } - +#endif } reA[j]=qeA[j]=0.f; diff --git a/ExternalLibs/libvorbis-1.3.2/lib/psy.h b/ExternalLibs/libvorbis-1.3.3/lib/psy.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/psy.h rename to ExternalLibs/libvorbis-1.3.3/lib/psy.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/psytune.c b/ExternalLibs/libvorbis-1.3.3/lib/psytune.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/psytune.c rename to ExternalLibs/libvorbis-1.3.3/lib/psytune.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/registry.c b/ExternalLibs/libvorbis-1.3.3/lib/registry.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/registry.c rename to ExternalLibs/libvorbis-1.3.3/lib/registry.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/registry.h b/ExternalLibs/libvorbis-1.3.3/lib/registry.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/registry.h rename to ExternalLibs/libvorbis-1.3.3/lib/registry.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/res0.c b/ExternalLibs/libvorbis-1.3.3/lib/res0.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/res0.c rename to ExternalLibs/libvorbis-1.3.3/lib/res0.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/scales.h b/ExternalLibs/libvorbis-1.3.3/lib/scales.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/scales.h rename to ExternalLibs/libvorbis-1.3.3/lib/scales.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/sharedbook.c b/ExternalLibs/libvorbis-1.3.3/lib/sharedbook.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/sharedbook.c rename to ExternalLibs/libvorbis-1.3.3/lib/sharedbook.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/smallft.c b/ExternalLibs/libvorbis-1.3.3/lib/smallft.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/smallft.c rename to ExternalLibs/libvorbis-1.3.3/lib/smallft.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/smallft.h b/ExternalLibs/libvorbis-1.3.3/lib/smallft.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/smallft.h rename to ExternalLibs/libvorbis-1.3.3/lib/smallft.h diff --git a/ExternalLibs/libvorbis-1.3.2/lib/synthesis.c b/ExternalLibs/libvorbis-1.3.3/lib/synthesis.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/synthesis.c rename to ExternalLibs/libvorbis-1.3.3/lib/synthesis.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/tone.c b/ExternalLibs/libvorbis-1.3.3/lib/tone.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/tone.c rename to ExternalLibs/libvorbis-1.3.3/lib/tone.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/vorbisenc.c b/ExternalLibs/libvorbis-1.3.3/lib/vorbisenc.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/vorbisenc.c rename to ExternalLibs/libvorbis-1.3.3/lib/vorbisenc.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/vorbisfile.c b/ExternalLibs/libvorbis-1.3.3/lib/vorbisfile.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/vorbisfile.c rename to ExternalLibs/libvorbis-1.3.3/lib/vorbisfile.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/window.c b/ExternalLibs/libvorbis-1.3.3/lib/window.c similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/window.c rename to ExternalLibs/libvorbis-1.3.3/lib/window.c diff --git a/ExternalLibs/libvorbis-1.3.2/lib/window.h b/ExternalLibs/libvorbis-1.3.3/lib/window.h similarity index 100% rename from ExternalLibs/libvorbis-1.3.2/lib/window.h rename to ExternalLibs/libvorbis-1.3.3/lib/window.h From ac6ca117aa87ddd7312579d47fa6ae560fc8c5f3 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Mon, 24 Sep 2012 02:32:21 +0200 Subject: [PATCH 37/42] vcproj update --- win/vc90/Aquaria.vcproj | 4 +- win/vc90/BBGE.vcproj | 4 +- win/vc90/external.vcproj | 92 ++++++++++++++++++++-------------------- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/win/vc90/Aquaria.vcproj b/win/vc90/Aquaria.vcproj index 94efbb1..70f7568 100644 --- a/win/vc90/Aquaria.vcproj +++ b/win/vc90/Aquaria.vcproj @@ -41,7 +41,7 @@ @@ -1347,15 +1347,15 @@ Name="libvorbis" > From 66d3b90473c8af6a834a2135fa678a4438c76f32 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 7 Oct 2012 00:05:17 +0200 Subject: [PATCH 38/42] Fix two sound looping bugs. The first one caused the music to stop randomly on scene changes, reproducible by changing maps with different music while holding 'G' button to speed up time. For some reason this caused the music to stop playing during the crossfade. Wasn't able to find the root cause, so I added a little hack to kick the music back on track if it stops unexpectedly. The second one was a simple string case issue; mostly noticable because of map background sounds not playing in loop mode. (this is possibly a regression from an earlier patch, not sure) --- BBGE/SoundManager.cpp | 63 ++++++++++++++++++------------------------- BBGE/SoundManager.h | 2 -- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/BBGE/SoundManager.cpp b/BBGE/SoundManager.cpp index d9f5454..4dfa57c 100644 --- a/BBGE/SoundManager.cpp +++ b/BBGE/SoundManager.cpp @@ -90,6 +90,7 @@ namespace SoundCore bool stopMusicOnFadeOut=false; bool wasPlayingVoice=false; + bool playingMusicOnce=false; typedef std::list FadeChs; FadeChs fadeChs; @@ -466,7 +467,7 @@ void SoundManager::toggleEffectMusic(SoundEffectType effect, bool on) std::string SoundManager::getVolumeString() { std::ostringstream os; - os << "sfxFader: " << this->sfxFader << " sfxVol: " << this->sfxVol << std::endl; + os << "sfxFader: " << this->sfxFader << " sfxVol: " << this->sfxVol << " [" << lastMusic << "]" << std::endl; os << "musVol: " << musVol.y << " voxVol: " << voxVol.y << std::endl; float musicChannelVol = -1; @@ -657,21 +658,17 @@ void SoundManager::update(float dt) if (musicChannel) { - bool _isplaying = false; - result = musicChannel->isPlaying(&_isplaying); - checkError(); - if (!_isplaying) + if (!isPlayingMusic()) { - result = musicChannel->stop(); - checkError(); - musicChannel = 0; - - if (musicStream) + if(!playingMusicOnce && lastMusic.size()) { - result = musicStream->release(); - checkError(); - musicStream = 0; - } + debugLog("music not playing, but it should be - force restart"); + playMusic(lastMusic, SLT_LOOP, SFT_IN, 1, SCT_NORMAL); // FIXME: make sure this works with playMusicOnce() + } + else + { + stopMusic(); + } } } @@ -685,17 +682,7 @@ void SoundManager::update(float dt) if (musVol.y <= 0 && stopMusicOnFadeOut) { - result = musicChannel->stop(); - checkError(); - musicChannel = 0; - - if (musicStream) - { - result = musicStream->release(); - checkError(); - musicStream = 0; - } - + stopMusic(); stopMusicOnFadeOut = false; } } @@ -791,7 +778,6 @@ void SoundManager::fadeMusic(SoundFadeType sft, float t) case SFT_CROSS: { #ifdef BBGE_BUILD_FMODEX - if (musicChannel2) { musicChannel2->stop(); @@ -1342,9 +1328,11 @@ bool SoundManager::playMusic(const std::string &name, SoundLoopType slt, SoundFa case SLT_OFF: case SLT_NONE: mode |= FMOD_LOOP_OFF; + playingMusicOnce = true; break; default: mode |= FMOD_LOOP_NORMAL; + playingMusicOnce = false; break; } @@ -1388,18 +1376,20 @@ bool SoundManager::playMusic(const std::string &name, SoundLoopType slt, SoundFa result = musicChannel->setPaused(false); // This is where the sound really starts. checkError(); + debugLog("music play: " + fn); + } + else + { + debugLog("Failed to create music stream: " + fn); } #endif - debugLog("playmusic end"); - return true; } void SoundManager::stopMusic() { - #ifdef BBGE_BUILD_FMODEX if (musicChannel) { @@ -1414,7 +1404,7 @@ void SoundManager::stopMusic() musicChannel = 0; } #endif - + playingMusicOnce = false; lastMusic = ""; } @@ -1518,6 +1508,12 @@ Buffer SoundManager::loadSoundIntoBank(const std::string &filename, const std::s std::string f = filename, name; + // HACK: proper sound looping + bool loop = false; + stringToLower(f); + if (f.find("loop")!=std::string::npos) + loop = true; + // WARNING: local sounds should go here! debugLog(filename); @@ -1540,13 +1536,6 @@ Buffer SoundManager::loadSoundIntoBank(const std::string &filename, const std::s f = core->adjustFilenameCase(f); } - bool loop = false; - - if (filename.find("loop")!=std::string::npos) - { - loop = true; - } - int loc = f.find_last_of('/'); int loc2 = f.rfind('.'); if (loc != std::string::npos && loc2 != std::string::npos) diff --git a/BBGE/SoundManager.h b/BBGE/SoundManager.h index 83f6b77..eb9646f 100644 --- a/BBGE/SoundManager.h +++ b/BBGE/SoundManager.h @@ -213,8 +213,6 @@ public: void update(float dt); - std::string currentMusic; - bool enabled; bool checkError(); From 6f05249fdc8ab2ec196e78cdf8bb06697531bfd4 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Tue, 9 Oct 2012 00:57:34 +0200 Subject: [PATCH 39/42] Fix crash in RenderObjectLayer::moveToBack() --- BBGE/RenderObjectLayer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BBGE/RenderObjectLayer.cpp b/BBGE/RenderObjectLayer.cpp index 6e37049..cd63ae8 100644 --- a/BBGE/RenderObjectLayer.cpp +++ b/BBGE/RenderObjectLayer.cpp @@ -314,7 +314,8 @@ void RenderObjectLayer::moveToBack(RenderObject *r) for (int i = newSize - 1; i >= sizeDiff; i--) { renderObjects[i] = renderObjects[i - sizeDiff]; - renderObjects[i]->setIdx(i); // Known to be non-NULL. + if(renderObjects[i]) + renderObjects[i]->setIdx(i); } for (int i = 0; i < newIdx; i++) renderObjects[i] = 0; From 8cad58f0c4a0d9e56757877ddd164d947a8b74fd Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 13 Oct 2012 05:43:47 +0200 Subject: [PATCH 40/42] Implement new (optional) world map reveal method. This one doesn't give the whole map away already just after entering it. --- Aquaria/GridRender.h | 9 +++++++ Aquaria/WorldMapRender.cpp | 52 +++++++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Aquaria/GridRender.h b/Aquaria/GridRender.h index 52a2c2d..c6ed3be 100644 --- a/Aquaria/GridRender.h +++ b/Aquaria/GridRender.h @@ -67,6 +67,12 @@ protected: InterpolatedVector lerp; }; +enum WorldMapRevealMethod +{ + REVEAL_DEFAULT = 0, + REVEAL_PARTIAL = 1 // Not visited areas have zero alpha (invisible) +}; + class WorldMapRender : public RenderObject, public ActionMapper { public: @@ -86,6 +92,9 @@ public: void removeGem(GemMover *gemMover); void onToggleHelpScreen(); bool isCursorOffHud(); + + static void setRevealMethod(WorldMapRevealMethod m); + protected: Quad *addHintQuad1, *addHintQuad2; AquariaMenuItem *helpButton; diff --git a/Aquaria/WorldMapRender.cpp b/Aquaria/WorldMapRender.cpp index b49f2e6..b8d07c7 100644 --- a/Aquaria/WorldMapRender.cpp +++ b/Aquaria/WorldMapRender.cpp @@ -44,11 +44,12 @@ namespace WorldMapRenderNamespace enum VisMethod { - VIS_VERTEX = 0, - VIS_WRITE = 1 + VIS_VERTEX = 0, // Uses the RenderObject tile grid (RenderObject::setSegs()) to display visited areas + VIS_WRITE = 1 // Uses render-to-texture instead }; VisMethod visMethod = VIS_VERTEX; + WorldMapRevealMethod revMethod = REVEAL_DEFAULT; std::vector tiles; @@ -84,6 +85,23 @@ WorldMapTile *activeTile=0; const float beaconSpawnBitTime = 0.05; + +void WorldMapRender::setRevealMethod(WorldMapRevealMethod m) +{ + switch(m) + { + case REVEAL_PARTIAL: + revMethod = REVEAL_PARTIAL; + baseMapSegAlpha = 0; + break; + + default: + revMethod = REVEAL_DEFAULT; + baseMapSegAlpha = 0.4; + } +} + + class WorldMapBoundQuad : public Quad { public: @@ -731,8 +749,6 @@ WorldMapRender::WorldMapRender() : RenderObject(), ActionMapper() q->alphaMod = 0; tile->q = q; - - setProperTileColor(tile); q->setWidthHeight(q->getWidth()*tile->scale, q->getHeight()*tile->scale); q->scale = Vector(0.25f*tile->scale2, 0.25f*tile->scale2); @@ -740,10 +756,18 @@ WorldMapRender::WorldMapRender() : RenderObject(), ActionMapper() if (tile == activeTile) activeQuad = q; - if (activeQuad == q) + if (revMethod == REVEAL_PARTIAL || activeQuad == q) { setVis(tile); } + + setProperTileColor(tile); + + if(activeQuad == q) + { + activeTile->q->color = Vector(1,1,1); + activeTile->q->alphaMod = 1; + } addChild(q, PM_POINTER); @@ -861,7 +885,13 @@ void WorldMapRender::bindInput() void WorldMapRender::destroy() { - clearVis(activeTile); + //clearVis(activeTile); + for (int i = 0; i < dsq->continuity.worldMap.getNumWorldMapTiles(); i++) + { + WorldMapTile *tile = dsq->continuity.worldMap.getWorldMapTile(i); + clearVis(tile); + } + RenderObject::destroy(); delete[] savedTexData; } @@ -973,7 +1003,8 @@ void WorldMapRender::onUpdate(float dt) { if ((activeTile != selectedTile) && selectedTile->q) { - clearVis(activeTile); + if(revMethod == REVEAL_DEFAULT) + clearVis(activeTile); activeTile = selectedTile; activeQuad = activeTile->q; @@ -1428,8 +1459,11 @@ void WorldMapRender::toggle(bool turnON) { if (activeTile != originalActiveTile) { - clearVis(activeTile); - setVis(originalActiveTile); + if(revMethod == REVEAL_DEFAULT) + { + clearVis(activeTile); + setVis(originalActiveTile); + } activeTile = originalActiveTile; activeQuad = activeTile->q; } From 416c47b4e9adec5ee38ab26578680c6f086d62a8 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 14 Oct 2012 03:46:47 +0200 Subject: [PATCH 41/42] Make world map reveal method configurable via user settings, and add the possibility for mods to override this setting. --- Aquaria/DSQ.h | 10 ++++++++++ Aquaria/Game.cpp | 5 +++++ Aquaria/GridRender.h | 6 ------ Aquaria/Mod.cpp | 7 +++++++ Aquaria/UserSettings.cpp | 8 ++++++++ Aquaria/UserSettings.h | 2 ++ 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index 1acd434..48ef1f2 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -177,6 +177,14 @@ enum MenuPage MENUPAGE_PETS = 3 }; +enum WorldMapRevealMethod +{ + REVEAL_UNSPECIFIED = -1, + REVEAL_DEFAULT = 0, + REVEAL_PARTIAL = 1 // Not visited areas have zero alpha (invisible) +}; + + /* class Title; class GameOver; @@ -274,6 +282,8 @@ public: static bool loadModXML(TiXmlDocument *d, std::string modName); static ModType getTypeFromXML(TiXmlElement *xml); + WorldMapRevealMethod mapRevealMethod; + protected: bool shuttingDown; bool active; diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index ce2c3f9..68d699b 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -6742,6 +6742,11 @@ void Game::applyState() worldMapRender = 0; + if(dsq->mod.isActive() && dsq->mod.mapRevealMethod != REVEAL_UNSPECIFIED) + WorldMapRender::setRevealMethod(dsq->mod.mapRevealMethod); + else + WorldMapRender::setRevealMethod((WorldMapRevealMethod)dsq->user.video.worldMapRevealMethod); + worldMapRender = new WorldMapRender; addRenderObject(worldMapRender, LR_WORLDMAP); // to hide minimap diff --git a/Aquaria/GridRender.h b/Aquaria/GridRender.h index c6ed3be..43e04b3 100644 --- a/Aquaria/GridRender.h +++ b/Aquaria/GridRender.h @@ -67,12 +67,6 @@ protected: InterpolatedVector lerp; }; -enum WorldMapRevealMethod -{ - REVEAL_DEFAULT = 0, - REVEAL_PARTIAL = 1 // Not visited areas have zero alpha (invisible) -}; - class WorldMapRender : public RenderObject, public ActionMapper { public: diff --git a/Aquaria/Mod.cpp b/Aquaria/Mod.cpp index 0f8b78c..693b9f0 100644 --- a/Aquaria/Mod.cpp +++ b/Aquaria/Mod.cpp @@ -60,6 +60,7 @@ void Mod::clear() debugMenu = false; hasMap = false; blockEditor = false; + mapRevealMethod = REVEAL_UNSPECIFIED; } bool Mod::isDebugMenu() @@ -137,6 +138,11 @@ void Mod::load(const std::string &p) props->Attribute("blockEditor", &t); blockEditor = t; } + if (props->Attribute("worldMapRevealMethod")) { + int t; + props->Attribute("worldMapRevealMethod", &t); + mapRevealMethod = (WorldMapRevealMethod)t; + } } } @@ -248,6 +254,7 @@ void Mod::setActive(bool a) { if (!active) { + mapRevealMethod = REVEAL_UNSPECIFIED; setLocalisationModPath(""); name = path = ""; dsq->secondaryTexturePath = ""; diff --git a/Aquaria/UserSettings.cpp b/Aquaria/UserSettings.cpp index b3d126b..49e19f4 100644 --- a/Aquaria/UserSettings.cpp +++ b/Aquaria/UserSettings.cpp @@ -144,6 +144,12 @@ void UserSettings::save() xml_saveSlotScreens.SetAttribute("on", video.saveSlotScreens); } xml_video.InsertEndChild(xml_saveSlotScreens); + + TiXmlElement xml_worldMap("WorldMap"); + { + xml_worldMap.SetAttribute("revealMethod", video.worldMapRevealMethod); + } + xml_video.InsertEndChild(xml_worldMap); } doc.InsertEndChild(xml_video); @@ -445,6 +451,8 @@ void UserSettings::load(bool doApply, const std::string &overrideFile) } readInt(xml_video, "SaveSlotScreens", "on", &video.saveSlotScreens); + + readInt(xml_video, "WorldMap", "revealMethod", &video.worldMapRevealMethod); } TiXmlElement *xml_control = doc.FirstChildElement("Control"); diff --git a/Aquaria/UserSettings.h b/Aquaria/UserSettings.h index 50b6c3f..1e31763 100644 --- a/Aquaria/UserSettings.h +++ b/Aquaria/UserSettings.h @@ -113,6 +113,7 @@ public: vsync = 1; darkbuffersize = 256; displaylists = 0; + worldMapRevealMethod = 0; } int shader; int blur; @@ -123,6 +124,7 @@ public: int parallaxOn0, parallaxOn1, parallaxOn2; int numParticles; int displaylists; + int worldMapRevealMethod; } video; struct Control From c5700f9c35cc71a3ced9b8892656aca9287d5acb Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sun, 14 Oct 2012 03:51:02 +0200 Subject: [PATCH 42/42] Little things to make the world map more user friendly: - Map markers are now spawned on the player position, not above - 66% alpha for world map icons, this way some of the stuff below the icon can be seen. - Unified and increased zoom-in distance. This way the view no longer forcefully resets to another zoom level when selecting maps of different layers (i.e. first an interior map, then zoom in, then select a regular map), which was a little jarring. The increased zoom level is useful for close-ups on tiny areas like the sun temple. --- Aquaria/WorldMapRender.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Aquaria/WorldMapRender.cpp b/Aquaria/WorldMapRender.cpp index b8d07c7..e9f1b9f 100644 --- a/Aquaria/WorldMapRender.cpp +++ b/Aquaria/WorldMapRender.cpp @@ -62,9 +62,9 @@ namespace WorldMapRenderNamespace float xMin, yMin, xMax, yMax; float zoomMin = 0.2; - float zoomMax = 1; - const float exteriorZoomMax = 1; - const float interiorZoomMax = 1.8; + float zoomMax = 3.0; + const float exteriorZoomMax = 3.0; + const float interiorZoomMax = 3.0; bool editorActive=false; @@ -295,6 +295,7 @@ public: followCamera = 1; blink = false; blinkTimer = 0; + alphaMod = 0.66; canMove = gemData->canMove; //canMove = true; //gemData->userString = "HI THERE!"; @@ -1538,7 +1539,7 @@ void WorldMapRender::createGemHint(const std::string &gfx) doubleClickTimer = 0; GemData *g = dsq->continuity.pickupGem(gfx, false); g->canMove = 1; - g->pos = getAvatarWorldMapPosition() + Vector(0, -20); + g->pos = getAvatarWorldMapPosition();// + Vector(0, -20); g->userString = useString; addGem(g); fixGems();