jpeg 0.6.0 → 0.7.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 +4 -4
- data/ext/jpeg/jpeg_image.c +84 -38
- data/ext/jpeg/jpeg_image.h +3 -0
- data/lib/jpeg.rb +1 -7
- data/lib/jpeg/version.rb +1 -1
- data/spec/leak_test.rb +18 -0
- metadata +4 -4
- data/.document +0 -5
- data/VERSION +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b512a8178edabb2a12690e9a276ad5606e0a80b
|
4
|
+
data.tar.gz: aaba7c6ba93a72a70523022f8ec9755520773172
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d161cfb5425cd64037ae7f264e374a97a1a232dfc9215cb36f65b26c29601e5e5e713c88813b9594c72db7dda9f934e33e81f0807c7da854d8fe604046e5cfc6
|
7
|
+
data.tar.gz: 25122f30d0b14743f57007162fc4c223e507f2f257120c3d36cc55d7ba4b4b65160e90bd5f215ae790281ab5843de58b7c9937ace6b46102052f3b9d033af697
|
data/ext/jpeg/jpeg_image.c
CHANGED
@@ -7,13 +7,11 @@ extern VALUE rb_mJpeg;
|
|
7
7
|
VALUE rb_cJpegImage;
|
8
8
|
|
9
9
|
static VALUE jpeg_image_s_open(int argc, VALUE *argv, VALUE sef);
|
10
|
+
static VALUE jpeg_image_s_open_buffer(int argc, VALUE *argv, VALUE sef);
|
10
11
|
static VALUE jpeg_image_alloc(VALUE klass);
|
11
12
|
static void jpeg_image_mark(struct rb_jpeg_image *p);
|
12
13
|
static void jpeg_image_free(struct rb_jpeg_image *p);
|
13
|
-
static VALUE jpeg_image_width(VALUE self);
|
14
|
-
static VALUE jpeg_image_height(VALUE self);
|
15
14
|
static VALUE jpeg_image_size(VALUE self);
|
16
|
-
static VALUE jpeg_image_color_info(VALUE self);
|
17
15
|
static VALUE jpeg_image_raw_data(VALUE self);
|
18
16
|
|
19
17
|
extern VALUE rb_eJpegError;
|
@@ -22,10 +20,12 @@ void Init_jpeg_image(void) {
|
|
22
20
|
rb_cJpegImage = rb_define_class_under(rb_mJpeg, "Image", rb_cObject);
|
23
21
|
rb_define_alloc_func(rb_cJpegImage, jpeg_image_alloc);
|
24
22
|
rb_define_singleton_method(rb_cJpegImage, "open", jpeg_image_s_open, -1);
|
25
|
-
|
26
|
-
|
23
|
+
rb_define_singleton_method(rb_cJpegImage, "open_buffer", jpeg_image_s_open_buffer, -1);
|
24
|
+
rb_attr(rb_cJpegImage, rb_intern("width"), 1, 0, 0);
|
25
|
+
rb_attr(rb_cJpegImage, rb_intern("height"), 1, 0, 0);
|
26
|
+
rb_attr(rb_cJpegImage, rb_intern("color_info"), 1, 0, 0);
|
27
|
+
|
27
28
|
rb_define_method(rb_cJpegImage, "size", jpeg_image_size, 0);
|
28
|
-
rb_define_method(rb_cJpegImage, "color_info", jpeg_image_color_info, 0);
|
29
29
|
rb_define_method(rb_cJpegImage, "raw_data", jpeg_image_raw_data, 0);
|
30
30
|
}
|
31
31
|
|
@@ -43,7 +43,6 @@ static VALUE jpeg_image_alloc(VALUE klass) {
|
|
43
43
|
jpeg->error = (void *)ALLOC(struct jpeg_error_mgr);
|
44
44
|
jpeg->read->err = jpeg_std_error(jpeg->error);
|
45
45
|
jpeg->error->error_exit = jpeg_image_exit;
|
46
|
-
jpeg_create_decompress(jpeg->read);
|
47
46
|
|
48
47
|
return Data_Wrap_Struct(klass, jpeg_image_mark, jpeg_image_free, jpeg);
|
49
48
|
}
|
@@ -54,7 +53,6 @@ static void jpeg_image_mark(struct rb_jpeg_image *p) {
|
|
54
53
|
|
55
54
|
static void jpeg_image_free(struct rb_jpeg_image *p) {
|
56
55
|
if (p->read) {
|
57
|
-
jpeg_destroy_decompress(p->read);
|
58
56
|
xfree(p->read);
|
59
57
|
}
|
60
58
|
if (p->error) {
|
@@ -66,56 +64,91 @@ static void jpeg_image_free(struct rb_jpeg_image *p) {
|
|
66
64
|
xfree(p);
|
67
65
|
}
|
68
66
|
|
69
|
-
static
|
70
|
-
|
67
|
+
static void jpeg_image_s_set_read_source(struct rb_jpeg_image *p_jpeg) {
|
68
|
+
|
69
|
+
if (p_jpeg->filename) {
|
70
|
+
|
71
|
+
if ((p_jpeg->fp = fopen(p_jpeg->filename, "rb")) == NULL) {
|
72
|
+
rb_raise(rb_eJpegError, "Open file failed: %s", p_jpeg->filename);
|
73
|
+
}
|
74
|
+
|
75
|
+
} else {
|
76
|
+
|
77
|
+
#ifdef jpeg_mem_src
|
78
|
+
jpeg_mem_src(p_jpeg->read, (unsigned char *) p_jpeg->buffer, p_jpeg->buffer_len);
|
79
|
+
#else
|
80
|
+
if ((p_jpeg->fp = fmemopen(p_jpeg->buffer, p_jpeg->buffer_len, "rb")) == NULL) {
|
81
|
+
rb_raise(rb_eJpegError, "Could not read jpeg from buffer");
|
82
|
+
}
|
83
|
+
#endif
|
84
|
+
|
85
|
+
}
|
86
|
+
|
87
|
+
if (p_jpeg->fp) {
|
88
|
+
jpeg_stdio_src(p_jpeg->read, p_jpeg->fp);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
static VALUE jpeg_image_s_get_image_values(char *filename, char *buffer, int64_t buffer_len, VALUE self) {
|
71
93
|
VALUE jpeg;
|
72
94
|
struct rb_jpeg_image *p_jpeg;
|
73
|
-
char *filename;
|
74
|
-
rb_scan_args(argc, argv, "1", &path);
|
75
|
-
Check_Type(path, T_STRING);
|
76
95
|
|
77
|
-
jpeg =
|
96
|
+
jpeg = rb_obj_alloc(rb_cJpegImage);
|
97
|
+
rb_obj_call_init(jpeg, 0, NULL);
|
98
|
+
|
78
99
|
Data_Get_Struct(jpeg, struct rb_jpeg_image, p_jpeg);
|
79
|
-
filename = StringValuePtr(path);
|
80
100
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
101
|
+
p_jpeg->filename = filename;
|
102
|
+
p_jpeg->buffer = buffer;
|
103
|
+
p_jpeg->buffer_len = buffer_len;
|
104
|
+
|
105
|
+
jpeg_create_decompress(p_jpeg->read);
|
106
|
+
|
107
|
+
jpeg_image_s_set_read_source(p_jpeg);
|
85
108
|
|
86
109
|
jpeg_read_header(p_jpeg->read, TRUE);
|
110
|
+
|
111
|
+
rb_iv_set(jpeg, "@width", LONG2NUM(p_jpeg->read->image_width));
|
112
|
+
rb_iv_set(jpeg, "@height", LONG2NUM(p_jpeg->read->image_height));
|
113
|
+
rb_iv_set(jpeg, "@color_info", ID2SYM(rb_intern( p_jpeg->read->out_color_space == JCS_GRAYSCALE ? "gray" : "rgb" )));
|
114
|
+
|
115
|
+
jpeg_destroy_decompress(p_jpeg->read);
|
116
|
+
|
117
|
+
if (p_jpeg->fp) {
|
118
|
+
fclose(p_jpeg->fp);
|
119
|
+
p_jpeg->fp = NULL;
|
120
|
+
}
|
121
|
+
|
87
122
|
return jpeg;
|
88
123
|
}
|
89
124
|
|
90
|
-
static VALUE
|
91
|
-
|
92
|
-
|
93
|
-
|
125
|
+
static VALUE jpeg_image_s_open(int argc, VALUE *argv, VALUE self) {
|
126
|
+
VALUE path;
|
127
|
+
|
128
|
+
rb_scan_args(argc, argv, "1", &path);
|
129
|
+
Check_Type(path, T_STRING);
|
130
|
+
|
131
|
+
return jpeg_image_s_get_image_values(StringValuePtr(path), NULL, 0, self);
|
94
132
|
}
|
95
133
|
|
96
|
-
static VALUE
|
97
|
-
|
98
|
-
|
99
|
-
|
134
|
+
static VALUE jpeg_image_s_open_buffer(int argc, VALUE *argv, VALUE self) {
|
135
|
+
VALUE str;
|
136
|
+
|
137
|
+
rb_scan_args(argc, argv, "1", &str);
|
138
|
+
Check_Type(str, T_STRING);
|
139
|
+
|
140
|
+
return jpeg_image_s_get_image_values(NULL, StringValuePtr(str), RSTRING_LEN(str), self);
|
100
141
|
}
|
101
142
|
|
102
143
|
static VALUE jpeg_image_size(VALUE self) {
|
103
|
-
struct rb_jpeg_image *p_jpeg;
|
104
144
|
VALUE array;
|
105
|
-
Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
|
106
145
|
|
107
146
|
array = rb_ary_new();
|
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));
|
110
147
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
static VALUE jpeg_image_color_info(VALUE self) {
|
115
|
-
struct rb_jpeg_image *p_jpeg;
|
148
|
+
rb_ary_push(array, rb_iv_get(self, "@width"));
|
149
|
+
rb_ary_push(array, rb_iv_get(self, "@height"));
|
116
150
|
|
117
|
-
|
118
|
-
return ID2SYM(rb_intern( p_jpeg->read->out_color_space == JCS_GRAYSCALE ? "gray" : "rgb" ));
|
151
|
+
return array;
|
119
152
|
}
|
120
153
|
|
121
154
|
static VALUE jpeg_image_raw_data(VALUE self) {
|
@@ -135,6 +168,12 @@ static VALUE jpeg_image_raw_data(VALUE self) {
|
|
135
168
|
|
136
169
|
Data_Get_Struct(self, struct rb_jpeg_image, p_jpeg);
|
137
170
|
|
171
|
+
jpeg_create_decompress(p_jpeg->read);
|
172
|
+
|
173
|
+
jpeg_image_s_set_read_source(p_jpeg);
|
174
|
+
|
175
|
+
jpeg_read_header(p_jpeg->read, TRUE);
|
176
|
+
|
138
177
|
jpeg_start_decompress(p_jpeg->read);
|
139
178
|
|
140
179
|
line_size = p_jpeg->read->output_width * p_jpeg->read->out_color_components;
|
@@ -165,6 +204,13 @@ static VALUE jpeg_image_raw_data(VALUE self) {
|
|
165
204
|
}
|
166
205
|
jpeg_finish_decompress(p_jpeg->read);
|
167
206
|
|
207
|
+
jpeg_destroy_decompress(p_jpeg->read);
|
208
|
+
|
209
|
+
if (p_jpeg->fp) {
|
210
|
+
fclose(p_jpeg->fp);
|
211
|
+
p_jpeg->fp = NULL;
|
212
|
+
}
|
213
|
+
|
168
214
|
rb_iv_set(self, "@raw_data", matrix);
|
169
215
|
|
170
216
|
return matrix;
|
data/ext/jpeg/jpeg_image.h
CHANGED
data/lib/jpeg.rb
CHANGED
@@ -5,13 +5,7 @@ require 'jpeg/image'
|
|
5
5
|
|
6
6
|
module Jpeg
|
7
7
|
def self.open_buffer(str)
|
8
|
-
|
9
|
-
tmp.set_encoding Encoding::BINARY if tmp.respond_to?(:set_encoding)
|
10
|
-
tmp.puts str
|
11
|
-
tmp.rewind
|
12
|
-
jpeg = Jpeg::Image.open(tmp.path)
|
13
|
-
tmp.close
|
14
|
-
jpeg
|
8
|
+
Jpeg::Image.open_buffer(str)
|
15
9
|
end
|
16
10
|
|
17
11
|
def self.open(file)
|
data/lib/jpeg/version.rb
CHANGED
data/spec/leak_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
4
|
+
require 'jpeg'
|
5
|
+
|
6
|
+
puts Process.pid
|
7
|
+
file = File.expand_path('samples/sample.jpg', File.dirname(__FILE__))
|
8
|
+
|
9
|
+
[10, 100, 1000].each do |n|
|
10
|
+
n.times do
|
11
|
+
@jpeg = Jpeg.open(file).raw_data
|
12
|
+
end
|
13
|
+
@jpeg = nil
|
14
|
+
GC.start
|
15
|
+
puts "#{n} times"
|
16
|
+
puts `pmap -x #{Process.pid} | tail -n 1`
|
17
|
+
# puts `lsof -p #{Process.pid}`
|
18
|
+
end
|
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.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- masarakki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -88,7 +88,6 @@ extensions:
|
|
88
88
|
- ext/jpeg/extconf.rb
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
-
- ".document"
|
92
91
|
- ".gitignore"
|
93
92
|
- ".rspec"
|
94
93
|
- ".travis.yml"
|
@@ -96,7 +95,6 @@ files:
|
|
96
95
|
- LICENSE.txt
|
97
96
|
- README.md
|
98
97
|
- Rakefile
|
99
|
-
- VERSION
|
100
98
|
- ext/jpeg/extconf.rb
|
101
99
|
- ext/jpeg/jpeg.c
|
102
100
|
- ext/jpeg/jpeg.h
|
@@ -109,6 +107,7 @@ files:
|
|
109
107
|
- lib/jpeg/image.rb
|
110
108
|
- lib/jpeg/version.rb
|
111
109
|
- spec/jpeg_spec.rb
|
110
|
+
- spec/leak_test.rb
|
112
111
|
- spec/samples/sample.jpg
|
113
112
|
- spec/samples/sample.png
|
114
113
|
- spec/spec_helper.rb
|
@@ -138,6 +137,7 @@ specification_version: 4
|
|
138
137
|
summary: libjpeg wrapper for ruby
|
139
138
|
test_files:
|
140
139
|
- spec/jpeg_spec.rb
|
140
|
+
- spec/leak_test.rb
|
141
141
|
- spec/samples/sample.jpg
|
142
142
|
- spec/samples/sample.png
|
143
143
|
- spec/spec_helper.rb
|
data/.document
DELETED
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.3.3
|