File Coverage

flip.im
Criterion Covered Total %
statement 112 115 97.3
branch 49 60 81.6
condition n/a
subroutine n/a
pod n/a
total 161 175 92.0


line stmt bran cond sub pod time code
1             #define IMAGER_NO_CONTEXT
2             #include "imager.h"
3              
4             static void flip_h(i_img *im);
5             static void flip_v(i_img *im);
6             static void flip_hv(i_img *im);
7              
8             #define XAXIS 0
9             #define YAXIS 1
10             #define XYAXIS 2
11              
12             /*
13             =item i_flipxy(im, axis)
14              
15             Flips the image inplace around the axis specified.
16             Returns 0 if parameters are invalid.
17              
18             im - Image pointer
19             axis - 0 = x, 1 = y, 2 = both
20              
21             =cut
22             */
23              
24             undef_int
25 143           i_flipxy(i_img *im, int direction) {
26 143           dIMCTXim(im);
27 143           i_clear_error();
28              
29 143           im_log((aIMCTX, 1, "i_flipxy(im %p, direction %d)\n", im, direction ));
30              
31 143           switch (direction) {
32             case XAXIS: /* Horizontal flip */
33 47           flip_h(im);
34 47           break;
35              
36             case YAXIS: /* Vertical flip */
37 53           flip_v(im);
38 53           break;
39              
40             case XYAXIS: /* Horizontal and Vertical flip */
41 43           flip_hv(im);
42 43           break;
43              
44             default:
45 0           im_log((aIMCTX, 1, "i_flipxy: direction is invalid\n" ));
46 0           im_push_errorf(aIMCTX, 0, "direction %d invalid", direction);
47 0           return 0;
48             }
49 143           return 1;
50             }
51              
52             static void
53 300           flip_row_pal(i_palidx *row, i_img_dim width) {
54             i_palidx tmp;
55 300           i_palidx *leftp = row;
56 300           i_palidx *rightp = row + width - 1;
57            
58 22800 100         while (leftp < rightp) {
59 22500           tmp = *leftp;
60 22500           *leftp = *rightp;
61 22500           *rightp = tmp;
62 22500           ++leftp;
63 22500           --rightp;
64             }
65 300           }
66              
67             #code
68              
69             static void
70 2540           IM_SUFFIX(flip_row)(IM_COLOR *row, i_img_dim width) {
71             IM_COLOR tmp;
72 2540           IM_COLOR *leftp = row;
73 2540           IM_COLOR *rightp = row + width - 1;
74            
75 83600 100         while (leftp < rightp) {
    100          
76 81060           tmp = *leftp;
77 81060           *leftp = *rightp;
78 81060           *rightp = tmp;
79 81060           ++leftp;
80 81060           --rightp;
81             }
82 2540           }
83              
84             #/code
85              
86             static void
87 47           flip_h(i_img *im) {
88             i_img_dim y;
89 47 100         if (im->type == i_palette_type) {
90 1           i_palidx *line = mymalloc(im->xsize * sizeof(i_palidx));
91 151 100         for (y = 0; y < im->ysize; ++y) {
92 150 50         i_gpal(im, 0, im->xsize, y, line);
93 150           flip_row_pal(line, im->xsize);
94 150 50         i_ppal(im, 0, im->xsize, y, line);
95             }
96 1           myfree(line);
97             }
98             else {
99 46 100         #code im->bits == i_8_bits
100 46           IM_COLOR *line = mymalloc(im->xsize * sizeof(IM_COLOR));
101 1551 100         for (y = 0; y < im->ysize; ++y) {
    100          
102 1505           IM_GLIN(im, 0, im->xsize, y, line);
103 1505           IM_SUFFIX(flip_row)(line, im->xsize);
104 1505           IM_PLIN(im, 0, im->xsize, y, line);
105             }
106 46           myfree(line);
107             #/code
108             }
109 47           }
110              
111             static void
112 53           flip_v(i_img *im) {
113 53           i_img_dim topy = 0;
114 53           i_img_dim boty = im->ysize - 1;
115 53 100         if (im->type == i_palette_type) {
116 6           i_palidx *top_line = mymalloc(im->xsize * sizeof(i_palidx));
117 6           i_palidx *bot_line = mymalloc(im->xsize * sizeof(i_palidx));
118 261 100         while (topy < boty) {
119 255 50         i_gpal(im, 0, im->xsize, topy, top_line);
120 255 50         i_gpal(im, 0, im->xsize, boty, bot_line);
121 255 50         i_ppal(im, 0, im->xsize, topy, bot_line);
122 255 50         i_ppal(im, 0, im->xsize, boty, top_line);
123 255           ++topy;
124 255           --boty;
125             }
126 6           myfree(bot_line);
127 6           myfree(top_line);
128             }
129             else {
130 47 100         #code im->bits == i_8_bits
131 47           IM_COLOR *top_line = mymalloc(im->xsize * sizeof(IM_COLOR));
132 47           IM_COLOR *bot_line = mymalloc(im->xsize * sizeof(IM_COLOR));
133 808 100         while (topy < boty) {
    100          
134 761           IM_GLIN(im, 0, im->xsize, topy, top_line);
135 761           IM_GLIN(im, 0, im->xsize, boty, bot_line);
136 761           IM_PLIN(im, 0, im->xsize, topy, bot_line);
137 761           IM_PLIN(im, 0, im->xsize, boty, top_line);
138 761           ++topy;
139 761           --boty;
140             }
141 47           myfree(top_line);
142 47           myfree(bot_line);
143             #/code
144             }
145 53           }
146              
147             static void
148 43           flip_hv(i_img *im) {
149 43           i_img_dim topy = 0;
150 43           i_img_dim boty = im->ysize - 1;
151 43 100         if (im->type == i_palette_type) {
152 1           i_palidx *top_line = mymalloc(im->xsize * sizeof(i_palidx));
153 1           i_palidx *bot_line = mymalloc(im->xsize * sizeof(i_palidx));
154 76 100         while (topy < boty) {
155 75 50         i_gpal(im, 0, im->xsize, topy, top_line);
156 75 50         i_gpal(im, 0, im->xsize, boty, bot_line);
157 75           flip_row_pal(top_line, im->xsize);
158 75           flip_row_pal(bot_line, im->xsize);
159 75 50         i_ppal(im, 0, im->xsize, topy, bot_line);
160 75 50         i_ppal(im, 0, im->xsize, boty, top_line);
161 75           ++topy;
162 75           --boty;
163             }
164 1           myfree(bot_line);
165 1           myfree(top_line);
166             }
167             else {
168 42 100         #code im->bits == i_8_bits
169 42           IM_COLOR *top_line = mymalloc(im->xsize * sizeof(IM_COLOR));
170 42           IM_COLOR *bot_line = mymalloc(im->xsize * sizeof(IM_COLOR));
171 559 100         while (topy < boty) {
    100          
172 517           IM_GLIN(im, 0, im->xsize, topy, top_line);
173 517           IM_GLIN(im, 0, im->xsize, boty, bot_line);
174 517           IM_SUFFIX(flip_row)(top_line, im->xsize);
175 517           IM_SUFFIX(flip_row)(bot_line, im->xsize);
176 517           IM_PLIN(im, 0, im->xsize, topy, bot_line);
177 517           IM_PLIN(im, 0, im->xsize, boty, top_line);
178 517           ++topy;
179 517           --boty;
180             }
181 42 100         if (topy == boty) {
    50          
182 1           IM_GLIN(im, 0, im->xsize, topy, top_line);
183 1           IM_SUFFIX(flip_row)(top_line, im->xsize);
184 1           IM_PLIN(im, 0, im->xsize, topy, top_line);
185             }
186 42           myfree(top_line);
187 42           myfree(bot_line);
188             #/code
189             }
190 43           }