home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 48
/
Amiga_Dream_48.iso
/
Atari
/
c
/
libs
/
xaes_new.lzh
/
EXTENDED.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-25
|
27KB
|
886 lines
/********************************************************************
* 0.91*
* XAES: Extended Object Types *
* Code by Ken Hollis *
* *
* Copyright (C) 1994, Bitgate Software *
* *
* Enhanced object routines that supposedly couldn't be done *
* in an orderly fashion, or so GEM-List people said. What do they*
* know, anyway? I created six 3D drawing types. Isn't this *
* satisfactory? I'm missing a few drawing bits, but no worries.. *
* *
********************************************************************/
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <ctype.h>
#include "xaes.h"
#ifdef __TURBOC__
#pragma warn -pia
#endif
LOCAL void FixThick(int thickness, OBJECT *obj)
{
if (thickness < 0) {
obj->ob_x -= (abs(thickness));
obj->ob_y -= (abs(thickness));
obj->ob_width += ((abs(thickness)) * 2);
obj->ob_height += ((abs(thickness)) * 2);
}
}
LOCAL void FixShadow(int thickness, OBJECT *obj)
{
if (obj->ob_state & SHADOWED) {
obj->ob_width += (abs(thickness)) * 2;
obj->ob_height += (abs(thickness)) * 2;
}
}
LOCAL void FixPositioning(char *te_ptext, OBJECT *obj)
{
if (strchr(te_ptext, '[')) {
obj->ob_y -= 2;
obj->ob_height += 4;
}
}
LOCAL void FixMovement(OBJECT *obj)
{
obj->ob_x++;
obj->ob_y++;
}
LOCAL void FixSizing(char *te_ptext, OBJECT *obj)
{
if (strchr(te_ptext, '['))
switch(obj->ob_type >> 8) {
case SLIDERLEFT:
case SLIDERRIGHT:
case SLIDERUP:
case SLIDERDOWN:
case SLIDERTRACK:
case SLIDERSLIDE:
obj->ob_y += 2;
obj->ob_height -= 4;
break;
}
}
LOCAL void pb_doobject(PARMBLK *pb, int xoff, int yoff)
{
int dummy, attr[10], fillattr[5], lineattr[6], effects = 0;
int interiorpxy[4], shadowed[20];
int extent[8], x, y, gr_ch, gr_bw;
EXTINFO *ex = (EXTINFO *) pb->pb_parm;
char *string, *ptr, *unformatted = ex->te_ptext;
int hotkey = -1, i = 0;
int flags = pb->pb_tree[pb->pb_obj].ob_flags;
int tempcalc = (abs(ex->te_thickness)) * 2;
pb->pb_x = pb->pb_x;
pb->pb_y = pb->pb_y;
pb->pb_w = pb->pb_tree[pb->pb_obj].ob_width - 1;
pb->pb_h = pb->pb_tree[pb->pb_obj].ob_height - 1;
if (pb->pb_tree[pb->pb_obj].ob_state & SHADOWED) {
pb->pb_w -= tempcalc;
pb->pb_h -= tempcalc;
}
if (ptr = string = strdup(unformatted)) {
while (*unformatted) {
if (*unformatted == '[')
if (*(++unformatted))
hotkey = i;
else
break;
*(ptr++) = *(unformatted++);
i++;
}
*ptr = 0;
pb->pb_x += xoff;
pb->pb_y += yoff;
vqt_attributes(VDIhandle, attr);
vqf_attributes(VDIhandle, fillattr);
vql_attributes(VDIhandle, lineattr);
vst_height(VDIhandle, ex->te_font == 3 ? large_font : small_font, &dummy, &gr_ch, &gr_bw, &dummy);
vst_color(VDIhandle, ex->te_color.text_color);
vswr_mode(VDIhandle, MD_TRANS);
if (pb->pb_currstate & 0x100) effects |= 1;
if (pb->pb_currstate & 0x800) effects |= 2;
if (pb->pb_currstate & 0x400) effects |= 4;
if (pb->pb_currstate & 0x200) effects |= 8;
if (pb->pb_currstate & 0x1000) effects |= 16;
vst_effects(VDIhandle, effects);
vqt_extent(VDIhandle, string, extent);
y = pb->pb_y + ((pb->pb_h - (extent[7] - extent[1])) / 2) + ((((xaes.config1 & X_GENEVACOMPAT) && GenevaInstalled)) ? 1 : (gr_ch + 1));
x = pb->pb_x + 1;
switch (ex->te_just) {
case 2:
x += (pb->pb_w - (extent[2] - extent[0])) / 2;
break;
case 1:
x += pb->pb_w - (extent[2] - extent[0]);
break;
}
interiorpxy[2] = (interiorpxy[0] = pb->pb_x) + pb->pb_w;
interiorpxy[3] = (interiorpxy[1] = pb->pb_y) + pb->pb_h;
interiorpxy[0] += (abs(ex->te_thickness));
interiorpxy[1] += (abs(ex->te_thickness));
interiorpxy[2] -= (abs(ex->te_thickness));
interiorpxy[3] -= (abs(ex->te_thickness));
if (xaes.config2 & X_INTERFACE) {
interiorpxy[0]--; interiorpxy[1]--;
interiorpxy[2]++; interiorpxy[3]++;
}
vsf_interior(VDIhandle, FIS_SOLID);
vsf_color(VDIhandle, WHITE);
vswr_mode(VDIhandle, MD_REPLACE);
vr_recfl(VDIhandle, interiorpxy);
if ((num_colors > 4) ||
((num_colors == 4) && (xaes.config1 & X_MEDEMUL))) {
vsf_style(VDIhandle, 8);
vsf_interior(VDIhandle, FIS_SOLID);
vsf_color(VDIhandle, ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) ? 2 : 8);
vr_recfl(VDIhandle, interiorpxy);
}
if ((ex->te_color.fill_ptn) ||
(((xaes.config1 & X_DRAW3DCOMPAT) && (num_colors == 2)))) {
vsf_style(VDIhandle, ((xaes.config1 & X_DRAW3DCOMPAT) && (num_colors == 2)) ? ((pb->pb_currstate & DISABLED) ? 8 : 4) : (ex->te_color.fill_ptn == 7 ? 8 : ex->te_color.fill_ptn));
vsf_interior(VDIhandle, FIS_PATTERN);
vsf_color(VDIhandle, ((xaes.config1 * X_DRAW3DCOMPAT) && (num_colors == 2)) ? BLACK : ex->te_color.in_color);
vr_recfl(VDIhandle, interiorpxy);
}
if (xaes.config2 & X_INTERFACE) {
interiorpxy[0]++; interiorpxy[1]++;
interiorpxy[2]--; interiorpxy[3]--;
}
if ((ex->te_thickness) &&
((pb->pb_tree[pb->pb_obj].ob_type >> 8) != UNDERLINE) &&
((xaes.draw_3d == DRAW_STANDARD) || (xaes.draw_3d == DRAW_LTMF) ||
(xaes.draw_3d == DRAW_MULTITOS) || (xaes.draw_3d == DRAW_GENEVA)))
for (i = 0; i <= ((abs(ex->te_thickness)) - 1); i++)
box(pb->pb_x + i, pb->pb_y + i, pb->pb_w - (2 * i), pb->pb_h - (2 * i), 1);
if (flags & 0x200 && (xaes.draw_3d == DRAW_MULTITOS || xaes.draw_3d == DRAW_GENEVA)) {
int col1, col2, pxyarray[8];
if (pb->pb_currstate & SELECTED && flags & 0x0400)
col1 = 1, col2 = ((xaes.draw_3d == DRAW_GENEVA) && num_colors > 4) ? 8 : 0;
else
col1 = 0, col2 = ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) ? 3 : 9;
vsl_color(VDIhandle, col1);
pxyarray[0] = pxyarray[2] = interiorpxy[0];
pxyarray[1] = (xaes.draw_3d==DRAW_GENEVA) ? interiorpxy[3] : interiorpxy[3] - 1;
pxyarray[3] = pxyarray[5] = interiorpxy[1];
pxyarray[4] = (xaes.draw_3d==DRAW_GENEVA) ? interiorpxy[2] : interiorpxy[2] - 1;
v_pline(VDIhandle, 3, pxyarray);
vsl_color(VDIhandle, col2);
pxyarray[0] = pxyarray[0] + 1;
pxyarray[1] = pxyarray[3] = interiorpxy[3];
pxyarray[2] = pxyarray[4] = interiorpxy[2];
pxyarray[5] = interiorpxy[1] + 1;
v_pline(VDIhandle, 3, pxyarray);
if (xaes.draw_3d!=DRAW_GENEVA) {
vsm_color(VDIhandle, (num_colors>4) ? 8 : 0);
pxyarray[0] = interiorpxy[0];
pxyarray[1] = interiorpxy[3];
pxyarray[2] = interiorpxy[2];
pxyarray[3] = interiorpxy[1];
v_pmarker(VDIhandle, 2, pxyarray);
}
}
if ((ex->te_thickness) && ((xaes.draw_3d == DRAW_ZOOM) || (xaes.draw_3d == DRAW_MOTIF))) {
int col1, col2;
if (pb->pb_currstate & SELECTED && flags & 0x0400)
col1 = 0, col2 = ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) ? 3 : 9;
else
col1 = ((num_colors == 4) && (xaes.config1 & X_MEDEMUL)) ? 3 : 9, col2 = 0;
for (i = 0; i <= (abs(ex->te_thickness)); i++) {
int pxyarray[8];
vsl_color(VDIhandle, col1);
pxyarray[0] = pb->pb_x + i;
pxyarray[1] = pxyarray[3] = pb->pb_y + pb->pb_h - i;
pxyarray[2] = pxyarray[4] = pb->pb_x + pb->pb_w - i;
pxyarray[5] = pb->pb_y + i;
v_pline(VDIhandle, 3, pxyarray);
vsl_color(VDIhandle, col2);
pxyarray[0] = pb->pb_x + i;
pxyarray[1] = pb->pb_y + pb->pb_h - i;
pxyarray[2] = pb->pb_x + i;
pxyarray[3] = pb->pb_y + i;
pxyarray[4] = pb->pb_x + pb->pb_w - i;
v_pline(VDIhandle, 3, pxyarray);
vsm_color(VDIhandle, (num_colors>4) ? 8 : 0);
pxyarray[0] = pb->pb_x + i;
pxyarray[1] = pb->pb_y + pb->pb_h - i;
pxyarray[2] = pb->pb_x + pb->pb_w - i;
pxyarray[3] = pb->pb_y + i;
v_pmarker(VDIhandle, 2, pxyarray);
}
if (xaes.draw_3d != DRAW_MOTIF)
box(pb->pb_x, pb->pb_y, pb->pb_w, pb->pb_h, 1);
}
switch (xaes.draw_3d) {
case DRAW_STANDARD:
case DRAW_LTMF:
case DRAW_MULTITOS:
case DRAW_GENEVA:
vswr_mode(VDIhandle, MD_TRANS);
vst_color(VDIhandle, ((xaes.config1 & X_DRAW3DCOMPAT) && (num_colors == 2) && (pb->pb_currstate & DISABLED)) ? 0 : ex->te_color.text_color);
if (((xaes.draw_3d == DRAW_MULTITOS) || (xaes.draw_3d == DRAW_GENEVA)) &&
(pb->pb_currstate & SELECTED) && (flags & 0x0400))
v_gtext(VDIhandle, x + 1, y + 1, string);
else
v_gtext(VDIhandle, x, y, string);
break;
case DRAW_ZOOM:
case DRAW_MOTIF:
vswr_mode(VDIhandle, MD_TRANS);
vst_color(VDIhandle, ((xaes.config1 & X_DRAW3DCOMPAT) && (num_colors == 2) && (pb->pb_currstate & DISABLED)) ? 0 : ex->te_color.text_color);
if ((pb->pb_currstate & SELECTED) && (flags & 0x0400))
v_gtext(VDIhandle, x + (abs(ex->te_thickness)), y + (abs(ex->te_thickness)), string);
else
v_gtext(VDIhandle, x, y, string);
break;
}
if (hotkey >= 0) {
int pxyarray[4];
vsl_color(VDIhandle, xaes.hotkey_color);
vswr_mode(VDIhandle, MD_TRANS);
if (((xaes.draw_3d == DRAW_MOTIF) ||
(xaes.draw_3d == DRAW_ZOOM)) &&
(pb->pb_currstate & SELECTED) &&
(flags & 0x0400)) {
pxyarray[2] = (pxyarray[0] = x + (abs(ex->te_thickness)) + gr_bw * hotkey) + gr_bw;
pxyarray[1] = pxyarray[3] = y + (abs(ex->te_thickness)) + (gr_ch / 6);
} else if (((xaes.draw_3d == DRAW_MULTITOS) ||
(xaes.draw_3d == DRAW_GENEVA)) &&
(pb->pb_currstate & SELECTED) &&
(flags & 0x0400)) {
pxyarray[2] = (pxyarray[0] = x + gr_bw * hotkey) + gr_bw + 1;
pxyarray[1] = pxyarray[3] = y + (gr_ch / 6) + 1;
if ((xaes.config1 & X_GENEVACOMPAT) && GenevaInstalled) {
pxyarray[1] += gr_ch;
pxyarray[3] += gr_ch;
}
} else {
pxyarray[2] = (pxyarray[0] = x + gr_bw * hotkey) + gr_bw;
pxyarray[1] = pxyarray[3] = y + (gr_ch / 6);
if ((xaes.config1 & X_GENEVACOMPAT) && GenevaInstalled) {
pxyarray[1] += gr_ch;
pxyarray[3] += gr_ch;
}
}
v_pline(VDIhandle, 2, pxyarray);
}
if ((pb->pb_currstate & SELECTED) &&
((!(flags & 0x0400)) ||
(xaes.draw_3d == DRAW_STANDARD) ||
(xaes.draw_3d == DRAW_LTMF))) {
vsf_interior(VDIhandle, FIS_SOLID);
vsf_color(VDIhandle, BLACK);
vswr_mode(VDIhandle, MD_XOR);
vr_recfl(VDIhandle, interiorpxy);
if (xaes.draw_3d == DRAW_LTMF) {
vswr_mode(VDIhandle, MD_REPLACE);
box(pb->pb_x + ((abs(ex->te_thickness)) - 1),
pb->pb_y + ((abs(ex->te_thickness)) - 1),
(pb->pb_w - (2 * (abs(ex->te_thickness)))) + 2,
(pb->pb_h - (2 * (abs(ex->te_thickness)))) + 2, 0);
vswr_mode(VDIhandle, MD_XOR);
}
}
if (pb->pb_tree[pb->pb_obj].ob_state & SHADOWED) {
pb->pb_w += tempcalc;
pb->pb_h += tempcalc;
vsf_interior(VDIhandle, FIS_SOLID);
vswr_mode(VDIhandle, MD_REPLACE);
vsf_color(VDIhandle, BLACK);
vsl_color(VDIhandle, BLACK);
/* Wow, look, mommie! I optimized it all by myself! */
shadowed[0] = shadowed[10] = shadowed[12] = pb->pb_x + pb->pb_w - tempcalc + 1;
shadowed[1] = shadowed[3] = shadowed[13] = pb->pb_y + tempcalc;
shadowed[2] = shadowed[4] = pb->pb_x + pb->pb_w;
shadowed[5] = shadowed[7] = pb->pb_y + pb->pb_h;
shadowed[6] = shadowed[8] = pb->pb_x + tempcalc;
shadowed[9] = shadowed[11] = pb->pb_y + pb->pb_h - tempcalc + 1;
v_fillarea(VDIhandle, 7, shadowed);
if (xaes.config1 & X_ROUNDSHADOW) {
point(pb->pb_x + pb->pb_w, pb->pb_y + tempcalc, (num_colors > 4) ? 8 : 0);
point(pb->pb_x + pb->pb_w, pb->pb_y + pb->pb_h, (num_colors > 4) ? 8 : 0);
point(pb->pb_x + tempcalc, pb->pb_y + pb->pb_h, (num_colors > 4) ? 8 : 0);
}
pb->pb_w -= tempcalc;
pb->pb_h -= tempcalc;
}
if (effects)
vst_effects(VDIhandle, 0);
if (xaes.config1 & X_ROUNDOBJECTS)
if (pb->pb_tree->ob_state & DRAW3D) {
point(pb->pb_x, pb->pb_y, (num_colors > 4) ? 8 : 0);
point(pb->pb_x + pb->pb_w, pb->pb_y, (num_colors > 4) ? 8 : 0);
point(pb->pb_x, pb->pb_y + pb->pb_h, (num_colors > 4) ? 8 : 0);
if (!(pb->pb_tree[pb->pb_obj].ob_state & SHADOWED))
point(pb->pb_x + pb->pb_w, pb->pb_y + pb->pb_h, (num_colors > 4) ? 8 : 0);
} else {
point(pb->pb_x, pb->pb_y, 0);
point(pb->pb_x + pb->pb_w, pb->pb_y, 0);
point(pb->pb_x, pb->pb_y + pb->pb_h, 0);
if (!(pb->pb_tree[pb->pb_obj].ob_state & SHADOWED))
point(pb->pb_x + pb->pb_w, pb->pb_y + pb->pb_h, 0);
}
if (pb->pb_currstate & DISABLED) {
vsf_interior(VDIhandle, FIS_PATTERN);
interiorpxy[0] = pb->pb_x + (abs(ex->te_thickness));
interiorpxy[1] = pb->pb_y + (abs(ex->te_thickness));
interiorpxy[2] = pb->pb_x + pb->pb_w - (abs(ex->te_thickness)) - 1;
interiorpxy[3] = pb->pb_y + pb->pb_h - (abs(ex->te_thickness)) - 1;
if (num_planes >= 4)
vsf_color(VDIhandle, 8);
else
vsf_color(VDIhandle, 0);
vsf_style(VDIhandle, 4);
vswr_mode(VDIhandle, MD_TRANS);
vr_recfl(VDIhandle, interiorpxy);
}
vst_height(VDIhandle, attr[7], &dummy, &dummy, &dummy, &dummy);
vst_color(VDIhandle, attr[1]);
vswr_mode(VDIhandle, attr[5]);
vsf_color(VDIhandle, fillattr[1]);
vsf_interior(VDIhandle, fillattr[0]);
vsf_style(VDIhandle, fillattr[2]);
vsl_color(VDIhandle, BLACK);
pb->pb_x -= xoff;
pb->pb_y -= yoff;
}
if (pb->pb_tree[pb->pb_obj].ob_state & SHADOWED) {
pb->pb_w += tempcalc;
pb->pb_h += tempcalc;
}
}
LOCAL int cdecl draw_specialtext(PARMBLK *pb)
{
EXTINFO *ex = (EXTINFO *) pb->pb_parm;
if (((ex->oldtype & 0xFF) != G_ICON) && ((ex->oldtype & 0xFF) != G_IMAGE))
pb_doobject(pb, 0, 0);
return pb->pb_currstate & ~(SELECTED | OUTLINED | DISABLED);
}
LOCAL int cdecl draw_menuline(PARMBLK *pb)
{
int attr[10], fillattr[5], lineattr[6];
GRECT line1, line2;
vqt_attributes(VDIhandle, attr);
vqf_attributes(VDIhandle, fillattr);
vql_attributes(VDIhandle, lineattr);
line1.g_x = line2.g_x = pb->pb_x;
line1.g_y = line1.g_h = pb->pb_y + (pb->pb_h / 2) - 1;
line1.g_w = line2.g_w = pb->pb_x + pb->pb_w - 1;
line2.g_y = line2.g_h = pb->pb_y + (pb->pb_h / 2);
vsl_color(VDIhandle, ((((EXTINFO *) pb->pb_parm)->te_color.bord_color == 0) ?
1 : (((EXTINFO *) pb->pb_parm)->te_color.bord_color)));
if (xaes.config1 & X_NICELINE) {
vsl_type(VDIhandle, 7);
vsl_udsty(VDIhandle, 0xAAAA);
}
line(line1.g_x, line1.g_y, line1.g_w, line1.g_h);
if (xaes.config1 & X_NICELINE)
vsl_udsty(VDIhandle, 0x5555);
line(line2.g_x, line2.g_y, line2.g_w, line2.g_h);
vst_color(VDIhandle, attr[1]);
vswr_mode(VDIhandle, attr[5]);
vsf_color(VDIhandle, fillattr[1]);
vsf_interior(VDIhandle, fillattr[0]);
vsf_style(VDIhandle, fillattr[2]);
vsl_color(VDIhandle, lineattr[1]);
vsl_type(VDIhandle, 7);
vsl_udsty(VDIhandle, 0xFFFF);
return FALSE;
}
LOCAL int cdecl draw_underline(PARMBLK *pb)
{
int pxyarray[4], dummy;
int attr[10], fillattr[5], lineattr[6];
vqt_attributes(VDIhandle, attr);
vqf_attributes(VDIhandle, fillattr);
vql_attributes(VDIhandle, lineattr);
pb_doobject(pb, 0, 0);
pxyarray[0] = pb->pb_xc;
pxyarray[1] = pb->pb_yc;
pxyarray[2] = pb->pb_xc + pb->pb_wc - 1;
pxyarray[3] = pb->pb_yc + pb->pb_hc - 1;
vs_clip(VDIhandle, 1, pxyarray);
if (pb->pb_tree[pb->pb_obj].ob_state & DISABLED) {
vsl_type(VDIhandle, 7);
vsl_udsty(VDIhandle, 0x5555);
}
vswr_mode(VDIhandle, MD_REPLACE);
vsl_color(VDIhandle, ((EXTINFO *) pb->pb_parm)->te_color.bord_color);
pxyarray[0] = pb->pb_x;
pxyarray[2] = pb->pb_x + pb->pb_w;
pxyarray[1] = pxyarray[3] = (pb->pb_y + pb->pb_h) + 1;
v_pline(VDIhandle, 2, pxyarray);
vst_height(VDIhandle, attr[7], &dummy, &dummy, &dummy, &dummy);
vst_color(VDIhandle, attr[1]);
vswr_mode(VDIhandle, attr[5]);
vsf_color(VDIhandle, fillattr[1]);
vsf_interior(VDIhandle, fillattr[0]);
vsf_style(VDIhandle, fillattr[2]);
vsl_color(VDIhandle, BLACK);
return FALSE;
}
LOCAL int cdecl draw_boxframe(PARMBLK *pb)
{
int pxyarray[10], dummy;
EXTINFO *ex = (EXTINFO *) pb->pb_parm;
char *unformatted = ex->te_ptext;
int state = pb->pb_tree[pb->pb_obj].ob_state;
int this_ch, this_bw;
int attr[10], fillattr[5], lineattr[6];
vqt_attributes(VDIhandle, attr);
vqf_attributes(VDIhandle, fillattr);
vql_attributes(VDIhandle, lineattr);
pxyarray[0] = pb->pb_xc;
pxyarray[1] = pb->pb_yc;
pxyarray[2] = pb->pb_xc + pb->pb_wc - 1;
pxyarray[3] = pb->pb_yc + pb->pb_hc - 1;
vs_clip(VDIhandle, 1, pxyarray);
vswr_mode(VDIhandle, MD_REPLACE);
vsl_color(VDIhandle, ((EXTINFO *) pb->pb_parm)->te_color.bord_color);
if ((num_colors<=4) || !(state & DRAW3D) || (xaes.draw_3d == DRAW_STANDARD))
box(pb->pb_x, pb->pb_y, pb->pb_w - 1, pb->pb_h - 1, ((EXTINFO *) pb->pb_parm)->te_color.bord_color);
if ((state & DRAW3D) && (num_colors > 4) && (xaes.draw_3d != DRAW_STANDARD)) {
vsl_color(VDIhandle, 9);
pxyarray[0] = pb->pb_x + pb->pb_w - 1;
pxyarray[1] = pxyarray[3] = pb->pb_y;
pxyarray[2] = pxyarray[4] = pb->pb_x;
pxyarray[5] = pb->pb_y + pb->pb_h - 1;
v_pline(VDIhandle, 3, pxyarray);
vsl_color(VDIhandle, 0);
pxyarray[0] = pxyarray[2] = pb->pb_x + pb->pb_w - 1;
pxyarray[1] = pb->pb_y + 1;
pxyarray[3] = pxyarray[5] = pb->pb_y + pb->pb_h - 1;
pxyarray[4] = pb->pb_x + 1;
v_pline(VDIhandle, 3, pxyarray);
vsf_interior(VDIhandle, FIS_SOLID);
if (state & 0x0040)
vsf_color(VDIhandle, WHITE);
else
vsf_color(VDIhandle, 8);
pxyarray[0] = pb->pb_x + 1;
pxyarray[1] = pb->pb_y + 1;
pxyarray[2] = pb->pb_x + pb->pb_w - 3;
pxyarray[3] = pb->pb_y + pb->pb_h - 3;
vr_recfl(VDIhandle, pxyarray);
box(pb->pb_x + 1, pb->pb_y + 1, pb->pb_w - 3, pb->pb_h - 3, (state & 0x0040) ? 8 : WHITE);
if (!(state & 0x0040)) {
vsl_color(VDIhandle, 9);
pxyarray[0] = pxyarray[2] = pb->pb_x + pb->pb_w - 2;
pxyarray[1] = pb->pb_y + 2;
pxyarray[3] = pxyarray[5] = pb->pb_y + pb->pb_h - 2;
pxyarray[4] = pb->pb_x + 2;
v_pline(VDIhandle, 3, pxyarray);
}
}
vst_height(VDIhandle, ex->te_font == 3 ? large_font : small_font, &dummy, &this_ch, &this_bw, &dummy);
v_gtext(VDIhandle, pb->pb_x + gr_cw, pb->pb_y + (this_ch / 2), unformatted);
if (pb->pb_tree[pb->pb_obj].ob_flags & BOXFRAMETITLE) {
vsl_color(VDIhandle, 9);
pxyarray[0] = pxyarray[2] = pb->pb_x + gr_cw;
pxyarray[1] = pxyarray[7] = pb->pb_y;
pxyarray[3] = pxyarray[5] = pb->pb_y - (gr_ch / 2);
pxyarray[4] = pxyarray[6] = pb->pb_x + (int)((strlen(unformatted) + 1) * gr_cw);
v_pline(VDIhandle, 4, pxyarray);
vsl_color(VDIhandle, 8);
pxyarray[0] = pxyarray[2] = pb->pb_x + gr_cw;
pxyarray[1] = pxyarray[7] = pb->pb_y + 1;
pxyarray[3] = pxyarray[5] = pb->pb_y + (gr_ch / 2) + 1;
pxyarray[4] = pxyarray[6] = pb->pb_x + (int)((strlen(unformatted) + 1) * gr_cw);
v_pline(VDIhandle, 4, pxyarray);
}
vst_height(VDIhandle, attr[7], &dummy, &dummy, &dummy, &dummy);
vst_color(VDIhandle, attr[1]);
vswr_mode(VDIhandle, attr[5]);
vsf_color(VDIhandle, fillattr[1]);
vsf_interior(VDIhandle, fillattr[0]);
vsf_style(VDIhandle, fillattr[2]);
vsl_color(VDIhandle, BLACK);
return pb->pb_currstate & ~(SELECTED | OUTLINED | DISABLED);
}
/*
* Fix resource objects to include customised objects
*
* *obj = pointer to object to fix
*
* Returns: TRUE on success
*/
GLOBAL int fix_object(OBJECT *obj, BOOL pos, BOOL repos)
{
int object = -1;
USERBLK *ub;
do {
object++;
/* DJH - Couldn't you compress this into one big switch {} statement? */
if (((obj[object].ob_type >> 8) == FLYING) ||
((obj[object].ob_type >> 8) == CUSTOM) ||
((obj[object].ob_type >> 8) == UNDERLINE) ||
((obj[object].ob_type >> 8) == BOXFRAME) ||
((obj[object].ob_type >> 8) == HELPBTN) ||
((obj[object].ob_type >> 8) == CYCLEBTN) ||
((obj[object].ob_type >> 8) == TEXTEFFECTS) ||
((obj[object].ob_type >> 8) == CUSTBTN) ||
((obj[object].ob_type >> 8) == DROPDOWN) ||
((obj[object].ob_type >> 8) == MENUTEAR) ||
((obj[object].ob_type >> 8) == UNDOBTN) ||
((obj[object].ob_type >> 8) == MENULINE) ||
((obj[object].ob_type >> 8) == SLIDERLEFT) ||
((obj[object].ob_type >> 8) == SLIDERRIGHT) ||
((obj[object].ob_type >> 8) == SLIDERUP) ||
((obj[object].ob_type >> 8) == SLIDERDOWN) ||
((obj[object].ob_type >> 8) == SLIDERTRACK) ||
((obj[object].ob_type >> 8) == SLIDERSLIDE)) {
if (ub = malloc(sizeof(USERBLK) + sizeof(EXTINFO))) {
EXTINFO *ex = (EXTINFO *) (ub + 1);
switch(obj[object].ob_type & 0xff) {
case G_TEXT:
memset(ex, 0, sizeof(EXTINFO));
memcpy(ex, obj[object].ob_spec.tedinfo, sizeof(TEDINFO));
ex->te_thickness = 0;
break;
case G_BOXTEXT:
memset(ex, 0, sizeof(EXTINFO));
memcpy(ex, obj[object].ob_spec.tedinfo, sizeof(TEDINFO));
FixThick(ex->te_thickness, &obj[object]);
FixShadow(ex->te_thickness, &obj[object]);
if (pos) {
FixPositioning(ex->te_ptext, &obj[object]);
FixSizing(ex->te_ptext, &obj[object]);
}
if (repos)
FixMovement(&obj[object]);
break;
case G_STRING:
memset(ex, 0, sizeof(EXTINFO));
ex->te_ptext = obj[object].ob_spec.free_string;
ex->te_font = 3;
ex->te_color.bord_color = ex->te_color.text_color = 1;
ex->te_thickness = 0;
break;
case G_BUTTON:
memset(ex, 0, sizeof(EXTINFO));
ex->te_ptext = obj[object].ob_spec.free_string;
ex->te_font = 3;
ex->te_just = 2;
ex->te_thickness = obj[object].ob_flags & EXIT ? (obj[object].ob_flags & DEFAULT ? -3 : -2) : -1;
ex->te_color.bord_color = ex->te_color.text_color = 1;
FixThick(ex->te_thickness, &obj[object]);
FixShadow(ex->te_thickness, &obj[object]);
if (pos) {
FixPositioning(ex->te_ptext, &obj[object]);
FixSizing(ex->te_ptext, &obj[object]);
}
if (repos)
FixMovement(&obj[object]);
break;
case G_BOX:
memset(ex, 0, sizeof(EXTINFO));
ex->te_ptext = "";
ex->te_font = 3;
ex->te_just = 2;
ex->te_thickness = obj[object].ob_spec.obspec.framesize;
ex->te_color.bord_color = obj[object].ob_spec.obspec.framecol;
ex->te_color.text_color = obj[object].ob_spec.obspec.textcol;
ex->te_color.in_color = obj[object].ob_spec.obspec.interiorcol;
ex->te_color.fill_ptn = obj[object].ob_spec.obspec.fillpattern;
if (ex->te_color.fill_ptn == 1)
ex->te_color.fill_ptn = 0;
FixThick(ex->te_thickness, &obj[object]);
FixShadow(ex->te_thickness, &obj[object]);
break;
case G_IBOX:
memset(ex, 0, sizeof(EXTINFO));
ex->te_ptext = "";
ex->te_font = 3;
ex->te_just = 2;
ex->te_thickness = obj[object].ob_spec.obspec.framesize;
ex->te_color.bord_color = obj[object].ob_spec.obspec.framecol;
ex->te_color.text_color = obj[object].ob_spec.obspec.textcol;
ex->te_color.in_color = obj[object].ob_spec.obspec.interiorcol;
ex->te_color.fill_ptn = 0;
FixThick(ex->te_thickness, &obj[object]);
FixShadow(ex->te_thickness, &obj[object]);
break;
case G_BOXCHAR:
memset(ex, 0, sizeof(EXTINFO));
ex->te_ptext = "X";
*ex->te_ptext = (char) obj[object].ob_spec.obspec.character;
ex->te_font = 3;
ex->te_just = 2;
ex->te_thickness = obj[object].ob_spec.obspec.framesize;
ex->te_color.bord_color = obj[object].ob_spec.obspec.framecol;
ex->te_color.text_color = obj[object].ob_spec.obspec.textcol;
ex->te_color.in_color = obj[object].ob_spec.obspec.interiorcol;
ex->te_color.fill_ptn = (obj[object].ob_spec.obspec.fillpattern == 1) ? 1 : obj[object].ob_spec.obspec.fillpattern;
FixThick(ex->te_thickness, &obj[object]);
FixShadow(ex->te_thickness, &obj[object]);
break;
default:
break;
}
ex->te_routines.mouse_down = NULL;
ex->te_routines.mouse_up = NULL;
ex->te_routines.mouse_move = NULL;
ex->te_routines.mouse_click = NULL;
ex->oldparm = obj[object].ob_spec.userblk;
ex->oldtype = obj[object].ob_type;
switch(obj[object].ob_type >> 8) {
case SLIDERLEFT:
ex->te_ptext = "\4";
break;
case SLIDERRIGHT:
ex->te_ptext = "\3";
break;
case SLIDERUP:
ex->te_ptext = "\1";
break;
case SLIDERDOWN:
ex->te_ptext = "\2";
break;
}
ub->ub_parm = (long) ex;
switch(obj[object].ob_type >> 8) {
case MENULINE:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_menuline;
obj[object].ob_type = (MENULINE << 8) + G_USERDEF;
break;
case UNDERLINE:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_underline;
obj[object].ob_type = (UNDERLINE << 8) + G_USERDEF;
break;
case BOXFRAME:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_boxframe;
obj[object].ob_type = (BOXFRAME << 8) + G_USERDEF;
break;
case SLIDERLEFT:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERLEFT << 8) + G_USERDEF;
break;
case SLIDERRIGHT:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERRIGHT << 8) + G_USERDEF;
break;
case SLIDERUP:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERUP << 8) + G_USERDEF;
break;
case SLIDERDOWN:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERDOWN << 8) + G_USERDEF;
break;
case SLIDERTRACK:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERTRACK << 8) + G_USERDEF;
break;
case SLIDERSLIDE:
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = (SLIDERSLIDE << 8) + G_USERDEF;
break;
default:
{
char *ptr;
if (((obj[object].ob_type >> 8) != FLYING))
if ((ptr = strchr(ex->te_ptext, '[')) && *(++ptr))
ex->te_hotkey = ((toupper(*ptr)) & 0x7f);
else
ex->te_hotkey = 0;
else
ex->te_hotkey = 0;
}
ub->ub_code = (int cdecl (*)(PARMBLK *))draw_specialtext;
obj[object].ob_type = G_USERDEF;
break;
}
obj[object].ob_spec.userblk = ub;
}
}
} while(!(obj[object].ob_flags & LASTOB));
return TRUE;
}
GLOBAL void unfix_object(OBJECT *obj)
{
USERBLK *ub;
EXTINFO *ex;
if (obj->ob_type != G_TITLE)
if ((obj->ob_type & 0xFF) == G_USERDEF) {
ub = obj->ob_spec.userblk;
ex = (EXTINFO *) ub->ub_parm;
if (ex != NULL) {
if (ex->te_thickness < 0) {
obj->ob_width += ex->te_thickness * 2;
obj->ob_height += ex->te_thickness * 2;
obj->ob_x -= ex->te_thickness;
obj->ob_y -= ex->te_thickness;
}
obj->ob_spec.userblk = ex->oldparm;
obj->ob_type = ex->oldtype;
free(ub);
}
}
}