Commit fd52c97c authored by Tavmjong Bah's avatar Tavmjong Bah

Add limited support for CSS 'font-face' rule.

Basically, any ttf or otf file found will be loaded but no custom matching is
done nor is the 'font-family' menu updated.
parent d9c86888
Pipeline #13177650 passed with stages
in 23 minutes and 17 seconds
......@@ -949,6 +949,38 @@ void font_factory::AddFontsDir(char const *utf8dir)
#endif
}
void font_factory::AddFontFile(char const *utf8file)
{
#ifdef USE_PANGO_WIN32
g_info("Adding additional font only supported for fontconfig backend.");
#else
if (!Inkscape::IO::file_test(utf8file, G_FILE_TEST_IS_REGULAR)) {
g_warning("Font file '%s' does not exist and will be ignored.", utf8file);
return;
}
gchar *file;
# ifdef WIN32
file = g_win32_locale_filename_from_utf8(utf8file);
# else
file = g_filename_from_utf8(utf8file, -1, NULL, NULL, NULL);
# endif
FcConfig *conf = NULL;
# if PANGO_VERSION_CHECK(1,38,0)
pango_fc_font_map_get_config(PANGO_FC_FONT_MAP(fontServer));
Please register or sign in to reply
# endif
FcBool res = FcConfigAppFontAddFile(conf, (FcChar8 const *)file);
if (res = FcTrue) {
g_info("Font file '%s' added successfully.", utf8file);
} else {
g_warning("Could not add font file '%s'.", utf8file);
}
g_free(file);
#endif
}
/*
Local Variables:
mode:c++
......
......@@ -139,6 +139,9 @@ public:
/// Add a directory from which to include additional fonts
void AddFontsDir(char const *utf8dir);
/// Add a an additional font.
void AddFontFile(char const *utf8file);
private:
void* loadedPtr;
......
......@@ -12,6 +12,9 @@
#include <iostream>
#include <fstream>
// For font-rule
#include "libnrtype/FontFactory.h"
using Inkscape::XML::TEXT_NODE;
SPStyleElem::SPStyleElem() : SPObject() {
......@@ -308,12 +311,61 @@ end_font_face_cb(CRDocHandler *a_handler)
unsigned(font_face_rule->type));
}
std::cout << "end_font_face_cb: font face rule unsupported." << std::endl;
std::cout << "end_font_face_cb: font face rule limited support." << std::endl;
cr_declaration_dump (font_face_rule->kind.font_face_rule->decl_list, stdout, 2, TRUE);
printf ("\n");
// Get document
SPDocument* document = parse_tmp.document;
if (!document) {
std::cerr << "end_font_face_cb: No document!" << std::endl;
return;
}
if (!document->getURI()) {
std::cerr << "end_font_face_cb: Document URI is NULL" << std::endl;
return;
}
// Add ttf or otf fonts.
CRDeclaration const *cur = NULL;
for (cur = font_face_rule->kind.font_face_rule->decl_list; cur; cur = cur->next) {
if (cur->property &&
cur->property->stryng &&
cur->property->stryng->str &&
strcmp(cur->property->stryng->str, "src") == 0 ) {
if (cur->value &&
cur->value->content.str &&
cur->value->content.str->stryng &&
cur->value->content.str->stryng->str) {
Glib::ustring value = cur->value->content.str->stryng->str;
std::size_t found = value.find_last_of("ttf");
if (value.rfind("ttf") == (value.length() - 3) ||
value.rfind("otf") == (value.length() - 3)) {
// Get file
Glib::ustring ttf_file =
Inkscape::IO::Resource::get_filename (document->getURI(), value);
if (!ttf_file.empty()) {
font_factory *factory = font_factory::Default();
factory->AddFontFile( ttf_file.c_str() );
std::cout << "end_font_face_cb: Added font: " << ttf_file << std::endl;
// FIX ME: Need to refresh font list.
} else {
std::cout << "end_font_face_cb: Failed to add: " << value << std::endl;
}
}
}
}
}
parse_tmp.currStmt = NULL;
parse_tmp.stmtType = NO_STMT;
}
static void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment