fontconfig 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/fontconfig/fc_config.c +14 -4
- data/ext/fontconfig/fc_internal.h +47 -0
- data/ext/fontconfig/fc_pattern.c +60 -2
- data/lib/fontconfig.rb +57 -0
- data/lib/fontconfig/version.rb +1 -1
- data/spec/base_spec.rb +4 -0
- data/spec/pattern_spec.rb +36 -0
- metadata +4 -8
data/ext/fontconfig/fc_config.c
CHANGED
@@ -312,12 +312,25 @@ static VALUE rb_config_get_application_fonts(VALUE self){
|
|
312
312
|
return config_get_fonts(self, FcSetApplication);
|
313
313
|
}
|
314
314
|
|
315
|
+
// FcFontSort -- Return list of matching fonts
|
316
|
+
static VALUE rb_config_font_sort(int argc, VALUE *argv, VALUE self){
|
317
|
+
VALUE pattern, trim;
|
318
|
+
rb_scan_args(argc, argv, "11", &pattern, &trim);
|
319
|
+
//charset - ignored.
|
320
|
+
if(!RTEST(pattern) || !is_fc_pattern(pattern)){
|
321
|
+
rb_raise(rb_eArgError, "pattern must be Fonconfig::Pattern");
|
322
|
+
}
|
323
|
+
FcResult res;
|
324
|
+
FcFontSet* set = FcFontSort(CONFIG_UNWRAP(self), pattern_unwrap(pattern), RTEST(trim), 0, &res);
|
325
|
+
return font_set_wrap(set);
|
326
|
+
}
|
315
327
|
|
316
328
|
void Init_fontconfig_config(){
|
317
329
|
rb_cFcConfig = rb_define_class_under(rb_cFontconfig, "Config", rb_cObject);
|
318
330
|
rb_define_singleton_method(rb_cFcConfig, "new", rb_config_new, -1);
|
319
331
|
rb_define_method(rb_cFcConfig, "parse_and_load", rb_config_parse_and_load, -1);
|
320
332
|
rb_define_singleton_method(rb_cFcConfig, "filename", rb_config_filename, 1);
|
333
|
+
rb_define_singleton_method(rb_cFontconfig, "current_config", rb_config_get_current, 0);
|
321
334
|
rb_define_singleton_method(rb_cFcConfig, "get_current", rb_config_get_current, 0);
|
322
335
|
rb_define_method(rb_cFcConfig, "set_current!", rb_config_set_current, 0);
|
323
336
|
rb_define_method(rb_cFcConfig, "up_to_date?", rb_config_up_to_date_p, 0);
|
@@ -348,10 +361,7 @@ void Init_fontconfig_config(){
|
|
348
361
|
symScan = ID2SYM(rb_intern("scan"));
|
349
362
|
rb_define_method(rb_cFcConfig, "substitute", rb_config_substitute, -1);
|
350
363
|
rb_define_method(rb_cFcConfig, "substitute_with_pat", rb_config_substitute_with_pat, -1);
|
351
|
-
|
364
|
+
rb_define_method(rb_cFcConfig, "font_sort", rb_config_font_sort, -1);
|
352
365
|
|
353
366
|
// FcConfigGetBlanks -- Get config blanks
|
354
|
-
// FcFontSort -- Return list of matching fonts
|
355
|
-
|
356
|
-
// FcConfigGetCache -- DEPRECATED used to return per-user cache filename
|
357
367
|
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
//fontconfig internal
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
struct _FcPattern {
|
6
|
+
int num;
|
7
|
+
int size;
|
8
|
+
intptr_t elts_offset;
|
9
|
+
// FcRef ref;
|
10
|
+
int ref_here_dot_not_use;
|
11
|
+
};
|
12
|
+
|
13
|
+
typedef int FcObject;
|
14
|
+
|
15
|
+
typedef enum _FcValueBinding {
|
16
|
+
FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame
|
17
|
+
} FcValueBinding;
|
18
|
+
|
19
|
+
typedef struct _FcValueList {
|
20
|
+
struct _FcValueList *next;
|
21
|
+
FcValue value;
|
22
|
+
FcValueBinding binding;
|
23
|
+
} FcValueList, *FcValueListPtr;
|
24
|
+
|
25
|
+
typedef struct _FcPatternElt {
|
26
|
+
FcObject object;
|
27
|
+
FcValueList *values;
|
28
|
+
} FcPatternElt;
|
29
|
+
|
30
|
+
#define FcOffsetToPtr(b,o,t) ((t *) ((intptr_t) (b) + (o)))
|
31
|
+
#define FcEncodedOffsetMember(s,m,t) FcOffsetToPtr(s,FcOffsetDecode((s)->m), t)
|
32
|
+
#define FcIsEncodedOffset(p) ((((intptr_t) (p)) & 1) != 0)
|
33
|
+
#define FcPointerMember(s,m,t) (FcIsEncodedOffset((s)->m) ? \
|
34
|
+
FcEncodedOffsetMember (s,m,t) : \
|
35
|
+
(s)->m)
|
36
|
+
#define FcOffsetMember(s,m,t) FcOffsetToPtr(s,(s)->m,t)
|
37
|
+
#define FcPatternElts(p) FcOffsetMember(p,elts_offset,FcPatternElt)
|
38
|
+
#define FcPatternEltValues(pe) FcPointerMember(pe,values,FcValueList)
|
39
|
+
|
40
|
+
const char *
|
41
|
+
FcObjectName (FcObject object);
|
42
|
+
FcObject
|
43
|
+
FcObjectFromName (const char * name);
|
44
|
+
FcPatternElt *
|
45
|
+
FcPatternObjectFindElt (const FcPattern *p, FcObject object);
|
46
|
+
|
47
|
+
#define FcValueListNext(vl) FcPointerMember(vl,next,FcValueList)
|
data/ext/fontconfig/fc_pattern.c
CHANGED
@@ -96,6 +96,8 @@ static VALUE rb_pattern_add(int argc, VALUE *argv, VALUE self){
|
|
96
96
|
case T_TRUE: val.type = FcTypeBool; val.u.b = 1; break;
|
97
97
|
case T_FALSE: val.type = FcTypeBool; val.u.b = 0; break;
|
98
98
|
case T_OBJECT:
|
99
|
+
case T_DATA:
|
100
|
+
|
99
101
|
//TODO: increment object references?
|
100
102
|
// ...
|
101
103
|
// FcTypeMatrix: // m FcMatrix *
|
@@ -143,7 +145,7 @@ static VALUE rb_pattern_get(VALUE self, VALUE object, VALUE id){
|
|
143
145
|
FcResult res = FcPatternGet(PATTERN_UNWRAP(self), RSTRING_PTR(object), FIX2INT(id), &val);
|
144
146
|
if(res == FcResultMatch){
|
145
147
|
VALUE r_res = fc_value_to_value(&val);
|
146
|
-
//
|
148
|
+
// no need to free, ptr to internal mem
|
147
149
|
return r_res;
|
148
150
|
}
|
149
151
|
if(res == FcResultNoMatch || res == FcResultNoId){
|
@@ -172,12 +174,63 @@ static VALUE rb_pattern_remove(VALUE self, VALUE object, VALUE id){
|
|
172
174
|
return res? Qtrue : Qfalse;
|
173
175
|
}
|
174
176
|
|
175
|
-
rb_pattern_default_substitute(VALUE self){
|
177
|
+
static VALUE rb_pattern_default_substitute(VALUE self){
|
176
178
|
FcDefaultSubstitute(PATTERN_UNWRAP(self));
|
177
179
|
return self;
|
178
180
|
}
|
179
181
|
|
180
182
|
|
183
|
+
#include "fc_internal.h"
|
184
|
+
|
185
|
+
static VALUE rb_pattern_each_key(VALUE self){
|
186
|
+
FcPattern* p = PATTERN_UNWRAP(self);
|
187
|
+
int i;
|
188
|
+
FcPatternElt* e;
|
189
|
+
for (i = 0; i < p->num; i++){
|
190
|
+
e = &FcPatternElts(p)[i];
|
191
|
+
//FIXME: return as symbols?
|
192
|
+
rb_yield(rb_str_new2(FcObjectName(e->object)));
|
193
|
+
}
|
194
|
+
return self;
|
195
|
+
}
|
196
|
+
|
197
|
+
static VALUE rb_pattern_has_key_p(VALUE self, VALUE key){
|
198
|
+
FcPattern* p = PATTERN_UNWRAP(self);
|
199
|
+
FcPatternElt* e = FcPatternObjectFindElt(p, FcObjectFromName (StringValuePtr(key)));
|
200
|
+
if(e){
|
201
|
+
return Qtrue;
|
202
|
+
}
|
203
|
+
return Qfalse;
|
204
|
+
}
|
205
|
+
|
206
|
+
static VALUE rb_pattern_get_keys(VALUE self){
|
207
|
+
FcPattern* p = PATTERN_UNWRAP(self);
|
208
|
+
VALUE res = rb_ary_new();
|
209
|
+
int i;
|
210
|
+
FcPatternElt* e;
|
211
|
+
for (i = 0; i < p->num; i++){
|
212
|
+
e = &FcPatternElts(p)[i];
|
213
|
+
rb_ary_push(res, rb_str_new2(FcObjectName(e->object)));
|
214
|
+
// FcValueListPrint (FcPatternEltValues(e));
|
215
|
+
}
|
216
|
+
return res;
|
217
|
+
}
|
218
|
+
|
219
|
+
static VALUE rb_pattern_each_key_value(VALUE self, VALUE key){
|
220
|
+
FcPattern* p = PATTERN_UNWRAP(self);
|
221
|
+
FcPatternElt* e = FcPatternObjectFindElt(p, FcObjectFromName (StringValuePtr(key)));
|
222
|
+
FcValueListPtr l;
|
223
|
+
if(e){
|
224
|
+
for (l = FcPatternEltValues(e); l; l = FcValueListNext(l)){
|
225
|
+
// FcValueCanonicalize(&l->value); - re allocates value pointers, do not need this
|
226
|
+
rb_yield(fc_value_to_value(&l->value));
|
227
|
+
}
|
228
|
+
}
|
229
|
+
return self;
|
230
|
+
}
|
231
|
+
|
232
|
+
|
233
|
+
|
181
234
|
void Init_fontconfig_pattern(){
|
182
235
|
rb_cFcPattern = rb_define_class_under(rb_cFontconfig, "Pattern", rb_cObject);
|
183
236
|
rb_define_singleton_method(rb_cFcPattern, "new", rb_pattern_new, -1);
|
@@ -199,4 +252,9 @@ void Init_fontconfig_pattern(){
|
|
199
252
|
rb_define_method(rb_cFcPattern, "debug_print", rb_pattern_debugprint, 0);
|
200
253
|
rb_define_method(rb_cFcPattern, "default_substitute!", rb_pattern_default_substitute, 0);
|
201
254
|
|
255
|
+
rb_define_method(rb_cFcPattern, "keys", rb_pattern_get_keys, 0);
|
256
|
+
rb_define_method(rb_cFcPattern, "each_key", rb_pattern_each_key, 0);
|
257
|
+
rb_define_method(rb_cFcPattern, "each_value", rb_pattern_each_key_value, 1);
|
258
|
+
rb_define_method(rb_cFcPattern, "has_key?", rb_pattern_has_key_p, 1);
|
259
|
+
|
202
260
|
}
|
data/lib/fontconfig.rb
CHANGED
@@ -23,10 +23,67 @@ module Fontconfig
|
|
23
23
|
def delete!
|
24
24
|
@pattern.delete(@key)
|
25
25
|
end
|
26
|
+
|
27
|
+
def each &blk
|
28
|
+
@pattern.each_value @key, &blk
|
29
|
+
end
|
30
|
+
|
31
|
+
include Enumerable
|
26
32
|
end
|
27
33
|
|
28
34
|
def [](key)
|
35
|
+
key = key.to_s
|
36
|
+
return nil unless has_key?(key)
|
29
37
|
return Proxy.new(self, key)
|
30
38
|
end
|
39
|
+
|
40
|
+
def inspect
|
41
|
+
"#<#{self.class.name} #{self.format('%{=fcmatch}')}>"
|
42
|
+
end
|
43
|
+
|
44
|
+
alias :each :each_key
|
45
|
+
include Enumerable
|
46
|
+
|
47
|
+
def config_substitute! config=Fontconfig.current_config, kind=:font
|
48
|
+
#kind - :pattern, :font, :scan
|
49
|
+
unless config.substitute(self)
|
50
|
+
raise "cannot perform substitutions on pattern"
|
51
|
+
end
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def prepare! config=Fontconfig.current_config, kind=:font
|
56
|
+
@prepared = true
|
57
|
+
config_substitute! config, kind
|
58
|
+
default_substitute!
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
def match config=Fontconfig.current_config
|
63
|
+
raise "unprepared pattern match" unless @prepared
|
64
|
+
config.font_match self
|
65
|
+
end
|
66
|
+
|
67
|
+
def filename
|
68
|
+
self[:filename].first
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def self.pattern *args
|
74
|
+
Pattern.new *args
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.prepared_pattern *args
|
78
|
+
self.pattern(*args).prepare!
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.match *args
|
82
|
+
pat = if args.first.is_a? Pattern
|
83
|
+
args.first
|
84
|
+
else
|
85
|
+
self.prepared_pattern *args
|
86
|
+
end
|
87
|
+
current_config.font_match pat
|
31
88
|
end
|
32
89
|
end
|
data/lib/fontconfig/version.rb
CHANGED
data/spec/base_spec.rb
CHANGED
data/spec/pattern_spec.rb
CHANGED
@@ -46,6 +46,42 @@ describe Fontconfig::Pattern do
|
|
46
46
|
subject["familylang"][0].must_equal "en"
|
47
47
|
end
|
48
48
|
|
49
|
+
describe "advanced" do
|
50
|
+
let(:key_type){ String }
|
51
|
+
|
52
|
+
it "each_key" do
|
53
|
+
n = 0
|
54
|
+
subject.each_key{|k|
|
55
|
+
k.must_be_kind_of key_type
|
56
|
+
n+=1
|
57
|
+
}
|
58
|
+
n.must_be :>, 0
|
59
|
+
end
|
60
|
+
|
61
|
+
it "each is each_key" do
|
62
|
+
subject.each{|k|
|
63
|
+
}
|
64
|
+
subject.to_a.sort.must_equal subject.keys.sort
|
65
|
+
end
|
66
|
+
|
67
|
+
it "keys" do
|
68
|
+
keys = subject.keys
|
69
|
+
keys.must_be_kind_of Array
|
70
|
+
keys.size.must_be :>,0
|
71
|
+
keys.each{|k|
|
72
|
+
k.must_be_kind_of key_type
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
it "each value for key" do
|
77
|
+
n = 0
|
78
|
+
subject.each_value("family"){|k|
|
79
|
+
n+=1
|
80
|
+
}
|
81
|
+
n.must_be :>, 0
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
49
85
|
end
|
50
86
|
|
51
87
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fontconfig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pkg-config
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- ext/fontconfig/extconf.rb
|
92
92
|
- ext/fontconfig/fc_config.c
|
93
93
|
- ext/fontconfig/fc_fontset.c
|
94
|
+
- ext/fontconfig/fc_internal.h
|
94
95
|
- ext/fontconfig/fc_objectset.c
|
95
96
|
- ext/fontconfig/fc_pattern.c
|
96
97
|
- ext/fontconfig/fontconfig.c
|
@@ -115,18 +116,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
116
|
- - ! '>='
|
116
117
|
- !ruby/object:Gem::Version
|
117
118
|
version: '0'
|
118
|
-
segments:
|
119
|
-
- 0
|
120
|
-
hash: -3843724065432744597
|
121
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
120
|
none: false
|
123
121
|
requirements:
|
124
122
|
- - ! '>='
|
125
123
|
- !ruby/object:Gem::Version
|
126
124
|
version: '0'
|
127
|
-
segments:
|
128
|
-
- 0
|
129
|
-
hash: -3843724065432744597
|
130
125
|
requirements: []
|
131
126
|
rubyforge_project:
|
132
127
|
rubygems_version: 1.8.24
|
@@ -139,3 +134,4 @@ test_files:
|
|
139
134
|
- spec/object_set_spec.rb
|
140
135
|
- spec/pattern_spec.rb
|
141
136
|
- spec/test_helper.rb
|
137
|
+
has_rdoc:
|