bmeps.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 886 行 · 第 1/2 页
C
886 行
/*
* libbmeps - Bitmap to EPS conversion library
* Copyright (C) 2000 - Dirk Krause
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* In this package the copy of the GNU Library General Public License
* is placed in file COPYING.
*/
#include "bmepsco.h"
#include "bmepsoe.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <process.h>
#include "bmpeps.h"
#ifdef HAVE_PNG_H
#include "pngeps.h"
#endif
#define BMEPS_C 1
#include "bmeps.h"
static char the_version_number[] = { VERSNUMB };
/* Postscript level */
static int bmeps_pslevel = 2;
/* colored (1) or grayscaled (0) output */
static int bmeps_color = 0;
/* use ASCII85 encoding */
static int bmeps_enc_a85 = 1;
/* use runlength encoding */
static int bmeps_enc_rl = 1;
/* use flate encoding */
static int bmeps_enc_fl = 0;
/* draft only */
static int bmeps_is_draft = 0;
/* print DSC comments */
static int show_dsc_comments = 0;
static Output_Encoder bmepsoe;
static int bmeps_alpha = 0; /* use alpha channel */
static int bmeps_trans = 0; /* alpha channel is transparency */
static int bmeps_altrig = 0; /* 0/1 trigger level alternated */
static int bmeps_mix = 0; /* mix foreground with background */
static int bmeps_specbg = 0; /* specify your own background color */
static int bmeps_bg_red = 255;
static int bmeps_bg_green = 255;
static int bmeps_bg_blue = 255;
int bmeps_get_mix(void) { return bmeps_mix ; }
int bmeps_get_specbg(void) { return bmeps_specbg; }
int bmeps_get_bg_red(void) { return bmeps_bg_red; }
int bmeps_get_bg_green(void) { return bmeps_bg_green; }
int bmeps_get_bg_blue(void) { return bmeps_bg_blue; }
int bmeps_get_dsc_comm(void) { return show_dsc_comments; }
static int use_trans = 0;
void bmeps_add_trans(int x) {
int val;
val = x;
if(use_trans) {
if(bmeps_trans) {
val = 255 - val;
}
/* if(bmeps_aldual) { */
if(bmeps_altrig) {
val = (val ? 255 : 0);
} else {
val = ((val == 255) ? 255 : 0);
}
/* } */
oe_byte_add(&bmepsoe, val);
}
}
static int is_configured = 0;
#define correct(x) x = ((x > 255) ? (255) : ((x < 0) ? (0) : (x)))
void bmeps_setup(int psl, int col, int a85, int rl, int fl,
int alpha, int trans, int altrig,
int mix, int specbg, int bg_red, int bg_green, int bg_blue, int dsc_show
)
{
is_configured = 1;
bmeps_color = bmeps_enc_a85 = bmeps_enc_rl = bmeps_enc_fl = 0;
bmeps_alpha = bmeps_trans = bmeps_altrig = 0;
bmeps_mix = bmeps_specbg = 0;
bmeps_bg_red = bmeps_bg_green = bmeps_bg_blue = 255;
bmeps_pslevel = psl;
bmeps_mix = (mix ? 1 : 0);
bmeps_specbg = (specbg ? 1 : 0);
bmeps_bg_red = bg_red;
bmeps_bg_green = bg_green;
bmeps_bg_blue = bg_blue;
show_dsc_comments = dsc_show;
correct(bmeps_bg_red);
correct(bmeps_bg_green);
correct(bmeps_bg_blue);
if(bmeps_pslevel < 1) bmeps_pslevel = 1;
if(bmeps_pslevel > MAXPSLEVEL) bmeps_pslevel = MAXPSLEVEL;
if(bmeps_pslevel > 1) {
bmeps_color = (col ? 1 : 0);
bmeps_enc_a85 = (a85 ? 1 : 0);
bmeps_enc_rl = (rl ? 1 : 0);
if(bmeps_pslevel > 2) {
bmeps_enc_fl = ( fl ? 1 : 0 );
if(alpha) {
bmeps_alpha = 1;
bmeps_trans = (trans ? 1 : 0); bmeps_altrig = (altrig ? 1 : 0);
}
}
}
}
static char *options = NULL;
void bmeps_cfg(char *o)
{
options = o;
}
void bmeps_set_draft(int dr)
{
bmeps_is_draft = dr;
}
static int digit_for_char(char c)
{
int back = 0;
switch(c) {
case '0': back = 0; break;
case '1': back = 1; break;
case '2': back = 2; break;
case '3': back = 3; break;
case '4': back = 4; break;
case '5': back = 5; break;
case '6': back = 6; break;
case '7': back = 7; break;
case '8': back = 8; break;
case '9': back = 9; break;
}
return back;
}
void bmeps_configure(void)
{
char *ptr;
if(!is_configured) {
is_configured = 1;
ptr = options;
if(!ptr) {
ptr = getenv("EPSOUTPUT");
}
if(ptr) {
int psl;
int col;
int a85;
int rl;
int fl;
int dr;
int f;
int alpha;
int trans;
int altrig;
int mix;
int specbg;
int bg_red;
int bg_green;
int bg_blue;
int digit;
int digstate;
int dsc_show;
digstate = 0;
dsc_show = show_dsc_comments;
bg_red = bmeps_bg_red;
bg_green = bmeps_bg_green;
bg_blue = bmeps_bg_blue;
specbg = bmeps_specbg;
mix = bmeps_mix;
psl = bmeps_pslevel;
col = bmeps_color;
a85 = bmeps_enc_a85;
rl = bmeps_enc_rl;
fl = bmeps_enc_fl;
dr = bmeps_is_draft;
alpha = bmeps_alpha;
trans = bmeps_trans;
altrig = bmeps_altrig;
f = 1;
while(*ptr) {
switch(*ptr) {
case 'x' : dsc_show = 1; break;
case 'c' : col = 1; break;
case 'g' : col = 0; break;
case 'r' : if(f) { f = a85 = fl = rl = 0; } rl = 1; break;
case 'f' : if(f) { f = a85 = fl = rl = 0; } fl = 1; break;
case 'd' : dr = 1; break;
case 'p' : dr = 0; break;
case 'a' : {
alpha = 1;
} break;
case 'b' : alpha = 0; break;
case 't' : trans = 1; break;
case 'o' : trans = 0; break;
case 'l' : altrig = 1; break;
case 'm' : mix = 1; break;
case 's' : specbg = 1; break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': {
digit = digit_for_char(*ptr);
switch(digstate) {
case 0: {
if(alpha || mix) {
bg_green = bg_blue = 0;
digstate = 1;
bg_red = digit;
} else {
if((digit >= 1) && (digit <=3)) { psl = digit; }
if(digit == 8) { if(f) { f = a85 = fl = rl = 0; } a85 = 1; }
}
} break;
case 1: bg_red = 10 * bg_red + digit; break;
case 2: bg_green = 10 * bg_green + digit; break;
case 3: bg_blue = 10 * bg_blue + digit; break;
}
} break;
case ',' : {
if(digstate == 0) {
bg_red = bg_green = bg_blue = 0;
}
digstate += 1;
} break;
}
ptr++;
}
bmeps_setup(
psl,col,a85,rl,fl,
alpha,trans,altrig,mix,specbg,bg_red,bg_green,bg_blue,dsc_show
);
bmeps_set_draft(dr);
}
}
}
int bmeps_get_pslevel(void)
{ return bmeps_pslevel; }
int bmeps_get_colored(void)
{ return bmeps_color; }
int bmeps_get_enc_a85(void)
{ return bmeps_enc_a85; }
int bmeps_get_enc_rl(void)
{ return bmeps_enc_rl; }
int bmeps_get_enc_fl(void)
{ return bmeps_enc_fl; }
int bmeps_get_draft(void)
{ return bmeps_is_draft; }
int bmeps_get_alpha(void)
{ return bmeps_alpha; }
int bmeps_get_trans(void)
{ return bmeps_trans; }
int bmeps_get_altrig(void)
{ return bmeps_altrig; }
void bmeps_bb(FILE *out, unsigned long w, unsigned long h)
{
fprintf(out, "%%%%BoundingBox: 0 0 %lu %lu\n", w, h);
}
static int version_not_yet_printed = 1;
void bmeps_header(FILE *out, char *name, unsigned long w, unsigned long h)
{
char *ptr;
use_trans = 0;
fprintf(out, "%%!PS-Adobe-%d.0 EPSF-%d.0\n",
bmeps_pslevel, bmeps_pslevel
);
bmeps_bb(out, w, h);
if(show_dsc_comments) {
fprintf(out, "%%%%Creator: bmp2eps\n");
fprintf(out, "%%%%Title: ");
if(name) {
ptr = name;
while(*ptr) {
switch(*ptr) {
case '\r':
case '\n':
break;
case '\\':
fputc('/', out);
break;
default:
fputc(*ptr, out);
break;
}
ptr++;
}
} else {
fprintf(out, "Bitmap image");
}
fprintf(out, "\n");
}
if(show_dsc_comments) {
fprintf(out, "%%%%Pages: 1\n");
fprintf(out, "%%%%EndComments\n");
}
}
void bmeps_footer(FILE *out)
{
if(show_dsc_comments) {
fprintf(out, "%%%%Trailer\n");
}
}
static int rlbuffer[129];
static int state = 0;
#define NTSC(r,g,b) (((30 * (r)) + (59 * (g)) + (11 * (b))) / 100)
void bmeps_add_rgb(int red, int green, int blue)
{
if(state > 0) {
int r, g, b;
r = red; g = green; b = blue;
if(r < 0) r = 256 + r;
if(g < 0) g = 256 + g;
if(b < 0) b = 256 + b;
if(bmeps_color) {
oe_byte_add(&bmepsoe, r);
oe_byte_add(&bmepsoe, g);
oe_byte_add(&bmepsoe, b);
} else {
oe_byte_add(&bmepsoe, NTSC(r,g,b) );
}
state = 2;
}
}
void bmeps_add_gray(int gray)
{
if(state > 0) {
int g;
g = gray; if(g < 0) g = g + 256;
oe_byte_add(&bmepsoe, g);
if(bmeps_color) {
oe_byte_add(&bmepsoe, g);
oe_byte_add(&bmepsoe, g);
}
state = 2;
}
}
void bmeps_set_trans(int x)
{
if(state == 0) {
if(bmeps_pslevel > 2) {
if(bmeps_alpha) {
use_trans = (x ? 1 : 0);
}
} else {
use_trans = 0;
}
}
}
static int imageno = 1;
void bmeps_begin_image(FILE *out, unsigned long w, unsigned long h)
{
if(out) {
if(!(use_trans && (bmeps_pslevel > 2))) {
if(show_dsc_comments) {
fprintf(out, "%%%%BeginProlog\n");
fprintf(out, "%%%%BeginResource: (bmeps procedures) 1.0 1\n");
}
fprintf(out, "/pstr\n %lu string\ndef\n", w);
if(bmeps_pslevel > 1) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?