OSDN Git Service

wwww
[proj16/16.git] / 16 / v2 / source / verge / UTIL / TRANS / TRANS.C
1 /*\r
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
15 */\r
16 \r
17 #include <stdio.h>\r
18 #include <strings.h>\r
19 #include <stdlib.h>\r
20 \r
21 // ================================= Data ====================================\r
22 \r
23 struct span\r
24 {\r
25   int begin, end;                     // begin & end location of span\r
26   int len, inverse;                   // lenth of span and inverse on/off\r
27 };\r
28 \r
29 struct span spans[32];                // maximum of 32 spans.\r
30 char numspans;                        // number of active spans in PDF\r
31 \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
36 \r
37 char spanidx[256];                    // Color -> Span xlat table\r
38 \r
39 // ================================= Code ====================================\r
40 \r
41 void ParsePaletteDefinition(FILE *f)\r
42 { int i;\r
43 \r
44   fscanf(f,"%s",strbuf);\r
45   if (stricmp("gradients",strbuf))\r
46   {\r
47     printf("Not a valid PDF file. \n");\r
48     exit(-1);\r
49   }\r
50   fscanf(f,"%s",strbuf);\r
51   numspans=atoi(strbuf);\r
52 \r
53   for (i=0; i<numspans; i++)\r
54   {\r
55      spans[i].inverse=0;\r
56 \r
57      while (1)\r
58      {\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
63              continue; }\r
64         if (!stricmp("ends",strbuf))\r
65            { fscanf(f,"%s", strbuf);\r
66              spans[i].end=atoi(strbuf);\r
67              continue; }\r
68        if (!stricmp("inverse",strbuf))\r
69            { spans[i].inverse=1;\r
70              continue; }\r
71        if (!stricmp("endspan",strbuf))\r
72            { spans[i].len=abs(spans[i].end-spans[i].begin);\r
73              break; }\r
74      }\r
75   }\r
76   fclose(f);\r
77 }\r
78 \r
79 void GenerateSpanIndex()\r
80 { int i,j;\r
81 \r
82   for (i=0; i<numspans; i++)\r
83   {\r
84     for (j=spans[i].begin; j<=spans[i].end; j++)\r
85         spanidx[j]=i;\r
86   }\r
87 }\r
88 \r
89 unsigned char MixColors(int i, int j)\r
90 { unsigned char in_i, in_j, in_m, f;\r
91 \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
96 \r
97   // Now, repeat for j.\r
98 \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
103 \r
104   in_m=(in_i+in_j)/2;                  // Average intensities.\r
105 \r
106   // now find final color.\r
107 \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
111 \r
112   f=spans[(int)spanidx[i]].begin+in_m;      // done!\r
113 \r
114   return f;\r
115 }\r
116 \r
117 void WriteTable(FILE *f)\r
118 { int i, j;\r
119 \r
120   transparencytbl=(char *) malloc(65536);\r
121   memset(transparencytbl, 0, 65535);\r
122 \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
126 \r
127   fwrite(transparencytbl, 256, 256, f);\r
128   fclose(f);\r
129 }\r
130 \r
131 int main ()\r
132 { FILE *f;\r
133 \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
137 \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
142 \r
143   if (!(f=fopen(paldefname,"r")))\r
144   {\r
145     printf("Could not open palette definition file.\n");\r
146     exit(-1);\r
147   }\r
148 \r
149   ParsePaletteDefinition(f);\r
150   GenerateSpanIndex();\r
151 \r
152   f=fopen(outname,"wb");\r
153   WriteTable(f);\r
154 \r
155   return 0;\r
156 }\r