SVGADEM2.C
上传用户:kammenn
上传日期:2007-06-26
资源大小:210k
文件大小:30k
源码类别:

GDI/图象编程

开发平台:

C/C++

  1. /****************************************************************************
  2.  
  3.   'SVGACC' A Super Vga Graphics Library for use with Microsoft and
  4.   Borland C/C++
  5.   Copyright 1993-1994 by Stephen L. Balkum and Daniel A. Sill
  6.   GIF and 'Graphics Intechange Format' are trademarks (tm) of
  7.   Compuserve, Incorporated, an H&R Block Company.
  8. **************** UNREGISTERD SHAREWARE VERSION ***********************
  9. * FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN  *
  10. * USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
  11. * OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY.  *
  12. **********************************************************************
  13. **************** NO WARRANTIES AND NO LIABILITY **********************
  14. * Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
  15. * expressed or implied, of merchantability, or fitness, for a        *
  16. * particular use or purpose of this SOFTWARE and documentation.      *
  17. * In no event shall Stephen L. Balkum or Daniel A. Sill be held      *
  18. * liable for any damages resulting from the use or misuse of the     * 
  19. * SOFTWARE and documentation.                                        *
  20. **********************************************************************
  21. ************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
  22. * Use, duplication, or disclosure of the SOFTWARE and documentation  *
  23. * by the U.S. Government is subject to the restictions as set forth  *
  24. * in subparagraph (c)(1)(ii) of the Rights in Technical Data and     *
  25. * Computer Software cluse at DFARS 252.227-7013.                     *
  26. * Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill,   *
  27. * P.O. Box 7704, Austin, Texas 78713-7704                            *
  28. **********************************************************************
  29. **********************************************************************
  30. * By using this SOFTWARE or documentation, you agree to the above    *
  31. * terms and conditions.                                              *
  32. **********************************************************************
  33.  ***************************************************************************/
  34. #define MODULE
  35. #include <stdio.h>
  36. #include <conio.h>
  37. #include <malloc.h>
  38. #include <string.h>
  39. #include <dos.h>
  40. #include <math.h>
  41. #include "svgacc.h"
  42. #include "svgademo.h"
  43. char showgif(char fname[]);
  44. void showhouse(D2Point *plotarray, D2Point *oplotarray);
  45. void showstar(D2Point *plotarray, D2Point *oplotarray);
  46. /********
  47.  * DO2D *
  48.  ********/
  49. char do2d(void)
  50. {
  51. int i, trans;
  52. int spcing, cntx, cnty;
  53. D2Point pointarray[9];
  54. D2Point plotarray[9];
  55. D2Point oplotarray[9];
  56. char ret;
  57. char title[TITLEN];
  58. char buf[TITLEN];
  59. char buf2[TITLEN];
  60. /*
  61.  * Set up the Title
  62.  */
  63. sprintf(title,"DEMO 11: 2D functions");
  64. palset(pal,0,255);
  65. /*
  66.  * Set up the star patter of points
  67.  */
  68. cntx = maxx / 2;
  69. cnty = (maxy - 32) / 2 + 32;
  70. spcing = maxx / 15;
  71. pointarray[0].x = 0;
  72. pointarray[0].y = -spcing * 3;
  73. pointarray[1].x = spcing;
  74. pointarray[1].y = -spcing;
  75. pointarray[2].x = spcing * 3;
  76. pointarray[2].y = 0;
  77. pointarray[3].x = spcing;
  78. pointarray[3].y = spcing;
  79. pointarray[4].x = 0;
  80. pointarray[4].y = spcing * 3;
  81. pointarray[5].x = -spcing;
  82. pointarray[5].y = spcing;
  83. pointarray[6].x = -spcing * 3;
  84. pointarray[6].y = 0;
  85. pointarray[7].x = -spcing;
  86. pointarray[7].y = -spcing;
  87. pointarray[8].x = 0;
  88. pointarray[8].y = -spcing * 3;
  89. /*
  90.  * Show d2translate
  91.  */
  92. fillscreen(0);
  93. setview(0,0,maxx,maxy);
  94. drwstring(1,7,0,title,10,0);
  95. sprintf(buf,"d2translate(point,xtrans,ytrans,inarray,outarray);");
  96. drwstring(1,7,0,buf,10,16);
  97. setview(0,32,maxx,maxy);
  98. d2translate(9,cntx,cnty,pointarray,plotarray);
  99. showstar(plotarray,oplotarray);
  100. ret = getkey();
  101. if ((ret=='s') || (ret=='q')) {
  102. fillscreen(0);
  103. setview(0,0,maxx,maxy);
  104. return(ret);
  105. }
  106. trans = 0;
  107. for(i=0;i<spcing;i++) {
  108. trans+=2;
  109. d2translate(9,cntx+trans,cnty+trans,pointarray,plotarray);
  110. showstar(plotarray,oplotarray);
  111. sdelay(2);
  112. }
  113. for(i=0;i<spcing;i++) {
  114. trans-=2;
  115. d2translate(9,cntx+trans,cnty+trans,pointarray,plotarray);
  116. showstar(plotarray,oplotarray);
  117. sdelay(2);
  118. }
  119. ret = getkey();
  120. if ((ret=='s') || (ret=='q')) {
  121. fillscreen(0);
  122. setview(0,0,maxx,maxy);
  123. return(ret);
  124. }
  125. /*
  126.  * Show d2scale
  127.  */
  128. setview(0,16,maxx,31);
  129. fillview(0);
  130. setview(0,16,maxx,maxy);
  131. sprintf(buf,"d2scale(points,xscale,yscale,inarray,outarray);");
  132. drwstring(1,7,0,buf,10,16);
  133. setview(0,32,maxx,maxy);
  134. d2translate(9,cntx,cnty,pointarray,plotarray);
  135. showstar(plotarray,oplotarray);
  136. for(i=256;i<=380;i+=4) {
  137. d2scale(9,i,i,pointarray,plotarray);
  138. d2translate(9,cntx,cnty,plotarray,plotarray);
  139. showstar(plotarray,oplotarray);
  140. sdelay(2);
  141. }
  142. for(i=384;i>=128;i-=4) {
  143. d2scale(9,i,i,pointarray,plotarray);
  144. d2translate(9,cntx,cnty,plotarray,plotarray);
  145. showstar(plotarray,oplotarray);
  146. sdelay(2);
  147. }
  148. for(i=124;i<=256;i+=4) {
  149. d2scale(9,i,i,pointarray,plotarray);
  150. d2translate(9,cntx,cnty,plotarray,plotarray);
  151. showstar(plotarray,oplotarray);
  152. sdelay(2);
  153. }
  154. ret = getkey();
  155. if ((ret=='s') || (ret=='q')) {
  156. fillscreen(0);
  157. setview(0,0,maxx,maxy);
  158. return(ret);
  159. }
  160. /*
  161.  * Show d2rotate
  162.  */
  163. setview(0,16,maxx,31);
  164. fillview(0);
  165. setview(0,16,maxx,maxy);
  166. sprintf(buf,"d2rotate(points,xorigin,yorigin,angle,inarray,outarray);");
  167. drwstring(1,7,0,buf,10,16);
  168. sprintf(buf2,"Let's do it about the center of the object.");
  169. drwstring(1,7,0,buf2,10,32);
  170. setview(0,48,maxx,maxy);
  171. d2translate(9,cntx,cnty,pointarray,plotarray);
  172. showstar(plotarray,oplotarray);
  173. for(i=0;i<=180;i++) {
  174. d2rotate(9,0,0,i,pointarray,plotarray);
  175. d2translate(9,cntx,cnty,plotarray,plotarray);
  176. showstar(plotarray,oplotarray);
  177. sdelay(2);
  178. }
  179. for(i=180;i>=0;i-=2) {
  180. d2rotate(9,0,0,i,pointarray,plotarray);
  181. d2translate(9,cntx,cnty,plotarray,plotarray);
  182. showstar(plotarray,oplotarray);
  183. sdelay(2);
  184. }
  185. ret = getkey();
  186. if ((ret=='s') || (ret=='q')) {
  187. fillscreen(0);
  188. setview(0,0,maxx,maxy);
  189. return(ret);
  190. }
  191. /*
  192.  * Show d2rotate (about an arbitrary point)
  193.  */
  194. setview(0,16,maxx,48);
  195. fillview(0);
  196. setview(0,16,maxx,maxy);
  197. sprintf(buf,"d2rotate(points,xorigin,yorigin,angle,inarray,outarray);");
  198. drwstring(1,7,0,buf,10,16);
  199. sprintf(buf2,"Let's do it about an arbitrary point.");
  200. drwstring(1,7,0,buf2,10,32);
  201. setview(0,48,maxx,maxy);
  202. d2translate(9,cntx,cnty,pointarray,plotarray);
  203. showstar(plotarray,oplotarray);
  204. for(i=0;i<=360;i+=2) {
  205. d2rotate(9,0,spcing*3,i,pointarray,plotarray);
  206. d2translate(9,cntx,cnty,plotarray,plotarray);
  207. showstar(plotarray,oplotarray);
  208. sdelay(2);
  209. }
  210. ret = getkey();
  211. fillscreen(0);
  212. setview(0,0,maxx,maxy);
  213. return(ret);
  214. }
  215. /********
  216.  * DO3D *
  217.  ********/
  218. char do3d(void)
  219. {
  220. float pi;
  221. int i;
  222. float height, radius;
  223. int spcing;
  224. D3Point pointarray[14];
  225. D3Point playarray[14];
  226. D2Point plotarray[14];
  227. D2Point oplotarray[14];
  228. ProjParameters proj;
  229. char ret;
  230. char title[TITLEN];
  231. char buf[TITLEN];
  232. /*
  233.  * Set up the Title
  234.  */
  235. sprintf(title,"DEMO 12: 3D functions");
  236. palset(pal,0,255);
  237. /*
  238.  * Set up the house pattern of points
  239.  */
  240. spcing = maxx / 6;
  241. pointarray[0].x = -spcing;
  242. pointarray[0].y = -spcing * 2;
  243. pointarray[0].z = 0;
  244. pointarray[1].x = spcing;
  245. pointarray[1].y = -spcing * 2;
  246. pointarray[1].z = 0;
  247. pointarray[2].x = spcing;
  248. pointarray[2].y = -spcing * 2;
  249. pointarray[2].z = spcing * 2;
  250. pointarray[3].x = -spcing;
  251. pointarray[3].y = -spcing * 2;
  252. pointarray[3].z = spcing * 2;
  253. pointarray[4].x = -spcing;
  254. pointarray[4].y = spcing * 2;
  255. pointarray[4].z = 0;
  256. pointarray[5].x = spcing;
  257. pointarray[5].y = spcing * 2;
  258. pointarray[5].z = 0;
  259. pointarray[6].x = spcing;
  260. pointarray[6].y = spcing * 2;
  261. pointarray[6].z = spcing * 2;
  262. pointarray[7].x = -spcing;
  263. pointarray[7].y = spcing * 2;
  264. pointarray[7].z = spcing * 2;
  265. pointarray[8].x = 0;
  266. pointarray[8].y = -spcing * 2;
  267. pointarray[8].z = spcing * 3;
  268. pointarray[9].x = 0;
  269. pointarray[9].y = spcing * 2;
  270. pointarray[9].z = spcing * 3;
  271. pointarray[10].x = 0;
  272. pointarray[10].y = 0;
  273. pointarray[10].z = 0;
  274. pointarray[11].x = spcing * 4;
  275. pointarray[11].y = 0;
  276. pointarray[11].z = 0;
  277. pointarray[12].x = 0;
  278. pointarray[12].y = 0;
  279. pointarray[12].z = spcing * 4;
  280. pointarray[13].x = 0;
  281. pointarray[13].y = spcing * 4;
  282. pointarray[13].z = 0;
  283. bytecopy(pointarray,playarray,sizeof(pointarray));
  284. /*
  285.  * Show d3project
  286.  */
  287. setview(0,0,maxx,maxy);
  288. pi = (float)(4. * atan(1) / 180.);
  289. fillscreen(0);
  290. drwstring(1,7,0,title,10,0);
  291. sprintf(buf,"d3project(points,projparams,inarray,outarray);");
  292. drwstring(1,7,0,buf,10,16);
  293. setview(0,32,maxx,maxy);
  294. height = (float)(maxy * 8);
  295. radius = (float)(maxx * 30);
  296. proj.scrd = (int)(sqrt(radius * radius + height * height) / 2.);
  297. proj.theta = 110;
  298. proj.phi = (int)(atan(height / -radius) / pi);
  299. proj.eyex = (int)(-radius * cos(proj.theta * pi));
  300. proj.eyey = (int)(-radius * sin(proj.theta * pi));
  301. proj.eyez = (int)height;
  302. d3project(14,&proj,playarray,plotarray);
  303. for(i=0;i<14;i++) {
  304. oplotarray[i].x = plotarray[i].x;
  305. oplotarray[i].y = plotarray[i].y;
  306. }
  307. showhouse(plotarray,oplotarray);
  308. ret = getkey();
  309. if ((ret=='s') || (ret=='q')) {
  310. fillscreen(0);
  311. setview(0,0,maxx,maxy);
  312. return(ret);
  313. }
  314. for(i=112;i<=470;i+=3) {
  315. proj.theta = i;
  316. proj.eyex = (int)(-radius * cos(proj.theta * pi));
  317. proj.eyey = (int)(-radius * sin(proj.theta * pi));
  318. d3project(14,&proj,playarray,plotarray);
  319. showhouse(plotarray,oplotarray);
  320. sdelay(2);
  321. }
  322. ret = getkey();
  323. if ((ret=='s') || (ret=='q')) {
  324. fillscreen(0);
  325. setview(0,0,maxx,maxy);
  326. return(ret);
  327. }
  328. /*
  329.  * Show d3translate
  330.  */
  331. setview(0,16,maxx,31);
  332. fillview(0);
  333. sprintf(buf,"d3translate(points,xtrans,ytrans,ztrans,inarray,outarray);");
  334. drwstring(1,7,0,buf,10,16);
  335. setview(0,32,maxx,maxy);
  336. for(i=2;i<=300;i+=6) {
  337. d3translate(10,i,i,0,pointarray,playarray);
  338. d3project(10,&proj,playarray,plotarray);
  339. showhouse(plotarray,oplotarray);
  340. sdelay(2);
  341. }
  342. for(i=302;i>=2;i-=6) {
  343. d3translate(10,i,i,0,pointarray,playarray);
  344. d3project(10,&proj,playarray,plotarray);
  345. showhouse(plotarray,oplotarray);
  346. sdelay(2);
  347. }
  348. ret = getkey();
  349. if ((ret=='s') || (ret=='q')) {
  350. fillscreen(0);
  351. setview(0,0,maxx,maxy);
  352. return(ret);
  353. }
  354. /*
  355.  * Show d3scale
  356.  */
  357. setview(0,16,maxx,31);
  358. fillview(0);
  359. sprintf(buf,"d3scale(points,xscale,yscale,zscale,inarray,outarray);");
  360. drwstring(1,7,0,buf,10,16);
  361. setview(0,32,maxx,maxy);
  362. for(i=256;i<=380;i+=4) {
  363. d3scale(10,i,i,i,pointarray,playarray);
  364. d3project(10,&proj,playarray,plotarray);
  365. showhouse(plotarray,oplotarray);
  366. sdelay(2);
  367. }
  368. for(i=384;i>=128;i-=4) {
  369. d3scale(10,i,i,i,pointarray,playarray);
  370. d3project(10,&proj,playarray,plotarray);
  371. showhouse(plotarray,oplotarray);
  372. sdelay(2);
  373. }
  374. for(i=124;i<=256;i+=4) {
  375. d3scale(10,i,i,i,pointarray,playarray);
  376. d3project(10,&proj,playarray,plotarray);
  377. showhouse(plotarray,oplotarray);
  378. sdelay(2);
  379. }
  380. ret = getkey();
  381. if ((ret=='s') || (ret=='q')) {
  382. fillscreen(0);
  383. setview(0,0,maxx,maxy);
  384. return(ret);
  385. }
  386. /*
  387.  * show d3rotate
  388.  */
  389. setview(0,16,maxx,31);
  390. fillview(0);
  391. sprintf(buf,"d3rotate(points,xorigin,yorigin,zorigin,zangle,yangle,xangle,inarray,outarray);");
  392. drwstring(1,7,0,buf,10,16);
  393. setview(0,32,maxx,maxy);
  394. for(i=0;i<=360;i+=3) {
  395. d3rotate(10,0,0,0,0,i,i,pointarray,playarray);
  396. d3project(10,&proj,playarray,plotarray);
  397. showhouse(plotarray,oplotarray);
  398. sdelay(2);
  399. }
  400. ret = getkey();
  401. fillscreen(0);
  402. setview(0,0,maxx,maxy);
  403. return(ret);
  404. }
  405. /***********
  406.  * DOMOUSE *
  407.  ***********/
  408. char domouse(void)
  409. {
  410. int i, mouse;
  411. int colr, x1, x2, y1, y2;
  412. int lb, cb, rb, x, y, mbuts;
  413. int spcing;
  414. char ret;
  415. char title[TITLEN];
  416. char buf[TITLEN];
  417. /*
  418.  * Set up the title
  419.  */
  420. sprintf(title,"DEMO 9: Mouse functions");
  421. fillscreen(0);
  422. palset(pal,0,255);
  423. setview(0,0,maxx,maxy);
  424. /*
  425.  * Check to see if we have a mouse so we can do the mouse demo
  426.  */
  427. mouse = whichmouse();
  428. if (mouse < 1) {
  429. drwstring(1,7,0,title,10,0);
  430. sprintf(buf,"Sorry, no mouse detected... Can not do the mouse demo.");
  431. drwstring(1,7,0,buf,10,16);
  432. ret = getkey();
  433. fillscreen(0);
  434. return(ret);
  435. }
  436. colr = 16;
  437. for(i=0;i<=maxx/2;i++) {
  438. drwcircle(1,colr,maxx/4 + i, maxy/2, maxy/5);
  439. colr+=2;
  440. if (colr>255)
  441. colr = 16;
  442. }
  443. /*
  444.  * Show mouseshow
  445.  */
  446. setview(0,0,maxx,31);
  447. fillview(0);   
  448. drwstring(1,7,0,title,10,0);
  449. sprintf(buf,"mouseshow();");
  450. drwstring(1,7,0,buf,10,16);
  451. setview(0,32,maxx,maxy);
  452. mouseenter(); /* MUST BE CALLED FIRST TO ENABLE MOUSE FUNCTIONS */
  453. mouseshow();
  454. ret = getkey();
  455. if ((ret=='s') || (ret=='q')) {
  456. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  457. fillscreen(0);
  458. setview(0,0,maxx,maxy);
  459. return(ret);
  460. }
  461. /*
  462.  * Show mousestatus
  463.  */
  464. mousehide();
  465. setview(0,16,maxx,31);
  466. fillview(0);
  467. sprintf(buf,"mousestatus(xloc,yloc,mbuts);");
  468. drwstring(1,7,0,buf,10,16);
  469. mouseshow();
  470. setview(0,32,maxx,maxy);
  471. beep();
  472. while(!kbhit()) {
  473. lb = cb = rb = 0;
  474. mousestatus(&x,&y,&mbuts);
  475. if (mbuts & 1)
  476. lb = 1;
  477. if (mbuts & 2)
  478. rb = 1;
  479. if (mbuts & 4)
  480. cb = 1;
  481. sprintf(buf,"X= %4d  Y= %4d  LB= %1d  CB= %1d  RB= %1d",x,y,lb,cb,rb);
  482. drwstring(1,15,8,buf,10,32);
  483. }
  484. ret = (char)getch();
  485. if ( (ret == 'Q') || (ret == 'q') )
  486. endit = 1;
  487. if (ret == 'Q')
  488. ret = 'q';
  489. if (ret == 'S')
  490. ret = 's';
  491. if ((ret=='s') || (ret=='q')) {
  492. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  493. fillscreen(0);
  494. setview(0,0,maxx,maxy);
  495. return(ret);
  496. }
  497. /*
  498.  * Show mousehide
  499.  */
  500. mousehide();
  501. setview(0,16,maxx,31);
  502. fillview(0);
  503. sprintf(buf,"mousehide(xloc,yloc,mbuts);");
  504. drwstring(1,7,0,buf,10,16);
  505. setview(0,32,maxx,maxy);
  506. beep();
  507. while(!kbhit()) {
  508. lb = cb = rb = 0;
  509. mousestatus(&x,&y,&mbuts);
  510. if (mbuts & 1)
  511. lb = 1;
  512. if (mbuts & 2)
  513. rb = 1;
  514. if (mbuts & 4)
  515. cb = 1;
  516. sprintf(buf,"X= %4d  Y= %4d  LB= %1d  CB= %1d  RB= %1d",x,y,lb,cb,rb);
  517. drwstring(1,15,8,buf,10,32);
  518. }
  519. ret = (char)getch();
  520. if ( (ret == 'Q') || (ret == 'q') )
  521. endit = 1;
  522. if (ret == 'Q')
  523. ret = 'q';
  524. if (ret == 'S')
  525. ret = 's';
  526. if ((ret=='s') || (ret=='q')) {
  527. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  528. fillscreen(0);
  529. setview(0,0,maxx,maxy);
  530. return(ret);
  531. }
  532. /*
  533.  * Show mouserangeset
  534.  */
  535. mousehide();
  536. setview(0,16,maxx,maxy);
  537. fillview(0);
  538. sprintf(buf,"mouserangeset(x1,y1,x2,y2);");
  539. drwstring(1,7,0,buf,10,16);
  540. setview(0,32,maxx,maxy);
  541. spcing = (maxy - 32) / 3;
  542. x1 = spcing;
  543. y1 = 32 + spcing;
  544. x2 = maxx - spcing;
  545. y2 = maxy - spcing;
  546. drwbox(1,15,x1,y1,x2,y2);
  547. mouseshow();
  548. mouserangeset(x1,y1,x2,y2);
  549. ret = getkey();
  550. mouserangeset(0,0,maxx,maxy);
  551. if ((ret=='s') || (ret=='q')) {
  552. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  553. fillscreen(0);
  554. setview(0,0,maxx,maxy);
  555. return(ret);
  556. }
  557. /*
  558.  * Show mousecursorset - use the magnifier
  559.  */
  560. setview(0,16,maxx,31);
  561. fillview(0);
  562. sprintf(buf,"mousecursorset(mousecursor);");
  563. drwstring(1,7,0,buf,10,16);
  564. setview(0,32,maxx,maxy);
  565. mousecursorset(&magmousecursor);
  566. ret = getkey();
  567. if ((ret=='s') || (ret=='q')) {
  568. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  569. fillscreen(0);
  570. setview(0,0,maxx,maxy);
  571. return(ret);
  572. }
  573. /*
  574.  * Show mousecursorset - use the big arrow
  575.  */
  576. setview(0,32,maxx,maxy);
  577. mousecursorset(&bigmousecursor);
  578. ret = getkey();
  579. if ((ret=='s') || (ret=='q')) {
  580. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  581. fillscreen(0);
  582. setview(0,0,maxx,maxy);
  583. return(ret);
  584. }
  585. /*
  586.  * Show mousecursorset - use the stopwatch
  587.  */
  588. setview(0,32,maxx,maxy);
  589. mousecursorset(&stwmousecursor);
  590. ret = getkey();
  591. if ((ret=='s') || (ret=='q')) {
  592. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  593. fillscreen(0);
  594. setview(0,0,maxx,maxy);
  595. return(ret);
  596. }
  597. /*
  598.  * Show mousecursordefault
  599.  */
  600. mousehide();
  601. setview(0,16,maxx,31);
  602. fillview(0);
  603. sprintf(buf,"mousecursordefault();");
  604. drwstring(1,7,0,buf,10,16);
  605. mouseshow();
  606. setview(0,32,maxx,maxy);
  607. mousecursordefault();
  608. ret = getkey();
  609. mouseexit(); /* MUST BE CALLED TO DISABLE MOUSE FUNCTIONS */
  610. fillscreen(0);
  611. setview(0,0,maxx,maxy);
  612. return(ret);
  613. }
  614. /*********
  615.  * DOGIF *
  616.  *********/
  617. char dogif(void)
  618. {
  619. int endthis;
  620. int ext, length;
  621. char c, ret;
  622. char title[TITLEN];
  623. char buf[TITLEN];
  624. char *fname;
  625. fname=malloc(128);
  626. /*
  627.  * Setup the title
  628.  */
  629. sprintf(title,"DEMO 8: GIF functions");
  630. /*
  631.  * Show gifgetinfo
  632.  */
  633. setview(0,0,maxx,maxy);
  634. fillscreen(0);
  635. drwstring(1,7,0,title,10,0);
  636. endthis = 0;
  637. ret = '';
  638. while (!endthis) {
  639. sprintf(buf,"Please provide the name (and full path if not in the current drive/directory)");
  640. drwstring(1,7,0,buf,10,64);
  641. sprintf(buf,"of a GIF file you would like to see...");
  642. drwstring(1,7,0,buf,10,80);
  643. sprintf(buf,"Filename:");
  644. drwstring(1,7,0,buf,10,96);
  645. sprintf(fname,"_");
  646. length = 0;
  647. ext = 0;
  648. c = '';
  649. while(!ext) {
  650. drwstring(1,7,0,fname,82,96);
  651. c = (char)getch();
  652. if(c>=' ' && c<='~') {
  653. fname[length] = c;
  654. fname[length+1] = '_';
  655. fname[length+2] = '';
  656. length++;
  657. }
  658. else
  659. if (c==8 && length>0) {
  660. drwstring(1,15,0,"   ",82+length*8,96);
  661. length--;
  662. fname[length] = '_';
  663. fname[length+1] = '';
  664. }
  665. else
  666. if (c==13)
  667. ext = 1;
  668. }
  669. if (length==0) {
  670. free(fname);
  671. return(ret);
  672. }
  673. fname[length] = '';
  674. ret = showgif(fname);
  675. if ((ret=='s') || (ret=='q')) {
  676. fillscreen(0);
  677. free(fname);
  678. return(ret);
  679. }
  680. drwstring(1,7,0,title,10,0);
  681. sprintf(buf,"Would you like to see another (Y/N) ?");
  682. drwstring(1,7,0,buf,10,64);
  683. ext = 0;
  684. while(!ext) {
  685. c=(char)getch();
  686. if ((c=='n') || (c=='N')) {
  687. ext = 1;
  688. endthis = 1;
  689. }
  690. else
  691. if ((c=='y') || (c=='Y'))
  692. ext = 1;
  693. }
  694. }
  695. fillscreen(0);
  696. free(fname);
  697. return(ret);
  698. }
  699. /**************
  700.  * DOJOYSTICK *
  701.  **************/
  702. char dojoystick(void)
  703. {
  704. int maxxa, maxya, minxa, minya;
  705. int maxxb, maxyb, minxb, minyb;
  706. int jax, jay, jabuts, jbx, jby, jbbuts;
  707. int joystick, spcing, dist;
  708. int x1, y1, x2, y2, x3, y3, x4, y4;
  709. int cntax, cntay, cntbx, cntby;
  710. int rangexa, rangeya, rangexb, rangeyb;
  711. int jabax, jabay, jabbx, jabby;
  712. int jbbax, jbbay, jbbbx, jbbby;
  713. int oax, oay, obx, oby;
  714. char ret;
  715. char title[TITLEN];
  716. char buf[TITLEN];
  717. oax = oay = obx = oby = 0;
  718. /*
  719.  * Set up the title
  720.  */
  721. sprintf(title,"DEMO 10: Joystick functions");
  722. palset(pal,0,255);
  723. fillscreen(0);
  724. setview(0,0,maxx,maxy);
  725. drwstring(1,7,0,title,10,0);
  726. /*
  727.  * Check to see if we have a joystick so we can do the joystick demo
  728.  */
  729. joystick = whichjoystick();
  730. if (joystick < 1) {
  731. sprintf(buf,"Sorry, no joystick detected... Can not do the joystick demo.");
  732. drwstring(1,7,0,buf,10,16);
  733. ret = getkey();
  734. fillscreen(0);
  735. return(ret);
  736. }
  737. /*
  738.  * Show joystickinfo (here we do some joystick calibration
  739.  */
  740. sprintf(buf,"joystickinfo(jax,jay,jabuts,jbx,jby,jbbuts);");
  741. drwstring(1,7,0,buf,10,16);
  742. switch(joystick) {
  743. case 1:
  744. sprintf(buf,"Please move Joystick A as far as it will go in all directions.");
  745. break;
  746. case 2:
  747. sprintf(buf,"Please move Joystick B as far as it will go in all directions.");
  748. break;
  749. case 3:
  750. sprintf(buf,"Please move Joystick A and B as far as they will go in all directions.");
  751. break;
  752. }
  753. drwstring(1,7,0,buf,10,32);
  754. drwstring(1,7,0,"And then press a key...",10,48);
  755. maxxa = -1;
  756. maxya = -1;
  757. minxa = 10000;
  758. minya = 10000;
  759. maxxb = -1;
  760. maxyb = -1;
  761. minxb = 10000;
  762. minyb = 10000;
  763. do {
  764. while(!kbhit()) {
  765. joystickinfo(&jax,&jay,&jabuts,&jbx,&jby,&jbbuts);
  766. if (joystick & 1) {
  767. if (jax>maxxa)
  768. maxxa = jax;
  769. if (jax<minxa)
  770. minxa = jax;
  771. if (jay>maxya)
  772. maxya = jay;
  773. if (jay<minya)
  774. minya = jay;
  775. }
  776. if (joystick & 2) {
  777. if (jbx>maxxb)
  778. maxxb = jbx;
  779. if (jbx<minxb)
  780. minxb = jbx;
  781. if (jby>maxyb)
  782. maxyb = jby;
  783. if (jby<minyb)
  784. minyb = jby;
  785. }
  786. }
  787. ret = getkey();
  788. } while ( ((joystick & 1) && ((maxxa==minxa) || (maxya==minya))) || 
  789. ((joystick & 2) && ((maxxb==minxb) || (maxyb==minyb))) );
  790. if ((ret=='s') || (ret=='q')) {
  791. setview(0,0,maxx,maxy);
  792. fillscreen(0);
  793. return(ret);
  794. }
  795. /*
  796.  * Calculate the center and stuff
  797.  */
  798. spcing = maxx / 7;
  799. dist = spcing * 2;
  800. x1 = spcing / 2;
  801. y1 = spcing / 2 + 32;
  802. x2 = x1 + dist;
  803. y2 = y1 + dist;
  804. x4 = maxx - spcing;
  805. y4 = y2;
  806. x3 = x4 - dist;
  807. y3 = y1;
  808. cntax = (x2 - x1) / 2 + x1;
  809. cntay = (y2 - y1) / 2 + y1;
  810. cntbx = (x4 - x3) / 2 + x3;
  811. cntby = (y4 - y3) / 2 + y3;
  812. rangexa = maxxa - minxa;
  813. rangeya = maxya - minya;
  814. rangexb = maxxb - minxb;
  815. rangeyb = maxyb - minyb;
  816. jabax = (x2 - x1) / 4 + x1 - 16;
  817. jabay = spcing / 4 + y2 - 6;
  818. jabbx = x2 - (x2 - x1) / 4 - 16;
  819. jabby = spcing / 4 + y2 - 6;
  820. jbbax = (x4 - x3) / 4 + x3 - 16;
  821. jbbay = spcing / 4 + y4 - 6;
  822. jbbbx = x4 - (x4 - x3) / 4 - 16;
  823. jbbby = spcing / 4 + y4 - 6;
  824. /*
  825.  * Let's move it (or them) around
  826.  */
  827. setview(0,32,maxx,maxy);
  828. fillview(0);
  829. drwstring(1,7,0,"Joysticks are nonlinear devices and may not appear centered.",10,32);
  830. if (joystick & 1) {
  831. drwbox(1,15,x1-1,y1-1,x2+1,y2+1);
  832. drwbox(1,15,x1-1,y2+1,x2+1,y2+spcing/2);
  833. drwline(1,15,(x2-x1)/2+x1,y2+1,(x2-x1)/2+x1,y2+spcing/2);
  834. oax = cntax;
  835. oay = cntay;
  836. drwline(1,10,cntax,cntay,oax,oay);
  837. }
  838. else {
  839. drwbox(1,8,x1-1,y1-1,x2+1,y2+1);
  840. drwbox(1,8,x1-1,y2+1,x2+1,y2+spcing/2);
  841. drwline(1,8,(x2-x1)/2+x1,y2+1,(x2-x1)/2+x1,y2+spcing/2);
  842. }
  843. if (joystick & 2) {
  844. drwbox(1,15,x3-1,y3-1,x4+1,y4+1);
  845. drwbox(1,15,x3-1,y4+1,x4+1,y4+spcing/2);
  846. drwline(1,15,(x4-x3)/2+x3,y4+1,(x4-x3)/2+x3,y4+spcing/2);
  847. obx = cntbx;
  848. oby = cntby;
  849. drwline(1,10,cntbx,cntby,obx,oby);
  850. }
  851. else {
  852. drwbox(1,8,x3-1,y3-1,x4+1,y4+1);
  853. drwbox(1,8,x3-1,y4+1,x4+1,y4+spcing/2);
  854. drwline(1,8,(x4-x3)/2+x3,y4+1,(x4-x3)/2+x3,y4+spcing/2);
  855. }
  856. while(!kbhit()) {
  857. joystickinfo(&jax,&jay,&jabuts,&jbx,&jby,&jbbuts);
  858. if (joystick & 1) {
  859. setview(x1,y1,x2,y2);
  860. jax = jax - minxa;
  861. jax = jax * dist / rangexa + x1;
  862. jay = jay - minya;
  863. jay = jay * dist / rangeya + y1;
  864. drwline(1,0,cntax,cntay,oax,oay);
  865. oax = jax;
  866. oay = jay;
  867. drwline(1,10,cntax,cntay,oax,oay);
  868. setview(0,0,maxx,maxy);
  869. sprintf(buf,"ButA");
  870. if (jabuts & 1)
  871. drwstring(1,10,0,buf,jabax,jabay);
  872. else
  873. drwstring(1,8,0,buf,jabax,jabay);
  874. sprintf(buf,"ButB");
  875. if (jabuts & 2)
  876. drwstring(1,10,0,buf,jabbx,jabby);
  877. else
  878. drwstring(1,8,0,buf,jabbx,jabby);
  879. }
  880. if (joystick & 2) {
  881. setview(x3,y3,x4,y4);
  882. jbx = jbx - minxb;
  883. jbx = jbx * dist / rangexb + x3;
  884. jby = jby - minyb;
  885. jby = jby * dist / rangeyb + y3;
  886. drwline(1,0,cntbx,cntby,obx,oby);
  887. obx = jbx;
  888. oby = jby;
  889. drwline(1,10,cntbx,cntby,obx,oby);
  890. setview(0,0,maxx,maxy);
  891. sprintf(buf,"ButA");
  892. if (jbbuts & 1)
  893. drwstring(1,10,0,buf,jbbax,jbbay);
  894. else
  895. drwstring(1,8,0,buf,jbbax,jbbay);
  896. sprintf(buf,"ButB");
  897. if (jbbuts & 2)
  898. drwstring(1,10,0,buf,jbbbx,jbbby);
  899. else
  900. drwstring(1,8,0,buf,jbbbx,jbbby);
  901. }
  902. }
  903. ret = getkey();
  904. fillscreen(0);
  905. setview(0,0,maxx,maxy);
  906. return(ret);
  907. }
  908. /***********
  909.  * SHOWGIF *
  910.  ***********/
  911. char showgif(char fname[])
  912. {
  913. int i, ok;
  914. int min, max, mincolor, maxcolor;
  915. int xsize, ysize, numcol;
  916. int xloc, yloc;
  917. int fixit, t;
  918. PaletteData gifpal;
  919. char ret;
  920. char *buf;
  921. buf = malloc(TITLEN);
  922. mincolor = maxcolor = 0;
  923. /*
  924.  * Show gifgetinfo
  925.  */
  926. palset(orgpal,0,255);
  927. setview(0,0,maxx,maxy);
  928. fillscreen(0);
  929. drwstring(1,7,0,"DEMO 8: GIF functions",10,0);
  930. sprintf(buf,"gifgetinfo(filename,gifxsize,gifysize,numcolors,palette);");
  931. drwstring(1,7,0,buf,10,16);
  932. ok = gifgetinfo(fname,&xsize,&ysize,&numcol,gifpal);
  933. min = 255 * 3;
  934. max = 0;
  935. if (ok == 1) {
  936. /*
  937.  * We need to check the GIF color palette entries to see if any colors
  938.  * are greater than six bits in length as the VGA color palette
  939.  * registers are only six bits wide.  We also look for the brightest
  940.  * and darkest colors to use as our text and background colors.
  941.  */
  942. fixit = 0;
  943. for(i=0;i<numcol;i++) {
  944. if((gifpal[i].r>63) || (gifpal[i].g>63) || (gifpal[i].b>63))
  945. fixit = 1;
  946. t = gifpal[i].r + gifpal[i].g + gifpal[i].b;
  947. if(t<min) {
  948. min = t;
  949. mincolor = i;
  950. }
  951. if(t>max) {
  952. max = t;
  953. maxcolor = i;
  954. }
  955. }
  956. /*
  957.  * If the GIF uses more than 6 bit color, then we shift each color entry
  958.  * right by 2 bits.  (This reduces it to 6 bits of color.)
  959.  */
  960. if (fixit)
  961. for(i=0;i<numcol;i++) {
  962. gifpal[i].r>>=2;
  963. gifpal[i].g>>=2;
  964. gifpal[i].b>>=2;
  965. }
  966. /*
  967.  * If the GIF has a palette of 128 colors or less, then we can use
  968.  * our own colors for the text and background.
  969.  */
  970. if (numcol<=128) {
  971. gifpal[254].r = gifpal[254].g = gifpal[254].b = 0;
  972. mincolor = 254;
  973. gifpal[255].r = gifpal[255].g = gifpal[255].b = 32;
  974. maxcolor = 255;
  975. }
  976. sprintf(buf,"'%s' is identified as a 'Non-interlaced' type 'GIF87a' GIF image.",fname);
  977. drwstring(1,15,0,buf,10,64);
  978. sprintf(buf,"Dimensions are: %d pixels wide and %d pixels high.",xsize,ysize);
  979. drwstring(1,15,0,buf,10,80);
  980. sprintf(buf,"Number of colors: %d.",numcol);
  981. drwstring(1,15,0,buf,10,96);
  982. ret = getkey();
  983. if ((ret=='s') || (ret=='q')) {
  984. fillscreen(0);
  985. setview(0,0,maxx,maxy);
  986. palset(orgpal,0,255);
  987. free(buf);
  988. return(ret);
  989. }
  990. /*
  991.  * Show gifput
  992.  */
  993. palset(gifpal,0,255);
  994. overscanset(mincolor);
  995. fillscreen(mincolor);
  996. drwstring(1,maxcolor,mincolor,"DEMO 8: GIF functions",10,0);
  997. sprintf(buf,"gifput(mode,x,y,filename);");
  998. drwstring(1,maxcolor,mincolor,buf,10,16);
  999. setview(0,32,maxx,maxy);
  1000. xloc = maxx / 2 - xsize / 2;
  1001. yloc = (maxy - 32) / 2 - ysize / 2 + 32;
  1002. ok = gifput(1,xloc,yloc,fname);
  1003. if (ok!=1) {
  1004. palset(orgpal,0,255);
  1005. sprintf(buf,"The file '%s'",fname);
  1006. switch (ok) {
  1007. case 0:
  1008. strcat(buf," does not exist in the specified directory.");
  1009. break;
  1010. case -1:
  1011. strcat(buf," does not have the 'GIF87a' signature.");
  1012. break;
  1013. case -2:
  1014. strcat(buf," is an interlaced GIF.");
  1015. break;
  1016. case -3:
  1017. strcat(buf," does not use a global color map.");
  1018. break;
  1019. default: /* should have a value of -4 */
  1020. strcat(buf," has some general error.");
  1021. }
  1022. drwstring(1,15,0,buf,10,64);
  1023. }
  1024. }
  1025. else {
  1026. palset(orgpal,0,255);
  1027. sprintf(buf,"The file '%s'",fname);
  1028. switch (ok) {
  1029. case 0:
  1030. strcat(buf," does not exist in the specified directory.");
  1031. break;
  1032. case -1:
  1033. strcat(buf," does not have the 'GIF87a' signature.");
  1034. break;
  1035. case -2:
  1036. strcat(buf," is an interlaced GIF.");
  1037. break;
  1038. case -3:
  1039. strcat(buf," does not use a global color map.");
  1040. break;
  1041. default: /* should have a value of -4 */
  1042. strcat(buf," has some general error.");
  1043. }
  1044. drwstring(1,15,0,buf,10,64);
  1045. }
  1046. ret = getkey();
  1047. palset(orgpal,0,255);
  1048. overscanset(0);
  1049. fillscreen(0);
  1050. setview(0,0,maxx,maxy);
  1051. free(buf);
  1052. return(ret);
  1053. }
  1054. /*************
  1055.  * SHOWHOUSE *
  1056.  *************/
  1057. void showhouse(D2Point *plotarray, D2Point *oplotarray)
  1058. {
  1059. int i;
  1060. /* Erase old axes */
  1061. drwline(1,0,(oplotarray+10)->x,(oplotarray+10)->y,(oplotarray+11)->x,(oplotarray+11)->y);
  1062. drwline(1,0,(oplotarray+10)->x,(oplotarray+10)->y,(oplotarray+12)->x,(oplotarray+12)->y);
  1063. drwline(1,0,(oplotarray+10)->x,(oplotarray+10)->y,(oplotarray+13)->x,(oplotarray+13)->y);
  1064. /* Erase old house */
  1065. for(i=0;i<3;i++) {
  1066. drwline(1,0,(oplotarray+i)->x,(oplotarray+i)->y,(oplotarray+i+1)->x,(oplotarray+i+1)->y);
  1067. drwline(1,0,(oplotarray+i+4)->x,(oplotarray+i+4)->y,(oplotarray+i+4+1)->x,(oplotarray+i+4+1)->y);
  1068. drwline(1,0,(oplotarray+i)->x,(oplotarray+i)->y,(oplotarray+i+4)->x,(oplotarray+i+4)->y);
  1069. }
  1070. drwline(1,0,(oplotarray+3)->x,(oplotarray+3)->y,(oplotarray+7)->x,(oplotarray+7)->y);
  1071. drwline(1,0,(oplotarray+0)->x,(oplotarray+0)->y,(oplotarray+3)->x,(oplotarray+3)->y);
  1072. drwline(1,0,(oplotarray+4)->x,(oplotarray+4)->y,(oplotarray+7)->x,(oplotarray+7)->y);
  1073. drwline(1,0,(oplotarray+3)->x,(oplotarray+3)->y,(oplotarray+8)->x,(oplotarray+8)->y);
  1074. drwline(1,0,(oplotarray+8)->x,(oplotarray+8)->y,(oplotarray+2)->x,(oplotarray+2)->y);
  1075. drwline(1,0,(oplotarray+9)->x,(oplotarray+9)->y,(oplotarray+7)->x,(oplotarray+7)->y);
  1076. drwline(1,0,(oplotarray+9)->x,(oplotarray+9)->y,(oplotarray+6)->x,(oplotarray+6)->y);
  1077. drwline(1,0,(oplotarray+8)->x,(oplotarray+8)->y,(oplotarray+9)->x,(oplotarray+9)->y);
  1078. /* Draw new axes */
  1079. drwline(1,8,(plotarray+10)->x,(plotarray+10)->y,(plotarray+11)->x,(plotarray+11)->y);
  1080. drwline(1,8,(plotarray+10)->x,(plotarray+10)->y,(plotarray+12)->x,(plotarray+12)->y);
  1081. drwline(1,8,(plotarray+10)->x,(plotarray+10)->y,(plotarray+13)->x,(plotarray+13)->y);
  1082. /* Draw new house */
  1083. for(i=0;i<3;i++) {
  1084. drwline(1,10,(plotarray+i)->x,(plotarray+i)->y,(plotarray+i+1)->x,(plotarray+i+1)->y);
  1085. drwline(1,10,(plotarray+i+4)->x,(plotarray+i+4)->y,(plotarray+i+4+1)->x,(plotarray+i+4+1)->y);
  1086. drwline(1,10,(plotarray+i)->x,(plotarray+i)->y,(plotarray+i+4)->x,(plotarray+i+4)->y);
  1087. }
  1088. drwline(1,10,(plotarray+3)->x,(plotarray+3)->y,(plotarray+7)->x,(plotarray+7)->y);
  1089. drwline(1,10,(plotarray+0)->x,(plotarray+0)->y,(plotarray+3)->x,(plotarray+3)->y);
  1090. drwline(1,10,(plotarray+4)->x,(plotarray+4)->y,(plotarray+7)->x,(plotarray+7)->y);
  1091. drwline(1,10,(plotarray+3)->x,(plotarray+3)->y,(plotarray+8)->x,(plotarray+8)->y);
  1092. drwline(1,10,(plotarray+8)->x,(plotarray+8)->y,(plotarray+2)->x,(plotarray+2)->y);
  1093. drwline(1,10,(plotarray+9)->x,(plotarray+9)->y,(plotarray+7)->x,(plotarray+7)->y);
  1094. drwline(1,10,(plotarray+9)->x,(plotarray+9)->y,(plotarray+6)->x,(plotarray+6)->y);
  1095. drwline(1,10,(plotarray+8)->x,(plotarray+8)->y,(plotarray+9)->x,(plotarray+9)->y);
  1096. /* Save old points */
  1097. bytecopy(plotarray,oplotarray,14*sizeof(*plotarray));
  1098. return;
  1099. }
  1100. /************
  1101.  * SHOWSTAR *
  1102.  ************/
  1103. void showstar(D2Point *plotarray, D2Point *oplotarray)
  1104. {
  1105. int i;
  1106. for(i=0;i<8;i++)
  1107. drwline(1,0,(oplotarray+i)->x,(oplotarray+i)->y,((oplotarray+i)+1)->x,((oplotarray+i)+1)->y);
  1108. for(i=0;i<8;i++)
  1109. drwline(1,10,(plotarray+i)->x,(plotarray+i)->y,((plotarray+i)+1)->x,((plotarray+i)+1)->y);
  1110. bytecopy(plotarray,oplotarray,9*sizeof(*plotarray));
  1111. return;
  1112. }