psd_native 0.5.0 → 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 +4 -4
- data/Gemfile +2 -0
- data/ext/psd_native/build_preview.c +58 -0
- data/ext/psd_native/build_preview.h +6 -0
- data/ext/psd_native/image_mode_rgb.c +15 -9
- data/ext/psd_native/psd_native_ext.c +18 -5
- data/ext/psd_native/psd_native_ext.h +4 -1
- data/ext/psd_native/util.c +17 -0
- data/ext/psd_native/util.h +8 -0
- data/lib/psd_native/version.rb +1 -1
- data/lib/psd_native.rb +2 -0
- data/spec/util_spec.rb +15 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 960643fec9eb4c5832460760e567953247189174
|
4
|
+
data.tar.gz: b3000995230c06cad6c95112e30e9be26d70c6aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9da0d02c2b6eb361f3750d44d370ed165af072e03f0ee91a66721da8e516d23213d93e30586630dca03aeba5ffbf4581cf691caf3c480d21401bede582ed46de
|
7
|
+
data.tar.gz: 5d2fc658099b074118b6890bcf0608a2be393fef2a415e1f2aba389500f6d6386bdb53c70b8ac0fca87214bc276d250e1015961082507f94260c3aacb36bde1c
|
data/Gemfile
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
#include "psd_native_ext.h"
|
2
|
+
|
3
|
+
VALUE psd_native_build_preview_blend_pixels(
|
4
|
+
VALUE self,
|
5
|
+
VALUE blending_mode,
|
6
|
+
VALUE layer,
|
7
|
+
VALUE base,
|
8
|
+
VALUE other,
|
9
|
+
VALUE r_offset_x,
|
10
|
+
VALUE r_offset_y) {
|
11
|
+
|
12
|
+
int x, y, base_x, base_y, offset_x, offset_y;
|
13
|
+
uint32_t width, height, base_width, base_height;
|
14
|
+
VALUE color;
|
15
|
+
VALUE Compose = rb_const_get(rb_const_get(rb_cObject, rb_intern("PSD")), rb_intern("Compose"));
|
16
|
+
|
17
|
+
width = FIX2UINT(rb_funcall(other, rb_intern("width"), 0));
|
18
|
+
height = FIX2UINT(rb_funcall(other, rb_intern("height"), 0));
|
19
|
+
base_width = FIX2UINT(rb_funcall(base, rb_intern("width"), 0));
|
20
|
+
base_height = FIX2UINT(rb_funcall(base, rb_intern("height"), 0));
|
21
|
+
offset_x = FIX2INT(r_offset_x);
|
22
|
+
offset_y = FIX2INT(r_offset_y);
|
23
|
+
|
24
|
+
VALUE opacity = rb_hash_new();
|
25
|
+
rb_hash_aset(
|
26
|
+
opacity,
|
27
|
+
ID2SYM(rb_intern("opacity")),
|
28
|
+
rb_funcall(layer, rb_intern("opacity"), 0)
|
29
|
+
);
|
30
|
+
|
31
|
+
rb_hash_aset(
|
32
|
+
opacity,
|
33
|
+
ID2SYM(rb_intern("fill_opacity")),
|
34
|
+
rb_funcall(layer, rb_intern("fill_opacity"), 0)
|
35
|
+
);
|
36
|
+
|
37
|
+
for (y = 0; y < height; y++) {
|
38
|
+
for (x = 0; x < width; x++) {
|
39
|
+
base_x = x + offset_x;
|
40
|
+
base_y = y + offset_y;
|
41
|
+
|
42
|
+
if (base_x < 0 || base_y < 0 || base_x >= base_width || base_y >= base_height) continue;
|
43
|
+
|
44
|
+
color = rb_funcall(
|
45
|
+
Compose,
|
46
|
+
rb_intern_str(blending_mode),
|
47
|
+
3,
|
48
|
+
rb_funcall(other, rb_intern("[]"), 2, INT2FIX(x), INT2FIX(y)),
|
49
|
+
rb_funcall(base, rb_intern("[]"), 2, INT2FIX(base_x), INT2FIX(base_y)),
|
50
|
+
opacity
|
51
|
+
);
|
52
|
+
|
53
|
+
rb_funcall(base, rb_intern("[]="), 3, INT2FIX(base_x), INT2FIX(base_y), color);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
return Qnil;
|
58
|
+
}
|
@@ -12,27 +12,33 @@ VALUE psd_native_combine_rgb_channel(VALUE self) {
|
|
12
12
|
int channel_count = RARRAY_LENINT(rb_iv_get(self, "@channels_info"));
|
13
13
|
|
14
14
|
int i, j;
|
15
|
-
uint32_t val,
|
15
|
+
uint32_t val, color;
|
16
|
+
|
17
|
+
int channel_ids[channel_count];
|
18
|
+
for (i = 0; i < channel_count; i++) {
|
19
|
+
channel_ids[i] = FIX2INT(rb_hash_aref(channels_info[i], ID2SYM(rb_intern("id"))));
|
20
|
+
}
|
16
21
|
|
17
22
|
// Loop through every pixel in the image
|
18
23
|
for (i = 0; i < num_pixels; i += pixel_step) {
|
19
|
-
|
20
|
-
a = 255;
|
24
|
+
color = 0x000000ff;
|
21
25
|
|
22
26
|
// And every channel for every pixel
|
23
27
|
for (j = 0; j < channel_count; j++) {
|
28
|
+
if (channel_ids[j] == -2) continue;
|
29
|
+
|
24
30
|
val = FIX2UINT(channel_data[i + (channel_length * j)]);
|
25
31
|
|
26
32
|
// Get the hash containing channel info
|
27
|
-
switch (
|
28
|
-
case -1:
|
29
|
-
case 0:
|
30
|
-
case 1:
|
31
|
-
case 2:
|
33
|
+
switch (channel_ids[j]) {
|
34
|
+
case -1: color = (color & 0xffffff00) | val; break; // A
|
35
|
+
case 0: color = (color & 0x00ffffff) | (val << 24); break; // R
|
36
|
+
case 1: color = (color & 0xff00ffff) | (val << 16); break; // G
|
37
|
+
case 2: color = (color & 0xffff00ff) | (val << 8); break; // B
|
32
38
|
}
|
33
39
|
}
|
34
40
|
|
35
|
-
rb_ary_push(rb_iv_get(self, "@pixel_data"), INT2FIX(
|
41
|
+
rb_ary_push(rb_iv_get(self, "@pixel_data"), INT2FIX(color));
|
36
42
|
}
|
37
43
|
|
38
44
|
return Qnil;
|
@@ -1,6 +1,12 @@
|
|
1
1
|
#include "psd_native_ext.h"
|
2
2
|
|
3
|
+
static VALUE psd_class;
|
4
|
+
static VALUE logger;
|
5
|
+
|
3
6
|
void Init_psd_native() {
|
7
|
+
psd_class = rb_const_get(rb_cObject, rb_intern("PSD"));
|
8
|
+
logger = rb_funcall(psd_class, rb_intern("logger"), 0);
|
9
|
+
|
4
10
|
VALUE PSDNative = rb_define_module("PSDNative");
|
5
11
|
VALUE ImageMode = rb_define_module_under(PSDNative, "ImageMode");
|
6
12
|
|
@@ -49,15 +55,22 @@ void Init_psd_native() {
|
|
49
55
|
VALUE ClippingMask = rb_define_module_under(PSDNative, "ClippingMask");
|
50
56
|
rb_define_method(ClippingMask, "apply", psd_native_clipping_mask_apply, 0);
|
51
57
|
|
52
|
-
|
53
|
-
|
58
|
+
// Build preview
|
59
|
+
VALUE Node = rb_define_module_under(PSDNative, "Node");
|
60
|
+
VALUE BuildPreview = rb_define_module_under(Node, "BuildPreview");
|
61
|
+
rb_define_private_method(BuildPreview, "blend_pixels!", psd_native_build_preview_blend_pixels, 6);
|
62
|
+
|
63
|
+
// Util
|
64
|
+
VALUE Util = rb_define_module_under(PSDNative, "Util");
|
65
|
+
rb_define_method(Util, "pad2", psd_native_util_pad2, 1);
|
66
|
+
rb_define_method(Util, "pad4", psd_native_util_pad4, 1);
|
67
|
+
rb_define_method(Util, "clamp", psd_native_util_clamp, 3);
|
54
68
|
|
55
|
-
|
56
|
-
return rb_const_get(rb_cObject, rb_intern("PSD"));
|
69
|
+
psd_logger("info", "PSD native mixins enabled!");
|
57
70
|
}
|
58
71
|
|
59
72
|
void psd_logger(char* level, char* message) {
|
60
|
-
rb_funcall(
|
73
|
+
rb_funcall(logger, rb_intern(level), 1, rb_str_new2(message));
|
61
74
|
}
|
62
75
|
|
63
76
|
VALUE psd_file(VALUE self) {
|
@@ -4,12 +4,14 @@
|
|
4
4
|
#include "ruby.h"
|
5
5
|
|
6
6
|
#define RSTRING_NOT_MODIFIED
|
7
|
+
#define PSD_CONCURRENCY 4
|
7
8
|
|
8
9
|
// Pixels use 32 bits unsigned integers
|
9
10
|
// We borrow this from OilyPNG
|
10
11
|
typedef uint32_t PIXEL;
|
11
12
|
|
12
13
|
// Our native mixins
|
14
|
+
#include "util.h"
|
13
15
|
#include "color.h"
|
14
16
|
#include "clipping_mask.h"
|
15
17
|
#include "compose.h"
|
@@ -17,9 +19,10 @@ typedef uint32_t PIXEL;
|
|
17
19
|
#include "image_mode_greyscale.h"
|
18
20
|
#include "image_mode_rgb.h"
|
19
21
|
#include "rle_decoding.h"
|
22
|
+
#include "build_preview.h"
|
20
23
|
|
21
24
|
void Init_psd_native();
|
22
|
-
VALUE psd_class();
|
25
|
+
// VALUE psd_class();
|
23
26
|
void psd_logger(char* level, char* message);
|
24
27
|
VALUE psd_file(VALUE self);
|
25
28
|
int psd_file_tell(VALUE self);
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#include "psd_native_ext.h"
|
2
|
+
|
3
|
+
VALUE psd_native_util_pad2(VALUE self, VALUE i) {
|
4
|
+
return INT2FIX((FIX2INT(i) + 1) & ~0x01);
|
5
|
+
}
|
6
|
+
|
7
|
+
VALUE psd_native_util_pad4(VALUE self, VALUE i) {
|
8
|
+
return INT2FIX(((FIX2INT(i) + 4) & ~0x03) - 1);
|
9
|
+
}
|
10
|
+
|
11
|
+
VALUE psd_native_util_clamp(VALUE self, VALUE r_num, VALUE r_min, VALUE r_max) {
|
12
|
+
int num = FIX2INT(r_num);
|
13
|
+
int min = FIX2INT(r_min);
|
14
|
+
int max = FIX2INT(r_max);
|
15
|
+
|
16
|
+
return num > max ? r_max : (num < min ? r_min : r_num);
|
17
|
+
}
|
data/lib/psd_native/version.rb
CHANGED
data/lib/psd_native.rb
CHANGED
@@ -7,6 +7,8 @@ module PSDNative
|
|
7
7
|
base::Image.send(:include, PSDNative::ImageMode::Greyscale)
|
8
8
|
base::Image.send(:include, PSDNative::ImageFormat::RLE)
|
9
9
|
base::Color.send(:include, PSDNative::Color)
|
10
|
+
base::Node.send(:include, PSDNative::Node::BuildPreview)
|
11
|
+
base::Util.extend PSDNative::Util
|
10
12
|
|
11
13
|
base::ClippingMask.class_eval do
|
12
14
|
remove_method :apply
|
data/spec/util_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Util' do
|
4
|
+
it "pad2's correctly" do
|
5
|
+
expect(PSD::Util.pad2(0)).to eq 0
|
6
|
+
expect(PSD::Util.pad2(1)).to eq 2
|
7
|
+
end
|
8
|
+
|
9
|
+
# Note, this pad4 is weird but this is expected results
|
10
|
+
it "pad4's correctly" do
|
11
|
+
expect(PSD::Util.pad4(0)).to eq 3
|
12
|
+
expect(PSD::Util.pad4(1)).to eq 3
|
13
|
+
expect(PSD::Util.pad4(2)).to eq 3
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: psd_native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan LeFevre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: psd
|
@@ -137,6 +137,8 @@ files:
|
|
137
137
|
- LICENSE.txt
|
138
138
|
- README.md
|
139
139
|
- Rakefile
|
140
|
+
- ext/psd_native/build_preview.c
|
141
|
+
- ext/psd_native/build_preview.h
|
140
142
|
- ext/psd_native/clipping_mask.c
|
141
143
|
- ext/psd_native/clipping_mask.h
|
142
144
|
- ext/psd_native/color.c
|
@@ -154,6 +156,8 @@ files:
|
|
154
156
|
- ext/psd_native/psd_native_ext.h
|
155
157
|
- ext/psd_native/rle_decoding.c
|
156
158
|
- ext/psd_native/rle_decoding.h
|
159
|
+
- ext/psd_native/util.c
|
160
|
+
- ext/psd_native/util.h
|
157
161
|
- lib/psd_native.rb
|
158
162
|
- lib/psd_native/compose.rb
|
159
163
|
- lib/psd_native/version.rb
|
@@ -167,6 +171,7 @@ files:
|
|
167
171
|
- spec/image_spec.rb
|
168
172
|
- spec/psd_spec.rb
|
169
173
|
- spec/spec_helper.rb
|
174
|
+
- spec/util_spec.rb
|
170
175
|
homepage: http://cosmos.layervault.com/psdrb.html
|
171
176
|
licenses:
|
172
177
|
- MIT
|
@@ -188,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
193
|
version: '0'
|
189
194
|
requirements: []
|
190
195
|
rubyforge_project:
|
191
|
-
rubygems_version: 2.
|
196
|
+
rubygems_version: 2.1.11
|
192
197
|
signing_key:
|
193
198
|
specification_version: 4
|
194
199
|
summary: Native C mixins to speed up the slowest parts of PSD.rb
|
@@ -202,3 +207,4 @@ test_files:
|
|
202
207
|
- spec/image_spec.rb
|
203
208
|
- spec/psd_spec.rb
|
204
209
|
- spec/spec_helper.rb
|
210
|
+
- spec/util_spec.rb
|