Skip to content

Commit 664bf34

Browse files
committed
add fontconfig_setting extension to read fontconfig from library instead of commands
1 parent 80c5441 commit 664bf34

File tree

4 files changed

+159
-4
lines changed

4 files changed

+159
-4
lines changed

.gitignore

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
/package/*.tar.bz2
2-
/src/ext/ft2_rendering/Makefile
3-
/src/ext/ft2_rendering/*.o
4-
/src/ext/ft2_rendering/*.so
5-
/src/ext/ft2_rendering/yast
2+
/src/ext/*/Makefile
3+
/src/ext/*/*.o
4+
/src/ext/*/*.so
65
/src/lib/yast
76
**/.*.swp
87

src/ext/fontconfig_setting/extconf.rb

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
require 'mkmf'
2+
3+
extension_name = 'fontconfig_setting'
4+
5+
$LDFLAGS << ' ' + `pkg-config --libs fontconfig`
6+
# there is bug in fontconfig.pc (will fix soon ;)
7+
$CFLAGS << ' ' + ' -I/usr/include/fontconfig ' + `pkg-config --cflags fontconfig`
8+
9+
dir_config(extension_name)
10+
create_makefile(extension_name)
11+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include "ruby.h"
2+
#include <fontconfig.h>
3+
#include <string.h>
4+
#include <stdio.h>
5+
6+
const char *blacklist_families[] = {
7+
"micro.pcf",
8+
"deccurs.pcf",
9+
"decsess.pcf",
10+
"cursor.pcf",
11+
};
12+
13+
#define NBLACK (sizeof(blacklist_families)/sizeof(blacklist_families[0]))
14+
15+
VALUE FontconfigSetting = Qnil;
16+
17+
void Init_fontconfig_setting();
18+
VALUE method_fc_installed_families(VALUE self, VALUE array_elements);
19+
VALUE method_fc_is_family_installed(VALUE self, VALUE str_family);
20+
21+
void Init_fontconfig_setting() {
22+
FontconfigSetting = rb_define_module("FontconfigSetting");
23+
rb_define_method(FontconfigSetting, "fc_installed_families",
24+
method_fc_installed_families, 1);
25+
rb_define_method(FontconfigSetting, "fc_is_family_installed",
26+
method_fc_is_family_installed, 1);
27+
}
28+
29+
VALUE method_fc_installed_families(VALUE self, VALUE array_elements) {
30+
VALUE str_family_list = rb_ary_new();
31+
32+
FcObjectSet *objectset;
33+
FcFontSet *fontset;
34+
FcPattern *empty;
35+
36+
char *str_pattern;
37+
int i, j;
38+
VALUE el;
39+
40+
FcInit();
41+
objectset = FcObjectSetCreate();
42+
while ((el = rb_ary_shift(array_elements)) != Qnil)
43+
{
44+
FcObjectSetAdd(objectset, StringValueCStr(el));
45+
}
46+
empty = FcPatternCreate();
47+
fontset = FcFontList (NULL, empty, objectset);
48+
FcObjectSetDestroy (objectset);
49+
FcPatternDestroy(empty);
50+
51+
for (i = 0; i < fontset->nfont; i++)
52+
{
53+
str_pattern = (char *)FcPatternFormat(fontset->fonts[i], (const FcChar8 *)"%{=fclist}");
54+
for (j = 0; j < NBLACK; j++)
55+
if (strcmp(blacklist_families[j], str_pattern) == 0)
56+
break;
57+
if (j < NBLACK)
58+
continue;
59+
rb_ary_push(str_family_list, rb_str_new2(str_pattern));
60+
}
61+
62+
return str_family_list;
63+
}
64+
65+
VALUE method_fc_is_family_installed(VALUE self, VALUE str_family) {
66+
FcObjectSet *objectset;
67+
FcPattern *pattern;
68+
FcFontSet *fontset;
69+
70+
char *family;
71+
72+
family = StringValueCStr(str_family);
73+
74+
FcInit();
75+
objectset = FcObjectSetBuild(FC_FAMILY, NULL);
76+
pattern = FcNameParse((FcChar8 *)family);
77+
fontset = FcFontList (NULL, pattern, objectset);
78+
FcPatternDestroy (pattern);
79+
FcObjectSetDestroy (objectset);
80+
81+
if (fontset->nfont > 0)
82+
return Qtrue;
83+
else
84+
return Qfalse;
85+
}
86+

test/fontconfig_setting_spec.rb

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
require_relative "spec-helper"
2+
require "yast/fontconfig_setting"
3+
4+
describe FontconfigSetting do
5+
include FontconfigSetting
6+
7+
def are_installed(families)
8+
families.each do |family|
9+
if (!fc_is_family_installed(family))
10+
return false
11+
end
12+
end
13+
return true
14+
end
15+
16+
def an_installed_family
17+
return fc_installed_families(["family"])[0]
18+
end
19+
20+
def contain_pattern_entries(families, entries)
21+
entries.delete("family")
22+
families.each do |family|
23+
entries.each do |entry|
24+
if (!family.include?(entry + "="))
25+
return false
26+
end
27+
end
28+
end
29+
return true
30+
end
31+
32+
describe "#fc_is_family_installed" do
33+
it "returns false when family is not installed" do
34+
family = fc_is_family_installed("foo")
35+
expect(family).to be false
36+
end
37+
38+
it "returns true when family is installed" do
39+
expect(fc_is_family_installed(an_installed_family()))
40+
end
41+
end
42+
43+
describe "#fc_installed_families" do
44+
it "returns non empty list of installed families" do
45+
families = fc_installed_families(["family"])
46+
expect(families).to be_a(Array)
47+
expect(families.length).to be > 0
48+
expect(are_installed(families)).to be true
49+
end
50+
51+
it "understands important fontconfig pattern entries" do
52+
entries = ["family", "fontformat"]
53+
families = fc_installed_families(entries)
54+
expect(contain_pattern_entries(families, entries)).to be true
55+
end
56+
end
57+
end
58+
59+

0 commit comments

Comments
 (0)