jpeg 0.5.1 → 0.6.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.
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