2021-10-11 18:20:23 -03:00

225 lines
8.0 KiB
C

#ifndef lint
static char sccsid[] = "@(#)cgipw.c 1.1 92/07/30 Copyr 1985-9 Sun Micro";
#endif
/*
* Copyright (c) 1985, 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
* Permission to use, copy, modify, and distribute this software for any
* purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both that copyright
* notice and this permission notice are retained, and that the name
* of Sun Microsystems, Inc., not be used in advertising or publicity
* pertaining to this software without specific, written prior permission.
* Sun Microsystems, Inc., makes no representations about the suitability
* of this software or the interface defined in this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/*
* CGI pixwin functions
*/
/*
int open_pw_cgi
int open_cgi_pw
Cerror _cgi_open_cgi_pw
int close_cgi_pw
int close_pw_cgi
*/
#include "cgipriv.h"
#include <fcntl.h>
Gstate _cgi_state; /* CGI global state */
View_surface *_cgi_view_surfaces[MAXVWS]; /* view surface information */
View_surface *_cgi_vws; /* current view surface */
int _cgi_vwsurf_count; /* number of view surfaces */
Outatt *_cgi_att; /* structure containing current attributes */
Clogical _cgi_get_r_screen();
Outatt *_cgi_alloc_output_att();
extern int gp1_rop();
/****************************************************************************/
/* */
/* FUNCTION: open_pw_cgi */
/* */
/* This function replaces open_cgi when using CGIPW mode. */
/****************************************************************************/
int open_pw_cgi()
{
int err;
err = _cgi_open_cgi(1, 1); /* cgipw_mode==1, use_pw_size==1 */
return (err);
}
/****************************************************************************/
/* */
/* FUNCTION: open_cgi_pw */
/* */
/* This function replaces open_vws when using CGIPW mode. */
/* It gets CGI ready to use the user-created pixwin specified.*/
/****************************************************************************/
Cerror open_cgi_pw(pw, desc, name)
Pixwin *pw;
Ccgiwin *desc;
Cint *name;
{
Cerror err;
err = _cgi_open_cgi_pw(pw, desc, name, (Canvas) 0);
return (_cgi_errhand(err));
}
/****************************************************************************/
/* */
/* FUNCTION: _cgi_open_cgi_pw */
/* */
/* Do all the work of associating an existing pixwin */
/* with a view surface structure. */
/****************************************************************************/
Cerror _cgi_open_cgi_pw(pw, desc, name, canvas_hndl)
Pixwin *pw;
Ccgiwin *desc;
Cint *name;
Canvas canvas_hndl; /* !0 == this is the pixwin hndl to a canvas */
{
register View_surface *cur_vws; /* ptr to current view surf info */
Cerror err;
Outatt *cur_att; /* will get attribute structure */
if (!_cgi_state.cgipw_mode) /* opened via open_pw_cgi? */
err = ENOTCSTD; /* Function not compatible with standard CGI */
else
{
err = _cgi_check_state_5();
if (!err)
{
*name = _cgi_new_vwsurf_name();
if (*name < 0)
err = EMAXVSOP; /* Maximum no. of view surfaces already open. */
else
{
/* Don't malloc unless everything else is OK */
cur_vws = (View_surface *) calloc(1, sizeof(View_surface));
if (cur_vws == (View_surface *) NULL)
{
err = EMEMSPAC;
_cgi_free_name(*name);
}
else
{
/*
* Initialize CGIPW surface's attribute from common_att.
* This will capture any attributes set before opening a
* CGIPW view surface.
*/
cur_att = _cgi_alloc_output_att(_cgi_state.common_att);
if (cur_att == (Outatt *) NULL)
{
err = EMEMSPAC;
_cgi_free_name(*name);
free((char *) cur_vws);
}
}
}
}
}
if (!err)
{ /* if mallocs all worked */
Cos incoming_cgi_state = _cgi_state.state;
cur_vws->att = _cgi_att = cur_att;
_cgi_view_surfaces[*name] = _cgi_vws = cur_vws;
_cgi_state.state = VSAC;
cur_vws->active = 1;
cur_vws->sunview.windowfd = pw->pw_clipdata->pwcd_windowfd;
IDENTITY_SCALE(cur_vws->xform.scale.x);
IDENTITY_SCALE(cur_vws->xform.scale.y);
cur_vws->xform.off.x = 0;
cur_vws->xform.off.y = 0;
cur_vws->xform.win_off.x = 0;
cur_vws->xform.win_off.y = 0;
cur_vws->sunview.canvas = canvas_hndl;
cur_vws->sunview.depth = pw->pw_pixrect->pr_depth;
cur_vws->sunview.pw = pw;
cur_vws->sunview.orig_pw = pw;
win_getsize(cur_vws->sunview.windowfd, &cur_vws->sunview.lock_rect);
(void) _cgi_get_r_screen(cur_vws, &cur_vws->real_screen);
cur_vws->vport = cur_vws->real_screen;
/* if first view surface opened, reset cgi's state */
if (incoming_cgi_state == CGOP)
_cgi_reset_internals();
(void) reset_to_defaults();
/*
* these scale factors must be reset from defaults because VDC space is
* not 32K square in cgipw mode
*/
cur_att->pattern.dx = cur_vws->real_screen.r_width / 100;
cur_att->pattern.dy = cur_vws->real_screen.r_width / 100;
cur_att->text.attr.height = cur_vws->real_screen.r_width / 32;
cur_vws->sunview.sig_function = 0;
if (pw->pw_pixrect->pr_ops->pro_rop == gp1_rop)
if (_cgi_initialize_gp1(cur_vws))
cur_vws->sunview.gp_att = (Gp1_attr *) NULL;
/* Enable CGIPW mode pixwin to do CGI input. */
if (!canvas_hndl)
(void) fcntl(cur_vws->sunview.windowfd, F_SETFL, FASYNC | FNDELAY);
/* fix for PW bug: pw_lock forgets retained & draw only on screen */
/* ## WCL 12/18/86 Can this be removed? Does PW bug still exist? */
pw_exposed(pw); /* Note that this undoes pw_restrictclipping */
desc->vws = _cgi_vws;
}
else
{
/*
* Explicitly invalidate the contents of the descriptor being returned
* to forestall later segmentation violations when the client calls
* CGIPW functions with this bogus descriptor.
*/
*name = -1;
desc->vws = (View_surface *) NULL;
}
return (err);
}
/****************************************************************************/
/* */
/* FUNCTION: close_cgi_pw */
/* */
/* */
/****************************************************************************/
/* Forced to match erroneous documentation, page F-2. */
int close_cgi_pw(desc)
Ccgiwin *desc; /* CGI pixwin descriptor */
{
int err, name;
SETUP_CGIWIN(desc);
for (name = 0; name < _cgi_vwsurf_count; name++)
if (_cgi_view_surfaces[name] == desc->vws)
{
err = close_vws(name);
desc->vws = (View_surface *) NULL;
return (err);
}
return (EVSNOTOP);
}
/****************************************************************************/
/* */
/* FUNCTION: close_pw_cgi */
/* */
/* */
/****************************************************************************/
Cerror close_pw_cgi()
{
return (_cgi_close_cgi());
}