2 Copyright (C) 1998 BJ Eirich (aka vecna)
\r
3 This program is free software; you can redistribute it and/or
\r
4 modify it under the terms of the GNU General Public License
\r
5 as published by the Free Software Foundation; either version 2
\r
6 of the License, or (at your option) any later version.
\r
7 This program is distributed in the hope that it will be useful,
\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\r
10 See the GNU General Public Lic
\r
11 See the GNU General Public License for more details.
\r
12 You should have received a copy of the GNU General Public License
\r
13 along with this program; if not, write to the Free Software
\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
18 #include <strings.h>
\r
21 // ================================= Data ====================================
\r
25 int begin, end; // begin & end location of span
\r
26 int len, inverse; // lenth of span and inverse on/off
\r
29 struct span spans[32]; // maximum of 32 spans.
\r
30 char numspans; // number of active spans in PDF
\r
32 unsigned char *transparencytbl; // full transparency table (64k)
\r
33 char outname[100]; // output filename
\r
34 char paldefname[100]; // palette definition filename
\r
35 char *strbuf; // generic string buffer
\r
37 char spanidx[256]; // Color -> Span xlat table
\r
39 // ================================= Code ====================================
\r
41 void ParsePaletteDefinition(FILE *f)
\r
44 fscanf(f,"%s",strbuf);
\r
45 if (stricmp("gradients",strbuf))
\r
47 printf("Not a valid PDF file. \n");
\r
50 fscanf(f,"%s",strbuf);
\r
51 numspans=atoi(strbuf);
\r
53 for (i=0; i<numspans; i++)
\r
59 fscanf(f,"%s",strbuf);
\r
60 if (!stricmp("starts",strbuf))
\r
61 { fscanf(f,"%s", strbuf);
\r
62 spans[i].begin=atoi(strbuf);
\r
64 if (!stricmp("ends",strbuf))
\r
65 { fscanf(f,"%s", strbuf);
\r
66 spans[i].end=atoi(strbuf);
\r
68 if (!stricmp("inverse",strbuf))
\r
69 { spans[i].inverse=1;
\r
71 if (!stricmp("endspan",strbuf))
\r
72 { spans[i].len=abs(spans[i].end-spans[i].begin);
\r
79 void GenerateSpanIndex()
\r
82 for (i=0; i<numspans; i++)
\r
84 for (j=spans[i].begin; j<=spans[i].end; j++)
\r
89 unsigned char MixColors(int i, int j)
\r
90 { unsigned char in_i, in_j, in_m, f;
\r
92 in_i=i-spans[(int)spanidx[i]].begin; // Get a intensity number from 0 to len
\r
93 in_i=in_i*63/spans[(int)spanidx[i]].len; // Translate intensity to 0..63 range
\r
94 if (spans[(int)spanidx[i]].inverse)
\r
95 in_i=63-in_i; // If inverse, flip it.
\r
97 // Now, repeat for j.
\r
99 in_j=j-spans[(int)spanidx[j]].begin; // Get a intensity number from 0 to len
\r
100 in_j=in_j*63/spans[(int)spanidx[j]].len; // Translate intensity to 0..63 range
\r
101 if (spans[(int)spanidx[j]].inverse)
\r
102 in_j=63-in_j; // If inverse, flip it.
\r
104 in_m=(in_i+in_j)/2; // Average intensities.
\r
106 // now find final color.
\r
108 if (spans[(int)spanidx[i]].inverse) // If dest span is inverse,
\r
109 in_m=63-in_m; // flip intensity_mixed
\r
110 in_m=in_m*spans[(int)spanidx[i]].len/63; // Convert intensity to 0 .. len range
\r
112 f=spans[(int)spanidx[i]].begin+in_m; // done!
\r
117 void WriteTable(FILE *f)
\r
120 transparencytbl=(char *) malloc(65536);
\r
121 memset(transparencytbl, 0, 65535);
\r
123 for (i=0; i<256; i++)
\r
124 for (j=0; j<256; j++)
\r
125 transparencytbl[(i*256)+j]=MixColors(i, j);
\r
127 fwrite(transparencytbl, 256, 256, f);
\r
134 strbuf=(char *) malloc(2000);
\r
135 printf("TRANS v.1.00 Transparency-table generator \n");
\r
136 printf("Copyright (C)1998 vecna \n\n");
\r
138 printf("Output table filename: ");
\r
139 fflush(stdout); gets(outname);
\r
140 printf("Palette definition filename: ");
\r
141 fflush(stdout); gets(paldefname);
\r
143 if (!(f=fopen(paldefname,"r")))
\r
145 printf("Could not open palette definition file.\n");
\r
149 ParsePaletteDefinition(f);
\r
150 GenerateSpanIndex();
\r
152 f=fopen(outname,"wb");
\r