+static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
+{
+ int i, j, k;
+
+ static struct
+ {
+ int graphic;
+ struct XY *pos;
+ }
+ video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] =
+ {
+ {
+ { IMG_GFX_TAPE_LABEL_PLAY, &tape.label.play },
+ { IMG_GFX_TAPE_SYMBOL_PLAY, &tape.symbol.play },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_RECORD, &tape.label.record },
+ { IMG_GFX_TAPE_SYMBOL_RECORD, &tape.symbol.record },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_PAUSE, &tape.label.pause },
+ { IMG_GFX_TAPE_SYMBOL_PAUSE, &tape.symbol.pause },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_DATE, &tape.label.date },
+ { -1, NULL },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_TIME, &tape.label.time },
+ { -1, NULL },
+ },
+ {
+ /* (no label for displaying optional frame) */
+ { -1, NULL },
+ { -1, NULL },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_FAST_FORWARD, &tape.label.fast_forward },
+ { IMG_GFX_TAPE_SYMBOL_FAST_FORWARD, &tape.symbol.fast_forward },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_WARP_FORWARD, &tape.label.warp_forward },
+ { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD, &tape.symbol.warp_forward },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind},
+ { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD_BLIND, &tape.symbol.warp_forward_blind},
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_PAUSE_BEFORE_END, &tape.label.pause_before_end },
+ { IMG_GFX_TAPE_SYMBOL_PAUSE_BEFORE_END, &tape.symbol.pause_before_end },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_SINGLE_STEP, &tape.label.single_step },
+ { IMG_GFX_TAPE_SYMBOL_SINGLE_STEP, &tape.symbol.single_step },
+ },
+ };
+
+ for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++) /* on or off states */
+ {
+ for (i = 0; i < NUM_TAPE_FUNCTIONS; i++) /* record, play, ... */
+ {
+ for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++) /* label or symbol */
+ {
+ int graphic = video_pos[i][j].graphic;
+ struct XY *pos = video_pos[i][j].pos;
+
+ if (graphic == -1 ||
+ pos->x == -1 ||
+ pos->y == -1)
+ continue;
+
+ if (state & (1 << (i * 2 + k)))
+ {
+ struct GraphicInfo *gfx_bg = &graphic_info[IMG_BACKGROUND_TAPE];
+ struct GraphicInfo *gfx = &graphic_info[graphic];
+ Bitmap *gd_bitmap;
+ int gd_x, gd_y;
+ int skip_value =
+ (j == 0 ? VIDEO_DISPLAY_SYMBOL_ONLY : VIDEO_DISPLAY_LABEL_ONLY);
+
+ if (value == skip_value)
+ continue;
+
+ if (k == 1) /* on */
+ {
+ gd_bitmap = gfx->bitmap;
+ gd_x = gfx->src_x;
+ gd_y = gfx->src_y;
+ }
+ else /* off */
+ {
+ gd_bitmap = gfx_bg->bitmap;
+ gd_x = gfx_bg->src_x + pos->x;
+ gd_y = gfx_bg->src_y + pos->y;
+ }
+
+ /* some tape graphics may be undefined -- only draw if defined */
+ if (gd_bitmap != NULL)
+ BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height,
+ VX + pos->x, VY + pos->y);
+
+ redraw_mask |= REDRAW_DOOR_2;
+ }
+ }
+ }
+ }
+}
+
+
+#define DATETIME_NONE (0)
+
+#define DATETIME_DATE_YYYY (1 << 0)
+#define DATETIME_DATE_YY (1 << 1)
+#define DATETIME_DATE_MON (1 << 2)
+#define DATETIME_DATE_MM (1 << 3)
+#define DATETIME_DATE_DD (1 << 4)
+
+#define DATETIME_TIME_HH (1 << 5)
+#define DATETIME_TIME_MIN (1 << 6)
+#define DATETIME_TIME_MM (1 << 7)
+#define DATETIME_TIME_SS (1 << 8)
+
+#define DATETIME_FRAME (1 << 9)
+
+#define DATETIME_XOFFSET_1 (1 << 10)
+#define DATETIME_XOFFSET_2 (1 << 11)
+
+#define DATETIME_DATE (DATETIME_DATE_YYYY | \
+ DATETIME_DATE_YY | \
+ DATETIME_DATE_MON | \
+ DATETIME_DATE_MM | \
+ DATETIME_DATE_DD)
+
+#define DATETIME_TIME (DATETIME_TIME_HH | \
+ DATETIME_TIME_MIN | \
+ DATETIME_TIME_MM | \
+ DATETIME_TIME_SS)
+
+#define MAX_DATETIME_STRING_SIZE 32
+
+static void DrawVideoDisplay_DateTime(unsigned int state, unsigned int value)