psd_native 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/README.md +4 -0
- data/Rakefile +6 -0
- data/ext/psd_native/color.c +20 -0
- data/ext/psd_native/color.h +7 -0
- data/ext/psd_native/image_mode_cmyk.c +50 -0
- data/ext/psd_native/image_mode_cmyk.h +6 -0
- data/ext/psd_native/image_mode_rgb.c +5 -5
- data/ext/psd_native/image_mode_rgb.h +0 -2
- data/ext/psd_native/psd_native_ext.c +8 -0
- data/ext/psd_native/psd_native_ext.h +3 -0
- data/lib/psd_native/color.rb +13 -0
- data/lib/psd_native/version.rb +1 -1
- data/lib/psd_native.rb +5 -4
- metadata +7 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a097861634857452e319eac2dc9b273f5152995
|
4
|
+
data.tar.gz: cdaa91f6470f0403cf4c551fbc6d7bae936604e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aeb904cc861e840673e1ce5e5a47d55e1dbcf50a3af58d05ae827fef0a7f5681489fe234e100644c1aa33a39dd208f5e2c6b1627f85f5179882c1ea5296c242
|
7
|
+
data.tar.gz: 05ad35fb96d4b7a85a113e2927ee948fb33e75fa1d5c9699f93a1a8aeecf518c06a575ee922aa2ea17c88d2826504b5d2eeaf8710242c0b834e24e6347205d3b
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# PSDNative
|
2
2
|
|
3
|
+
[![Travis CI](https://travis-ci.org/layervault/psd_native.png)](https://travis-ci.org/layervault/psd_native)
|
4
|
+
|
3
5
|
A gem that includes multiple mixins that speed up [PSD.rb](https://github.com/layervault/psd.rb) by delegating certain parts of the library to native C code. This library allows for PSD.rb to function as a pure Ruby library, while allowing for optional native code speed improvements. It overwrites specific methods within PSD.rb transparently, so you can use PSD.rb like normal.
|
4
6
|
|
5
7
|
Currently, PSDNative replaces these sections of PSD.rb with native code:
|
6
8
|
|
7
9
|
* RGB processing
|
10
|
+
* CMYK processing
|
8
11
|
* RLE decoding
|
12
|
+
* Some color conversions
|
9
13
|
|
10
14
|
## Installation
|
11
15
|
|
data/Rakefile
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/extensiontask"
|
3
|
+
require 'rspec/core/rake_task'
|
3
4
|
|
4
5
|
Rake::ExtensionTask.new('psd_native') do |ext|
|
5
6
|
ext.lib_dir = File.join('lib', 'psd_native')
|
6
7
|
ext.config_options = '--with-cflags="-std=c99"'
|
7
8
|
end
|
9
|
+
|
10
|
+
Rake::Task['spec'].prerequisites << :compile
|
11
|
+
|
12
|
+
RSpec::Core::RakeTask.new(:spec)
|
13
|
+
task :default => :spec
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#include "psd_native_ext.h"
|
2
|
+
|
3
|
+
VALUE psd_native_cmyk_to_rgb(VALUE self, VALUE c, VALUE m, VALUE y, VALUE k) {
|
4
|
+
int r, g, b;
|
5
|
+
|
6
|
+
r = psd_clamp_int((65535 - (FIX2INT(c) * (255 - FIX2INT(k)) + (FIX2INT(k) << 8))) >> 8, 0, 255);
|
7
|
+
g = psd_clamp_int((65535 - (FIX2INT(m) * (255 - FIX2INT(k)) + (FIX2INT(k) << 8))) >> 8, 0, 255);
|
8
|
+
b = psd_clamp_int((65535 - (FIX2INT(y) * (255 - FIX2INT(k)) + (FIX2INT(k) << 8))) >> 8, 0, 255);
|
9
|
+
|
10
|
+
VALUE result = rb_hash_new();
|
11
|
+
rb_hash_aset(result, ID2SYM(rb_intern("r")), INT2FIX(r));
|
12
|
+
rb_hash_aset(result, ID2SYM(rb_intern("g")), INT2FIX(g));
|
13
|
+
rb_hash_aset(result, ID2SYM(rb_intern("b")), INT2FIX(b));
|
14
|
+
|
15
|
+
return result;
|
16
|
+
}
|
17
|
+
|
18
|
+
int psd_clamp_int(int n, int low, int high) {
|
19
|
+
return n < low ? low : (n > high ? high : n);
|
20
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#include "psd_native_ext.h"
|
2
|
+
|
3
|
+
VALUE psd_native_combine_cmyk_channel(VALUE self) {
|
4
|
+
psd_logger("debug", "Beginning CMYK processing");
|
5
|
+
|
6
|
+
uint32_t num_pixels = FIX2UINT(rb_iv_get(self, "@num_pixels"));
|
7
|
+
uint32_t pixel_step = FIX2UINT(rb_funcall(self, rb_intern("pixel_step"), 0));
|
8
|
+
|
9
|
+
VALUE* channel_data = RARRAY_PTR(rb_iv_get(self, "@channel_data"));
|
10
|
+
uint32_t channel_length = FIX2UINT(rb_iv_get(self, "@channel_length"));
|
11
|
+
uint32_t channel_count = FIX2UINT(rb_funcall(self, rb_intern("channels"), 0));
|
12
|
+
|
13
|
+
int i;
|
14
|
+
uint32_t r, g, b;
|
15
|
+
VALUE a, c, m, y, k, rgb;
|
16
|
+
|
17
|
+
// Loop through every pixel in the image
|
18
|
+
for (i = 0; i < num_pixels; i += pixel_step) {
|
19
|
+
if (channel_count == 5) {
|
20
|
+
a = channel_data[i];
|
21
|
+
c = channel_data[i + channel_length];
|
22
|
+
m = channel_data[i + channel_length * 2];
|
23
|
+
y = channel_data[i + channel_length * 3];
|
24
|
+
k = channel_data[i + channel_length * 4];
|
25
|
+
} else {
|
26
|
+
a = 255;
|
27
|
+
c = channel_data[i];
|
28
|
+
m = channel_data[i + channel_length];
|
29
|
+
y = channel_data[i + channel_length * 2];
|
30
|
+
k = channel_data[i + channel_length * 3];
|
31
|
+
}
|
32
|
+
|
33
|
+
rgb = psd_native_cmyk_to_rgb(
|
34
|
+
self,
|
35
|
+
INT2FIX(255 - FIX2INT(c)),
|
36
|
+
INT2FIX(255 - FIX2INT(m)),
|
37
|
+
INT2FIX(255 - FIX2INT(y)),
|
38
|
+
INT2FIX(255 - FIX2INT(k))
|
39
|
+
);
|
40
|
+
|
41
|
+
|
42
|
+
r = FIX2UINT(rb_hash_aref(rgb, ID2SYM(rb_intern("r"))));
|
43
|
+
g = FIX2UINT(rb_hash_aref(rgb, ID2SYM(rb_intern("g"))));
|
44
|
+
b = FIX2UINT(rb_hash_aref(rgb, ID2SYM(rb_intern("b"))));
|
45
|
+
|
46
|
+
rb_ary_push(rb_iv_get(self, "@pixel_data"), INT2FIX(BUILD_PIXEL(r, g, b, a)));
|
47
|
+
}
|
48
|
+
|
49
|
+
return Qnil;
|
50
|
+
}
|
@@ -6,10 +6,10 @@ VALUE psd_native_combine_rgb_channel(VALUE self) {
|
|
6
6
|
uint32_t num_pixels = FIX2UINT(rb_iv_get(self, "@num_pixels"));
|
7
7
|
uint32_t pixel_step = FIX2UINT(rb_funcall(self, rb_intern("pixel_step"), 0));
|
8
8
|
|
9
|
-
VALUE channels_info = rb_iv_get(self, "@channels_info");
|
10
|
-
VALUE channel_data = rb_iv_get(self, "@channel_data");
|
9
|
+
VALUE* channels_info = RARRAY_PTR(rb_iv_get(self, "@channels_info"));
|
10
|
+
VALUE* channel_data = RARRAY_PTR(rb_iv_get(self, "@channel_data"));
|
11
11
|
uint32_t channel_length = FIX2UINT(rb_iv_get(self, "@channel_length"));
|
12
|
-
|
12
|
+
int channel_count = RARRAY_LENINT(rb_iv_get(self, "@channels_info"));
|
13
13
|
|
14
14
|
int i, j;
|
15
15
|
uint32_t val, r, g, b, a;
|
@@ -21,10 +21,10 @@ VALUE psd_native_combine_rgb_channel(VALUE self) {
|
|
21
21
|
|
22
22
|
// And every channel for every pixel
|
23
23
|
for (j = 0; j < channel_count; j++) {
|
24
|
-
val = FIX2UINT(
|
24
|
+
val = FIX2UINT(channel_data[i + (channel_length * j)]);
|
25
25
|
|
26
26
|
// Get the hash containing channel info
|
27
|
-
switch (FIX2INT(rb_hash_aref(
|
27
|
+
switch (FIX2INT(rb_hash_aref(channels_info[j], ID2SYM(rb_intern("id"))))) {
|
28
28
|
case -1: a = val; break;
|
29
29
|
case 0: r = val; break;
|
30
30
|
case 1: g = val; break;
|
@@ -8,11 +8,19 @@ void Init_psd_native() {
|
|
8
8
|
VALUE ImageMode_RGB = rb_define_module_under(ImageMode, "RGB");
|
9
9
|
rb_define_private_method(ImageMode_RGB, "combine_rgb_channel", psd_native_combine_rgb_channel, 0);
|
10
10
|
|
11
|
+
// CMYK Processing
|
12
|
+
VALUE ImageMode_CMYK = rb_define_module_under(ImageMode, "CMYK");
|
13
|
+
rb_define_private_method(ImageMode_CMYK, "combine_cmyk_channel", psd_native_combine_cmyk_channel, 0);
|
14
|
+
|
11
15
|
// RLE decoding
|
12
16
|
VALUE ImageFormat = rb_define_module_under(PSDNative, "ImageFormat");
|
13
17
|
VALUE RLE = rb_define_module_under(ImageFormat, "RLE");
|
14
18
|
rb_define_private_method(RLE, "decode_rle_channel", psd_native_decode_rle_channel, 0);
|
15
19
|
|
20
|
+
// Color functions
|
21
|
+
VALUE Color = rb_define_module_under(PSDNative, "Color");
|
22
|
+
rb_define_singleton_method(Color, "cmyk_to_rgb", psd_native_cmyk_to_rgb, 4);
|
23
|
+
|
16
24
|
psd_logger("info", "PSD native mixins enabled!");
|
17
25
|
}
|
18
26
|
|
@@ -8,10 +8,13 @@
|
|
8
8
|
// Pixels use 32 bits unsigned integers
|
9
9
|
// We borrow this from OilyPNG
|
10
10
|
typedef uint32_t PIXEL;
|
11
|
+
#define BUILD_PIXEL(r, g, b, a) (((PIXEL) (r) << 24) + ((PIXEL) (g) << 16) + ((PIXEL) (b) << 8) + (PIXEL) (a))
|
11
12
|
|
12
13
|
// Our native mixins
|
13
14
|
#include "image_mode_rgb.h"
|
15
|
+
#include "image_mode_cmyk.h"
|
14
16
|
#include "rle_decoding.h"
|
17
|
+
#include "color.h"
|
15
18
|
|
16
19
|
void Init_psd_native();
|
17
20
|
VALUE psd_class();
|
data/lib/psd_native/version.rb
CHANGED
data/lib/psd_native.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require "psd"
|
2
|
-
require "psd_native/version"
|
3
|
-
require "psd_native/psd_native"
|
4
2
|
|
5
3
|
module PSDNative
|
6
4
|
def self.included(base)
|
7
5
|
base::Image.send(:include, PSDNative::ImageMode::RGB)
|
8
|
-
|
9
|
-
# Disabled until optimized
|
6
|
+
base::Image.send(:include, PSDNative::ImageMode::CMYK)
|
10
7
|
base::Image.send(:include, PSDNative::ImageFormat::RLE)
|
11
8
|
end
|
12
9
|
end
|
13
10
|
|
11
|
+
require "psd_native/version"
|
12
|
+
require "psd_native/psd_native"
|
13
|
+
require "psd_native/color"
|
14
|
+
|
14
15
|
PSD.send :include, PSDNative
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: psd_native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan LeFevre
|
@@ -131,12 +131,17 @@ extensions:
|
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
133
|
- .gitignore
|
134
|
+
- .travis.yml
|
134
135
|
- Gemfile
|
135
136
|
- Guardfile
|
136
137
|
- LICENSE.txt
|
137
138
|
- README.md
|
138
139
|
- Rakefile
|
140
|
+
- ext/psd_native/color.c
|
141
|
+
- ext/psd_native/color.h
|
139
142
|
- ext/psd_native/extconf.rb
|
143
|
+
- ext/psd_native/image_mode_cmyk.c
|
144
|
+
- ext/psd_native/image_mode_cmyk.h
|
140
145
|
- ext/psd_native/image_mode_rgb.c
|
141
146
|
- ext/psd_native/image_mode_rgb.h
|
142
147
|
- ext/psd_native/psd_native_ext.c
|
@@ -144,6 +149,7 @@ files:
|
|
144
149
|
- ext/psd_native/rle_decoding.c
|
145
150
|
- ext/psd_native/rle_decoding.h
|
146
151
|
- lib/psd_native.rb
|
152
|
+
- lib/psd_native/color.rb
|
147
153
|
- lib/psd_native/version.rb
|
148
154
|
- psd_native.gemspec
|
149
155
|
- spec/files/example.psd
|