📄 pcx.htm
字号:
the following is a simple set of c subroutines to read data from a .pcx file.<br>
<br>
/* this procedure reads one encoded block from the image file and stores a<br>
count and data byte.<br>
<br>
return result: 0 = valid data stored, eof = out of data in file */<br>
<br>
encget(pbyt, pcnt, fid)<br>
int *pbyt; /* where to place data */<br>
int *pcnt; /* where to place count */<br>
file *fid; /* image file handle */<br>
{<br>
int i;<br>
*pcnt = 1; /* assume a "run" length of one */<br>
if (eof == (i = getc(fid)))<br>
return (eof);<br>
if (0xc0 == (0xc0 & i))<br>
{<br>
*pcnt = 0x3f & i;<br>
if (eof == (i = getc(fid)))<br>
return (eof);<br>
}<br>
*pbyt = i;<br>
return (0);<br>
}<br>
/* here's a program fragment using encget. this reads an entire file and<br>
stores it in a (large) buffer, pointed to by the variable "bufr". "fp"
is<br>
the file pointer for the image */<br>
<br>
int i;<br>
long l, lsize;<br>
lsize = (long )hdr.bytesperline * hdr.nplanes * (1 + hdr.ymax - hdr.ymin);<br>
for (l = 0; l < lsize; ) /* increment by cnt below */<br>
{<br>
if (eof == encget(&chr, &cnt, fp))<br>
break;<br>
for (i = 0; i < cnt; i++)<br>
*bufr++ = chr;<br>
l += cnt;<br>
}<br>
<br>
the following is a set of c subroutines to write data to a .pcx file.<br>
<br>
/* subroutine for writing an encoded byte pair (or single byte if it<br>
doesn't encode) to a file. it returns the count of bytes written, 0 if error */<br>
<br>
encput(byt, cnt, fid)<br>
unsigned char byt, cnt;<br>
file *fid;<br>
{<br>
if (cnt) {<br>
if ((cnt == 1) && (0xc0 != (0xc0 & byt)))<br>
{<br>
if (eof == putc((int )byt, fid))<br>
return(0); /* disk write error (probably full) */<br>
return(1);<br>
}<br>
else<br>
{<br>
if (eof == putc((int )0xc0 | cnt, fid))<br>
return (0); /* disk write error */<br>
if (eof == putc((int )byt, fid))<br>
return (0); /* disk write error */<br>
return (2);<br>
}<br>
}<br>
return (0);<br>
}<br>
<br>
/* this subroutine encodes one scanline and writes it to a file.<br>
it returns number of bytes written into outbuff, 0 if failed. */<br>
<br>
encline(inbuff, inlen, fp)<br>
unsigned char *inbuff; /* pointer to scanline data */<br>
int inlen; /* length of raw scanline in bytes */<br>
file *fp; /* file to be written to */<br>
{<br>
unsigned char this, last;<br>
int srcindex, i;<br>
register int total;<br>
register unsigned char runcount; /* max single runlength is 63 */<br>
total = 0;<br>
runcount = 1;<br>
last = *(inbuff);<br>
<br>
/* find the pixel dimensions of the image by calculating <br>
[xsize = xmax - xmin + 1] and [ysize = ymax - ymin + 1]. <br>
then calculate how many bytes are in a "run" */<br>
<br>
for (srcindex = 1; srcindex < inlen; srcindex++)<br>
{<br>
this = *(++inbuff);<br>
if (this == last) /* there is a "run" in the data, encode it */<br>
{<br>
runcount++;<br>
if (runcount == 63)<br>
{<br>
if (! (i = encput(last, runcount, fp)))<br>
return (0);<br>
total += i;<br>
runcount = 0;<br>
}<br>
}<br>
else /* no "run" - this != last */<br>
{<br>
if (runcount)<br>
{<br>
if (! (i = encput(last, runcount, fp)))<br>
return(0);<br>
total += i;<br>
}<br>
last = this;<br>
runcount = 1;<br>
}<br>
} /* endloop */<br>
if (runcount) /* finish up */<br>
{<br>
if (! (i = encput(last, runcount, fp)))<br>
return (0);<br>
return (total + i);<br>
}<br>
return (total);<br>
}<br>
<br>
<a name="frieze technical information">frieze technical information</a><br>
<br>
<a name="general frieze information">general frieze information</a><br>
<br>
frieze is a memory-resident utility that allows you to capture and save<br>
graphic images from other programs. you can then bring these images into<br>
pc paintbrush for editing and enhancement.<br>
<br>
frieze 7.10 and later can be removed from memory (this can return you up<br>
to 90k of dos ram, depending on your configuration). to remove frieze from<br>
memory, change directories to your paintbrush directory and type the word<br>
"frieze".<br>
<br>
<a name="7.00 and later frieze">7.00 and later frieze</a><br>
<br>
the frieze command line format is:<br>
<br>
frieze {pd} {xn[aarr]} {flags} {video} {hres} {vres} {vnum}<br>
where:<br>
{pd} printer driver filename (without the .pdv extension)<br>
{xn[aarr]}<br>
x=s for serial printer, p for parallel printer, d for disk file.<br>
(file is always named frieze.prn)<br>
n = port number<br>
aa = two digit hex code for which return bits cause<br>
an abort (optional)<br>
rr = two digit hex code for which return bits cause<br>
a retry (optional)<br>
note: these codes represent return values from serial or<br>
parallel port bios calls. for values see and ibm<br>
bios reference (such as ray duncan's advanced ms-dos<br>
programming).<br>
{flags}four digit hex code<br>
first digit controls length flag<br>
second digit controls width flag<br>
third digit controls mode flag<br>
fourth digit controls bios flag<br>
0 - none<br>
1 - dual monitor present<br>
2 - use internal (true) b/w palette for dithering<br>
2 color images<br>
4 - capture palette along with screen in vga only<br>
frieze 8.08 & up only)<br>
<br>
note: the length, width and mode flags are printer driver specific.<br>
see printers.dat on disk 1 (or setup disk) for correct use. in general<br>
width flag of 1 means wide carriage, and 0 means standard width. length<br>
flag of 0 and mode flag of 0 means use default printer driver settings.<br>
<br>
if you need to use more than one bios flag option, add the needed flag values<br>
and use the sum as the flag value.<br>
<br>
{video} video driver combination, where the leading digit signifies the<br>
high level video driver and the rest signifies the low<br>
level video driver<br>
example = 1ega - uses drive1 and ega.dev<br>
{hres} horizontal resolution of the desired graphics mode<br>
{vres} vertical resolution of the desired graphics mode<br>
{vnum} hardware specific parameter (usually number of color planes)<br>
<br>
note: the last four parameters can be obtained from the cards.dat file,<br>
in your pc paintbrush product directory.<br>
<br>
<br>
<a name="frieze function calls">frieze function calls</a><br>
<br>
frieze is operated using software interrupt number 10h (the video interrupt<br>
call).<br>
<br>
to make a frieze function call, load 75 (decimal) into the ah register and<br>
the function number into the cl register, then either load al with the<br>
function argument or load es and bx with a segment and offset which point<br>
to the function argument. do an int 10h. frieze will return a result code<br>
number in ax. all other registers are preserved. in general, a result<br>
code of 0 means success and other values indicate errors. however, function<br>
20 (get frieze version) behaves differently; see below.<br>
no. definition arguments<br>
0 reserved<br>
1 load window<br>
es:bx - string (filename to read from)<br>
2 save window<br>
es:bx - string (filename to write to)<br>
3 reserved<br>
4 reserved <br>
6 reserved <br>
7 set window size<br>
es:bx - 4 element word vector of window settings:<br>
xmin, ymin, xmax, ymax<br>
8 reserved<br>
9 set patterns <br>
es:bx - 16 element vector of byte values<br>
containing the screen-to-printer color correspondence<br>
10 get patterns<br>
es:bx - room for 16 bytes as above<br>
11 set mode<br>
12,13,14 reserved<br>
15 get window<br>
es:bx - room for 4 words of the current window<br>
settings<br>
16 set print options<br>
es:bx - character string of printer options.<br>
same format as for the frieze command.<br>
17, 18, 19 reserved<br>
20 get frieze version.<br>
ah gets the whole number portion and al gets the<br>
decimal portion of the version number. (eg. for<br>
freize vesion 7.41, ah will contain 7 and al will<br>
contain 41. if ah =0, you are calling a pre-7.0<br>
version of frieze).<br>
21 set parameters<br>
es:bx points to an 8 word table (16 bytes) of<br>
parameter settings: topmargin, leftmargin,<br>
hsize,vsize, quality/draft mode, printhres,<br>
printvres, reserved.<br>
margins and sizes are specified in hundredths<br>
of inches.<br>
q/d mode parameter values:<br>
0 - draft print mode<br>
1 - quality print mode<br>
print resolutions are specified in dpi.<br>
any parameter which should be left unchanged may<br>
be filled with a (-1) (0ffff hex). the reserved<br>
settings should be filled with a (-1).<br>
22 get parameters<br>
es:bx points to an 8 word table (16 bytes) where<br>
parameter settings are held.<br>
23 get printer res<br>
es:bx points to a 12 word table (24 bytes) that<br>
holds six printer resolution pairs.<br>
24 reserved (versions 8.00 & up)<br>
<br>
<a name="frieze error codes">frieze error codes</a><br>
<br>
when frieze is called using interrupt 10 hex, it will return an error code<br>
in the ax register. a value of zero shows that there was no error. a<br>
nonzero result means there was an error. these error codes are explained<br>
below.<br>
<br>
0 no error<br>
1 printout was stopped by user with the esc key<br>
2 reserved<br>
3 file read error<br>
4 file write error<br>
5 file not found<br>
6 invalid header - not an image, wrong screen mode<br>
7 file close error<br>
8 disk error - usually drive door open<br>
9 printer error - printer is off or out of paper<br>
10 invalid command - cl was set to call a nonexistent frieze function<br>
11 can't create file - write protect tab or disk is full<br>
12 wrong video mode - frieze cannot capture text screens.<br>
<br>
technical reference manual<br>
<br>
including information for:<br>
publisher's paintbrushr<br>
pc paintbrush ivtm<br>
pc paintbrush iv plustm<br>
pc paintbrush plustm<br>
pc paintbrushr<br>
friezetm graphics<br>
paintbrushtm<br>
revision 5<br>
<br>
zsoft corporation<br>
450 franklin rd. suite 100<br>
marietta, ga 30067<br>
(404) 428-0008<br>
(404) 427-1150 fax<br>
(404) 427-1045 bbs<br>
<br>
copyright c 1985, 1987, 1988, 1990, 1991, zsoft corporation <br>
all rights reserved</td>
</tr>
</table>
</center></div>
<p align="center"><a href="../index.htm">返回</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -