46 inT32 xsize, ysize, new_xsize, new_ysize;
48 int *hires, *lores, *oldhires, *oldlores;
49 int i, j, n, oldn, row, col;
52 uinT8 curr_colour, new_colour;
60 if (new_ysize > new_xsize)
61 new_line.
init (new_ysize);
63 new_line.
init (new_xsize);
65 factor = (float) xsize / (
float) new_xsize;
67 hires = (
int *) calloc (xsize,
sizeof (
int));
68 lores = (
int *) calloc (new_xsize,
sizeof (
int));
69 oldhires = (
int *) calloc (xsize,
sizeof (
int));
70 oldlores = (
int *) calloc (new_xsize,
sizeof (
int));
71 if ((hires ==
NULL) || (lores ==
NULL) || (oldhires ==
NULL)
72 || (oldlores ==
NULL)) {
73 fprintf (stderr,
"Calloc error in scale_image\n");
85 for (i = 0; i < xsize; i++) {
86 new_colour = *(line.
pixels + i);
87 if (new_colour != curr_colour) {
90 curr_colour = new_colour;
94 for (i = 0; i < n; i++)
98 tprintf (
"Too many transitions (%d) on line 0\n", n);
109 dyn_prog (n, hires, lores, new_xsize, &dummy, &dummy, 0, factor);
111 lores[0] = new_xsize;
115 for (i = 0; i < new_xsize; i++) {
117 curr_colour = 1 - curr_colour;
120 *(new_line.
pixels + i) = curr_colour;
122 image2.
put_line (0, 0, new_xsize, &new_line, 0);
124 for (i = 0; i < n; i++) {
125 oldhires[i] = hires[i];
126 oldlores[i] = lores[i];
129 for (i = n; i < oldn; i++) {
135 for (row = 1; row < ysize; row++) {
140 for (i = 0; i < xsize; i++) {
141 new_colour = *(line.
pixels + i);
142 if (new_colour != curr_colour) {
145 curr_colour = new_colour;
148 for (i = n; i < oldn; i++) {
153 for (i = 0; i < n; i++)
157 tprintf (
"Too many transitions (%d) on line %d\n", n, row);
168 dyn_prog(n, hires, lores, new_xsize, oldhires, oldlores, oldn, factor);
170 lores[0] = new_xsize;
174 for (i = 0; i < new_xsize; i++) {
176 curr_colour = 1 - curr_colour;
179 *(new_line.
pixels + i) = curr_colour;
181 image2.
put_line (0, row, new_xsize, &new_line, 0);
183 for (i = 0; i < n; i++) {
184 oldhires[i] = hires[i];
185 oldlores[i] = lores[i];
187 for (i = n; i < oldn; i++) {
202 factor = (float) ysize / (
float) new_ysize;
205 hires = (
int *) calloc (ysize,
sizeof (
int));
206 lores = (
int *) calloc (new_ysize,
sizeof (
int));
207 oldhires = (
int *) calloc (ysize,
sizeof (
int));
208 oldlores = (
int *) calloc (new_ysize,
sizeof (
int));
209 if ((hires ==
NULL) || (lores ==
NULL) || (oldhires ==
NULL)
210 || (oldlores ==
NULL)) {
211 fprintf (stderr,
"Calloc error in scale_image (vert)\n");
221 for (i = 0; i < ysize; i++) {
222 new_colour = *(line.
pixels + i);
223 if (new_colour != curr_colour) {
226 curr_colour = new_colour;
231 for (i = 0; i < n; i++)
235 tprintf (
"Too many transitions (%d) on column 0\n", n);
246 dyn_prog (n, hires, lores, new_ysize, &dummy, &dummy, 0, factor);
248 lores[0] = new_ysize;
252 for (i = 0; i < new_ysize; i++) {
254 curr_colour = 1 - curr_colour;
257 *(new_line.
pixels + i) = curr_colour;
259 target_image.
put_column (0, 0, new_ysize, &new_line, 0);
261 for (i = 0; i < n; i++) {
262 oldhires[i] = hires[i];
263 oldlores[i] = lores[i];
265 for (i = n; i < oldn; i++) {
271 for (col = 1; col < xsize; col++) {
276 for (i = 0; i < ysize; i++) {
277 new_colour = *(line.
pixels + i);
278 if (new_colour != curr_colour) {
281 curr_colour = new_colour;
284 for (i = n; i < oldn; i++) {
290 for (i = 0; i < n; i++)
294 tprintf (
"Too many transitions (%d) on column %d\n", n, col);
305 dyn_prog(n, hires, lores, new_ysize, oldhires, oldlores, oldn, factor);
307 lores[0] = new_ysize;
311 for (i = 0; i < new_ysize; i++) {
313 curr_colour = 1 - curr_colour;
316 *(new_line.
pixels + i) = curr_colour;
318 target_image.
put_column (col, 0, new_ysize, &new_line, 0);
320 for (i = 0; i < n; i++) {
321 oldhires[i] = hires[i];
322 oldlores[i] = lores[i];
324 for (i = n; i < oldn; i++) {
void dyn_prog(int n, int *x, int *y, int ymax, int *oldx, int *oldy, int oldn, float factor)
void put_line(inT32 x, inT32 y, inT32 width, IMAGELINE *linebuf, inT32 margins)
void put_column(inT32 x, inT32 y, inT32 height, IMAGELINE *linebuf, inT32 margins)
DLLSYM void tprintf(const char *format,...)
uinT8 * pixels
image pixels
void scale_image_cop_out(IMAGE &image, IMAGE &target_image, float factor, int *hires, int *lores, int *oldhires, int *oldlores)
void get_column(inT32 x, inT32 y, inT32 height, IMAGELINE *linebuf, inT32 margins)
void fast_get_line(inT32 x, inT32 y, inT32 width, IMAGELINE *linebuf)
inT8 create(inT32 x, inT32 y, inT8 bits_per_pixel)