home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume37 / magiccube / part01 / cube / cube.h next >
Encoding:
C/C++ Source or Header  |  1993-05-15  |  14.5 KB  |  408 lines

  1. /**********************************************************************************
  2.  * cube.h: declarations for the cube program
  3.  *The following references were used:
  4.    "The X Window System Programming And Applications with Xt
  5.    OSF/MOTIF EDITION"
  6.    by Douglas A Young 
  7.    Prentice-Hall, 1990.
  8.    ISBN 0-13-642786-3
  9.  
  10.    "Mastering Rubik's Cube"
  11.    by Don Taylor
  12.    An Owl Book; Holt, Rinehart and Winston, New York, 1980
  13.    ISBN 0-03-059941-5
  14.  
  15. -------------------------------------------------------------------
  16. Copyright (C) 1993 by Pierre A. Fleurant
  17. Permission is granted to copy and distribute this program
  18. without charge, provided this copyright notice is included
  19. in the copy.
  20. This Software is distributed on an as-is basis. There will be
  21. ABSOLUTELY NO WARRANTY for any part of this software to work
  22. correct. In no case will the author be liable to you for damages
  23. caused by the usage of this software.
  24. -------------------------------------------------------------------
  25.  */
  26.  
  27. #include <X11/StringDefs.h>
  28. #include <X11/cursorfont.h>
  29. #include <X11/Intrinsic.h> 
  30. #include <X11/Xutil.h>
  31. #include <Xm/Xm.h>
  32. #include <Xm/DrawingA.h>
  33. #include <Xm/RowColumn.h>
  34. #include <Xm/Form.h>
  35. #include <Xm/PushB.h>
  36. #include <Xm/ToggleB.h>
  37. #include <Xm/Label.h>
  38. #include <math.h>
  39. #include "libXs.h"
  40.  
  41. #define DEFAULT_DELTA_ANGLE 30
  42.  
  43. /* application context, display */
  44. XtAppContext appContext;
  45. Display *xDisplay;
  46.  
  47. /* #define MotifBC YES */
  48.  
  49. Boolean Draw_Enable           = TRUE; 
  50. Boolean Cube_Side_Chosen      = FALSE;
  51. Boolean Fill_Pattern_Chosen   = FALSE;
  52.  
  53. /* Used for cornermap array. See align_subfaces in cube.c */
  54. typedef struct {
  55.   int a;
  56.   int b;
  57.   int c;
  58. } Corner;
  59.  
  60. /* Used for edge array. See align_subfaces in cube.c */
  61. typedef struct {
  62.   int a;
  63.   int b;
  64. } Edge;
  65.  
  66. /*  help information */
  67.  
  68. char *tophelp_str[] = {
  69.   "Init Cube: init cube to pattern desired",
  70.   "Pristine: to start with a pristine cube",
  71.   "Quit: exit",
  72.   "rotate,spin,flip: turns whole cube",
  73.   "!front, !left, !right,...: operates on 1/3 of cube",
  74.   "  ",
  75.   "  ",
  76.   "",""};
  77.  
  78. static unsigned char fg_bitmap[32] = {
  79.       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* solid foreground  */
  80.       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
  81.       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
  82.       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  
  83. };
  84. #define fg_width  16
  85. #define fg_height 16
  86.  
  87. /* the initial colors of the 6 sides of the cube */
  88. char *seed_color[] = {
  89. /*  0      1        2         3             4        5     
  90.     front  left     right     back          top      bottom  
  91.  */
  92.    "red", "yellow", "orange", "light grey", "blue", "green"
  93. };
  94.  
  95. /* the names of the 6 sides of the cube */
  96. char *side_names[] = {
  97.   "front", "left", "right", "back", "top", "bottom"  
  98. };
  99.  
  100. /* Menu bar data */
  101. extern void spin_it();
  102. extern void rot_it();
  103. extern void flip_it();
  104. extern void quit_it();
  105. extern void init_cube();
  106. extern void clear_draw();
  107. extern void cubik_front();
  108. extern void cubik_left();
  109. extern void cubik_right();
  110. extern void cubik_back();
  111. extern void cubik_top();
  112. extern void cubik_bottom();
  113.  
  114. /*
  115.  * Create the list of menu items for a sub menu pane.
  116.  */
  117. static xs_menu_struct OpData[] = {
  118.   {"rotate", rot_it, "ignore", NULL, 0, NULL},
  119.   {"spin", spin_it, "ignore", NULL, 0, NULL},
  120.   {"flip", flip_it, "ignore", NULL, 0 ,NULL},
  121.   {"!front", cubik_front, "ignore", NULL, 0, NULL},
  122.   {"!left",  cubik_left, "ignore", NULL, 0, NULL},
  123.   {"!right", cubik_right, "ignore", NULL, 0, NULL},
  124.   {"!back",  cubik_back, "ignore", NULL, 0, NULL},
  125.   {"!top",   cubik_top, "ignore", NULL, 0, NULL},
  126.   {"!bottom",cubik_bottom, "ignore", NULL, 0, NULL}
  127. };
  128.  
  129. /*
  130.  * Describe the menu bar, giving only the names to appear in
  131.  * the menu bar and pointers to each pulldown pane.
  132.  */
  133. static xs_menu_struct PulldownData[] = {
  134.   {"Operate" , NULL,  NULL,  
  135.     OpData, XtNumber(OpData), NULL}
  136. };
  137.  
  138. /* Old cube0 values. 
  139.    #define MR_X  150
  140.    #define MR_Y  125
  141.    #define Z_DEPTH 0
  142. */
  143. /* With following values cube is centered about (0,0,0) */
  144. #define MR_X  (-75)
  145. #define MR_Y  (-75)
  146. #define Z_DEPTH (-75)
  147.  
  148. #define WINDOW_CENTER_X 225
  149. #define WINDOW_CENTER_Y 200
  150.  
  151. #define PROJECTION_DEPTH 500
  152. #define FACE0_WIDTH  50
  153. #define FACE0_HEIGHT 50
  154. #define NUM_SUBPLANES 54
  155. #define NUM_CUBIKPLANES 21 /* number of planes moved in cubikked op; 1/3 of cube moved */
  156.  
  157.  
  158. /* Double_XPoint arrays are used for all double calculations so that rotated, flipped,
  159.    or spin'ed face does not look bad after many small increments of rotation. 
  160.    The z coordnate is used to preserve info when spin`ed or flipped. The routine 
  161.    shortface() converts the double_XPoint array to the regular XPoint array for drawing */
  162. typedef struct {
  163.   double x;
  164.   double y;
  165.   double z;
  166. }double_XPoint;
  167.  
  168. /* seed_face coordinates use mode=CoordModePrevious. They are converted to mode=CoordModeOrigin later. */
  169. double_XPoint rot_face[NUM_SUBPLANES][5];   /* the last spin'ed, flipped, or rotated face */
  170. double_XPoint cubik_face[NUM_SUBPLANES][5]; /* the cubikked face, a face that is turned only-1/3 of cube */
  171. double_XPoint seed_face[][5] = {
  172.  
  173.   /* Side 0 (front)*/
  174.   {MR_X, MR_Y, Z_DEPTH},
  175.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  176.   {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH},
  177.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  178.   {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH},
  179.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  180.  
  181.   {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH},
  182.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  183.   {MR_X+FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
  184.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  185.   {MR_X+2*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
  186.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  187.  
  188.   {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
  189.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  190.   {MR_X+FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
  191.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  192.   {MR_X+2*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
  193.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  194.  
  195.   /* Side 1 (left) */
  196.   {MR_X, MR_Y, Z_DEPTH},
  197.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  198.   {MR_X, MR_Y, Z_DEPTH+FACE0_WIDTH},
  199.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  200.   {MR_X, MR_Y, Z_DEPTH+2*FACE0_WIDTH},
  201.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  202.  
  203.   {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH},
  204.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  205.   {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
  206.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  207.   {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
  208.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  209.  
  210.   {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
  211.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  212.   {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
  213.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  214.   {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
  215.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  216.  
  217.   /* Side 2 (right) */
  218.   {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH},
  219.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  220.   {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_WIDTH},
  221.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  222.   {MR_X+3*FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_WIDTH},
  223.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  224.  
  225.   {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH},
  226.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  227.   {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
  228.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  229.   {MR_X+3*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
  230.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  231.  
  232.   {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH},
  233.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  234.   {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+FACE0_WIDTH},
  235.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  236.   {MR_X+3*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+2*FACE0_WIDTH},
  237.               {0,0,FACE0_WIDTH},{0,FACE0_HEIGHT,0},{0,0,-FACE0_WIDTH},{0,-FACE0_HEIGHT,0},
  238.  
  239.   /* Side 3 (back) */
  240.   {MR_X, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
  241.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  242.   {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
  243.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  244.   {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+3*FACE0_WIDTH},
  245.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  246.  
  247.   {MR_X, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  248.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  249.   {MR_X+FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  250.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  251.   {MR_X+2*FACE0_WIDTH, MR_Y+FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  252.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  253.  
  254.   {MR_X, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  255.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  256.   {MR_X+FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  257.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  258.   {MR_X+2*FACE0_WIDTH, MR_Y+2*FACE0_HEIGHT, Z_DEPTH+3*FACE0_WIDTH},
  259.               {FACE0_WIDTH,0,0},{0,FACE0_HEIGHT,0},{-FACE0_WIDTH,0,0},{0,-FACE0_HEIGHT,0},
  260.  
  261.   /* Side 4 (top) */
  262.   {MR_X, MR_Y, Z_DEPTH},
  263.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  264.   {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH},
  265.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  266.   {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH},
  267.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  268.  
  269.   {MR_X, MR_Y, Z_DEPTH+FACE0_HEIGHT},
  270.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  271.   {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_HEIGHT},
  272.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  273.   {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+FACE0_HEIGHT},
  274.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  275.  
  276.   {MR_X, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
  277.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  278.   {MR_X+FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
  279.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  280.   {MR_X+2*FACE0_WIDTH, MR_Y, Z_DEPTH+2*FACE0_HEIGHT},
  281.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  282.  
  283.   /* Side 5 (bottom) */
  284.   {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
  285.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  286.   {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
  287.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  288.   {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH},
  289.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  290.  
  291.   {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
  292.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  293.   {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
  294.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  295.   {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+FACE0_HEIGHT},
  296.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  297.  
  298.   {MR_X, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
  299.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  300.   {MR_X+FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
  301.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  302.   {MR_X+2*FACE0_WIDTH, MR_Y+3*FACE0_HEIGHT, Z_DEPTH+2*FACE0_HEIGHT},
  303.               {FACE0_WIDTH,0,0},{0,0,FACE0_HEIGHT},{-FACE0_WIDTH,0,0},{0,0,-FACE0_HEIGHT},
  304.  
  305. };
  306. int rot_angle,spin_angle,flip_angle;
  307.  
  308. /* The subplanes that are moved in the cubikc_xxxx callback
  309.  * that make up a twisting of the 1/3 of the cube.
  310.  * 
  311.  */
  312. int seed_front[] = {
  313.   0,1,2,3,4,5,6,7,8, 
  314.   0,0,0,
  315.   0,0,0,
  316.   0,0,0,
  317.   0,0,0
  318.   };
  319.  
  320. int seed_left[] = {
  321.   9,10,11,12,13,14,15,16,17,
  322.   0,0,0,
  323.   0,0,0,
  324.   0,0,0,
  325.   0,0,0
  326.   };
  327.  
  328. int seed_right[] = {
  329.   18,19,20,21,22,23,24,25,26,
  330.   0,0,0,
  331.   0,0,0,
  332.   0,0,0,
  333.   0,0,0
  334.   };
  335.  
  336. int seed_back[] = {
  337.   27,28,29,30,31,32,33,34,35,
  338.   0,0,0,
  339.   0,0,0,
  340.   0,0,0,
  341.   0,0,0
  342.   };
  343.  
  344. int seed_top[] = {
  345.   36,37,38,39,40,41,42,43,44,
  346.   0,0,0,
  347.   0,0,0,
  348.   0,0,0,
  349.   0,0,0
  350.   };
  351.  
  352. int seed_bottom[] = {
  353.   45,46,47,48,49,50,51,52,53,
  354.   0,0,0,
  355.   0,0,0,
  356.   0,0,0,
  357.   0,0,0
  358.   };
  359. /* the front[]. left[], .... arrays 
  360.    indicate which subplane occupies a subplane location.
  361.    When pristine these values are equal. (See seed_xxxx.)
  362.    cubik_face[x][] gives the coordinates of a the xth
  363.    subplane. The coordinates of a subplane change if a cubik
  364.    operation operates on the said subplane. 
  365.  */
  366. int front[NUM_CUBIKPLANES],left[NUM_CUBIKPLANES];
  367. int right[NUM_CUBIKPLANES],back[NUM_CUBIKPLANES];
  368. int top[NUM_CUBIKPLANES],bottom[NUM_CUBIKPLANES];
  369. Corner cornermap[6][6][6]; /* see align_subfaces in cube.c */
  370. Edge   edgemap[6][6];      /* see align_subfaces in cube.c */
  371.  
  372.  
  373. double Delta_Angle = DEFAULT_DELTA_ANGLE; 
  374.  
  375. void  draw_line();
  376. void  draw_circle();
  377. void  draw_rectangle();
  378. void  draw_filled_circle();
  379. void  draw_filled_rectangle();
  380.  
  381. void  activate();
  382. void  refresh();
  383. void  refresh_cube();
  384. void  set_stipple();
  385. void  start_rubber_band();
  386. void  track_rubber_band();
  387. void  end_rubber_band();
  388. void  prev_to_org();
  389. void  facecpy();
  390. void  cubik();
  391. void  cubikcpy();
  392. void  update_cubik();
  393. void  lefthand_twist();
  394. void  righthand_twist();
  395. void  xs_help_callback();
  396. void  init_subplane_pattern();
  397. void  norm_face();
  398. void  projface();
  399. void  shortface();
  400. extern void xcube_init_cubik();
  401. extern void taylor();
  402. extern void ldfile();
  403.  
  404. void init_cornermap();
  405. void init_edgemap();
  406. void check_events();
  407. Bool test_for_event();
  408.