oily_png 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -5,4 +5,5 @@ Makefile
5
5
  /.bundle/
6
6
  /pkg
7
7
  oily_png-*.gem
8
- .DS_Store
8
+ .DS_Store
9
+ /spec/resources/_*.*
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oily_png (0.0.5)
4
+ oily_png (0.0.6)
5
5
  chunky_png (~> 0.10.2)
6
6
 
7
7
  GEM
@@ -1,2 +1,3 @@
1
1
  require 'mkmf'
2
+ $CFLAGS << ' -Wall'
2
3
  create_makefile('oily_png/oily_png_ext')
@@ -1,6 +1,5 @@
1
1
  #include "oily_png_ext.h"
2
2
 
3
- // Initialize the extension by creating the OilyPNG modules.
4
3
  void Init_oily_png_ext() {
5
4
  VALUE OilyPNG = rb_define_module("OilyPNG");
6
5
 
@@ -13,7 +12,6 @@ void Init_oily_png_ext() {
13
12
  rb_define_method(OilyPNG_PNGEncoding, "encode_png_image_pass_to_stream", oily_png_encode_png_image_pass_to_stream, 3);
14
13
  }
15
14
 
16
- // Returns the number of bytes per pixel for a given color mode.
17
15
  int oily_png_pixel_size(int color_mode) {
18
16
  switch (color_mode) {
19
17
  case OILY_PNG_COLOR_GRAYSCALE: return 1;
@@ -21,6 +19,6 @@ int oily_png_pixel_size(int color_mode) {
21
19
  case OILY_PNG_COLOR_INDEXED: return 1;
22
20
  case OILY_PNG_COLOR_GRAYSCALE_ALPHA: return 2;
23
21
  case OILY_PNG_COLOR_TRUECOLOR_ALPHA: return 4;
24
- default: return -1;
22
+ default: rb_raise(rb_eRuntimeError, "Unsupported color mode: %d", color_mode);
25
23
  }
26
24
  }
@@ -24,7 +24,21 @@
24
24
  #include "png_decoding.h"
25
25
  #include "png_encoding.h"
26
26
 
27
+
28
+ /*
29
+ Initialize the extension by creating the OilyPNG modules, and registering
30
+ the encoding and decoding replacement functions.
31
+
32
+ Note, this does not actually replace functionality in ChunkyPNG; you will need
33
+ to extend the ChunkyPNG::Canvas class with the OilyPNG::PNGDecoding module to
34
+ speed up decoding, and include OilyPNG::PNGEncoding into the same class to speed
35
+ up encoding. This is done in lib/oily_png.rb
36
+ */
27
37
  void Init_oily_png_ext();
38
+
39
+ /*
40
+ Returns the number of bytes per pixel for a given color mode.
41
+ */
28
42
  int oily_png_pixel_size(int color_mode);
29
43
 
30
- #endif
44
+ #endif
@@ -1,77 +1,73 @@
1
1
  #include "oily_png_ext.h"
2
2
 
3
- ////////////////////////////////////////////////////////////////////////////
4
-
5
- // Decodes a pixel at the given position in the bytearray
6
- PIXEL oily_png_decode_pixel(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
7
- switch (color_mode) {
8
- case OILY_PNG_COLOR_GRAYSCALE:
9
- return (bytes[byte_index] << 24) + (bytes[byte_index] << 16) + (bytes[byte_index] << 8) + 0xff;
10
- case OILY_PNG_COLOR_TRUECOLOR:
11
- return (bytes[byte_index] << 24) + (bytes[byte_index + 1] << 16) + (bytes[byte_index + 2] << 8) + 0xff;
12
- case OILY_PNG_COLOR_INDEXED:
13
- return NUM2UINT(rb_funcall(decoding_palette, rb_intern("[]"), 1, INT2FIX(bytes[byte_index])));
14
- case OILY_PNG_COLOR_GRAYSCALE_ALPHA:
15
- return (bytes[byte_index] << 24) + (bytes[byte_index] << 16) + (bytes[byte_index] << 8) + bytes[byte_index + 1];
16
- case OILY_PNG_COLOR_TRUECOLOR_ALPHA:
17
- return (bytes[byte_index] << 24) + (bytes[byte_index + 1] << 16) + (bytes[byte_index + 2] << 8) + bytes[byte_index + 3];
18
- default:
19
- exit(1);
20
- }
21
- }
22
3
 
23
4
  // Decodes a SUB filtered scanline at the given position in the byte array
24
5
  void oily_png_decode_filter_sub(BYTE* bytes, int pos, int line_length, int pixel_size) {
25
6
  int i;
26
7
  for (i = 1 + pixel_size; i < line_length; i++) {
27
- bytes[pos + i] += bytes[pos + i - pixel_size]; // mod 256 ???
8
+ UNFILTER_BYTE(bytes[pos + i], bytes[pos + i - pixel_size]);
28
9
  }
29
10
  }
30
11
 
31
12
  // Decodes an UP filtered scanline at the given position in the byte array
32
- void oily_png_decode_filter_up(BYTE* bytes, int pos, int line_length, int pixel_size) {
13
+ void oily_png_decode_filter_up(BYTE* bytes, int pos, int line_size, int pixel_size) {
33
14
  int i;
34
15
  // The first line is not filtered because there is no privous line
35
- if (pos >= line_length) {
36
- for (i = 1; i < line_length; i++) {
37
- bytes[pos + i] += bytes[pos + i - line_length]; // mod 256 ???
16
+ if (pos >= line_size) {
17
+ for (i = 1; i < line_size; i++) {
18
+ UNFILTER_BYTE(bytes[pos + i], bytes[pos + i - line_size]);
38
19
  }
39
20
  }
40
21
  }
41
22
 
42
23
  // Decodes an AVERAGE filtered scanline at the given position in the byte array
43
- void oily_png_decode_filter_average(BYTE* bytes, int pos, int line_length, int pixel_size) {
24
+ void oily_png_decode_filter_average(BYTE* bytes, int pos, int line_size, int pixel_size) {
44
25
  int i;
45
26
  BYTE a, b;
46
- for (i = 1; i < line_length; i++) {
27
+ for (i = 1; i < line_size; i++) {
47
28
  a = (i > pixel_size) ? bytes[pos + i - pixel_size] : 0;
48
- b = (pos >= line_length) ? bytes[pos + i - line_length] : 0;
49
- bytes[pos + i] += (a + b) >> 1; // mod 256 ???
29
+ b = (pos >= line_size) ? bytes[pos + i - line_size] : 0;
30
+ UNFILTER_BYTE(bytes[pos + i], (a + b) >> 1);
50
31
  }
51
32
  }
52
33
 
53
34
  // Decodes a PAETH filtered scanline at the given position in the byte array
54
- void oily_png_decode_filter_paeth(BYTE* bytes, int pos, int line_length, int pixel_size) {
35
+ void oily_png_decode_filter_paeth(BYTE* bytes, int pos, int line_size, int pixel_size) {
55
36
  BYTE a, b, c, pr;
56
37
  int i, p, pa, pb, pc;
57
- for (i = 1; i < line_length; i++) {
38
+ for (i = 1; i < line_size; i++) {
58
39
  a = (i > pixel_size) ? bytes[pos + i - pixel_size] : 0;
59
- b = (pos >= line_length) ? bytes[pos + i - line_length] : 0;
60
- c = (pos >= line_length && i > pixel_size) ? bytes[pos + i - line_length - pixel_size] : 0;
40
+ b = (pos >= line_size) ? bytes[pos + i - line_size] : 0;
41
+ c = (pos >= line_size && i > pixel_size) ? bytes[pos + i - line_size - pixel_size] : 0;
61
42
  p = a + b - c;
62
43
  pa = abs(p - a);
63
44
  pb = abs(p - b);
64
45
  pc = abs(p - c);
65
46
  pr = (pa <= pb) ? (pa <= pc ? a : c) : (pb <= pc ? b : c);
66
- bytes[pos + i] += pr; // mod 256 ???
47
+ UNFILTER_BYTE(bytes[pos + i], pr);
67
48
  }
68
49
  }
69
50
 
70
- /*
71
- Decodes an image pass from the given byte stream at the given position.
72
- A normal PNG will only have one pass that consumes the entire stream, while an
73
- interlaced image requires 7 passes which are loaded from different starting positions.
74
- */
51
+ PIXEL oily_png_decode_pixel_grayscale(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
52
+ return BUILD_PIXEL(bytes[byte_index], bytes[byte_index], bytes[byte_index], 0xff);
53
+ }
54
+
55
+ PIXEL oily_png_decode_pixel_truecolor(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
56
+ return BUILD_PIXEL(bytes[byte_index], bytes[byte_index + 1], bytes[byte_index + 2], 0xff);
57
+ }
58
+
59
+ PIXEL oily_png_decode_pixel_indexed(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
60
+ return (PIXEL) NUM2UINT(rb_funcall(decoding_palette, rb_intern("[]"), 1, INT2FIX(bytes[byte_index])));
61
+ }
62
+
63
+ PIXEL oily_png_decode_pixel_grayscale_alpha(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
64
+ return BUILD_PIXEL(bytes[byte_index], bytes[byte_index], bytes[byte_index], bytes[byte_index + 1]);
65
+ }
66
+
67
+ PIXEL oily_png_decode_pixel_truecolor_alpha(int color_mode, BYTE* bytes, int byte_index, VALUE decoding_palette) {
68
+ return BUILD_PIXEL(bytes[byte_index], bytes[byte_index + 1], bytes[byte_index + 2], bytes[byte_index + 3]);
69
+ }
70
+
75
71
  VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALUE height, VALUE color_mode, VALUE start_pos) {
76
72
 
77
73
  int pixel_size = oily_png_pixel_size(FIX2INT(color_mode));
@@ -80,8 +76,9 @@ VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALU
80
76
 
81
77
  VALUE pixels = rb_ary_new();
82
78
 
79
+ // Make sure that the stream is large enough to contain out pass.
83
80
  if (RSTRING_LEN(stream) < pass_size + FIX2INT(start_pos)) {
84
- exit(1);
81
+ rb_raise(rb_eRuntimeError, "The length of the stream is too short to contain the image!");
85
82
  }
86
83
 
87
84
  // Copy the bytes for this pass from the stream to a separate location
@@ -96,8 +93,18 @@ VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALU
96
93
  decoding_palette = rb_funcall(self, rb_intern("decoding_palette"), 0);
97
94
  }
98
95
 
99
- int y, x, line_start, prev_line_start, byte_index, pixel_index;
100
- BYTE filter;
96
+ // Select the pixel decoder function for this color mode.
97
+ PIXEL (*pixel_decoder)(int, BYTE*, int, VALUE);
98
+ switch (FIX2INT(color_mode)) {
99
+ case OILY_PNG_COLOR_GRAYSCALE: pixel_decoder = &oily_png_decode_pixel_grayscale; break;
100
+ case OILY_PNG_COLOR_TRUECOLOR: pixel_decoder = &oily_png_decode_pixel_truecolor; break;
101
+ case OILY_PNG_COLOR_INDEXED: pixel_decoder = &oily_png_decode_pixel_indexed; break;
102
+ case OILY_PNG_COLOR_GRAYSCALE_ALPHA: pixel_decoder = &oily_png_decode_pixel_grayscale_alpha; break;
103
+ case OILY_PNG_COLOR_TRUECOLOR_ALPHA: pixel_decoder = &oily_png_decode_pixel_truecolor_alpha; break;
104
+ default: rb_raise(rb_eRuntimeError, "Color mode not supported: %d", color_mode);
105
+ }
106
+
107
+ int y, x, line_start, byte_index, pixel_index;
101
108
  PIXEL pixel;
102
109
 
103
110
  for (y = 0; y < FIX2INT(height); y++) {
@@ -110,7 +117,7 @@ VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALU
110
117
  case OILY_PNG_FILTER_UP: oily_png_decode_filter_up( bytes, line_start, line_size, pixel_size); break;
111
118
  case OILY_PNG_FILTER_AVERAGE: oily_png_decode_filter_average( bytes, line_start, line_size, pixel_size); break;
112
119
  case OILY_PNG_FILTER_PAETH: oily_png_decode_filter_paeth( bytes, line_start, line_size, pixel_size); break;
113
- default: exit(1);
120
+ default: rb_raise(rb_eRuntimeError, "Filter type not supported: %d", bytes[line_start]);
114
121
  }
115
122
 
116
123
  // Set the filter byte to 0 because the bytearray is now unfiltered.
@@ -120,7 +127,7 @@ VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALU
120
127
  for (x = 0; x < FIX2INT(width); x++) {
121
128
  pixel_index = FIX2INT(width) * y + x;
122
129
  byte_index = line_start + 1 + (x * pixel_size);
123
- pixel = oily_png_decode_pixel(FIX2INT(color_mode), bytes, byte_index, decoding_palette);
130
+ pixel = pixel_decoder(FIX2INT(color_mode), bytes, byte_index, decoding_palette);
124
131
  rb_ary_store(pixels, pixel_index, INT2NUM(pixel));
125
132
  }
126
133
  }
@@ -1,7 +1,16 @@
1
1
  #ifndef PNG_DECODING_H
2
2
  #define PNG_DECODING_H
3
3
 
4
- // Function to overwrite ChunkyPNG::Canvas::PNGDecoding.decode_png_image_pass
4
+ #define BUILD_PIXEL(r, g, b, a) (((PIXEL) r << 24) + ((PIXEL) g << 16) + ((PIXEL) b << 8) + (PIXEL) a)
5
+ #define UNFILTER_BYTE(byte, adjustment) byte = (BYTE) (((byte) + (adjustment)) & 0x000000ff)
6
+
7
+ /*
8
+ Decodes an image pass from the given byte stream at the given position.
9
+ A normal PNG will only have one pass that consumes the entire stream, while an
10
+ interlaced image requires 7 passes which are loaded from different starting positions.
11
+
12
+ This function shouild replace ChunkyPNG::Canvas::PNGDecoding.decode_png_image_pass
13
+ */
5
14
  VALUE oily_png_decode_png_image_pass(VALUE self, VALUE stream, VALUE width, VALUE height, VALUE color_mode, VALUE start_pos);
6
15
 
7
16
  #endif
@@ -1,42 +1,37 @@
1
1
  #include "oily_png_ext.h"
2
2
 
3
- PIXEL oily_png_encode_get_pixel(VALUE self, long index) {
4
- VALUE pixels = rb_funcall(self, rb_intern("pixels"), 0);
5
- return NUM2UINT(rb_ary_entry(pixels, index));
6
- }
7
-
8
3
  void oily_png_encode_pixel(PIXEL pixel, int color_mode, BYTE* bytes, int pos, VALUE palette) {
9
4
  switch (color_mode) {
10
5
  case OILY_PNG_COLOR_GRAYSCALE:
11
- bytes[pos] = (BYTE) ((pixel & (PIXEL) 0xff000000) >> 24);
6
+ bytes[pos] = R_BYTE(pixel);
12
7
  break;
13
8
  case OILY_PNG_COLOR_TRUECOLOR:
14
- bytes[pos + 0] = (BYTE) ((pixel & (PIXEL) 0xff000000) >> 24);
15
- bytes[pos + 1] = (BYTE) ((pixel & (PIXEL) 0x00ff0000) >> 16);
16
- bytes[pos + 2] = (BYTE) ((pixel & (PIXEL) 0x0000ff00) >> 8);
9
+ bytes[pos + 0] = R_BYTE(pixel);
10
+ bytes[pos + 1] = G_BYTE(pixel);
11
+ bytes[pos + 2] = B_BYTE(pixel);
17
12
  break;
18
13
  case OILY_PNG_COLOR_INDEXED:
19
14
  bytes[pos] = (BYTE) NUM2UINT(rb_funcall(palette, rb_intern("index"), 1, UINT2NUM(pixel)));
20
15
  break;
21
16
  case OILY_PNG_COLOR_GRAYSCALE_ALPHA:
22
- bytes[pos + 0] = (BYTE) ((pixel & (PIXEL) 0xff000000) >> 24);
23
- bytes[pos + 1] = (BYTE) ((pixel & (PIXEL) 0x000000ff));
17
+ bytes[pos + 0] = R_BYTE(pixel);
18
+ bytes[pos + 1] = A_BYTE(pixel);
24
19
  break;
25
20
  case OILY_PNG_COLOR_TRUECOLOR_ALPHA:
26
- bytes[pos + 0] = (BYTE) ((pixel & (PIXEL) 0xff000000) >> 24);
27
- bytes[pos + 1] = (BYTE) ((pixel & (PIXEL) 0x00ff0000) >> 16);
28
- bytes[pos + 2] = (BYTE) ((pixel & (PIXEL) 0x0000ff00) >> 8);
29
- bytes[pos + 3] = (BYTE) ((pixel & (PIXEL) 0x000000ff));
21
+ bytes[pos + 0] = R_BYTE(pixel);
22
+ bytes[pos + 1] = G_BYTE(pixel);
23
+ bytes[pos + 2] = B_BYTE(pixel);
24
+ bytes[pos + 3] = A_BYTE(pixel);
30
25
  break;
31
26
  default:
32
- exit(1);
27
+ rb_raise(rb_eRuntimeError, "Unsupported color mode: %d", color_mode);
33
28
  }
34
29
  }
35
30
 
36
31
  void oily_png_encode_filter_sub(BYTE* bytes, int pos, int line_size, int pixel_size) {
37
32
  int x;
38
33
  for (x = line_size - 1; x > pixel_size; x--) {
39
- bytes[pos + x] -= bytes[pos + x - pixel_size];
34
+ FILTER_BYTE(bytes[pos + x], bytes[pos + x - pixel_size]);
40
35
  }
41
36
  }
42
37
 
@@ -44,7 +39,7 @@ void oily_png_encode_filter_up(BYTE* bytes, int pos, int line_size, int pixel_si
44
39
  int x;
45
40
  if (pos >= line_size) {
46
41
  for (x = line_size - 1; x > 0; x--) {
47
- bytes[pos + x] -= bytes[pos + x - line_size];
42
+ FILTER_BYTE(bytes[pos + x], bytes[pos + x - line_size]);
48
43
  }
49
44
  }
50
45
  }
@@ -54,7 +49,7 @@ void oily_png_encode_filter_average(BYTE* bytes, int pos, int line_size, int pix
54
49
  for (x = line_size - 1; x > 0; x--) {
55
50
  a = (x > pixel_size) ? bytes[pos + x - pixel_size] : 0;
56
51
  b = (pos >= line_size) ? bytes[pos + x - line_size] : 0;
57
- bytes[pos + x] -= ((a + b) >> 1);
52
+ FILTER_BYTE(bytes[pos + x], (a + b) >> 1);
58
53
  }
59
54
  }
60
55
 
@@ -69,18 +64,11 @@ void oily_png_encode_filter_paeth(BYTE* bytes, int pos, int line_size, int pixel
69
64
  pb = abs(p - b);
70
65
  pc = abs(p - c);
71
66
  pr = (pa <= pb && pa <= pc) ? a : (pb <= pc ? b : c);
72
- bytes[pos + x] -= pr;
67
+ FILTER_BYTE(bytes[pos + x], pr);
73
68
  }
74
69
 
75
70
  }
76
71
 
77
-
78
- /*
79
- Encodes an image and append it to the stream.
80
- A normal PNG will only have one pass and call this method once, while interlaced
81
- images are split up in 7 distinct images. This method will be called for every one
82
- of these images, reusing the stream.
83
- */
84
72
  VALUE oily_png_encode_png_image_pass_to_stream(VALUE self, VALUE stream, VALUE color_mode, VALUE filtering) {
85
73
 
86
74
  // Get the data
@@ -89,7 +77,7 @@ VALUE oily_png_encode_png_image_pass_to_stream(VALUE self, VALUE stream, VALUE c
89
77
  VALUE pixels = rb_funcall(self, rb_intern("pixels"), 0);
90
78
 
91
79
  if (RARRAY_LEN(pixels) != width * height) {
92
- exit(1);
80
+ rb_raise(rb_eRuntimeError, "The number of pixels does not match the canvas dimensions.");
93
81
  }
94
82
 
95
83
  VALUE palette = Qnil;
@@ -123,12 +111,11 @@ VALUE oily_png_encode_png_image_pass_to_stream(VALUE self, VALUE stream, VALUE c
123
111
  case OILY_PNG_FILTER_UP: oily_png_encode_filter_up( bytes, line_size * y, line_size, pixel_size); break;
124
112
  case OILY_PNG_FILTER_AVERAGE: oily_png_encode_filter_average( bytes, line_size * y, line_size, pixel_size); break;
125
113
  case OILY_PNG_FILTER_PAETH: oily_png_encode_filter_paeth( bytes, line_size * y, line_size, pixel_size); break;
126
- default: exit(1);
114
+ default: rb_raise(rb_eRuntimeError, "Unsupported filter type: %d", FIX2INT(filtering));
127
115
  }
128
116
  }
129
117
  }
130
118
 
131
- rb_str_cat(stream, bytes, pass_size);
132
-
119
+ rb_str_cat(stream, (char*) bytes, pass_size);
133
120
  return Qnil;
134
- }
121
+ }
@@ -1,7 +1,21 @@
1
1
  #ifndef PNG_ENCODING_H
2
2
  #define PNG_ENCODING_H
3
3
 
4
- // Function to overwrite ChunkyPNG::Canvas::PNGEncoding.encode_png_image_pass_to_stream
4
+ #define R_BYTE(pixel) ((BYTE) ((pixel & (PIXEL) 0xff000000) >> 24))
5
+ #define G_BYTE(pixel) ((BYTE) ((pixel & (PIXEL) 0x00ff0000) >> 16))
6
+ #define B_BYTE(pixel) ((BYTE) ((pixel & (PIXEL) 0x0000ff00) >> 8))
7
+ #define A_BYTE(pixel) ((BYTE) ((pixel & (PIXEL) 0x000000ff)))
8
+
9
+ #define FILTER_BYTE(byte, adjustment) byte = (BYTE) (((byte) - (adjustment)) & 0x000000ff)
10
+
11
+ /*
12
+ Encodes an image and append it to the stream.
13
+ A normal PNG will only have one pass and call this method once, while interlaced
14
+ images are split up in 7 distinct images. This method will be called for every one
15
+ of these images, reusing the stream.
16
+
17
+ This function should replace ChunkyPNG::Canvas::PNGEncoding.encode_png_image_pass_to_stream
18
+ */
5
19
  VALUE oily_png_encode_png_image_pass_to_stream(VALUE self, VALUE stream, VALUE color_mode, VALUE filtering);
6
20
 
7
21
  #endif
data/lib/oily_png.rb CHANGED
@@ -2,7 +2,7 @@ require 'chunky_png'
2
2
 
3
3
  module OilyPNG
4
4
 
5
- VERSION = "0.0.5"
5
+ VERSION = "0.0.6"
6
6
 
7
7
  def self.included(base)
8
8
  base::Canvas.send(:extend, OilyPNG::PNGDecoding)
data/oily_png.gemspec CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
4
4
 
5
5
  # Do not change the version and date fields by hand. This will be done
6
6
  # automatically by the gem release script.
7
- s.version = "0.0.5"
8
- s.date = "2010-10-05"
7
+ s.version = "0.0.6"
8
+ s.date = "2010-10-06"
9
9
 
10
10
  s.summary = "Native mixin to speed up ChunkyPNG"
11
11
  s.description = <<-EOT
@@ -19,7 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.extensions = ["ext/oily_png/extconf.rb"]
20
20
  s.require_paths = ["lib", "ext"]
21
21
 
22
- s.required_rubygems_version = '1.3.7'
23
22
  s.add_runtime_dependency('chunky_png', '~> 0.10.2')
24
23
 
25
24
  s.add_development_dependency('rake')
@@ -30,6 +29,6 @@ Gem::Specification.new do |s|
30
29
 
31
30
  # Do not change the files and test_files fields by hand. This will be done
32
31
  # automatically by the gem release script.
33
- s.files = %w(.gitignore Gemfile Gemfile.lock LICENSE README.rdoc Rakefile ext/oily_png/extconf.rb ext/oily_png/oily_png_ext.c ext/oily_png/oily_png_ext.h ext/oily_png/png_decoding.c ext/oily_png/png_decoding.h ext/oily_png/png_encoding.c ext/oily_png/png_encoding.h lib/oily_png.rb oily_png.gemspec spec/decoding_spec.rb spec/encoding_spec.rb spec/resources/gray.png spec/resources/operations.png spec/spec_helper.rb tasks/github-gem.rake)
32
+ s.files = %w(.gitignore Gemfile Gemfile.lock LICENSE README.rdoc Rakefile ext/oily_png/extconf.rb ext/oily_png/oily_png_ext.c ext/oily_png/oily_png_ext.h ext/oily_png/png_decoding.c ext/oily_png/png_decoding.h ext/oily_png/png_encoding.c ext/oily_png/png_encoding.h lib/oily_png.rb oily_png.gemspec spec/decoding_spec.rb spec/encoding_spec.rb spec/resources/gray.png spec/resources/interlaced.png spec/resources/operations.png spec/spec_helper.rb tasks/github-gem.rake)
34
33
  s.test_files = %w(spec/decoding_spec.rb spec/encoding_spec.rb)
35
34
  end
@@ -12,6 +12,12 @@ describe OilyPNG::PNGDecoding do
12
12
  OilyCanvas.from_file(resource_file('operations.png'))
13
13
  end
14
14
 
15
+ it "should decode an interlaced image correctly" do
16
+ c1 = OilyCanvas.from_file(resource_file('interlaced.png'))
17
+ c2 = ChunkyPNG::Canvas.from_file(resource_file('interlaced.png'))
18
+ c2.should == c1
19
+ end
20
+
15
21
  context 'decoding different filtering methods' do
16
22
  before(:all) { @reference = ChunkyPNG::Canvas.from_file(resource_file('operations.png'))}
17
23
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe OilyPNG::PNGEncoding do
4
4
 
5
5
  context 'encoding different color modes' do
6
- before do
6
+ before do
7
7
  @canvas = ChunkyPNG::Canvas.from_file(resource_file('gray.png'))
8
8
  @oily_canvas = OilyCanvas.from_canvas(@canvas)
9
9
  end
@@ -78,6 +78,14 @@ describe OilyPNG::PNGEncoding do
78
78
  @oily_canvas.send(:encode_png_image_pass_to_stream, stream1 = "", ChunkyPNG::COLOR_TRUECOLOR, ChunkyPNG::FILTER_PAETH)
79
79
  @canvas.send(:encode_png_image_pass_to_stream, stream2 = "", ChunkyPNG::COLOR_TRUECOLOR, ChunkyPNG::FILTER_PAETH)
80
80
  stream1.should == stream2
81
- end
81
+ end
82
+ end
83
+
84
+ it "should encode an interlaced image correctly" do
85
+ canvas = ChunkyPNG::Canvas.from_file(resource_file('interlaced.png'))
86
+ data = OilyCanvas.from_canvas(canvas).to_blob(:interlace => true)
87
+ ds = ChunkyPNG::Datastream.from_blob(data)
88
+ ds.header_chunk.interlace.should == ChunkyPNG::INTERLACING_ADAM7
89
+ ChunkyPNG::Canvas.from_datastream(ds).should == canvas
82
90
  end
83
91
  end
Binary file
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oily_png
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Willem van Bergen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-05 00:00:00 +02:00
18
+ date: 2010-10-06 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -91,6 +91,7 @@ files:
91
91
  - spec/decoding_spec.rb
92
92
  - spec/encoding_spec.rb
93
93
  - spec/resources/gray.png
94
+ - spec/resources/interlaced.png
94
95
  - spec/resources/operations.png
95
96
  - spec/spec_helper.rb
96
97
  - tasks/github-gem.rake
@@ -121,14 +122,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
122
  required_rubygems_version: !ruby/object:Gem::Requirement
122
123
  none: false
123
124
  requirements:
124
- - - "="
125
+ - - ">="
125
126
  - !ruby/object:Gem::Version
126
- hash: 21
127
+ hash: 3
127
128
  segments:
128
- - 1
129
- - 3
130
- - 7
131
- version: 1.3.7
129
+ - 0
130
+ version: "0"
132
131
  requirements: []
133
132
 
134
133
  rubyforge_project: oily_png