axon 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
- }