summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2013-02-02 07:44:07 +0000
committerJohn Smith <john.smith7545@yahoo.com>2013-02-02 07:44:07 +0000
commitb4394b6d2a5db9fe935824c946d8a81333614ae8 (patch)
tree13b3796bdc9d61006ed1eb917aa425b96c29d7bd /src
parentFix for 1091582 : Problem with key release when pressing space with cursor of... (diff)
downloadinkscape-b4394b6d2a5db9fe935824c946d8a81333614ae8.tar.gz
inkscape-b4394b6d2a5db9fe935824c946d8a81333614ae8.zip
Fix for 1002757 : Regressions with new default font 'sans-serif'
(bzr r12089)
Diffstat (limited to 'src')
-rw-r--r--src/libnrtype/FontFactory.cpp42
-rw-r--r--src/libnrtype/FontFactory.h3
-rw-r--r--src/libnrtype/FontInstance.cpp4
-rw-r--r--src/libnrtype/Layout-TNG-Output.cpp4
-rw-r--r--src/sp-text.cpp2
-rw-r--r--src/ui/dialog/font-substitution.cpp2
6 files changed, 45 insertions, 12 deletions
diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp
index fdb02aa0f..6c95c0363 100644
--- a/src/libnrtype/FontFactory.cpp
+++ b/src/libnrtype/FontFactory.cpp
@@ -28,7 +28,7 @@ typedef INK_UNORDERED_MAP<PangoFontDescription*, font_instance*, font_descr_hash
size_t font_descr_hash::operator()( PangoFontDescription *const &x) const {
int h = 0;
h *= 1128467;
- char const *theF = pango_font_description_get_family(x);
+ char const *theF = sp_font_description_get_family(x);
h += (theF)?g_str_hash(theF):0;
h *= 1128467;
h += (int)pango_font_description_get_style(x);
@@ -42,8 +42,8 @@ size_t font_descr_hash::operator()( PangoFontDescription *const &x) const {
}
bool font_descr_equal::operator()( PangoFontDescription *const&a, PangoFontDescription *const &b) const {
//if ( pango_font_description_equal(a,b) ) return true;
- char const *fa = pango_font_description_get_family(a);
- char const *fb = pango_font_description_get_family(b);
+ char const *fa = sp_font_description_get_family(a);
+ char const *fb = sp_font_description_get_family(b);
if ( ( fa && fb == NULL ) || ( fb && fa == NULL ) ) return false;
if ( fa && fb && strcmp(fa,fb) != 0 ) return false;
if ( pango_font_description_get_style(a) != pango_font_description_get_style(b) ) return false;
@@ -395,6 +395,33 @@ Glib::ustring font_factory::ConstructFontSpecification(font_instance *font)
return pangoString;
}
+/*
+ * Wrap calls to pango_font_description_get_family
+ * and replace some of the pango font names with generic css names
+ * http://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#generic-font-families
+ *
+ * This function should be called in place of pango_font_description_get_family()
+ */
+const char *sp_font_description_get_family(PangoFontDescription const *fontDescr) {
+
+ static std::map<Glib::ustring, Glib::ustring> fontNameMap;
+ std::map<Glib::ustring, Glib::ustring>::iterator it;
+
+ fontNameMap.insert(std::make_pair("Sans", "sans-serif"));
+ fontNameMap.insert(std::make_pair("Serif", "serif"));
+ fontNameMap.insert(std::make_pair("Monospace", "monospace"));
+ //fontNameMap.insert(std::make_pair("", "cursive"));
+ //fontNameMap.insert(std::make_pair("", "fantasy"));
+
+ const char *pangoFamily = pango_font_description_get_family(fontDescr);
+
+ if (pangoFamily && ((it = fontNameMap.find(pangoFamily)) != fontNameMap.end())) {
+ return ((Glib::ustring)it->second).c_str();
+ }
+
+ return pangoFamily;
+}
+
Glib::ustring font_factory::GetUIFamilyString(PangoFontDescription const *fontDescr)
{
Glib::ustring family;
@@ -403,7 +430,8 @@ Glib::ustring font_factory::GetUIFamilyString(PangoFontDescription const *fontDe
if (fontDescr) {
// For now, keep it as family name taken from pango
- const char *pangoFamily = pango_font_description_get_family(fontDescr);
+ const char *pangoFamily = sp_font_description_get_family(fontDescr);
+
if( pangoFamily ) {
family = pangoFamily;
}
@@ -719,6 +747,7 @@ void font_factory::GetUIFamiliesAndStyles(FamilyToStylesMap *map)
Glib::ustring styleUIName = GetUIStyleString(faceDescr);
if (!familyUIName.empty() && !styleUIName.empty()) {
+
// Find the right place to put the style information, adding
// a map entry for the family name if it doesn't yet exist
@@ -754,6 +783,7 @@ void font_factory::GetUIFamiliesAndStyles(FamilyToStylesMap *map)
ConstructFontSpecification(faceDescr)));
fontInstanceMap.insert(
std::make_pair(ConstructFontSpecification(faceDescr), faceDescr));
+
} else {
pango_font_description_free(faceDescr);
}
@@ -870,7 +900,7 @@ font_instance* font_factory::FaceFromPangoString(char const *pangoString)
descr = pango_font_description_from_string(pangoString);
}
- if (descr && (pango_font_description_get_family(descr) != NULL)) {
+ if (descr && (sp_font_description_get_family(descr) != NULL)) {
fontInstance = Face(descr);
}
@@ -918,7 +948,7 @@ font_instance *font_factory::Face(PangoFontDescription *descr, bool canFail)
// workaround for bug #1025565.
// fonts without families blow up Pango.
- if (pango_font_description_get_family(descr) != NULL) {
+ if (sp_font_description_get_family(descr) != NULL) {
nFace = pango_font_map_load_font(fontServer,fontContext,descr);
}
else {
diff --git a/src/libnrtype/FontFactory.h b/src/libnrtype/FontFactory.h
index 42f975ab7..12046079e 100644
--- a/src/libnrtype/FontFactory.h
+++ b/src/libnrtype/FontFactory.h
@@ -54,6 +54,9 @@ struct font_descr_equal : public std::binary_function<PangoFontDescription*, Pan
int style_name_compare(char const *aa, char const *bb);
int family_name_compare(char const *a, char const *b);
+// Wraps calls to pango_font_description_get_family with some name substitution
+const char *sp_font_description_get_family(PangoFontDescription const *fontDescr);
+
// Map type for gathering UI family and style strings
typedef std::map<Glib::ustring, std::list<Glib::ustring> > FamilyToStylesMap;
diff --git a/src/libnrtype/FontInstance.cpp b/src/libnrtype/FontInstance.cpp
index f26b157da..61225ad0c 100644
--- a/src/libnrtype/FontInstance.cpp
+++ b/src/libnrtype/FontInstance.cpp
@@ -285,14 +285,14 @@ unsigned int font_instance::Attribute(const gchar *key, gchar *str, unsigned int
bool b = (weight >= PANGO_WEIGHT_BOLD);
res = g_strdup_printf ("%s%s%s%s",
- pango_font_description_get_family(descr),
+ sp_font_description_get_family(descr),
(b || i || o) ? "-" : "",
(b) ? "Bold" : "",
(i) ? "Italic" : ((o) ? "Oblique" : "") );
free_res = true;
}
} else if ( strcmp(key,"family") == 0 ) {
- res=(char*)pango_font_description_get_family(descr);
+ res=(char*)sp_font_description_get_family(descr);
free_res=false;
} else if ( strcmp(key,"style") == 0 ) {
PangoStyle v=pango_font_description_get_style(descr);
diff --git a/src/libnrtype/Layout-TNG-Output.cpp b/src/libnrtype/Layout-TNG-Output.cpp
index bf746b41f..1d086b57b 100644
--- a/src/libnrtype/Layout-TNG-Output.cpp
+++ b/src/libnrtype/Layout-TNG-Output.cpp
@@ -340,7 +340,7 @@ Glib::ustring Layout::getFontFamily(unsigned span_index) const
return "";
if (_spans[span_index].font) {
- return pango_font_description_get_family(_spans[span_index].font->descr);
+ return sp_font_description_get_family(_spans[span_index].font->descr);
}
return "";
@@ -368,7 +368,7 @@ Glib::ustring Layout::dumpAsText() const
snprintf(line, sizeof(line), " in chunk %d (x=%f, baselineshift=%f)\n", _spans[span_index].in_chunk, _chunks[_spans[span_index].in_chunk].left_x, _spans[span_index].baseline_shift);
result += line;
if (_spans[span_index].font) {
- snprintf(line, sizeof(line), " font '%s' %f %s %s\n", pango_font_description_get_family(_spans[span_index].font->descr), _spans[span_index].font_size, style_to_text(pango_font_description_get_style(_spans[span_index].font->descr)), weight_to_text(pango_font_description_get_weight(_spans[span_index].font->descr)));
+ snprintf(line, sizeof(line), " font '%s' %f %s %s\n", sp_font_description_get_family(_spans[span_index].font->descr), _spans[span_index].font_size, style_to_text(pango_font_description_get_style(_spans[span_index].font->descr)), weight_to_text(pango_font_description_get_weight(_spans[span_index].font->descr)));
result += line;
}
snprintf(line, sizeof(line), " x_start = %f, x_end = %f\n", _spans[span_index].x_start, _spans[span_index].x_end);
diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index 1b4246483..8d42b7d59 100644
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
@@ -384,7 +384,7 @@ static char * sp_text_description(SPItem *item)
char name_buf[256];
char *n;
if (tf) {
- tf->Name(name_buf, sizeof(name_buf));
+ tf->Family(name_buf, sizeof(name_buf));
n = xml_quote_strdup(name_buf);
tf->Unref();
} else {
diff --git a/src/ui/dialog/font-substitution.cpp b/src/ui/dialog/font-substitution.cpp
index 24588946e..07e73cec8 100644
--- a/src/ui/dialog/font-substitution.cpp
+++ b/src/ui/dialog/font-substitution.cpp
@@ -260,7 +260,7 @@ Glib::ustring FontSubstitution::getSubstituteFontName (Glib::ustring font)
font_instance *res = (font_factory::Default())->Face(descr);
if (res->pFont) {
PangoFontDescription *nFaceDesc = pango_font_describe(res->pFont);
- out = pango_font_description_get_family(nFaceDesc);
+ out = sp_font_description_get_family(nFaceDesc);
}
pango_font_description_free(descr);