apple_png 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/ext/apple_png/apple_png.c +82 -4
  2. metadata +1 -1
@@ -123,6 +123,12 @@ static int png_deflate(unsigned char *data, uint32_t length, unsigned char **out
123
123
  return APPLE_PNG_OK;
124
124
  }
125
125
 
126
+ static void flip_colors(unsigned char *pixelData, size_t index) {
127
+ char tmp = pixelData[index];
128
+ pixelData[index] = pixelData[index + 2];
129
+ pixelData[index + 2] = tmp;
130
+ }
131
+
126
132
  /* flip first and third color in uncompressed png pixel data */
127
133
  static void flip_color_bytes(unsigned char *pixelData, uint32_t width, uint32_t height) {
128
134
  uint32_t x, y;
@@ -131,9 +137,75 @@ static void flip_color_bytes(unsigned char *pixelData, uint32_t width, uint32_t
131
137
  for (y = 0; y < height; y++) {
132
138
  i += 1;
133
139
  for (x = 0; x < width; x++) {
134
- char tmp = pixelData[i];
135
- pixelData[i] = pixelData[i + 2];
136
- pixelData[i + 2] = tmp;
140
+ flip_colors(pixelData, i);
141
+ i += 4;
142
+ }
143
+ }
144
+ }
145
+
146
+ static void interlaced_flip_color_bytes(unsigned char *pixelData, uint32_t width, uint32_t height) {
147
+ uint32_t x, y;
148
+ size_t i = 0;
149
+
150
+ // pass 1
151
+ for (y = 0; y < height; y += 8) {
152
+ i += 1;
153
+ for (x = 0; x < width; x += 8) {
154
+ flip_colors(pixelData, i);
155
+ i += 4;
156
+ }
157
+ }
158
+
159
+ // pass 2
160
+ for (y = 0; y < height; y += 8) {
161
+ i += 1;
162
+ for (x = 5; x < width; x += 8) {
163
+ flip_colors(pixelData, i);
164
+ i += 4;
165
+ }
166
+ }
167
+
168
+ // pass 3
169
+ for (y = 4; y < height; y += 8) {
170
+ i += 1;
171
+ for (x = 0; x < width; x += 4) {
172
+ flip_colors(pixelData, i);
173
+ i += 4;
174
+ }
175
+ }
176
+
177
+ // pass 4
178
+ for (y = 0; y < height; y += 4) {
179
+ i += 1;
180
+ for (x = 2; x < width; x += 4) {
181
+ flip_colors(pixelData, i);
182
+ i += 4;
183
+ }
184
+ }
185
+
186
+ // pass 5
187
+ for (y = 2; y < height; y += 4) {
188
+ i += 1;
189
+ for (x = 0; x < width; x += 2) {
190
+ flip_colors(pixelData, i);
191
+ i += 4;
192
+ }
193
+ }
194
+
195
+ // pass 6
196
+ for (y = 0; y < height; y += 2) {
197
+ i += 1;
198
+ for (x = 1; x < width; x += 2) {
199
+ flip_colors(pixelData, i);
200
+ i += 4;
201
+ }
202
+ }
203
+
204
+ // pass 7
205
+ for (y = 1; y < height; y += 2) {
206
+ i += 1;
207
+ for (x = 0; x < width; x++) {
208
+ flip_colors(pixelData, i);
137
209
  i += 4;
138
210
  }
139
211
  }
@@ -194,7 +266,13 @@ static int readPngChunks(VALUE self, const char *oldPNG, size_t oldPngLength, dy
194
266
  dyn_arr_free(applePngCompressedPixelData);
195
267
  return error;
196
268
  }
197
- flip_color_bytes(decompressedPixelData, width, height);
269
+
270
+ if (interlaced) {
271
+ interlaced_flip_color_bytes(decompressedPixelData, width, height);
272
+ } else {
273
+ flip_color_bytes(decompressedPixelData, width, height);
274
+ }
275
+
198
276
  error = png_deflate(decompressedPixelData, uncompressed_size, &standardPngCompressedPixelData, &compressed_size);
199
277
  if (error != APPLE_PNG_OK) {
200
278
  dyn_arr_free(applePngCompressedPixelData);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apple_png
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: