jpeg 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37e34eced4b72b29ce0b8db024cb09d9129923db
4
- data.tar.gz: f6037f904afb7807dab5373ce124bb6e3bd18a6e
3
+ metadata.gz: 5d53a185f8b43438f663a8e6515c32e76913c618
4
+ data.tar.gz: 1ae8dc89c3d59e39daa72326ec5d1baabb0545c0
5
5
  SHA512:
6
- metadata.gz: 36106ee53ebf35042fc721ef305ab5d4f9dcb16a2a1ae63957e11207d7e3ba408b475b8edb6469e8cacb9c43e6644f61514bbd674badb52593b8f814ed8a5064
7
- data.tar.gz: 98719b20b28f9f1f4043169d11a45d96c8bdde5437eecd429064f8db2ec8808822d6eea043f9f8310d198d792b2710de2c76a5962b8c00233ed5315b625354c8
6
+ metadata.gz: 293cb450233a0c2b2d0a5b915031853f0633ce95ac8f21d5f65fad003489ce214af197a7b3bc48eff4d06e70164f3d3152e4b5fe5deacb92e0a47447445bba10
7
+ data.tar.gz: 8dd0300b215a2094ac3b4f812ec09a1d0671b313b99eb658ce11d7c3ca5909bc4ea165178ec5139085d38a49118cc0f758fac5f998e38bcce34676bf77fd0c59
data/.travis.yml CHANGED
@@ -3,4 +3,4 @@ before_script:
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
- - 2.1.3
6
+ - 2.1.5
@@ -14,6 +14,7 @@ static VALUE jpeg_image_width(VALUE self);
14
14
  static VALUE jpeg_image_height(VALUE self);
15
15
  static VALUE jpeg_image_size(VALUE self);
16
16
  static VALUE jpeg_image_color_info(VALUE self);
17
+ static VALUE jpeg_image_raw_data(VALUE self);
17
18
 
18
19
  extern VALUE rb_eJpegError;
19
20
 
@@ -25,17 +26,19 @@ void Init_jpeg_image(void) {
25
26
  rb_define_method(rb_cJpegImage, "height", jpeg_image_height, 0);
26
27
  rb_define_method(rb_cJpegImage, "size", jpeg_image_size, 0);
27
28
  rb_define_method(rb_cJpegImage, "color_info", jpeg_image_color_info, 0);
29
+ rb_define_method(rb_cJpegImage, "raw_data", jpeg_image_raw_data, 0);
28
30
  }
29
31
 
30
32
  void jpeg_image_exit(j_common_ptr jpeg) {
31
33
  char buffer[JMSG_LENGTH_MAX];
32
34
  jpeg->err->format_message(jpeg, buffer);
33
- rb_raise(rb_eJpegError, buffer);
35
+ rb_raise(rb_eJpegError, "%s", buffer);
34
36
  }
35
37
 
36
38
  static VALUE jpeg_image_alloc(VALUE klass) {
37
39
  struct rb_jpeg_image *jpeg = ALLOC(struct rb_jpeg_image);
38
40
 
41
+ jpeg->fp = NULL;
39
42
  jpeg->read = (void *)ALLOC(struct jpeg_decompress_struct);
40
43
  jpeg->error = (void *)ALLOC(struct jpeg_error_mgr);
41
44
  jpeg->read->err = jpeg_std_error(jpeg->error);
@@ -57,6 +60,9 @@ static void jpeg_image_free(struct rb_jpeg_image *p) {
57
60
  if (p->error) {
58
61
  xfree(p->error);
59
62
  }
63
+ if (p->fp) {
64
+ fclose(p->fp);
65
+ }
60
66
  xfree(p);
61
67
  }
62
68
 
@@ -64,7 +70,6 @@ static VALUE jpeg_image_s_open(int argc, VALUE *argv, VALUE self) {
64
70
  VALUE path;
65
71
  VALUE jpeg;
66
72
  struct rb_jpeg_image *p_jpeg;
67
- FILE *fp;
68
73
  char *filename;
69
74
  rb_scan_args(argc, argv, "1", &path);
70
75
  Check_Type(path, T_STRING);
@@ -73,27 +78,25 @@ static VALUE jpeg_image_s_open(int argc, VALUE *argv, VALUE self) {
73
78
  Data_Get_Struct(jpeg, struct rb_jpeg_image, p_jpeg);
74
79
  filename = StringValuePtr(path);
75
80
 
76
- if ((fp = fopen(filename, "rb")) == NULL) {
81
+ if ((p_jpeg->fp = fopen(filename, "rb")) == NULL) {
77
82
  rb_raise(rb_eJpegError, "Open file failed: %s", filename);
78
83
  }
79
- jpeg_stdio_src(p_jpeg->read, fp);
84
+ jpeg_stdio_src(p_jpeg->read, p_jpeg->fp);
80
85
 
81
86
  jpeg_read_header(p_jpeg->read, TRUE);
82
- jpeg_start_decompress(p_jpeg->read);
83
- fclose(fp);
84
87
  return jpeg;
85
88
  }
86
89
 
87
90
  static VALUE jpeg_image_width(VALUE self) {
88
91
  struct rb_jpeg_image *p_jpeg;
89
92
  Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
90
- return rb_int_new(p_jpeg->read->output_width);
93
+ return rb_int_new(p_jpeg->read->image_width);
91
94
  }
92
95
 
93
96
  static VALUE jpeg_image_height(VALUE self) {
94
97
  struct rb_jpeg_image *p_jpeg;
95
98
  Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
96
- return rb_int_new(p_jpeg->read->output_height);
99
+ return rb_int_new(p_jpeg->read->image_height);
97
100
  }
98
101
 
99
102
  static VALUE jpeg_image_size(VALUE self) {
@@ -102,8 +105,8 @@ static VALUE jpeg_image_size(VALUE self) {
102
105
  Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
103
106
 
104
107
  array = rb_ary_new();
105
- rb_ary_push(array, rb_int_new(p_jpeg->read->output_width));
106
- rb_ary_push(array, rb_int_new(p_jpeg->read->output_height));
108
+ rb_ary_push(array, rb_int_new(p_jpeg->read->image_width));
109
+ rb_ary_push(array, rb_int_new(p_jpeg->read->image_height));
107
110
 
108
111
  return array;
109
112
  }
@@ -112,5 +115,57 @@ static VALUE jpeg_image_color_info(VALUE self) {
112
115
  struct rb_jpeg_image *p_jpeg;
113
116
 
114
117
  Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
115
- return ID2SYM(rb_intern( p_jpeg->read->out_color_components == 3 ? "rgb" : "gray" ));
118
+ return ID2SYM(rb_intern( p_jpeg->read->out_color_space == JCS_GRAYSCALE ? "gray" : "rgb" ));
119
+ }
120
+
121
+ static VALUE jpeg_image_raw_data(VALUE self) {
122
+ struct rb_jpeg_image *p_jpeg;
123
+ VALUE matrix;
124
+ VALUE line;
125
+ VALUE point;
126
+ int64_t line_size;
127
+ int64_t i;
128
+ JSAMPARRAY buffer;
129
+
130
+ matrix = rb_iv_get(self, "@raw_data");
131
+
132
+ if (RTEST(matrix)) {
133
+ return matrix;
134
+ }
135
+
136
+ Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
137
+
138
+ jpeg_start_decompress(p_jpeg->read);
139
+
140
+ line_size = p_jpeg->read->output_width * p_jpeg->read->out_color_components;
141
+ if ((buffer = (*p_jpeg->read->mem->alloc_sarray)((j_common_ptr) p_jpeg->read, JPOOL_IMAGE, line_size, 1)) == NULL) {
142
+ rb_raise(rb_eJpegError, "Could not allocate memory (%ld bytes) to decode the image", line_size);
143
+ }
144
+
145
+ matrix = rb_ary_new();
146
+ while (p_jpeg->read->output_scanline < p_jpeg->read->output_height) {
147
+ jpeg_read_scanlines(p_jpeg->read, buffer , 1);
148
+
149
+ line = rb_ary_new();
150
+ if (p_jpeg->read->out_color_components == 3) {
151
+ for (i = 0; i < line_size; i += 3) {
152
+ point = rb_ary_new();
153
+ rb_ary_push(point, rb_int_new(buffer[0][i]));
154
+ rb_ary_push(point, rb_int_new(buffer[0][i + 1]));
155
+ rb_ary_push(point, rb_int_new(buffer[0][i + 2]));
156
+ rb_ary_push(line, point);
157
+ }
158
+ } else {
159
+ for (i = 0; i < line_size; i++) {
160
+ rb_ary_push(line, rb_int_new(buffer[0][i]));
161
+ }
162
+ }
163
+
164
+ rb_ary_push(matrix, line);
165
+ }
166
+ jpeg_finish_decompress(p_jpeg->read);
167
+
168
+ rb_iv_set(self, "@raw_data", matrix);
169
+
170
+ return matrix;
116
171
  }
@@ -7,6 +7,7 @@
7
7
  struct rb_jpeg_image {
8
8
  struct jpeg_decompress_struct *read;
9
9
  struct jpeg_error_mgr *error;
10
+ FILE *fp;
10
11
  };
11
12
 
12
13
  void Init_jpeg_image();
data/lib/jpeg/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jpeg
2
- VERSION = '0.5.1'
2
+ VERSION = '0.6.0'
3
3
  end
data/spec/jpeg_spec.rb CHANGED
@@ -16,6 +16,14 @@ describe "Jpeg" do
16
16
  it { expect(subject.color_info).to eq :rgb }
17
17
  it { expect(subject).to be_rgb }
18
18
  it { expect(subject).not_to be_gray }
19
+ it "should export the decoded data" do
20
+ decoded = subject.raw_data
21
+ expect(decoded.count).to eq 112
22
+ expect(decoded[0].count).to eq 112
23
+ expect(decoded[0][0]).to eq [255, 255, 253]
24
+ expect(decoded[60][50]).to eq [16, 27, 207]
25
+ expect(decoded[111][111]).to eq [255, 255, 255]
26
+ end
19
27
  end
20
28
 
21
29
  context "non-exists file" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jpeg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - masarakki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler