|
|
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 i
Length: 4285 (0x10bd)
Types: TextFile
Names: »imagesbr.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/others/image/imagesbr.c«
/* imagesbr.c - image subroutines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/others/image/RCS/imagesbr.c,v 6.0 89/03/18 23:35:15 mrose Rel $";
#endif
/*
* $Header: /f/osi/others/image/RCS/imagesbr.c,v 6.0 89/03/18 23:35:15 mrose Rel $
*
*
* $Log: imagesbr.c,v $
* Revision 6.0 89/03/18 23:35:15 mrose
* Release 5.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include <stdio.h>
#include <varargs.h>
#include "imagesbr.h"
/* \f
IMAGE */
free_IMAGE_Image (im)
register struct type_IMAGE_Image *im;
{
if (im == NULL)
return;
qb_free (im -> data);
free ((char *) im);
}
/* \f
*/
static int passno;
static int x, y, maxx;
static struct type_IMAGE_Image *im = NULL;
struct type_IMAGE_Image *fetch_image (dn)
char *dn;
{
PE pe;
if ((pe = name2value (dn, "photo", NULLPEP)) == NULLPE)
return NULL;
if (pe_pullup (pe) == NOTOK) {
fprintf (stderr, "pe_pullup: %s\n", pe_error (pe -> pe_errno));
pe_free (pe);
return NULL;
}
if (prim2bit (pe) == NULLPE) {
fprintf (stderr, "prim2bit: %s\n", pe_error (pe -> pe_errno));
pe_free (pe);
return NULL;
}
im = NULL;
for (passno = 1; passno < 3; passno++)
if (decode_t4 (pe -> pe_prim, "photo", pe -> pe_len) == NOTOK) {
fprintf (stderr, "\n");
if (im)
free_IMAGE_Image (im), im = NULL;
break;
}
pe_free (pe);
return im;
}
/* \f
*/
/* ARGSUSED */
photo_start(name)
char *name;
{
if (passno == 1)
maxx = 0;
x = y = 0;
return OK;
}
/* ARGSUSED */
photo_end (name)
char *name;
{
int len;
register struct qbuf *qb,
*pb;
if (passno == 1) {
x = maxx, y--;
if (debug)
fprintf (stderr, "ending pass one for \"%s\", %dx%d\n",
name, x, y);
if ((im = (struct type_IMAGE_Image *) calloc (1, sizeof *im))
== NULL) {
fprintf (stderr, "calloc fails");
return NOTOK;
}
im -> hot__spot__x = im -> hot__spot__y = -1;
im -> width = x, im -> height = y;
len = ((im -> width + 7) / 8) * im -> height;
if ((im -> data = qb = (struct qbuf *) malloc (sizeof *qb)) == NULL) {
fprintf (stderr, "unable to allocate qbuf");
return NOTOK;
}
qb -> qb_forw = qb -> qb_back = qb;
qb -> qb_data = NULL, qb -> qb_len = len;
if ((pb = (struct qbuf *) calloc ((unsigned) (sizeof *pb + len), 1))
== NULL) {
fprintf (stderr, "unable to allocate qbuf (%d+%d)",
sizeof *qb, len);
return NOTOK;
}
pb -> qb_data = pb -> qb_base, pb -> qb_len = len;
insque (pb, qb);
}
return OK;
}
photo_black (length)
int length;
{
if (passno == 2) {
register int i,
j;
register unsigned char *cp;
cp = (unsigned char *) im -> data -> qb_forw -> qb_data
+ ((im -> width + 7) / 8) * y + x / 8;
i = x % 8;
for (j = length; j > 0; j--) {
*cp |= 1 << i;
if (++i == 8)
cp++, i = 0;
}
}
x += length;
return OK;
}
photo_white (length)
{
x += length;
return OK;
}
/* ARGSUSED */
photo_line_end (line)
caddr_t line;
{
if (passno == 1 && x > maxx)
maxx = x;
x = 0, y++;
return OK;
}
/* \f
ERRORS */
#ifndef lint
void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
if (errsw != NOTOK) {
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif
/* \f
MISC */
char *strdup (s)
char *s;
{
char *p;
if (p = malloc ((unsigned) (strlen (s) + 1)))
(void) strcpy (p, s);
return p;
}