1 /* scale image from SRC to DST - parameterized by type T */
2 
3 /* get pixel address of point (x,y) in image t */
4 #define getP(t,x,y) \
5 	(T *) (&ximage[t]->data[(ximage[t]->xoffset+(x))*sizeof(T) + \
6 	                        (y)*ximage[t]->bytes_per_line])
7 
8 {
9 	int i, j, k;
10 
11 	/* copy scaled lines from SRC to DST */
12 	j = flipxy ? width[SRC] - 1 : height[SRC] - 1;
13 	do {
14 		T *p1;
15 		T *p2;
16 		int p2step;
17 		T *p1_save;
18 
19 		/* p1 point to begining of scanline j*magy in DST */
20 		p1 = getP(DST,0,j*magy);
21 		p1_save = p1;
22 		/* p2 point to begining of scanline j in SRC */
23 		/* if flipy then line height[SRC]-1-j */
24 		p2 = getP(SRC,0,flipy ? (height[SRC]-1-j) : j);
25 
26 		if (flipxy)
27 		{
28 			p2 = getP(SRC,flipy ? j : (width[SRC]-1-j),0);
29 			p2step = ximage[SRC]->bytes_per_line / sizeof(T);
30 
31 			if (flipx)
32 			{
33 				p2 += p2step * (height[SRC]-1);
34 				p2step = -p2step;
35 			}
36 
37 			i = height[SRC];
38 			do {
39 				T c = *p2; p2 += p2step;
40 				k = magx; do *p1++ = c; while (--k > 0);
41 			} while (--i > 0);
42 		}
43 		else if (flipx)
44 		{
45 			p2 += width[SRC];
46 			i = width[SRC];
47 			do {
48 				T c = *--p2;
49 				k = magx; do *p1++ = c; while (--k > 0);
50 			} while (--i > 0);
51 		}
52 		else
53 		{
54 			i = width[SRC];
55 			do {
56 				T c = *p2++;
57 				k = magx; do *p1++ = c; while (--k > 0);
58 			} while (--i > 0);
59 		}
60 
61 		/* draw vertical grid */
62 		if (gridy && magx >= 2)
63 		{
64 			p1 = p1_save - 1;
65 			i = magx;
66 			k = flipxy ? height[SRC] : width[SRC];
67 			do {
68 				p1 += i;
69 				*p1 ^= ~((T)0);
70 			} while (--k > 0);
71 		}
72 
73 		/* duplicate that line as needed */
74 		if (magy > 1)
75 		{
76 			/* p1 point to begining of scanline j*magy in DST */
77 			p1 = p1_save;
78 			/* p2 points to begining of next line */
79 			p2 = p1;
80 			p2step = ximage[DST]->bytes_per_line / sizeof(T);
81 
82 			i = width[DST] * sizeof(T);
83 			k = magy - 1;
84 			do {
85 				p2 += p2step;
86 				memcpy(p2, p1, i);
87 			} while (--k > 0);
88 
89 			/* draw horizontal grid */
90 			if (gridx && magy >= 2)
91 			{
92 				k = width[DST];
93 				do {
94 					*p2++ ^= ~((T)0);
95 				} while (--k > 0);
96 			}
97 		}
98 	} while (--j >= 0);
99 }
100 
101 #undef getP
102 
103