DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦93dba7b6b⟧ TextFile

    Length: 3504 (0xdb0)
    Types: TextFile
    Names: »cursor.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Sdi/cursor.c« 

TextFile

/*****************************  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);
}