3 The tool to extract two images hidden iside one indexed image
\r
6 Copyright (C) 2015, 2022 Balthasar SzczepaĆski
\r
8 This program is free software: you can redistribute it and/or modify
\r
9 it under the terms of the GNU Affero General Public License as
\r
10 published by the Free Software Foundation, either version 3 of the
\r
11 License, or (at your option) any later version.
\r
13 This program is distributed in the hope that it will be useful,
\r
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 GNU Affero General Public License for more details.
\r
18 You should have received a copy of the GNU Affero General Public License
\r
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
22 Requires Dev Image Library (libdevil) (http://openil.sourceforge.net/)
\r
23 on Pentium III libdevil must be recompiled with
\r
24 --disable-ssl2 --disable-ssl3
\r
25 (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572954)
\r
34 #include "pal_unmix.h"
\r
36 int palette_unmix_index (ILuint n, struct PixelInfo *p, void *data);
\r
38 char PAL_UNMIX_MISSING_ARGS[] = "Missing parameters.\npal_unmix inPix outPix1 outPix2 [n1 n2]\n";
\r
40 int subtool_pal_unmix (int argc, char **argv, int argi, char **err)
\r
42 uint_fast16_t id[3] = {0, 1, 2};
\r
43 ILint xyf0[3] = {0, 0, 0};
\r
44 struct IL_full_info info[3];
\r
45 FLAG_TYPE flags[3] = {
\r
46 MUST_BE_INDEXED | NOT_READABLE | CAN_BE_MULTIPLE,
\r
47 MUST_BE_INDEXED | NOT_READABLE | CAN_BE_MULTIPLE,
\r
48 MUST_BE_INDEXED | NOT_WRITABLE | CAN_BE_MULTIPLE
\r
50 ILubyte new_pal0[0x100 * 4];
\r
51 ILubyte new_pal1[0x100 * 4];
\r
55 uint_fast8_t size_defined = 0;
\r
59 if (argc < argi + 3)
\r
61 *err = PAL_UNMIX_MISSING_ARGS;
\r
65 if (argc >= argi + 5)
\r
67 sscanf(argv[argi+3],"%u",&n0);
\r
68 sscanf(argv[argi+4],"%u",&n1);
\r
73 r = reserve_pictures(3);
\r
76 *err = CREATE_FAILED;
\r
80 r = load_picture(2, argv[argi], &(info[2]), &(flags[2]));
\r
89 if (info[2].palette_num_cols < n)
\r
91 *err = BAD_PALETTE_SIZE;
\r
97 n = info[2].palette_num_cols;
\r
101 *err = BAD_PALETTE_SIZE;
\r
107 if (flags[2] & HAS_ALPHA)
\r
109 flags[0] |= MUST_HAVE_ALPHA;
\r
110 flags[1] |= MUST_HAVE_ALPHA;
\r
114 flags[0] |= CANNOT_HAVE_ALPHA;
\r
115 flags[1] |= CANNOT_HAVE_ALPHA;
\r
118 r = build_picture_from_info(0, &(info[2]), &(info[0]), &(flags[0]));
\r
121 *err = CREATE_FAILED;
\r
125 r = build_picture_from_info(1, &(info[2]), &(info[1]), &(flags[1]));
\r
128 *err = CREATE_FAILED;
\r
132 /* create palettes - I didn't define separate action of this type */
\r
134 for (i=0; i<=info[2].num_images; ++i)
\r
136 r = get_palette(2, &pal2, i);
\r
139 *err = CONVERT_FAILED;
\r
144 for (j=0; j<n0; ++j)
\r
146 rd = pal2 + ((2*(j*(n-1))+1)/(2*(n0-1))) * info[2].palette_bpp;
\r
147 for (k=0; k<info[2].palette_bpp; ++k)
\r
155 for (j=0; j<n1; ++j)
\r
157 rd = pal2 + ((2*(j*(n-1))+1)/(2*(n1-1))) * info[2].palette_bpp;
\r
158 for (k=0; k<info[2].palette_bpp; ++k)
\r
169 n0 * info[2].palette_bpp,
\r
170 info[2].palette_type,
\r
175 *err = CONVERT_FAILED;
\r
182 n1 * info[2].palette_bpp,
\r
183 info[2].palette_type,
\r
188 *err = CONVERT_FAILED;
\r
193 r = perform_action(
\r
198 &palette_unmix_index,
\r
204 *err = CONVERT_FAILED;
\r
208 r = save_picture(0, argv[argi+1], flags[0]);
\r
211 *err = SAVE_FAILED;
\r
215 r = save_picture(1, argv[argi+2], flags[1]);
\r
218 *err = SAVE_FAILED;
\r
225 int palette_unmix_index (ILuint n, struct PixelInfo *p, void *data)
\r
232 p[0].index = p[2].index / *d;
\r
233 p[1].index = p[2].index % *d;
\r