axon 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. data/CHANGELOG.rdoc +9 -3
  2. data/README.rdoc +29 -36
  3. data/Rakefile +26 -21
  4. data/TODO.rdoc +1 -6
  5. data/ext/axon/axon.c +6 -15
  6. data/ext/axon/extconf.rb +19 -9
  7. data/ext/axon/interpolation.c +147 -0
  8. data/ext/axon/jpeg.c +1207 -0
  9. data/ext/axon/png.c +542 -0
  10. data/lib/axon.rb +235 -32
  11. data/lib/axon/cropper.rb +80 -18
  12. data/lib/axon/fit.rb +69 -19
  13. data/lib/axon/generators.rb +109 -0
  14. data/lib/axon/scalers.rb +160 -0
  15. data/test/helper.rb +151 -6
  16. data/test/reader_tests.rb +37 -82
  17. data/test/scaler_tests.rb +102 -0
  18. data/test/stress_helper.rb +58 -0
  19. data/test/stress_tests.rb +8 -5
  20. data/test/test_bilinear_scaler.rb +60 -2
  21. data/test/test_cropper.rb +68 -1
  22. data/test/test_fit.rb +35 -0
  23. data/test/test_generators.rb +21 -0
  24. data/test/test_image.rb +61 -0
  25. data/test/test_jpeg_reader.rb +96 -94
  26. data/test/test_jpeg_writer.rb +95 -8
  27. data/test/test_nearest_neighbor_scaler.rb +28 -4
  28. data/test/test_png_reader.rb +12 -8
  29. data/test/test_png_writer.rb +8 -6
  30. data/test/writer_tests.rb +129 -111
  31. metadata +71 -128
  32. data/.gemtest +0 -0
  33. data/ext/axon/bilinear_interpolation.c +0 -115
  34. data/ext/axon/interpolation.h +0 -7
  35. data/ext/axon/jpeg_common.c +0 -118
  36. data/ext/axon/jpeg_common.h +0 -37
  37. data/ext/axon/jpeg_native_writer.c +0 -248
  38. data/ext/axon/jpeg_reader.c +0 -774
  39. data/ext/axon/nearest_neighbor_interpolation.c +0 -50
  40. data/ext/axon/png_common.c +0 -21
  41. data/ext/axon/png_common.h +0 -18
  42. data/ext/axon/png_native_writer.c +0 -166
  43. data/ext/axon/png_reader.c +0 -381
  44. data/lib/axon/axon.so +0 -0
  45. data/lib/axon/bilinear_scaler.rb +0 -60
  46. data/lib/axon/jpeg_writer.rb +0 -41
  47. data/lib/axon/nearest_neighbor_scaler.rb +0 -39
  48. data/lib/axon/png_writer.rb +0 -35
  49. data/lib/axon/scaler.rb +0 -41
  50. data/lib/axon/solid.rb +0 -23
  51. data/test/_test_readme.rb +0 -34
  52. data/test/test_exif.rb +0 -39
  53. data/test/test_generator.rb +0 -10
  54. data/test/test_icc.rb +0 -18
  55. data/test/test_jpeg.rb +0 -9
  56. data/test/test_png.rb +0 -9
metadata CHANGED
@@ -1,164 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: axon
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 2
10
- version: 0.0.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Timothy Elliott
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
12
+ date: 2012-01-06 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! 'axon reads, manipulates, and writes images.
17
15
 
18
- date: 2011-08-16 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: rake-compiler
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
33
- type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: hoe
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 23
44
- segments:
45
- - 2
46
- - 10
47
- version: "2.10"
48
- type: :development
49
- version_requirements: *id002
50
- description: |-
51
- Axon is a library for streaming and manipulating JPEG and PNG images. It scales
52
- and crops images along the way.
53
-
54
- By limiting its functionality, Axon is able to depend on two ubiquitous
55
- libraries: libjpeg and libpng. Axon can be installed anywhere those libraries
56
- are available.
57
-
58
- Axon never stores an entire image in memory. All images and operations are
59
- streamed from an input to an output. As a result, memory requirements and
60
- latency are low.
61
- email:
62
- - tle@holymonkey.com
63
- executables: []
64
16
 
65
- extensions:
66
- - ext/axon/extconf.rb
67
- extra_rdoc_files: []
17
+ axon depends only on libjpeg and libpng.
68
18
 
69
- files:
70
- - CHANGELOG.rdoc
19
+
20
+ axon never stores an entire image in memory. All images and operations are
21
+
22
+ streamed. This keeps memory requirements and latency low.
23
+
24
+ '
25
+ email: tle@holymonkey.com
26
+ executables: []
27
+ extensions:
28
+ - ext/axon/extconf.rb
29
+ extra_rdoc_files:
71
30
  - README.rdoc
31
+ - CHANGELOG.rdoc
32
+ - TODO.rdoc
33
+ files:
72
34
  - Rakefile
35
+ - README.rdoc
36
+ - CHANGELOG.rdoc
73
37
  - TODO.rdoc
74
- - ext/axon/bilinear_interpolation.c
75
- - ext/axon/extconf.rb
76
- - ext/axon/iccjpeg.c
77
- - ext/axon/iccjpeg.h
78
- - ext/axon/interpolation.h
79
- - ext/axon/jpeg_common.c
80
- - ext/axon/jpeg_common.h
81
- - ext/axon/jpeg_native_writer.c
82
- - ext/axon/jpeg_reader.c
83
- - ext/axon/axon.c
84
- - ext/axon/nearest_neighbor_interpolation.c
85
- - ext/axon/png_common.c
86
- - ext/axon/png_common.h
87
- - ext/axon/png_native_writer.c
88
- - ext/axon/png_reader.c
89
38
  - lib/axon.rb
90
- - lib/axon/bilinear_scaler.rb
91
- - lib/axon/cropper.rb
92
39
  - lib/axon/fit.rb
93
- - lib/axon/jpeg_writer.rb
94
- - lib/axon/axon.so
95
- - lib/axon/nearest_neighbor_scaler.rb
96
- - lib/axon/png_writer.rb
97
- - lib/axon/scaler.rb
98
- - lib/axon/solid.rb
99
- - test/_test_readme.rb
100
- - test/helper.rb
101
- - test/reader_tests.rb
102
- - test/stress_tests.rb
40
+ - lib/axon/cropper.rb
41
+ - lib/axon/scalers.rb
42
+ - lib/axon/generators.rb
43
+ - ext/axon/interpolation.c
44
+ - ext/axon/png.c
45
+ - ext/axon/jpeg.c
46
+ - ext/axon/axon.c
47
+ - ext/axon/iccjpeg.c
48
+ - ext/axon/iccjpeg.h
49
+ - ext/axon/extconf.rb
50
+ - test/stress_helper.rb
51
+ - test/test_image.rb
52
+ - test/test_png_writer.rb
53
+ - test/test_fit.rb
54
+ - test/test_generators.rb
103
55
  - test/test_bilinear_scaler.rb
56
+ - test/test_nearest_neighbor_scaler.rb
57
+ - test/test_jpeg_writer.rb
58
+ - test/stress_tests.rb
104
59
  - test/test_cropper.rb
105
- - test/test_exif.rb
106
- - test/test_generator.rb
107
- - test/test_icc.rb
108
- - test/test_jpeg.rb
109
60
  - test/test_jpeg_reader.rb
110
- - test/test_jpeg_writer.rb
111
- - test/test_nearest_neighbor_scaler.rb
112
- - test/test_png.rb
113
61
  - test/test_png_reader.rb
114
- - test/test_png_writer.rb
62
+ - test/helper.rb
115
63
  - test/writer_tests.rb
116
- - .gemtest
117
- has_rdoc: true
64
+ - test/reader_tests.rb
65
+ - test/scaler_tests.rb
118
66
  homepage: http://github.com/ender672/axon
119
67
  licenses: []
120
-
121
68
  post_install_message:
122
- rdoc_options:
123
- - --main
124
- - README.rdoc
125
- require_paths:
69
+ rdoc_options: []
70
+ require_paths:
126
71
  - lib
127
- required_ruby_version: !ruby/object:Gem::Requirement
72
+ - ext
73
+ required_ruby_version: !ruby/object:Gem::Requirement
128
74
  none: false
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- hash: 3
133
- segments:
134
- - 0
135
- version: "0"
136
- required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
80
  none: false
138
- requirements:
139
- - - ">="
140
- - !ruby/object:Gem::Version
141
- hash: 3
142
- segments:
143
- - 0
144
- version: "0"
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
145
85
  requirements: []
146
-
147
- rubyforge_project: axon
148
- rubygems_version: 1.6.2
86
+ rubyforge_project:
87
+ rubygems_version: 1.8.13
149
88
  signing_key:
150
89
  specification_version: 3
151
- summary: Axon is a library for streaming and manipulating JPEG and PNG images
152
- test_files:
90
+ summary: Axon reads, manipulates, and writes images.
91
+ test_files:
92
+ - test/stress_helper.rb
93
+ - test/test_image.rb
153
94
  - test/test_png_writer.rb
154
- - test/test_icc.rb
155
- - test/test_exif.rb
95
+ - test/test_fit.rb
96
+ - test/test_generators.rb
156
97
  - test/test_bilinear_scaler.rb
157
- - test/test_jpeg.rb
158
98
  - test/test_nearest_neighbor_scaler.rb
159
99
  - test/test_jpeg_writer.rb
100
+ - test/stress_tests.rb
160
101
  - test/test_cropper.rb
161
102
  - test/test_jpeg_reader.rb
162
103
  - test/test_png_reader.rb
163
- - test/test_png.rb
164
- - test/test_generator.rb
104
+ - test/helper.rb
105
+ - test/writer_tests.rb
106
+ - test/reader_tests.rb
107
+ - test/scaler_tests.rb
data/.gemtest DELETED
File without changes
@@ -1,115 +0,0 @@
1
- #include <ruby.h>
2
-
3
- static ID id_image, id_components, id_width_ratio, id_width;
4
-
5
-
6
- /* c00 a c10
7
- * --------------------------
8
- * | | |
9
- * | | |
10
- * | ty| |
11
- * | tx | |
12
- * |------------------+-----|
13
- * | /| |
14
- * | sample| |
15
- * | | |
16
- * | | |
17
- * | | |
18
- * | | |
19
- * --------------------------
20
- * c01 b c11
21
- *
22
- * a = (1 - tx) * c00 + tx * c10
23
- * b = (1 - tx) * c01 + tx * c11
24
- * sample = (1 - ty) * a + ty * b
25
- *
26
- * sample = (1 - ty) * (1 - tx) * c00 +
27
- * (1 - ty) * tx * c10 +
28
- * ty * (1 - tx) * c01 +
29
- ty * tx * c11
30
- */
31
- static VALUE
32
- interpolate_scanline2(size_t width, double width_ratio, size_t components,
33
- double ty, char *scanline1, char *scanline2)
34
- {
35
- VALUE rb_dest_sl;
36
- double sample_x, tx, _tx, p00, p10, p01, p11;
37
- unsigned char *c00, *c10, *c01, *c11, *dest_sl;
38
- size_t sample_x_i, i, j;
39
-
40
- rb_dest_sl = rb_str_new(0, width * components);
41
- dest_sl = RSTRING_PTR(rb_dest_sl);
42
-
43
- for (i = 0; i < width; i++) {
44
- sample_x = i / width_ratio;
45
- sample_x_i = (int)sample_x;
46
-
47
- tx = sample_x - sample_x_i;
48
- _tx = 1 - tx;
49
-
50
- p11 = tx * ty;
51
- p01 = _tx * ty;
52
- p10 = tx - p11;
53
- p00 = _tx - p01;
54
-
55
- c00 = scanline1 + sample_x_i * components;
56
- c10 = c00 + components;
57
- c01 = scanline2 + sample_x_i * components;
58
- c11 = c01 + components;
59
-
60
- for (j = 0; j < components; j++)
61
- *dest_sl++ = p00 * c00[j] + p10 * c10[j] + p01 * c01[j] +
62
- p11 * c11[j];
63
- }
64
-
65
- return rb_dest_sl;
66
- }
67
-
68
- /*
69
- * call-seq:
70
- * image.interpolate_scanline(original_scanlines, q) -> interpolated_scanline
71
- * Expects the instance variable @image to respond to components, and
72
- * expects the intance variable @width_ratio to respond to the ratio that
73
- * we will resample our width to.
74
- */
75
- static VALUE
76
- interpolate_scanline(VALUE self, VALUE orig_scanline1, VALUE orig_scanline2,
77
- VALUE rb_sample_y)
78
- {
79
- VALUE rb_components, rb_width_ratio, rb_image, rb_width;
80
- double width_ratio, ty, sample_y;
81
- unsigned char *scanline1, *scanline2;
82
- size_t width, components;
83
-
84
- rb_width = rb_ivar_get(self, id_width);
85
- width = FIX2INT(rb_width);
86
-
87
- rb_image = rb_ivar_get(self, id_image);
88
- rb_components = rb_funcall(rb_image, id_components, 0);
89
- components = FIX2INT(rb_components);
90
-
91
- rb_width_ratio = rb_ivar_get(self, id_width_ratio);
92
- width_ratio = NUM2DBL(rb_width_ratio);
93
-
94
- sample_y = NUM2DBL(rb_sample_y);
95
- ty = sample_y - (int)sample_y;
96
-
97
- scanline1 = RSTRING_PTR(orig_scanline1);
98
- scanline2 = RSTRING_PTR(orig_scanline2);
99
-
100
- return interpolate_scanline2(width, width_ratio, components, ty, scanline1,
101
- scanline2);
102
- }
103
-
104
- void
105
- Init_bilinear_interpolation()
106
- {
107
- VALUE mAxon = rb_define_module("Axon");
108
- VALUE mBilinearScaling = rb_define_module_under(mAxon, "BilinearScaling");
109
- rb_define_method(mBilinearScaling, "interpolate_scanline", interpolate_scanline, 3);
110
-
111
- id_width = rb_intern("@width");
112
- id_width_ratio = rb_intern("@width_ratio");
113
- id_image = rb_intern("@image");
114
- id_components = rb_intern("components");
115
- }
@@ -1,7 +0,0 @@
1
- #ifndef AXON_INTERPOLATION_H
2
- #define AXON_INTERPOLATION_H
3
-
4
- void Init_bilinear_interpolation();
5
- void Init_nearest_neighbor_interpolation();
6
-
7
- #endif
@@ -1,118 +0,0 @@
1
- #include "jpeg_common.h"
2
-
3
- static ID id_GRAYSCALE, id_RGB, id_YCbCr, id_CMYK, id_YCCK, id_UNKNOWN;
4
- static ID id_APP0, id_APP1, id_APP2, id_APP3, id_APP4, id_APP5, id_APP6,
5
- id_APP7, id_APP8, id_APP9, id_APP10, id_APP11, id_APP12, id_APP13,
6
- id_APP14, id_APP15, id_COM;
7
-
8
- struct jpeg_error_mgr jerr;
9
-
10
- ID
11
- j_color_space_to_id(J_COLOR_SPACE cs)
12
- {
13
- switch (cs) {
14
- case JCS_GRAYSCALE: return id_GRAYSCALE;
15
- case JCS_RGB: return id_RGB;
16
- case JCS_YCbCr: return id_YCbCr;
17
- case JCS_CMYK: return id_CMYK;
18
- case JCS_YCCK: return id_YCCK;
19
- }
20
-
21
- return id_UNKNOWN;
22
- }
23
-
24
- J_COLOR_SPACE
25
- id_to_j_color_space(ID rb)
26
- {
27
- if (rb == id_GRAYSCALE) return JCS_GRAYSCALE;
28
- else if (rb == id_RGB) return JCS_RGB;
29
- else if (rb == id_YCbCr) return JCS_YCbCr;
30
- else if (rb == id_CMYK) return JCS_CMYK;
31
- else if (rb == id_YCCK) return JCS_YCCK;
32
- else if (rb == id_UNKNOWN) return JCS_UNKNOWN;
33
-
34
- rb_raise(rb_eRuntimeError, "Color Space not recognized.");
35
- }
36
-
37
- int sym_to_marker_code(VALUE sym)
38
- {
39
- ID rb = SYM2ID(sym);
40
-
41
- if (rb == id_APP0) return JPEG_APP0;
42
- else if (rb == id_APP1) return JPEG_APP0 + 1;
43
- else if (rb == id_APP2) return JPEG_APP0 + 2;
44
- else if (rb == id_APP3) return JPEG_APP0 + 3;
45
- else if (rb == id_APP4) return JPEG_APP0 + 4;
46
- else if (rb == id_APP5) return JPEG_APP0 + 5;
47
- else if (rb == id_APP6) return JPEG_APP0 + 6;
48
- else if (rb == id_APP7) return JPEG_APP0 + 7;
49
- else if (rb == id_APP8) return JPEG_APP0 + 8;
50
- else if (rb == id_APP9) return JPEG_APP0 + 9;
51
- else if (rb == id_APP10) return JPEG_APP0 + 10;
52
- else if (rb == id_APP11) return JPEG_APP0 + 11;
53
- else if (rb == id_APP12) return JPEG_APP0 + 12;
54
- else if (rb == id_APP13) return JPEG_APP0 + 13;
55
- else if (rb == id_APP14) return JPEG_APP0 + 14;
56
- else if (rb == id_APP15) return JPEG_APP0 + 15;
57
- else if (rb == id_COM) return JPEG_COM;
58
-
59
- rb_raise(rb_eRuntimeError, "Marker code not recognized.");
60
- }
61
-
62
- void
63
- error_exit(j_common_ptr cinfo)
64
- {
65
- char buffer[JMSG_LENGTH_MAX];
66
-
67
- (*cinfo->err->format_message) (cinfo, buffer);
68
- rb_raise(rb_eRuntimeError, "jpeglib: %s", buffer);
69
- }
70
-
71
- void
72
- output_message(j_common_ptr cinfo)
73
- {
74
- /* do nothing */
75
- }
76
-
77
- void
78
- init_jerror(struct jpeg_error_mgr * err)
79
- {
80
- jpeg_std_error(err);
81
- err->error_exit = error_exit;
82
- err->output_message = output_message;
83
- }
84
-
85
- void
86
- Init_jpeg()
87
- {
88
- VALUE mAxon = rb_define_module("Axon");
89
- rb_const_set(mAxon, rb_intern("JPEG_LIB_VERSION"),
90
- INT2FIX(JPEG_LIB_VERSION));
91
-
92
- init_jerror(&jerr);
93
-
94
- id_GRAYSCALE = rb_intern("GRAYSCALE");
95
- id_RGB = rb_intern("RGB");
96
- id_YCbCr = rb_intern("YCbCr");
97
- id_CMYK = rb_intern("CMYK");
98
- id_YCCK = rb_intern("YCCK");
99
- id_UNKNOWN = rb_intern("UNKNOWN");
100
-
101
- id_APP0 = rb_intern("APP0");
102
- id_APP1 = rb_intern("APP1");
103
- id_APP2 = rb_intern("APP2");
104
- id_APP3 = rb_intern("APP3");
105
- id_APP4 = rb_intern("APP4");
106
- id_APP5 = rb_intern("APP5");
107
- id_APP6 = rb_intern("APP6");
108
- id_APP7 = rb_intern("APP7");
109
- id_APP8 = rb_intern("APP8");
110
- id_APP9 = rb_intern("APP9");
111
- id_APP10 = rb_intern("APP10");
112
- id_APP11 = rb_intern("APP11");
113
- id_APP12 = rb_intern("APP12");
114
- id_APP13 = rb_intern("APP13");
115
- id_APP14 = rb_intern("APP14");
116
- id_APP15 = rb_intern("APP15");
117
- id_COM = rb_intern("COM");
118
- }