/micropolis-activity/src/sim/headers/cam.h

http://micropolis.googlecode.com/ · C++ Header · 217 lines · 130 code · 26 blank · 61 comment · 2 complexity · 641109aa6389de17b8776df2da824835 MD5 · raw file

  1. /* cam.h
  2. *
  3. * Micropolis, Unix Version. This game was released for the Unix platform
  4. * in or about 1990 and has been modified for inclusion in the One Laptop
  5. * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If
  6. * you need assistance with this program, you may contact:
  7. * http://wiki.laptop.org/go/Micropolis or email micropolis@laptop.org.
  8. *
  9. * This program is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation, either version 3 of the License, or (at
  12. * your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful, but
  15. * WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * General Public License for more details. You should have received a
  18. * copy of the GNU General Public License along with this program. If
  19. * not, see <http://www.gnu.org/licenses/>.
  20. *
  21. * ADDITIONAL TERMS per GNU GPL Section 7
  22. *
  23. * No trademark or publicity rights are granted. This license does NOT
  24. * give you any right, title or interest in the trademark SimCity or any
  25. * other Electronic Arts trademark. You may not distribute any
  26. * modification of this program using the trademark SimCity or claim any
  27. * affliation or association with Electronic Arts Inc. or its employees.
  28. *
  29. * Any propagation or conveyance of this program must include this
  30. * copyright notice and these terms.
  31. *
  32. * If you convey this program (or any modifications of it) and assume
  33. * contractual liability for the program to recipients of it, you agree
  34. * to indemnify Electronic Arts for any liability that those contractual
  35. * assumptions impose on Electronic Arts.
  36. *
  37. * You may not misrepresent the origins of this program; modified
  38. * versions of the program must be marked as such and not identified as
  39. * the original program.
  40. *
  41. * This disclaimer supplements the one included in the General Public
  42. * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
  43. * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
  44. * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF
  45. * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS
  46. * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
  47. * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
  48. * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
  49. * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
  50. * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST
  51. * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
  52. * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
  53. * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
  54. * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
  55. * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
  56. * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME
  57. * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
  58. * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
  59. * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
  60. * NOT APPLY TO YOU.
  61. */
  62. #include <stdio.h>
  63. #include <stdlib.h>
  64. #include <fcntl.h>
  65. #include <signal.h>
  66. #ifndef HPUX
  67. #include <stropts.h>
  68. #endif
  69. #include <time.h>
  70. #include <errno.h>
  71. #ifndef IS_LINUX
  72. #include <sys/conf.h>
  73. #endif
  74. #include <sys/types.h>
  75. #include <sys/stat.h>
  76. #include <sys/file.h>
  77. #include <sys/mman.h>
  78. #include <sys/socket.h>
  79. #include <netinet/in.h>
  80. #include <sys/ipc.h>
  81. #include <sys/shm.h>
  82. #include <X11/Xlib.h>
  83. #include <X11/Xatom.h>
  84. #include <X11/extensions/XShm.h>
  85. #define CAM_ARGS \
  86. SimCam *scam, ARGS
  87. struct Can {
  88. Byte *mem;
  89. int line_bytes;
  90. int width;
  91. int height;
  92. };
  93. typedef struct Can Can;
  94. struct Cam {
  95. struct Cam *next;
  96. Can *back, *front;
  97. void (*neighborhood)();
  98. Byte *rule;
  99. int rule_size;
  100. int width;
  101. int height;
  102. int ideal_width;
  103. int ideal_height;
  104. int phase;
  105. int wrap;
  106. int steps;
  107. int frob;
  108. int x;
  109. int y;
  110. int dx;
  111. int dy;
  112. int gx;
  113. int gy;
  114. int dragging;
  115. int set_x;
  116. int set_y;
  117. int set_width;
  118. int set_height;
  119. int set_x0;
  120. int set_y0;
  121. int set_x1;
  122. int set_y1;
  123. char *name;
  124. };
  125. typedef struct Cam Cam;
  126. struct SimCam {
  127. struct SimCam *next;
  128. int w_x, w_y, w_width, w_height;
  129. int visible;
  130. int invalid;
  131. int skips;
  132. int skip;
  133. Tk_Window tkwin;
  134. Tcl_Interp *interp;
  135. int flags;
  136. XDisplay *x;
  137. XImage *image;
  138. XShmSegmentInfo *shminfo;
  139. int line_bytes;
  140. u_char *data;
  141. int cam_count;
  142. Cam *cam_list;
  143. };
  144. typedef struct SimCam SimCam;
  145. #define NORTHWEST ((Byte)((l0>>16) & 0xff))
  146. #define NORTH ((Byte)((l0>>8) & 0xff))
  147. #define NORTHEAST ((Byte)(l0 & 0xff))
  148. #define WEST ((Byte)((l1>>16) & 0xff))
  149. #define CENTER ((Byte)((l1>>8) & 0xff))
  150. #define EAST ((Byte)(l1 & 0xff))
  151. #define SOUTHWEST ((Byte)((l2>>16) & 0xff))
  152. #define SOUTH ((Byte)((l2>>8) & 0xff))
  153. #define SOUTHEAST ((Byte)(l2 & 0xff))
  154. #define SUM8 ((l0&1) + ((l0>>8)&1) + ((l0>>16)&1) + \
  155. (l1&1) + ((l1>>16)&1) + \
  156. (l2&1) + ((l2>>8)&1) + ((l2>>16)&1))
  157. #define SUM9 (SUM8 + ((l1>>8)&1))
  158. #define SUM8p(p) (((l0>>p)&1) + ((l0>>(p+8))&1) + ((l0>>(p+16))&1) + \
  159. ((l1>>p)&1) + ((l1>>(p+16))&1) + \
  160. ((l2>>p)&1) + ((l2>>(p+8))&1) + ((l2>>(p+16))&1))
  161. #define SUM9p(p) (SUM8p(p) + ((l1>>(p+8))&1))
  162. #define CAM_LOOP_BODY(BODY) \
  163. { int y; \
  164. int backline = cam->back->line_bytes, \
  165. frontline = cam->front->line_bytes; \
  166. Byte *back = cam->back->mem, \
  167. *front = cam->front->mem; \
  168. Byte *rule = cam->rule; \
  169. for (y=0; y<cam->height; y++) { \
  170. QUAD l0 = (back[0]<<8) + \
  171. back[1], \
  172. l1 = (back[backline]<<8) + \
  173. back[backline+1], \
  174. l2 = (back[backline+backline]<<8) + \
  175. back[backline+backline+1]; \
  176. int x, w = cam->width; \
  177. for (x=0; x<w; x++) { \
  178. l0 = (l0<<8) + back[2]; \
  179. l1 = (l1<<8) + back[backline+2]; \
  180. l2 = (l2<<8) + back[backline+backline+2]; \
  181. BODY; \
  182. back++; front++; \
  183. } \
  184. back += backline - w; front += frontline - w; \
  185. } \
  186. }
  187. #define CAM_LOOP(RULE) \
  188. CAM_LOOP_BODY(*front = (RULE) )
  189. #define CAM_TABLE_LOOP(NEIGHBORHOOD) \
  190. CAM_LOOP(rule[(NEIGHBORHOOD)])
  191. typedef void (*vf)();