Guest User

Untitled

a guest
Sep 4th, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.84 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <regex.h>
  5. #include <sys/types.h>
  6. #include <math.h>
  7. #include "misc.h"
  8. #include "defines.h"
  9. #include "interface.h"
  10. #include "graphics.h"
  11. #include "powder.h"
  12. #include <icondoc.h>
  13. #include <update.h>
  14. #if defined WIN32
  15. #include <windows.h>
  16. #else
  17. #include <unistd.h>
  18. #endif
  19. #ifdef MACOSX
  20. #include <ApplicationServices/ApplicationServices.h>
  21. #endif
  22.  
  23. char *clipboard_text = NULL;
  24.  
  25. //Signum function
  26. #if defined(WIN32) && !defined(__GNUC__)
  27. int isign(float i)
  28. #else
  29. int isign(float i)
  30. #endif
  31. {
  32. if (i<0)
  33. return -1;
  34. if (i>0)
  35. return 1;
  36. return 0;
  37. }
  38.  
  39. #if defined(WIN32) && !defined(__GNUC__)
  40. unsigned clamp_flt(float f, float min, float max)
  41. #else
  42. unsigned clamp_flt(float f, float min, float max)
  43. #endif
  44. {
  45. if (f<min)
  46. return 0;
  47. if (f>max)
  48. return 255;
  49. return (int)(255.0f*(f-min)/(max-min));
  50. }
  51.  
  52. #if defined(WIN32) && !defined(__GNUC__)
  53. float restrict_flt(float f, float min, float max)
  54. #else
  55. float restrict_flt(float f, float min, float max)
  56. #endif
  57. {
  58. if (f<min)
  59. return min;
  60. if (f>max)
  61. return max;
  62. return f;
  63. }
  64.  
  65. char *mystrdup(char *s)
  66. {
  67. char *x;
  68. if (s)
  69. {
  70. x = (char*)malloc(strlen(s)+1);
  71. strcpy(x, s);
  72. return x;
  73. }
  74. return s;
  75. }
  76.  
  77. void strlist_add(struct strlist **list, char *str)
  78. {
  79. struct strlist *item = malloc(sizeof(struct strlist));
  80. item->str = mystrdup(str);
  81. item->next = *list;
  82. *list = item;
  83. }
  84.  
  85. int strlist_find(struct strlist **list, char *str)
  86. {
  87. struct strlist *item;
  88. for (item=*list; item; item=item->next)
  89. if (!strcmp(item->str, str))
  90. return 1;
  91. return 0;
  92. }
  93.  
  94. void strlist_free(struct strlist **list)
  95. {
  96. struct strlist *item;
  97. while (*list)
  98. {
  99. item = *list;
  100. *list = (*list)->next;
  101. free(item);
  102. }
  103. }
  104.  
  105. void clean_text(char *text, int vwidth)
  106. {
  107. int i = 0;
  108. if(textwidth(text) > vwidth){
  109. text[textwidthx(text, vwidth)] = 0;
  110. }
  111. for(i = 0; i < strlen(text); i++){
  112. if(! (text[i]>=' ' && text[i]<127)){
  113. text[i] = ' ';
  114. }
  115. }
  116. }
  117.  
  118. void save_presets(int do_update)
  119. {
  120. FILE *f=fopen("powder.def", "wb");
  121. unsigned char sig[4] = {0x50, 0x44, 0x65, 0x67};
  122. unsigned char tmp = sdl_scale;
  123. if (!f)
  124. return;
  125. fwrite(sig, 1, 4, f);
  126. save_string(f, svf_user);
  127. //save_string(f, svf_pass);
  128. save_string(f, svf_user_id);
  129. save_string(f, svf_session_id);
  130. fwrite(&tmp, 1, 1, f);
  131. tmp = cmode;
  132. fwrite(&tmp, 1, 1, f);
  133. tmp = svf_admin;
  134. fwrite(&tmp, 1, 1, f);
  135. tmp = svf_mod;
  136. fwrite(&tmp, 1, 1, f);
  137. save_string(f, http_proxy_string);
  138. tmp = SAVE_VERSION;
  139. fwrite(&tmp, 1, 1, f);
  140. tmp = MINOR_VERSION;
  141. fwrite(&tmp, 1, 1, f);
  142. tmp = do_update;
  143. fwrite(&tmp, 1, 1, f);
  144. fclose(f);
  145. }
  146.  
  147. int sregexp(const char *str, char *pattern)
  148. {
  149. int result;
  150. regex_t patternc;
  151. if (regcomp(&patternc, pattern, 0)!=0)
  152. return 1;
  153. result = regexec(&patternc, str, 0, NULL, 0);
  154. regfree(&patternc);
  155. return result;
  156. }
  157.  
  158. void load_presets(void)
  159. {
  160. FILE *f=fopen("powder.def", "rb");
  161. unsigned char sig[4], tmp;
  162. if (!f)
  163. return;
  164. fread(sig, 1, 4, f);
  165. if (sig[0]!=0x50 || sig[1]!=0x44 || sig[2]!=0x65)
  166. {
  167. if (sig[0]==0x4D && sig[1]==0x6F && sig[2]==0x46 && sig[3]==0x6F)
  168. {
  169. if (fseek(f, -3, SEEK_END))
  170. {
  171. remove("powder.def");
  172. return;
  173. }
  174. if (fread(sig, 1, 3, f) != 3)
  175. {
  176. remove("powder.def");
  177. goto fail;
  178. }
  179. last_major = sig[0];
  180. last_minor = sig[1];
  181. update_flag = sig[2];
  182. }
  183. fclose(f);
  184. remove("powder.def");
  185. return;
  186. }
  187. if (sig[3]==0x66) {
  188. if (load_string(f, svf_user, 63))
  189. goto fail;
  190. if (load_string(f, svf_pass, 63))
  191. goto fail;
  192. } else {
  193. if (load_string(f, svf_user, 63))
  194. goto fail;
  195. if (load_string(f, svf_user_id, 63))
  196. goto fail;
  197. if (load_string(f, svf_session_id, 63))
  198. goto fail;
  199. }
  200. svf_login = !!svf_session_id[0];
  201. if (fread(&tmp, 1, 1, f) != 1)
  202. goto fail;
  203. sdl_scale = (tmp == 2) ? 2 : 1;
  204. if (fread(&tmp, 1, 1, f) != 1)
  205. goto fail;
  206. cmode = tmp%CM_COUNT;
  207. if (fread(&tmp, 1, 1, f) != 1)
  208. goto fail;
  209. svf_admin = tmp;
  210. if (fread(&tmp, 1, 1, f) != 1)
  211. goto fail;
  212. svf_mod = tmp;
  213. if (load_string(f, http_proxy_string, 255))
  214. goto fail;
  215. if (fread(sig, 1, 3, f) != 3)
  216. goto fail;
  217. last_major = sig[0];
  218. last_minor = sig[1];
  219. update_flag = sig[2];
  220. fail:
  221. fclose(f);
  222. }
  223.  
  224. void save_string(FILE *f, char *str)
  225. {
  226. int li = strlen(str);
  227. unsigned char lb[2];
  228. lb[0] = li;
  229. lb[1] = li >> 8;
  230. fwrite(lb, 2, 1, f);
  231. fwrite(str, li, 1, f);
  232. }
  233.  
  234. int load_string(FILE *f, char *str, int max)
  235. {
  236. int li;
  237. unsigned char lb[2];
  238. fread(lb, 2, 1, f);
  239. li = lb[0] | (lb[1] << 8);
  240. if (li > max)
  241. {
  242. str[0] = 0;
  243. return 1;
  244. }
  245. fread(str, li, 1, f);
  246. str[li] = 0;
  247. return 0;
  248. }
  249.  
  250. void strcaturl(char *dst, char *src)
  251. {
  252. char *d;
  253. unsigned char *s;
  254.  
  255. for (d=dst; *d; d++) ;
  256.  
  257. for (s=(unsigned char *)src; *s; s++)
  258. {
  259. if ((*s>='0' && *s<='9') ||
  260. (*s>='a' && *s<='z') ||
  261. (*s>='A' && *s<='Z'))
  262. *(d++) = *s;
  263. else
  264. {
  265. *(d++) = '%';
  266. *(d++) = hex[*s>>4];
  267. *(d++) = hex[*s&15];
  268. }
  269. }
  270. *d = 0;
  271. }
  272.  
  273. void strappend(char *dst, char *src)
  274. {
  275. char *d;
  276. unsigned char *s;
  277.  
  278. for (d=dst; *d; d++) ;
  279.  
  280. for (s=(unsigned char *)src; *s; s++)
  281. {
  282. *(d++) = *s;
  283. }
  284. *d = 0;
  285. }
  286.  
  287. void *file_load(char *fn, int *size)
  288. {
  289. FILE *f = fopen(fn, "rb");
  290. void *s;
  291.  
  292. if (!f)
  293. return NULL;
  294. fseek(f, 0, SEEK_END);
  295. *size = ftell(f);
  296. fseek(f, 0, SEEK_SET);
  297. s = malloc(*size);
  298. if (!s)
  299. {
  300. fclose(f);
  301. return NULL;
  302. }
  303. fread(s, *size, 1, f);
  304. fclose(f);
  305. return s;
  306. }
  307.  
  308. int cpu_check(void)
  309. {
  310. #ifdef MACOSX
  311. return 0;
  312. #else
  313. #ifdef X86
  314. unsigned af,bf,cf,df;
  315. x86_cpuid(0, af, bf, cf, df);
  316. if (bf==0x68747541 && cf==0x444D4163 && df==0x69746E65)
  317. amd = 1;
  318. x86_cpuid(1, af, bf, cf, df);
  319. #ifdef X86_SSE
  320. if (!(df&(1<<25)))
  321. return 1;
  322. #endif
  323. #ifdef X86_SSE2
  324. if (!(df&(1<<26)))
  325. return 1;
  326. #endif
  327. #ifdef X86_SSE3
  328. if (!(cf&1))
  329. return 1;
  330. #endif
  331. #endif
  332. #endif
  333. return 0;
  334. }
  335.  
  336. matrix2d m2d_multiply_m2d(matrix2d m1, matrix2d m2)
  337. {
  338. matrix2d result = {
  339. m1.a*m2.a+m1.b*m2.c, m1.a*m2.b+m1.b*m2.d,
  340. m1.c*m2.a+m1.d*m2.c, m1.c*m2.b+m1.d*m2.d
  341. };
  342. return result;
  343. }
  344. vector2d m2d_multiply_v2d(matrix2d m, vector2d v)
  345. {
  346. vector2d result = {
  347. m.a*v.x+m.b*v.y,
  348. m.c*v.x+m.d*v.y
  349. };
  350. return result;
  351. }
  352. matrix2d m2d_multiply_float(matrix2d m, float s)
  353. {
  354. matrix2d result = {
  355. m.a*s, m.b*s,
  356. m.c*s, m.d*s,
  357. };
  358. return result;
  359. }
  360.  
  361. vector2d v2d_multiply_float(vector2d v, float s)
  362. {
  363. vector2d result = {
  364. v.x*s,
  365. v.y*s
  366. };
  367. return result;
  368. }
  369.  
  370. vector2d v2d_add(vector2d v1, vector2d v2)
  371. {
  372. vector2d result = {
  373. v1.x+v2.x,
  374. v1.y+v2.y
  375. };
  376. return result;
  377. }
  378. vector2d v2d_sub(vector2d v1, vector2d v2)
  379. {
  380. vector2d result = {
  381. v1.x-v2.x,
  382. v1.y-v2.y
  383. };
  384. return result;
  385. }
  386.  
  387. matrix2d m2d_new(float me0, float me1, float me2, float me3)
  388. {
  389. matrix2d result = {me0,me1,me2,me3};
  390. return result;
  391. }
  392. vector2d v2d_new(float x, float y)
  393. {
  394. vector2d result = {x, y};
  395. return result;
  396. }
  397.  
  398. void clipboard_push_text(char * text)
  399. {
  400. #ifdef MACOSX
  401. PasteboardRef newclipboard;
  402.  
  403. if (PasteboardCreate(kPasteboardClipboard, &newclipboard)!=noErr) return;
  404. if (PasteboardClear(newclipboard)!=noErr) return;
  405. PasteboardSynchronize(newclipboard);
  406.  
  407. CFDataRef data = CFDataCreate(kCFAllocatorDefault, text, strlen(text));
  408. PasteboardPutItemFlavor(newclipboard, (PasteboardItemID)1, CFSTR("com.apple.traditional-mac-plain-text"), data, 0);
  409. #elif defined WIN32
  410. if (OpenClipboard(NULL))
  411. {
  412. HGLOBAL cbuffer;
  413. char * glbuffer;
  414.  
  415. EmptyClipboard();
  416.  
  417. cbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(text)+1);
  418. glbuffer = (char*)GlobalLock(cbuffer);
  419.  
  420. strcpy(glbuffer, text);
  421.  
  422. GlobalUnlock(cbuffer);
  423. SetClipboardData(CF_TEXT, cbuffer);
  424. CloseClipboard();
  425. }
  426. #elif (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11)
  427. if (clipboard_text!=NULL) {
  428. free(clipboard_text);
  429. clipboard_text = NULL;
  430. }
  431. clipboard_text = mystrdup(text);
  432. sdl_wminfo.info.x11.lock_func();
  433. XSetSelectionOwner(sdl_wminfo.info.x11.display, XA_CLIPBOARD, sdl_wminfo.info.x11.window, CurrentTime);
  434. XFlush(sdl_wminfo.info.x11.display);
  435. sdl_wminfo.info.x11.unlock_func();
  436. #else
  437. printf("Not implemented: put text on clipboard \"%s\"\n", text);
  438. #endif
  439. }
  440.  
  441. char * clipboard_pull_text()
  442. {
  443. #ifdef MACOSX
  444. #elif defined WIN32
  445. if (OpenClipboard(NULL))
  446. {
  447. HANDLE cbuffer;
  448. char * glbuffer;
  449.  
  450. cbuffer = GetClipboardData(CF_TEXT);
  451. glbuffer = (char*)GlobalLock(cbuffer);
  452. GlobalUnlock(cbuffer);
  453. CloseClipboard();
  454. if(glbuffer!=NULL){
  455. return mystrdup(glbuffer);
  456. } else {
  457. return "";
  458. }
  459. }
  460. #elif (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11)
  461. #else
  462. printf("Not implemented: get text from clipboard\n");
  463. return "";
  464. #endif
  465. }
  466.  
  467. int register_extension()
  468. {
  469. #if defined WIN32
  470. LONG rresult;
  471. HKEY newkey;
  472. char *currentfilename = exe_name();
  473. char *iconname;
  474. char *opencommand;
  475. iconname = malloc(strlen(currentfilename)+6);
  476. opencommand = malloc(strlen(currentfilename)+13);
  477. sprintf(iconname, "%s,-102", currentfilename);
  478. sprintf(opencommand, "\"%s\" open \"%%1\"", currentfilename);
  479.  
  480. //Create extension entry
  481. rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.cps", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL);
  482. if (rresult != ERROR_SUCCESS) {
  483. return 0;
  484. }
  485. rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1);
  486. if (rresult != ERROR_SUCCESS) {
  487. RegCloseKey(newkey);
  488. return 0;
  489. }
  490. RegCloseKey(newkey);
  491.  
  492. rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.stm", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL);
  493. if (rresult != ERROR_SUCCESS) {
  494. return 0;
  495. }
  496. rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1);
  497. if (rresult != ERROR_SUCCESS) {
  498. RegCloseKey(newkey);
  499. return 0;
  500. }
  501. RegCloseKey(newkey);
  502.  
  503. //Create program entry
  504. rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL);
  505. if (rresult != ERROR_SUCCESS) {
  506. return 0;
  507. }
  508. rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"Powder Toy Save", strlen("Powder Toy Save")+1);
  509. if (rresult != ERROR_SUCCESS) {
  510. RegCloseKey(newkey);
  511. return 0;
  512. }
  513. RegCloseKey(newkey);
  514.  
  515. //Set DefaultIcon
  516. rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\DefaultIcon", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL);
  517. if (rresult != ERROR_SUCCESS) {
  518. return 0;
  519. }
  520. rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)iconname, strlen(iconname)+1);
  521. if (rresult != ERROR_SUCCESS) {
  522. RegCloseKey(newkey);
  523. return 0;
  524. }
  525. RegCloseKey(newkey);
  526.  
  527. //Set Launch command
  528. rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\shell\\open\\command", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL);
  529. if (rresult != ERROR_SUCCESS) {
  530. return 0;
  531. }
  532. rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)opencommand, strlen(opencommand)+1);
  533. if (rresult != ERROR_SUCCESS) {
  534. RegCloseKey(newkey);
  535. return 0;
  536. }
  537. RegCloseKey(newkey);
  538.  
  539. return 1;
  540. #elif defined(LIN32) || defined(LIN64)
  541. char *currentfilename = exe_name();
  542. FILE *f;
  543. char *mimedata =
  544. "<?xml version=\"1.0\"?>\n"
  545. " <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>\n"
  546. " <mime-type type=\"application/vnd.powdertoy.save\">\n"
  547. " <comment>Powder Toy save</comment>\n"
  548. " <glob pattern=\"*.cps\"/>\n"
  549. " <glob pattern=\"*.stm\"/>\n"
  550. " </mime-type>\n"
  551. "</mime-info>\n";
  552. f = fopen("powdertoy-save.xml", "wb");
  553. if (!f)
  554. return 0;
  555. fwrite(mimedata, 1, strlen(mimedata), f);
  556. fclose(f);
  557.  
  558. char *desktopfiledata_tmp =
  559. "[Desktop Entry]\n"
  560. "Type=Application\n"
  561. "Name=Powder Toy\n"
  562. "Comment=Physics sandbox game\n"
  563. "MimeType=application/vnd.powdertoy.save;\n"
  564. "NoDisplay=true\n";
  565. char *desktopfiledata = malloc(strlen(desktopfiledata_tmp)+strlen(currentfilename)+100);
  566. strcpy(desktopfiledata, desktopfiledata_tmp);
  567. strappend(desktopfiledata, "Exec=");
  568. strappend(desktopfiledata, currentfilename);
  569. strappend(desktopfiledata, " open %f\n");
  570. f = fopen("powdertoy-tpt.desktop", "wb");
  571. if (!f)
  572. return 0;
  573. fwrite(desktopfiledata, 1, strlen(desktopfiledata), f);
  574. fclose(f);
  575. system("xdg-mime install powdertoy-save.xml");
  576. system("xdg-desktop-menu install powdertoy-tpt.desktop");
  577. f = fopen("powdertoy-save-32.png", "wb");
  578. if (!f)
  579. return 0;
  580. fwrite(icon_doc_32_png, 1, sizeof(icon_doc_32_png), f);
  581. fclose(f);
  582. f = fopen("powdertoy-save-16.png", "wb");
  583. if (!f)
  584. return 0;
  585. fwrite(icon_doc_16_png, 1, sizeof(icon_doc_16_png), f);
  586. fclose(f);
  587. system("xdg-icon-resource install --noupdate --context mimetypes --size 32 powdertoy-save-32.png application-vnd.powdertoy.save");
  588. system("xdg-icon-resource install --noupdate --context mimetypes --size 16 powdertoy-save-16.png application-vnd.powdertoy.save");
  589. system("xdg-icon-resource forceupdate");
  590. system("xdg-mime default powdertoy-tpt.desktop application/vnd.powdertoy.save");
  591. unlink("powdertoy-save-32.png");
  592. unlink("powdertoy-save-16.png");
  593. unlink("powdertoy-save.xml");
  594. unlink("powdertoy-tpt.desktop");
  595. return 1;
  596. #elif defined MACOSX
  597. return 0;
  598. #endif
  599. }
  600.  
  601. void HSV_to_RGB(int h,int s,int v,int *r,int *g,int *b)//convert 0-255(0-360 for H) HSV values to 0-255 RGB
  602. {
  603. float hh, ss, vv, c, x;
  604. int m;
  605. hh = h/60.0f;//normalize values
  606. ss = s/255.0f;
  607. vv = v/255.0f;
  608. c = vv * ss;
  609. x = c * ( 1 - fabs(fmod(hh,2.0) -1) );
  610. if(hh<1){
  611. *r = (int)(c*255.0);
  612. *g = (int)(x*255.0);
  613. *b = 0;
  614. }
  615. else if(hh<2){
  616. *r = (int)(x*255.0);
  617. *g = (int)(c*255.0);
  618. *b = 0;
  619. }
  620. else if(hh<3){
  621. *r = 0;
  622. *g = (int)(c*255.0);
  623. *b = (int)(x*255.0);
  624. }
  625. else if(hh<4){
  626. *r = 0;
  627. *g = (int)(x*255.0);
  628. *b = (int)(c*255.0);
  629. }
  630. else if(hh<5){
  631. *r = (int)(x*255.0);
  632. *g = 0;
  633. *b = (int)(c*255.0);
  634. }
  635. else if(hh<6){
  636. *r = (int)(c*255.0);
  637. *g = 0;
  638. *b = (int)(x*255.0);
  639. }
  640. m = (int)((vv-c)*255.0);
  641. *r += m;
  642. *g += m;
  643. *b += m;
  644. }
  645.  
  646. void RGB_to_HSV(int r,int g,int b,int *h,int *s,int *v)//convert 0-255 RGB values to 0-255(0-360 for H) HSV
  647. {
  648. float rr, gg, bb, a,x,c,d;
  649. rr = r/255.0f;//normalize values
  650. gg = g/255.0f;
  651. bb = b/255.0f;
  652. a = fmin(rr,gg);
  653. a = fmin(a,bb);
  654. x = fmax(rr,gg);
  655. x = fmax(x,bb);
  656. if (a==x)//greyscale
  657. {
  658. *h = 0;
  659. *s = 0;
  660. *v = (int)(a*255.0);
  661. }
  662. else
  663. {
  664. c = (rr==a) ? gg-bb : ((bb==a) ? rr-gg : bb-rr);
  665. d = (rr==a) ? 3 : ((bb==a) ? 1 : 5);
  666. *h = (int)(60.0*(d - c/(x - a)));
  667. *s = (int)(255.0*((x - a)/x));
  668. *v = (int)(255.0*x);
  669. }
  670. }
  671.  
  672. void membwand(void * destv, void * srcv, size_t destsize, size_t srcsize)
  673. {
  674. size_t i;
  675. unsigned char * dest = destv;
  676. unsigned char * src = srcv;
  677. for(i = 0; i < destsize; i++){
  678. dest[i] = dest[i] & src[i%srcsize];
  679. }
  680. }
  681. vector2d v2d_zero = {0,0};
  682. matrix2d m2d_identity = {1,0,0,1};
Advertisement
Add Comment
Please, Sign In to add comment