00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "mmstools/mmstypes.h"
00034 #include "mmstools/tools.h"
00035 #include <string.h>
00036 #include <math.h>
00037 #include <stdlib.h>
00038
00039
00040 string getMMSFBBackendString(MMSFBBackend be) {
00041 if(be == MMSFB_BE_DFB)
00042 return MMSFB_BE_DFB_STR;
00043 if(be == MMSFB_BE_X11)
00044 return MMSFB_BE_X11_STR;
00045 if(be == MMSFB_BE_FBDEV)
00046 return MMSFB_BE_FBDEV_STR;
00047 return MMSFB_BE_NONE_STR;
00048 }
00049
00050 MMSFBBackend getMMSFBBackendFromString(string be) {
00051 if(be == MMSFB_BE_NONE_STR)
00052 return MMSFB_BE_NONE;
00053 if(be == MMSFB_BE_DFB_STR)
00054 return MMSFB_BE_DFB;
00055 if(be == MMSFB_BE_X11_STR)
00056 return MMSFB_BE_X11;
00057 if(be == MMSFB_BE_FBDEV_STR)
00058 return MMSFB_BE_FBDEV;
00059 return MMSFB_BE_NONE;
00060 }
00061
00062 string getMMSFBOutputTypeString(MMSFBOutputType ot) {
00063 if(ot == MMSFB_OT_STDFB)
00064 return MMSFB_OT_STDFB_STR;
00065 if(ot == MMSFB_OT_MATROXFB)
00066 return MMSFB_OT_MATROXFB_STR;
00067 if(ot == MMSFB_OT_VIAFB)
00068 return MMSFB_OT_VIAFB_STR;
00069 if(ot == MMSFB_OT_X11)
00070 return MMSFB_OT_X11_STR;
00071 if(ot == MMSFB_OT_XSHM)
00072 return MMSFB_OT_XSHM_STR;
00073 if(ot == MMSFB_OT_XVSHM)
00074 return MMSFB_OT_XVSHM_STR;
00075 if(ot == MMSFB_OT_DAVINCIFB)
00076 return MMSFB_OT_DAVINCIFB_STR;
00077 if(ot == MMSFB_OT_OMAPFB)
00078 return MMSFB_OT_OMAPFB_STR;
00079 if(ot == MMSFB_OT_OGL)
00080 return MMSFB_OT_OGL_STR;
00081 return MMSFB_OT_NONE_STR;
00082 }
00083
00084 MMSFBOutputType getMMSFBOutputTypeFromString(string ot) {
00085 if(ot == MMSFB_OT_NONE_STR)
00086 return MMSFB_OT_NONE;
00087 if(ot == MMSFB_OT_STDFB_STR)
00088 return MMSFB_OT_STDFB;
00089 if(ot == MMSFB_OT_MATROXFB_STR)
00090 return MMSFB_OT_MATROXFB;
00091 if(ot == MMSFB_OT_VIAFB_STR)
00092 return MMSFB_OT_VIAFB;
00093 if(ot == MMSFB_OT_X11_STR)
00094 return MMSFB_OT_X11;
00095 if(ot == MMSFB_OT_XSHM_STR)
00096 return MMSFB_OT_XSHM;
00097 if(ot == MMSFB_OT_XVSHM_STR)
00098 return MMSFB_OT_XVSHM;
00099 if(ot == MMSFB_OT_DAVINCIFB_STR)
00100 return MMSFB_OT_DAVINCIFB;
00101 if(ot == MMSFB_OT_OMAPFB_STR)
00102 return MMSFB_OT_OMAPFB;
00103 if(ot == MMSFB_OT_OGL_STR)
00104 return MMSFB_OT_OGL;
00105 return MMSFB_OT_NONE;
00106 }
00107
00108 string getMMSFBFullScreenModeString(MMSFBFullScreenMode fsm) {
00109 if(fsm == MMSFB_FSM_FALSE)
00110 return MMSFB_FSM_FALSE_STR;
00111 if(fsm == MMSFB_FSM_TRUE)
00112 return MMSFB_FSM_TRUE_STR;
00113 if(fsm == MMSFB_FSM_ASPECT_RATIO)
00114 return MMSFB_FSM_ASPECT_RATIO_STR;
00115 return MMSFB_FSM_NONE_STR;
00116 }
00117
00118 MMSFBFullScreenMode getMMSFBFullScreenModeFromString(string fsm) {
00119 if(fsm == MMSFB_FSM_NONE_STR)
00120 return MMSFB_FSM_NONE;
00121 if(fsm == MMSFB_FSM_FALSE_STR)
00122 return MMSFB_FSM_FALSE;
00123 if(fsm == MMSFB_FSM_TRUE_STR)
00124 return MMSFB_FSM_TRUE;
00125 if(fsm == MMSFB_FSM_ASPECT_RATIO_STR)
00126 return MMSFB_FSM_ASPECT_RATIO;
00127 return MMSFB_FSM_NONE;
00128 }
00129
00130
00131
00132 string getMMSFBPixelFormatString(MMSFBSurfacePixelFormat pf) {
00133 switch (pf) {
00134 case MMSFB_PF_RGB16: return MMSFB_PF_RGB16_STR;
00135 case MMSFB_PF_RGB24: return MMSFB_PF_RGB24_STR;
00136 case MMSFB_PF_RGB32: return MMSFB_PF_RGB32_STR;
00137 case MMSFB_PF_ARGB: return MMSFB_PF_ARGB_STR;
00138 case MMSFB_PF_A8: return MMSFB_PF_A8_STR;
00139 case MMSFB_PF_YUY2: return MMSFB_PF_YUY2_STR;
00140 case MMSFB_PF_UYVY: return MMSFB_PF_UYVY_STR;
00141 case MMSFB_PF_I420: return MMSFB_PF_I420_STR;
00142 case MMSFB_PF_YV12: return MMSFB_PF_YV12_STR;
00143 case MMSFB_PF_AiRGB: return MMSFB_PF_AiRGB_STR;
00144 case MMSFB_PF_A1: return MMSFB_PF_A1_STR;
00145 case MMSFB_PF_NV12: return MMSFB_PF_NV12_STR;
00146 case MMSFB_PF_NV16: return MMSFB_PF_NV16_STR;
00147 case MMSFB_PF_NV21: return MMSFB_PF_NV21_STR;
00148 case MMSFB_PF_AYUV: return MMSFB_PF_AYUV_STR;
00149 case MMSFB_PF_A4: return MMSFB_PF_A4_STR;
00150 case MMSFB_PF_ARGB1666:return MMSFB_PF_ARGB1666_STR;
00151 case MMSFB_PF_ARGB6666:return MMSFB_PF_ARGB6666_STR;
00152 case MMSFB_PF_RGB18: return MMSFB_PF_RGB18_STR;
00153 case MMSFB_PF_LUT2: return MMSFB_PF_LUT2_STR;
00154 case MMSFB_PF_RGB444: return MMSFB_PF_RGB444_STR;
00155 case MMSFB_PF_RGB555: return MMSFB_PF_RGB555_STR;
00156 case MMSFB_PF_ARGB1555:return MMSFB_PF_ARGB1555_STR;
00157 case MMSFB_PF_RGB332: return MMSFB_PF_RGB332_STR;
00158 case MMSFB_PF_ALUT44: return MMSFB_PF_ALUT44_STR;
00159 case MMSFB_PF_LUT8: return MMSFB_PF_LUT8_STR;
00160 case MMSFB_PF_ARGB2554:return MMSFB_PF_ARGB2554_STR;
00161 case MMSFB_PF_ARGB4444:return MMSFB_PF_ARGB4444_STR;
00162 case MMSFB_PF_ARGB3565:return MMSFB_PF_ARGB3565_STR;
00163 case MMSFB_PF_BGR24: return MMSFB_PF_BGR24_STR;
00164 case MMSFB_PF_BGR555: return MMSFB_PF_BGR555_STR;
00165 case MMSFB_PF_ABGR: return MMSFB_PF_ABGR_STR;
00166 default: return MMSFB_PF_NONE_STR;
00167 }
00168 }
00169
00170 MMSFBSurfacePixelFormat getMMSFBPixelFormatFromString(string pf) {
00171 if(pf == MMSFB_PF_NONE_STR)
00172 return MMSFB_PF_NONE;
00173 if(pf == MMSFB_PF_RGB16_STR)
00174 return MMSFB_PF_RGB16;
00175 if(pf == MMSFB_PF_RGB24_STR)
00176 return MMSFB_PF_RGB24;
00177 if(pf == MMSFB_PF_RGB32_STR)
00178 return MMSFB_PF_RGB32;
00179 if(pf == MMSFB_PF_ARGB_STR)
00180 return MMSFB_PF_ARGB;
00181 if(pf == MMSFB_PF_A8_STR)
00182 return MMSFB_PF_A8;
00183 if(pf == MMSFB_PF_YUY2_STR)
00184 return MMSFB_PF_YUY2;
00185 if(pf == MMSFB_PF_UYVY_STR)
00186 return MMSFB_PF_UYVY;
00187 if(pf == MMSFB_PF_I420_STR)
00188 return MMSFB_PF_I420;
00189 if(pf == MMSFB_PF_YV12_STR)
00190 return MMSFB_PF_YV12;
00191 if(pf == strToUpr(MMSFB_PF_AiRGB_STR))
00192 return MMSFB_PF_AiRGB;
00193 if(pf == MMSFB_PF_A1_STR)
00194 return MMSFB_PF_A1;
00195 if(pf == MMSFB_PF_NV12_STR)
00196 return MMSFB_PF_NV12;
00197 if(pf == MMSFB_PF_NV16_STR)
00198 return MMSFB_PF_NV16;
00199 if(pf == MMSFB_PF_NV21_STR)
00200 return MMSFB_PF_NV21;
00201 if(pf == MMSFB_PF_AYUV_STR)
00202 return MMSFB_PF_AYUV;
00203 if(pf == MMSFB_PF_A4_STR)
00204 return MMSFB_PF_A4;
00205 if(pf == MMSFB_PF_ARGB1666_STR)
00206 return MMSFB_PF_ARGB1666;
00207 if(pf == MMSFB_PF_ARGB6666_STR)
00208 return MMSFB_PF_ARGB6666;
00209 if(pf == MMSFB_PF_RGB18_STR)
00210 return MMSFB_PF_RGB18;
00211 if(pf == MMSFB_PF_LUT2_STR)
00212 return MMSFB_PF_LUT2;
00213 if(pf == MMSFB_PF_RGB444_STR)
00214 return MMSFB_PF_RGB444;
00215 if(pf == MMSFB_PF_RGB555_STR)
00216 return MMSFB_PF_RGB555;
00217 if(pf == MMSFB_PF_ARGB1555_STR)
00218 return MMSFB_PF_ARGB1555;
00219 if(pf == MMSFB_PF_RGB332_STR)
00220 return MMSFB_PF_RGB332;
00221 if(pf == MMSFB_PF_ALUT44_STR)
00222 return MMSFB_PF_ALUT44;
00223 if(pf == MMSFB_PF_LUT8_STR)
00224 return MMSFB_PF_LUT8;
00225 if(pf == MMSFB_PF_ARGB2554_STR)
00226 return MMSFB_PF_ARGB2554;
00227 if(pf == MMSFB_PF_ARGB4444_STR)
00228 return MMSFB_PF_ARGB4444;
00229 if(pf == MMSFB_PF_ARGB3565_STR)
00230 return MMSFB_PF_ARGB3565;
00231 if(pf == MMSFB_PF_BGR24_STR)
00232 return MMSFB_PF_BGR24;
00233 if(pf == MMSFB_PF_BGR555_STR)
00234 return MMSFB_PF_BGR555;
00235 if(pf == MMSFB_PF_ABGR_STR)
00236 return MMSFB_PF_ABGR;
00237 return MMSFB_PF_NONE;
00238 }
00239
00240
00241 bool getMMSFBColorFromString(string input, MMSFBColor *color) {
00242
00243 if (!color)
00244 return false;
00245
00246
00247 color->r = 0;
00248 color->g = 0;
00249 color->b = 0;
00250 color->a = 0;
00251
00252
00253 if (input == "")
00254 return false;
00255
00256 if (input.size()!=9)
00257 return false;
00258
00259 if (input.substr(0,1)!="#")
00260 return false;
00261
00262
00263 color->r = hexToInt(input.substr(1,2).c_str());
00264 color->g = hexToInt(input.substr(3,2).c_str());
00265 color->b = hexToInt(input.substr(5,2).c_str());
00266 color->a = hexToInt(input.substr(7,2).c_str());
00267
00268 return true;
00269 }
00270
00271
00272 string getMMSFBColorString(MMSFBColor color) {
00273 string ret = "#";
00274 ret+= ucharToHex(color.r);
00275 ret+= ucharToHex(color.g);
00276 ret+= ucharToHex(color.b);
00277 ret+= ucharToHex(color.a);
00278 return ret;
00279 }
00280
00281
00282
00283 string getMMSFBPointerModeString(MMSFBPointerMode pm) {
00284 if(pm == MMSFB_PM_FALSE)
00285 return MMSFB_PM_FALSE_STR;
00286 if(pm == MMSFB_PM_TRUE)
00287 return MMSFB_PM_TRUE_STR;
00288 if(pm == MMSFB_PM_EXTERNAL)
00289 return MMSFB_PM_EXTERNAL_STR;
00290 return MMSFB_PM_NONE_STR;
00291 }
00292
00293 MMSFBPointerMode getMMSFBPointerModeFromString(string pm) {
00294 if(pm == MMSFB_PM_NONE_STR)
00295 return MMSFB_PM_NONE;
00296 if(pm == MMSFB_PM_FALSE_STR)
00297 return MMSFB_PM_FALSE;
00298 if(pm == MMSFB_PM_TRUE_STR)
00299 return MMSFB_PM_TRUE;
00300 if(pm == MMSFB_PM_EXTERNAL_STR)
00301 return MMSFB_PM_EXTERNAL;
00302 return MMSFB_PM_NONE;
00303 }
00304
00305
00306 const char *convertMMSKeySymbolToXKeysymString(MMSKeySymbol key) {
00307 switch (key) {
00308 case MMSKEY_CURSOR_LEFT: return "Left";
00309 case MMSKEY_CURSOR_RIGHT: return "Right";
00310 case MMSKEY_CURSOR_UP: return "Up";
00311 case MMSKEY_CURSOR_DOWN: return "Down";
00312 case MMSKEY_0: return "0";
00313 case MMSKEY_1: return "1";
00314 case MMSKEY_2: return "2";
00315 case MMSKEY_3: return "3";
00316 case MMSKEY_4: return "4";
00317 case MMSKEY_5: return "5";
00318 case MMSKEY_6: return "6";
00319 case MMSKEY_7: return "7";
00320 case MMSKEY_8: return "8";
00321 case MMSKEY_9: return "9";
00322 case MMSKEY_CAPITAL_A: return "A";
00323 case MMSKEY_CAPITAL_B: return "B";
00324 case MMSKEY_CAPITAL_C: return "C";
00325 case MMSKEY_CAPITAL_D: return "D";
00326 case MMSKEY_CAPITAL_E: return "E";
00327 case MMSKEY_CAPITAL_F: return "F";
00328 case MMSKEY_CAPITAL_G: return "G";
00329 case MMSKEY_CAPITAL_H: return "H";
00330 case MMSKEY_CAPITAL_I: return "I";
00331 case MMSKEY_CAPITAL_J: return "J";
00332 case MMSKEY_CAPITAL_K: return "K";
00333 case MMSKEY_CAPITAL_L: return "L";
00334 case MMSKEY_CAPITAL_M: return "M";
00335 case MMSKEY_CAPITAL_N: return "N";
00336 case MMSKEY_CAPITAL_O: return "O";
00337 case MMSKEY_CAPITAL_P: return "P";
00338 case MMSKEY_CAPITAL_Q: return "Q";
00339 case MMSKEY_CAPITAL_R: return "R";
00340 case MMSKEY_CAPITAL_S: return "S";
00341 case MMSKEY_CAPITAL_T: return "T";
00342 case MMSKEY_CAPITAL_U: return "U";
00343 case MMSKEY_CAPITAL_V: return "V";
00344 case MMSKEY_CAPITAL_W: return "W";
00345 case MMSKEY_CAPITAL_X: return "X";
00346 case MMSKEY_CAPITAL_Y: return "Y";
00347 case MMSKEY_CAPITAL_Z: return "Z";
00348 case MMSKEY_SMALL_A: return "a";
00349 case MMSKEY_SMALL_B: return "b";
00350 case MMSKEY_SMALL_C: return "c";
00351 case MMSKEY_SMALL_D: return "d";
00352 case MMSKEY_SMALL_E: return "e";
00353 case MMSKEY_SMALL_F: return "f";
00354 case MMSKEY_SMALL_G: return "g";
00355 case MMSKEY_SMALL_H: return "h";
00356 case MMSKEY_SMALL_I: return "i";
00357 case MMSKEY_SMALL_J: return "j";
00358 case MMSKEY_SMALL_K: return "k";
00359 case MMSKEY_SMALL_L: return "l";
00360 case MMSKEY_SMALL_M: return "m";
00361 case MMSKEY_SMALL_N: return "n";
00362 case MMSKEY_SMALL_O: return "o";
00363 case MMSKEY_SMALL_P: return "p";
00364 case MMSKEY_SMALL_Q: return "q";
00365 case MMSKEY_SMALL_R: return "r";
00366 case MMSKEY_SMALL_S: return "s";
00367 case MMSKEY_SMALL_T: return "t";
00368 case MMSKEY_SMALL_U: return "u";
00369 case MMSKEY_SMALL_V: return "v";
00370 case MMSKEY_SMALL_W: return "w";
00371 case MMSKEY_SMALL_X: return "x";
00372 case MMSKEY_SMALL_Y: return "y";
00373 case MMSKEY_SMALL_Z: return "z";
00374 case MMSKEY_F1: return "F1";
00375 case MMSKEY_F2: return "F2";
00376 case MMSKEY_F3: return "F3";
00377 case MMSKEY_F4: return "F4";
00378 case MMSKEY_F5: return "F5";
00379 case MMSKEY_F6: return "F6";
00380 case MMSKEY_F7: return "F7";
00381 case MMSKEY_F8: return "F8";
00382 case MMSKEY_F9: return "F9";
00383 case MMSKEY_F10: return "F10";
00384 case MMSKEY_F11: return "F11";
00385 case MMSKEY_F12: return "F12";
00386 case MMSKEY_CAPS_LOCK: return "Caps_Lock";
00387 case MMSKEY_NUM_LOCK: return "Num_Lock";
00388 case MMSKEY_SCROLL_LOCK: return "Scroll_Lock";
00389 case MMSKEY_ESCAPE: return "Escape";
00390 case MMSKEY_TAB: return "Tab";
00391 case MMSKEY_RETURN: return "Return";
00392 case MMSKEY_SPACE: return "space";
00393 case MMSKEY_BACKSPACE: return "BackSpace";
00394 case MMSKEY_INSERT: return "Insert";
00395 case MMSKEY_DELETE: return "Delete";
00396 case MMSKEY_HOME: return "Home";
00397 case MMSKEY_END: return "End";
00398 case MMSKEY_PAGE_UP: return "Prior";
00399 case MMSKEY_PAGE_DOWN: return "Next";
00400 case MMSKEY_PRINT: return "Print";
00401 case MMSKEY_PAUSE: return "Pause";
00402 case MMSKEY_MINUS_SIGN: return "minus";
00403 case MMSKEY_EQUALS_SIGN: return "equal";
00404 case MMSKEY_BACKSLASH: return "backslash";
00405 case MMSKEY_SEMICOLON: return "semicolon";
00406 case MMSKEY_COMMA: return "comma";
00407 case MMSKEY_PERIOD: return "period";
00408 case MMSKEY_SLASH: return "slash";
00409 case MMSKEY_SHIFT: return "Shift";
00410 case MMSKEY_CONTROL: return "Control";
00411 case MMSKEY_ALT: return "Alt";
00412 case MMSKEY_META: return "Meta";
00413 case MMSKEY_SUPER: return "Super";
00414 case MMSKEY_HYPER: return "Hyper";
00415 case MMSKEY_ALTGR: return "Mode_switch";
00416 case MMSKEY_ASTERISK: return "Multiply";
00417 case MMSKEY_PLUS_SIGN: return "Add";
00418 case MMSKEY_COLON: return "colon";
00419 default: return "";
00420 }
00421 }
00422
00423
00424 string getMMSLanguageString(MMSLanguage lang) {
00425 if (lang == MMSLANG_DE)
00426 return MMSLANG_DE_STR;
00427 if (lang == MMSLANG_EN)
00428 return MMSLANG_EN_STR;
00429 if (lang == MMSLANG_DK)
00430 return MMSLANG_DK_STR;
00431 if (lang == MMSLANG_ES)
00432 return MMSLANG_ES_STR;
00433 if (lang == MMSLANG_FI)
00434 return MMSLANG_FI_STR;
00435 if (lang == MMSLANG_FR)
00436 return MMSLANG_FR_STR;
00437 if (lang == MMSLANG_IT)
00438 return MMSLANG_IT_STR;
00439 if (lang == MMSLANG_NL)
00440 return MMSLANG_NL_STR;
00441 if (lang == MMSLANG_NO)
00442 return MMSLANG_NO_STR;
00443 if (lang == MMSLANG_SE)
00444 return MMSLANG_SE_STR;
00445 if (lang == MMSLANG_TR)
00446 return MMSLANG_TR_STR;
00447 if (lang == MMSLANG_CN)
00448 return MMSLANG_CN_STR;
00449 if (lang == MMSLANG_IL)
00450 return MMSLANG_IL_STR;
00451 if (lang == MMSLANG_AR)
00452 return MMSLANG_AR_STR;
00453 return MMSLANG_NONE_STR;
00454 }
00455
00456 MMSLanguage getMMSLanguageFromString(string lang) {
00457 strToUpr(&lang);
00458 if (lang == MMSLANG_NONE_STR)
00459 return MMSLANG_NONE;
00460 if (lang == MMSLANG_DE_STR)
00461 return MMSLANG_DE;
00462 if (lang == MMSLANG_EN_STR)
00463 return MMSLANG_EN;
00464 if (lang == MMSLANG_DK_STR)
00465 return MMSLANG_DK;
00466 if (lang == MMSLANG_ES_STR)
00467 return MMSLANG_ES;
00468 if (lang == MMSLANG_FI_STR)
00469 return MMSLANG_FI;
00470 if (lang == MMSLANG_FR_STR)
00471 return MMSLANG_FR;
00472 if (lang == MMSLANG_IT_STR)
00473 return MMSLANG_IT;
00474 if (lang == MMSLANG_NL_STR)
00475 return MMSLANG_NL;
00476 if (lang == MMSLANG_NO_STR)
00477 return MMSLANG_NO;
00478 if (lang == MMSLANG_SE_STR)
00479 return MMSLANG_SE;
00480 if (lang == MMSLANG_TR_STR)
00481 return MMSLANG_TR;
00482 if (lang == MMSLANG_CN_STR)
00483 return MMSLANG_CN;
00484 if (lang == MMSLANG_IL_STR)
00485 return MMSLANG_IL;
00486 if (lang == MMSLANG_AR_STR)
00487 return MMSLANG_AR;
00488 return MMSLANG_NONE;
00489 }
00490
00491
00492
00493
00494 MMS_HALF_FLOAT convertFloat2HalfFloat(float f) {
00495 unsigned int x = *(unsigned int *)&f;
00496 unsigned int sign = (unsigned short)(x >> 31);
00497 unsigned int mantissa;
00498 unsigned int exp;
00499 MMS_HALF_FLOAT hf;
00500
00501
00502 mantissa = x & ((1 << 23) - 1);
00503
00504
00505 exp = x & FLOAT_MAX_BIASED_EXP;
00506
00507 if (exp >= HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP) {
00508
00509 if (mantissa && (exp == FLOAT_MAX_BIASED_EXP)) {
00510
00511 mantissa = (1 << 23) - 1;
00512 }
00513 else {
00514
00515 mantissa = 0;
00516 }
00517
00518 hf = (((MMS_HALF_FLOAT)sign) << 15) | (MMS_HALF_FLOAT)(HALF_FLOAT_MAX_BIASED_EXP) | (MMS_HALF_FLOAT)(mantissa >> 13);
00519 }
00520
00521 else if (exp <= HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP) {
00522
00523 exp = (HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP - exp) >> 23;
00524 mantissa >>= (14 + exp);
00525 hf = (((MMS_HALF_FLOAT)sign) << 15) | (MMS_HALF_FLOAT)(mantissa);
00526 }
00527 else {
00528 hf = (((MMS_HALF_FLOAT)sign) << 15) | (MMS_HALF_FLOAT)((exp - HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP) >> 13) |
00529 (MMS_HALF_FLOAT)(mantissa >> 13);
00530 }
00531
00532 return hf;
00533 }
00534
00535 float convertHalfFloat2Float(MMS_HALF_FLOAT hf) {
00536 unsigned int sign = (unsigned int)(hf >> 15);
00537 unsigned int mantissa = (unsigned int)(hf & ((1 << 10) - 1));
00538 unsigned int exp = (unsigned int)(hf & HALF_FLOAT_MAX_BIASED_EXP);
00539 unsigned int f;
00540
00541 if (exp == HALF_FLOAT_MAX_BIASED_EXP) {
00542
00543
00544
00545 exp = FLOAT_MAX_BIASED_EXP;
00546 if (mantissa)
00547 mantissa = (1 << 23) - 1;
00548 }
00549 else if (exp == 0x0) {
00550
00551 if (mantissa) {
00552 mantissa <<= 1;
00553 exp = HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP;
00554
00555
00556 while ((mantissa & (1 << 10)) == 0) {
00557
00558
00559 mantissa <<= 1;
00560 exp -= (1 << 23);
00561 }
00562
00563
00564 mantissa &= ((1 << 10) - 1);
00565
00566 mantissa <<= 13;
00567 }
00568 }
00569 else {
00570
00571 mantissa <<= 13;
00572
00573 exp = (exp << 13) + HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP;
00574 }
00575
00576 f = (sign << 31) | exp | mantissa;
00577 return *((float *)&f);
00578 }
00579
00580
00581
00582 bool initVertexArray(MMS_VERTEX_ARRAY *array, int eSize, int eNum,
00583 MMS_VERTEX_DATA_TYPE dtype, void *data) {
00584 if (!array) return false;
00585 array->dtype = dtype;
00586 array->data = data;
00587 if (eSize <= 0 || eNum <= 0) {
00588 array->eSize = 0;
00589 array->eNum = 0;
00590 return false;
00591 }
00592 array->eSize = eSize;
00593 array->eNum = eNum;
00594
00595 if (!array->data) {
00596
00597 unsigned int len = getVertexArraySize(array);
00598 if (!len) return false;
00599 array->data = malloc(len);
00600 }
00601
00602 return true;
00603 }
00604
00605 void freeVertexArray(MMS_VERTEX_ARRAY *array) {
00606 if (array && array->data) {
00607 free(array->data);
00608 array->data = NULL;
00609 }
00610 }
00611
00612 unsigned int getVertexArraySize(MMS_VERTEX_ARRAY *array) {
00613 switch (array->dtype) {
00614 case MMS_VERTEX_DATA_TYPE_FLOAT:
00615 return sizeof(float) * array->eSize * array->eNum;
00616 case MMS_VERTEX_DATA_TYPE_HALF_FLOAT:
00617 return sizeof(MMS_HALF_FLOAT) * array->eSize * array->eNum;
00618 default:
00619 return 0;
00620 }
00621 }
00622
00623
00624 bool initIndexArray(MMS_INDEX_ARRAY *array, MMS_INDEX_ARRAY_TYPE type, int eNum, unsigned int *data) {
00625 if (!array) return false;
00626 array->type = type;
00627 array->data = data;
00628 if (eNum < 0) {
00629 array->eNum = 0;
00630 return false;
00631 }
00632 array->eNum = eNum;
00633
00634 if (!array->data) {
00635
00636
00637
00638 unsigned int len = getIndexArraySize(array);
00639 if (len) {
00640 array->data = (unsigned int *)malloc(len);
00641 }
00642 }
00643
00644 return true;
00645 }
00646
00647 void freeIndexArray(MMS_INDEX_ARRAY *array) {
00648 if (array && array->data) {
00649 free(array->data);
00650 array->data = NULL;
00651 }
00652 }
00653
00654 unsigned int getIndexArraySize(MMS_INDEX_ARRAY *array) {
00655 return sizeof(unsigned int) * array->eNum;
00656 }
00657
00658
00659 void multiplyMatrix(MMSMatrix result, MMSMatrix srcA, MMSMatrix srcB) {
00660 MMSMatrix tmp;
00661
00662 for (int i = 0; i < 4; i++) {
00663 tmp[i][0] = (srcA[i][0] * srcB[0][0]) +
00664 (srcA[i][1] * srcB[1][0]) +
00665 (srcA[i][2] * srcB[2][0]) +
00666 (srcA[i][3] * srcB[3][0]);
00667
00668 tmp[i][1] = (srcA[i][0] * srcB[0][1]) +
00669 (srcA[i][1] * srcB[1][1]) +
00670 (srcA[i][2] * srcB[2][1]) +
00671 (srcA[i][3] * srcB[3][1]);
00672
00673 tmp[i][2] = (srcA[i][0] * srcB[0][2]) +
00674 (srcA[i][1] * srcB[1][2]) +
00675 (srcA[i][2] * srcB[2][2]) +
00676 (srcA[i][3] * srcB[3][2]);
00677
00678 tmp[i][3] = (srcA[i][0] * srcB[0][3]) +
00679 (srcA[i][1] * srcB[1][3]) +
00680 (srcA[i][2] * srcB[2][3]) +
00681 (srcA[i][3] * srcB[3][3]);
00682 }
00683 memcpy(result, tmp, sizeof(MMSMatrix));
00684 }
00685
00686
00687 void copyMatrix(MMSMatrix result, MMSMatrix src) {
00688 memcpy(result, src, sizeof(MMSMatrix));
00689 }
00690
00691 bool equalMatrix(MMSMatrix result, MMSMatrix src) {
00692 return (memcmp(result, src, sizeof(MMSMatrix)) == 0);
00693 }
00694
00695
00696
00697 void loadIdentityMatrix(MMSMatrix result) {
00698 memset(result, 0x0, sizeof(MMSMatrix));
00699 result[0][0] = 1.0f;
00700 result[1][1] = 1.0f;
00701 result[2][2] = 1.0f;
00702 result[3][3] = 1.0f;
00703 }
00704
00705
00706 void scaleMatrix(MMSMatrix result, float sx, float sy, float sz) {
00707 result[0][0] *= sx;
00708 result[0][1] *= sx;
00709 result[0][2] *= sx;
00710 result[0][3] *= sx;
00711
00712 result[1][0] *= sy;
00713 result[1][1] *= sy;
00714 result[1][2] *= sy;
00715 result[1][3] *= sy;
00716
00717 result[2][0] *= sz;
00718 result[2][1] *= sz;
00719 result[2][2] *= sz;
00720 result[2][3] *= sz;
00721 }
00722
00723
00724 void translateMatrix(MMSMatrix result, float tx, float ty, float tz) {
00725 result[3][0] += (result[0][0] * tx + result[1][0] * ty + result[2][0] * tz);
00726 result[3][1] += (result[0][1] * tx + result[1][1] * ty + result[2][1] * tz);
00727 result[3][2] += (result[0][2] * tx + result[1][2] * ty + result[2][2] * tz);
00728 result[3][3] += (result[0][3] * tx + result[1][3] * ty + result[2][3] * tz);
00729 }
00730
00731
00732 void rotateMatrix(MMSMatrix result, float angle, float x, float y, float z) {
00733 float sinAngle, cosAngle;
00734 float mag = sqrtf(x * x + y * y + z * z);
00735
00736 sinAngle = sinf (angle * MMS_PI / 180.0f);
00737 cosAngle = cosf (angle * MMS_PI / 180.0f);
00738 if (mag > 0.0f) {
00739 float xx, yy, zz, xy, yz, zx, xs, ys, zs;
00740 float oneMinusCos;
00741 MMSMatrix rotMat;
00742
00743 x /= mag;
00744 y /= mag;
00745 z /= mag;
00746
00747 xx = x * x;
00748 yy = y * y;
00749 zz = z * z;
00750 xy = x * y;
00751 yz = y * z;
00752 zx = z * x;
00753 xs = x * sinAngle;
00754 ys = y * sinAngle;
00755 zs = z * sinAngle;
00756 oneMinusCos = 1.0f - cosAngle;
00757
00758 rotMat[0][0] = (oneMinusCos * xx) + cosAngle;
00759 rotMat[0][1] = (oneMinusCos * xy) - zs;
00760 rotMat[0][2] = (oneMinusCos * zx) + ys;
00761 rotMat[0][3] = 0.0f;
00762
00763 rotMat[1][0] = (oneMinusCos * xy) + zs;
00764 rotMat[1][1] = (oneMinusCos * yy) + cosAngle;
00765 rotMat[1][2] = (oneMinusCos * yz) - xs;
00766 rotMat[1][3] = 0.0f;
00767
00768 rotMat[2][0] = (oneMinusCos * zx) - ys;
00769 rotMat[2][1] = (oneMinusCos * yz) + xs;
00770 rotMat[2][2] = (oneMinusCos * zz) + cosAngle;
00771 rotMat[2][3] = 0.0f;
00772
00773 rotMat[3][0] = 0.0f;
00774 rotMat[3][1] = 0.0f;
00775 rotMat[3][2] = 0.0f;
00776 rotMat[3][3] = 1.0f;
00777
00778 multiplyMatrix(result, rotMat, result);
00779 }
00780 }
00781
00782
00783 void frustumMatrix(MMSMatrix result, float left, float right, float bottom, float top, float nearZ, float farZ) {
00784 float deltaX = right - left;
00785 float deltaY = top - bottom;
00786 float deltaZ = farZ - nearZ;
00787
00788 if ( (nearZ <= 0.0f) || (farZ <= 0.0f) ||
00789 (deltaX <= 0.0f) || (deltaY <= 0.0f) || (deltaZ <= 0.0f) )
00790 return;
00791
00792 MMSMatrix frust;
00793 frust[0][0] = 2.0f * nearZ / deltaX;
00794 frust[0][1] = frust[0][2] = frust[0][3] = 0.0f;
00795
00796 frust[1][1] = 2.0f * nearZ / deltaY;
00797 frust[1][0] = frust[1][2] = frust[1][3] = 0.0f;
00798
00799 frust[2][0] = (right + left) / deltaX;
00800 frust[2][1] = (top + bottom) / deltaY;
00801 frust[2][2] = -(nearZ + farZ) / deltaZ;
00802 frust[2][3] = -1.0f;
00803
00804 frust[3][2] = -2.0f * nearZ * farZ / deltaZ;
00805 frust[3][0] = frust[3][1] = frust[3][3] = 0.0f;
00806
00807 multiplyMatrix(result, frust, result);
00808 }
00809
00810
00811 void perspectiveMatrix(MMSMatrix result, float fovy, float aspect, float nearZ, float farZ) {
00812 float frustumW, frustumH;
00813
00814 frustumH = tanf(fovy / 360.0f * MMS_PI) * nearZ;
00815 frustumW = frustumH * aspect;
00816
00817 frustumMatrix(result, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ);
00818 }
00819
00820 void orthoMatrix(MMSMatrix result, float left, float right, float bottom, float top, float nearZ, float farZ) {
00821 float deltaX = right - left;
00822 float deltaY = top - bottom;
00823 float deltaZ = farZ - nearZ;
00824
00825 if ((deltaX == 0.0f) || (deltaY == 0.0f) || (deltaZ == 0.0f))
00826 return;
00827
00828 MMSMatrix ortho;
00829 loadIdentityMatrix(ortho);
00830 ortho[0][0] = 2.0f / deltaX;
00831 ortho[3][0] = -(right + left) / deltaX;
00832 ortho[1][1] = 2.0f / deltaY;
00833 ortho[3][1] = -(top + bottom) / deltaY;
00834 ortho[2][2] = -2.0f / deltaZ;
00835 ortho[3][2] = -(nearZ + farZ) / deltaZ;
00836
00837 multiplyMatrix(result, ortho, result);
00838 }
00839
00840
00841 bool isMMS3DObjectShown(MMS3D_OBJECT *object) {
00842 if (!object->shown) {
00843 return false;
00844 }
00845 if (object->parent) {
00846 return isMMS3DObjectShown(object->parent);
00847 }
00848 return true;
00849 }
00850
00851
00852
00853