home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
500-599
/
ff562.lza
/
Intuisup
/
Borders
/
source.lzh
/
borders.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-20
|
5KB
|
188 lines
/*************************************
* *
* Borders v2.0 *
* by Torsten Jürgeleit in 05/91 *
* *
* Routines *
* *
*************************************/
/* Includes */
#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>
#include "/render/render.h"
#include "borders.h"
/* Defines */
#define MAX_BORDER_BUFFER_SIZE BORDER_TYPE_BOX2_BUFFER_SIZE
#define BORDER_VEC_MODE_BOX_TOP_LEFT 0
#define BORDER_VEC_MODE_BOX_BOTTOM_RIGHT 1
/* Static prototypes */
VOID fill_border_vec(SHORT *vec, USHORT width, USHORT height, USHORT mode);
/* Static pragmas */
#pragma regcall(fill_border_vec(a0,d0,d1,d2))
/* Display borders described by border list */
VOID
display_borders(struct RenderInfo *ri, struct Window *win,
struct BorderData *bd, SHORT hoffset, SHORT voffset)
{
while (bd->bd_Type != INTUISUP_DATA_END &&
bd->bd_Type <= MAX_BORDER_DATA_TYPE) {
draw_border(ri, win, bd->bd_LeftEdge + hoffset, bd->bd_TopEdge +
voffset, bd->bd_Width, bd->bd_Height, (USHORT)bd->bd_Type);
bd++;
}
}
/* Draw border */
VOID
draw_border(struct RenderInfo *ri, struct Window *win, USHORT left_edge,
USHORT top_edge, USHORT width, USHORT height, USHORT type)
{
USHORT buffer[MAX_BORDER_BUFFER_SIZE];
BYTE *border = (BYTE *)&buffer[0];
init_border(ri, border, 0, 0, width, height, type);
if (ri->ri_Flags & RENDER_INFO_FLAG_INNER_WINDOW) {
left_edge += ri->ri_WindowBorderLeft;
top_edge += ri->ri_WindowBorderTop;
}
DrawBorder(win->RPort, (struct Border *)border, (LONG)left_edge, (LONG)
top_edge);
}
/* Init border */
BYTE *
init_border(struct RenderInfo *ri, BYTE *buffer, SHORT left_edge,
SHORT top_edge, USHORT width, USHORT height, USHORT type)
{
struct Border *border = (struct Border *)buffer;
UBYTE highlight_pen, shadow_pen;
SHORT *vec;
USHORT i, vec_mode, vec_width, vec_height;
switch (type) {
case BORDER_DATA_TYPE_BOX1_OUT :
case BORDER_DATA_TYPE_BOX2_OUT :
highlight_pen = ri->ri_HighlightPen;
shadow_pen = ri->ri_ShadowPen;
break;
case BORDER_DATA_TYPE_BOX1_IN :
case BORDER_DATA_TYPE_BOX2_IN :
highlight_pen = ri->ri_ShadowPen;
shadow_pen = ri->ri_HighlightPen;
break;
}
switch (type) {
case BORDER_DATA_TYPE_BOX1_OUT :
case BORDER_DATA_TYPE_BOX1_IN :
vec = (SHORT *)(border + 2);
for (i = 0; i < 2; i++, border++, vec += 10) {
if (i & 1) { /* odd ? */
border->FrontPen = shadow_pen;
vec_mode = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
} else {
border->FrontPen = highlight_pen;
vec_mode = BORDER_VEC_MODE_BOX_TOP_LEFT;
}
border->LeftEdge = left_edge;
border->TopEdge = top_edge;
border->DrawMode = JAM1;
border->Count = 5;
border->XY = vec;
if (i < 1) {
border->NextBorder = border + 1;
} else {
border->NextBorder = NULL;
}
fill_border_vec(vec, width, height, vec_mode);
}
buffer += BORDER_TYPE_BOX1_BUFFER_SIZE;
break;
case BORDER_DATA_TYPE_BOX2_OUT :
case BORDER_DATA_TYPE_BOX2_IN :
vec = (SHORT *)(border + 4);
for (i = 0; i < 4; i++, border++, vec += 10) {
if (i < 2) {
border->LeftEdge = left_edge;
border->TopEdge = top_edge;
if (i & 1) { /* odd ? */
border->FrontPen = shadow_pen;
vec_mode = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
} else {
border->FrontPen = highlight_pen;
vec_mode = BORDER_VEC_MODE_BOX_TOP_LEFT;
}
vec_width = width;
vec_height = height;
} else {
border->LeftEdge = left_edge + 2;
border->TopEdge = top_edge + 1;
if (i & 1) { /* odd ? */
border->FrontPen = highlight_pen;
vec_mode = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
} else {
border->FrontPen = shadow_pen;
vec_mode = BORDER_VEC_MODE_BOX_TOP_LEFT;
}
vec_width = width - 4;
vec_height = height - 2;
}
border->DrawMode = JAM1;
border->Count = 5;
border->XY = vec;
if (i < 3) {
border->NextBorder = border + 1;
} else {
border->NextBorder = NULL;
}
fill_border_vec(vec, vec_width, vec_height, vec_mode);
}
buffer += BORDER_TYPE_BOX2_BUFFER_SIZE;
break;
}
return(buffer);
}
/* Fill border vector array */
STATIC VOID
fill_border_vec(SHORT *vec, USHORT width, USHORT height, USHORT mode)
{
switch (mode) {
case BORDER_VEC_MODE_BOX_TOP_LEFT :
*(vec++) = width - 2;
*(vec++) = 0;
*(vec++) = 0;
*(vec++) = 0;
*(vec++) = 0;
*(vec++) = height - 1;
*(vec++) = 1;
*(vec++) = height - 2;
*(vec++) = 1;
*(vec) = 1;
break;
case BORDER_VEC_MODE_BOX_BOTTOM_RIGHT :
*(vec++) = 1;
*(vec++) = height - 1;
*(vec++) = width - 1;
*(vec++) = height - 1;
*(vec++) = width - 1;
*(vec++) = 0;
*(vec++) = width - 2;
*(vec++) = 1;
*(vec++) = width - 2;
*(vec) = height - 2;
break;
}
}