source: libpipi/trunk/pipi/resize.c @ 2245

Last change on this file since 2245 was 2245, checked in by Sam Hocevar, 14 years ago
  • Image resizing test.
File size: 3.0 KB
Line 
1/*
2 *  libpipi       Proper image processing implementation library
3 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id$
7 *
8 *  This library is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15/*
16 * resize.c: image resizing functions
17 */
18
19#include "config.h"
20#include "common.h"
21
22#include "pipi_internals.h"
23#include "pipi.h"
24
25pipi_image_t *pipi_resize(pipi_image_t const *src, int w, int h)
26{
27    int *aline, *line;
28    pipi_image_t *dst;
29    int x, y, x0, y0, sw, dw, sh, dh, remy = 0;
30
31    dst = pipi_new(w, h);
32
33    sw = src->width; sh = src->height;
34    dw = dst->width; dh = dst->height;
35
36    aline = malloc(3 * dw * sizeof(int));
37    line = malloc(3 * dw * sizeof(int));
38
39    for(y = 0, y0 = 0; y < dst->height; y++)
40    {
41        int toty = 0, ny;
42
43        memset(aline, 0, 3 * dw * sizeof(int));
44        memset(line, 0, 3 * dw * sizeof(int));
45
46        while(toty < sh)
47        {
48            if(remy == 0)
49            {
50                for(x = 0, x0 = 0; x < dst->width; x++)
51                {
52                    int remx = 0, totx = 0, nx;
53                    int ar = 0, ag = 0, ab = 0;
54                    int r = 0, g = 0, b = 0;
55
56                    while(totx < sw)
57                    {
58                        if(remx == 0)
59                        {
60                            pipi_getpixel(src, x0, y0, &r, &g, &b);
61                            x0++;
62                            remx = dw;
63                        }
64
65                        nx = (totx + remx <= sw) ? remx : sw - totx;
66                        ar += nx * r; ag += nx * g; ab += nx * b;
67                        totx += nx;
68                        remx -= nx;
69                    }
70
71                    line[3 * x] = ar;
72                    line[3 * x + 1] = ag;
73                    line[3 * x + 2] = ab;
74/* HACK */
75pipi_setpixel(dst, x, y, ar / sw, ag / sw, ab / sw);
76                }
77
78                y0++;
79                remy = dh;
80//printf("  remy is now %i\n", remy);
81            }
82
83            ny = (toty + remy <= sh) ? remy : sh - toty;
84            for(x = 0; x < dst->width; x++)
85            {
86                aline[3 * x] += ny * line[3 * x];
87                aline[3 * x + 1] += ny * line[3 * x + 1];
88                aline[3 * x + 2] += ny * line[3 * x + 2];
89            }
90            toty += ny;
91            remy -= ny;
92//printf("  remy-- %i\n", remy);
93        }
94//printf("pasting line %i (src line now %i)\n", y, y0);
95
96#if 0
97        for(x = 0; x < dst->width; x++)
98            pipi_setpixel(dst, x, y,
99                          aline[3 * x] / (sw * sh),
100                          aline[3 * x + 1] / (sw * sh),
101                          aline[3 * x + 2] / (sw * sh));
102#endif
103    }
104
105    free(aline);
106    free(line);
107
108    return dst;
109}
110
Note: See TracBrowser for help on using the repository browser.