|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 3504 (0xdb0)
Types: TextFile
Names: »cursor.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/Sun/Sdi/cursor.c«
/***************************** cursor.c ******************************/
#include "sdi.h"
/*
* Copyright 1987 by Mark Weiser.
* Permission to reproduce and use in any manner whatsoever on Suns is granted
* so long as this copyright and other identifying marks of authorship
* in the code and the game remain intact and visible. Use of this code
* in other products is reserved to me--I'm working on Mac and IBM versions.
*/
/*
* Code to manage the dynamic cursor.
*/
struct cursor *compute_cursor();
struct pixrect *compute_cursor_image();
static short dynacursor_data[] = {
#include "dynacursor.h"
};
mpr_static(dynabase_cursor_pr, 16, 16, 1, dynacursor_data);
static short cursor_data[] = {
#include "cursor.h"
};
mpr_static(base_cursor_pr, 16, 16, 1, cursor_data);
struct cursor *
init_cursor()
{
static struct cursor *main_cursor = NULL;
extern int cursor_type;
if (main_cursor) {
cursor_destroy(main_cursor);
}
switch(cursor_type) {
case 0:
main_cursor = (struct cursor *)cursor_create(CURSOR_IMAGE, &base_cursor_pr,
CURSOR_XHOT, 8, CURSOR_YHOT, 8,
CURSOR_OP, PIX_SRC ^ PIX_DST,
0);
break;
case 1:
main_cursor = (struct cursor *)cursor_create(CURSOR_OP, PIX_SRC ^ PIX_DST,
CURSOR_IMAGE, &dynabase_cursor_pr,
CURSOR_XHOT, 8, CURSOR_YHOT, 3,
0);
break;
case 2:
main_cursor = (struct cursor *)cursor_create(CURSOR_SHOW_CROSSHAIRS, TRUE,
CURSOR_OP, PIX_SRC ^ PIX_DST,
0);
break;
case 3:
main_cursor = (struct cursor *)cursor_create(CURSOR_SHOW_CROSSHAIRS, TRUE,
CURSOR_OP, PIX_SRC ^ PIX_DST,
CURSOR_IMAGE, &dynabase_cursor_pr,
CURSOR_XHOT, 8, CURSOR_YHOT, 3,
0);
break;
}
window_set(launchcanvas, WIN_CURSOR, main_cursor, 0);
window_set(citycanvas, WIN_CURSOR, main_cursor, 0);
}
update_cursor()
{
extern int cursor_type;
switch (cursor_type) {
case 1: case 3:
window_set(launchcanvas,
WIN_CURSOR, compute_cursor(window_get(launchcanvas, WIN_CURSOR)),
0);
window_set(citycanvas,
WIN_CURSOR, compute_cursor(window_get(citycanvas, WIN_CURSOR)),
0);
break;
default:
break;
}
}
struct cursor *
compute_cursor(c)
struct cursor * c;
{
cursor_set(c,
CURSOR_IMAGE, compute_cursor_image(cursor_get(c, CURSOR_IMAGE)),
0);
return c;
}
/* Returns a static structure, so get rid of it before reusing it. */
struct pixrect *
compute_cursor_image(pr)
struct pixrect *pr;
{
extern Panel_item rock_item;
int left_current = (int)panel_get_value(interceptor_item);
int left_max = (int)panel_get(interceptor_item, PANEL_MAX_VALUE);
int middle_current = (int)panel_get_value(rock_item);
int middle_max = (int)panel_get(rock_item, PANEL_MAX_VALUE);
int right_current = (int)panel_get_value(laser_item);
int right_max = (int)panel_get(laser_item, PANEL_MAX_VALUE);
pr_rop(pr, 0, 0, 16, 16, PIX_SRC, &dynabase_cursor_pr, 0, 0);
put_line(pr, 1, 8, 15, left_current, left_max);
put_line(pr, 7, 8, 15, middle_current, middle_max);
put_line(pr, 13, 8, 15, right_current, right_max);
return pr;
}
/*
* Draw a double-width line in pr from start to finish, with
* length equal current/max. assumes finish > start.
*/
put_line(pr, x, start, finish, current, max)
struct pixrect *pr;
{
int length = (current*(finish-start+1))/max;
if (length == 0 && current != 0) length = 1;
pr_vector(pr, x, start-1, x, start+length-1, PIX_SRC, 1);
pr_vector(pr, x+1, start-1, x+1, start+length-1, PIX_SRC, 1);
pr_vector(pr, x+2, start-1, x+2, start+length-1, PIX_SRC, 1);
}