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