354 lines
8.4 KiB
C
354 lines
8.4 KiB
C
|
/*
|
||
|
* Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis
|
||
|
*
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
* 1. Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in the
|
||
|
* documentation and/or other materials provided with the distribution.
|
||
|
* 3. All advertising materials mentioning features or use of this software
|
||
|
* must display the following acknowledgement:
|
||
|
* This product includes software developed by Hellmuth Michaelis.
|
||
|
* 4. The name of the developer may not be used to endorse or promote
|
||
|
* products derived from this software without specific prior written
|
||
|
* permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR
|
||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||
|
* IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
* misc.c, 3.00, last edit-date: [Sun Jan 2 20:09:21 1994]
|
||
|
*/
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
*
|
||
|
* misc.c font editor misc routines
|
||
|
* -----------------------------------------
|
||
|
*
|
||
|
* written by Hellmuth Michaelis, hm@hcshh.hcs.de
|
||
|
*
|
||
|
* -hm first public release
|
||
|
* -hm writefont routine
|
||
|
*
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "fed.h"
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
|
||
|
static unsigned char *fonttab; /* ptr to font in core memory */
|
||
|
|
||
|
static char *bitmask[] = {
|
||
|
"....", /* 0 */
|
||
|
"...*", /* 1 */
|
||
|
"..*.", /* 2 */
|
||
|
"..**", /* 3 */
|
||
|
".*..", /* 4 */
|
||
|
".*.*", /* 5 */
|
||
|
".**.", /* 6 */
|
||
|
".***", /* 7 */
|
||
|
"*...", /* 8 */
|
||
|
"*..*", /* 9 */
|
||
|
"*.*.", /* A */
|
||
|
"*.**", /* B */
|
||
|
"**..", /* C */
|
||
|
"**.*", /* D */
|
||
|
"***.", /* E */
|
||
|
"****", /* F */
|
||
|
NULL };
|
||
|
|
||
|
static char lfilename[1024]; /* current filename */
|
||
|
static unsigned int lfilesize; /* current filename's size */
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* read fontfile into memory
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void readfont(char *filename)
|
||
|
{
|
||
|
FILE *in;
|
||
|
struct stat sbuf, *sbp;
|
||
|
int ret;
|
||
|
char buffer[1024];
|
||
|
|
||
|
sbp = &sbuf;
|
||
|
|
||
|
if((in = fopen(filename, "r")) == NULL)
|
||
|
{
|
||
|
sprintf(buffer, "cannot open file %s for reading", filename);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if((fstat(fileno(in), sbp)) != 0)
|
||
|
{
|
||
|
sprintf(buffer, "cannot fstat file %s", filename);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
switch(sbp->st_size)
|
||
|
{
|
||
|
case FONT8X8:
|
||
|
ch_height = HEIGHT8X8;
|
||
|
ch_width = WIDTH8;
|
||
|
break;
|
||
|
|
||
|
case FONT8X10:
|
||
|
ch_height = HEIGHT8X10;
|
||
|
ch_width = WIDTH8;
|
||
|
break;
|
||
|
|
||
|
case FONT8X14:
|
||
|
ch_height = HEIGHT8X14;
|
||
|
ch_width = WIDTH8;
|
||
|
break;
|
||
|
|
||
|
case FONT8X16:
|
||
|
ch_height = HEIGHT8X16;
|
||
|
ch_width = WIDTH8;
|
||
|
break;
|
||
|
|
||
|
case FONT16X16:
|
||
|
ch_height = HEIGHT16X16;
|
||
|
ch_width = WIDTH16;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
fprintf(stderr,"error, file %s is no valid font file, size=%d\n",filename,sbp->st_size);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if((fonttab = (unsigned char *)malloc((size_t)sbp->st_size)) == NULL)
|
||
|
{
|
||
|
fprintf(stderr,"error, malloc failed\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
strcpy(lfilename, filename); /* save for write */
|
||
|
lfilesize = sbp->st_size; /* save for write */
|
||
|
|
||
|
if((ret = fread(fonttab, sizeof(*fonttab), sbp->st_size, in)) != sbp->st_size)
|
||
|
{
|
||
|
sprintf(buffer,"error reading file %s, size = %d, ret = %d\n",filename,sbp->st_size, ret);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* write fontfile to disk
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void writefont()
|
||
|
{
|
||
|
FILE *in, *out;
|
||
|
int ret;
|
||
|
char buffer[1024];
|
||
|
|
||
|
if((in = fopen(lfilename, "r")) != NULL)
|
||
|
{
|
||
|
int c;
|
||
|
char wfn[1024];
|
||
|
|
||
|
strcpy(wfn, lfilename);
|
||
|
strcat(wfn, ".BAK");
|
||
|
if((out = fopen(wfn, "w")) == NULL)
|
||
|
{
|
||
|
sprintf(buffer, "cannot open file %s for writing", wfn);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
while(( c = fgetc(in) ) != EOF )
|
||
|
fputc(c, out);
|
||
|
|
||
|
fclose(out);
|
||
|
fclose(in);
|
||
|
}
|
||
|
|
||
|
if((out = fopen(lfilename, "w")) == NULL)
|
||
|
{
|
||
|
sprintf(buffer, "cannot open file %s for writing", lfilename);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if((ret = fwrite(fonttab, sizeof(*fonttab), lfilesize, out)) != lfilesize)
|
||
|
{
|
||
|
sprintf(buffer,"error writing file %s, size=%d, ret=%d\n",lfilename,lfilesize, ret);
|
||
|
perror(buffer);
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* display a string
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void dis_cmd(char *strg)
|
||
|
{
|
||
|
move(22,0);
|
||
|
clrtoeol();
|
||
|
mvaddstr(22,0,strg);
|
||
|
refresh();
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* clear a command string
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void clr_cmd(void)
|
||
|
{
|
||
|
move(22,0);
|
||
|
clrtoeol();
|
||
|
refresh();
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* move char from src to dest
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void move_ch(int src, int dst)
|
||
|
{
|
||
|
unsigned char *s, *d;
|
||
|
int offset = 0;
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
offset = 2;
|
||
|
else
|
||
|
offset = 1;
|
||
|
|
||
|
s = &(fonttab[ch_height * offset * src]);
|
||
|
d = &(fonttab[ch_height * offset * dst]);
|
||
|
|
||
|
bcopy(s, d, (ch_height*offset)); /* src -> dst */
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* exchange char's src and dest
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void xchg_ch(int src, int dst)
|
||
|
{
|
||
|
unsigned char *s, *d;
|
||
|
unsigned char buf[32];
|
||
|
int offset = 0;
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
offset = 2;
|
||
|
else
|
||
|
offset = 1;
|
||
|
|
||
|
s = &(fonttab[ch_height * offset * src]);
|
||
|
d = &(fonttab[ch_height * offset * dst]);
|
||
|
|
||
|
bcopy(s, buf, (ch_height*offset)); /* src -> tmp */
|
||
|
bcopy(d, s, (ch_height*offset)); /* dst -> src */
|
||
|
bcopy(buf, d, (ch_height*offset)); /* tmp -> dst */
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* display the current selected character
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void display(int no)
|
||
|
{
|
||
|
unsigned char *fontchar;
|
||
|
char line[32];
|
||
|
int ln_no;
|
||
|
unsigned char hibyte;
|
||
|
unsigned char lobyte;
|
||
|
int offset;
|
||
|
int r;
|
||
|
|
||
|
offset = 0;
|
||
|
r = 1;
|
||
|
lobyte = 0;
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
fontchar = &(fonttab[ch_height * 2 * no]);
|
||
|
else
|
||
|
fontchar = &(fonttab[ch_height * no]);
|
||
|
|
||
|
for (ln_no = 0; ln_no < ch_height; ln_no++)
|
||
|
{
|
||
|
hibyte = *(fontchar + (offset++));
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
{
|
||
|
lobyte = *(fontchar + offset++);
|
||
|
}
|
||
|
|
||
|
strcpy(line,bitmask[(int)((hibyte >> 4) & 0x0f)]);
|
||
|
strcat(line,bitmask[(int)(hibyte & 0x0f)]);
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
{
|
||
|
strcat(line,bitmask[(int)((lobyte >> 4) & 0x0f)]);
|
||
|
strcat(line,bitmask[(int)(lobyte & 0x0f)]);
|
||
|
mvwprintw(ch_win, r, 1, "%16.16s", line);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mvwprintw(ch_win, r, 1, "%8.8s", line);
|
||
|
}
|
||
|
r++;
|
||
|
}
|
||
|
wmove(ch_win, 1, 1);
|
||
|
wrefresh(ch_win);
|
||
|
}
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* save character
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
void save_ch(void)
|
||
|
{
|
||
|
unsigned char *s;
|
||
|
int offset = 0;
|
||
|
int r, c;
|
||
|
unsigned short byte;
|
||
|
unsigned short shift;
|
||
|
|
||
|
if(ch_width == WIDTH16)
|
||
|
offset = 2;
|
||
|
else
|
||
|
offset = 1;
|
||
|
|
||
|
s = &(fonttab[ch_height * offset * curchar]);
|
||
|
|
||
|
r = 1;
|
||
|
|
||
|
while(r <= ch_height)
|
||
|
{
|
||
|
c = 1;
|
||
|
byte = 0;
|
||
|
if(offset == 2)
|
||
|
shift = 0x8000;
|
||
|
else
|
||
|
shift = 0x80;
|
||
|
|
||
|
while(c <= ch_width)
|
||
|
{
|
||
|
if(mvwinch(ch_win, r, c) == BLACK)
|
||
|
byte |= shift;
|
||
|
shift = (shift >> 1);
|
||
|
c++;
|
||
|
}
|
||
|
*s++ = byte;
|
||
|
r++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*---------------------------------- E O F ----------------------------------*/
|
||
|
|
||
|
|