From 18b3401a3e941d021e7c38ffbf8ed98bec8b70cf Mon Sep 17 00:00:00 2001 From: gbanaszk Date: Thu, 10 Jan 2008 22:40:48 +0000 Subject: [PATCH] Fix for Bug #181663 (Font style errors / assert when changing style) - I didn't see the problem described in the main part, but the assert was overzealous and, in my new opinion, shouldn't be there, so it's gone. - Fixed other style button problems mentioned in comments. --- src/desktop-style.cpp | 18 ++++++++------ src/libnrtype/FontFactory.cpp | 4 ---- src/widgets/toolbox.cpp | 44 ++++++++++++++++++++++++++++++----- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp index e56e7fbbe..fe388ded3 100644 --- a/src/desktop-style.cpp +++ b/src/desktop-style.cpp @@ -1075,18 +1075,22 @@ objects_query_fontspecification (GSList *objects, SPStyle *style_res) texts ++; - if (style_res->text->font_specification.value && style->text->font_specification.value && + if (style_res->text->font_specification.value && style_res->text->font_specification.set && + style->text->font_specification.value && style->text->font_specification.set && strcmp (style_res->text->font_specification.value, style->text->font_specification.value)) { different = true; // different fonts } + + if (style->text->font_specification.set) { - if (style_res->text->font_specification.value) { - g_free(style_res->text->font_specification.value); - style_res->text->font_specification.value = NULL; + if (style_res->text->font_specification.value) { + g_free(style_res->text->font_specification.value); + style_res->text->font_specification.value = NULL; + } + + style_res->text->font_specification.set = TRUE; + style_res->text->font_specification.value = g_strdup(style->text->font_specification.value); } - - style_res->text->font_specification.set = TRUE; - style_res->text->font_specification.value = g_strdup(style->text->font_specification.value); } if (texts == 0 || !style_res->text->font_specification.set) diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp index 2d56a1a41..98846b77f 100644 --- a/src/libnrtype/FontFactory.cpp +++ b/src/libnrtype/FontFactory.cpp @@ -420,8 +420,6 @@ Glib::ustring font_factory::ReplaceFontSpecificationFamily(const Glib::ustring & // Find the PangoFontDescription associated to this fontSpec PangoStringToDescrMap::iterator it = fontInstanceMap.find(fontSpec); - g_assert(it != fontInstanceMap.end()); - if (it != fontInstanceMap.end()) { PangoFontDescription *descr = pango_font_description_copy((*it).second); @@ -496,8 +494,6 @@ Glib::ustring font_factory::FontSpecificationSetItalic(const Glib::ustring & fon // Find the PangoFontDesecription that goes with this font specification string PangoStringToDescrMap::iterator it = fontInstanceMap.find(fontSpec); - g_assert(it != fontInstanceMap.end()); - if (it != fontInstanceMap.end()) { // If we did find one, make a copy and set/unset the italic as needed PangoFontDescription *descr = pango_font_description_copy((*it).second); diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 850018662..5d01eb78f 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -4181,9 +4181,21 @@ sp_text_toolbox_family_changed (GtkTreeSelection *selection, int result_fontspec = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONT_SPECIFICATION); + font_instance * fontFromStyle = font_factory::Default()->FaceFromStyle(query); + SPCSSAttr *css = sp_repr_css_attr_new (); - std::string fontSpec = query->text->font_specification.value; + + // First try to get the font spec from the stored value + Glib::ustring fontSpec = query->text->font_specification.set ? query->text->font_specification.value : ""; + + if (fontSpec.empty()) { + // Construct a new font specification if it does not yet exist + font_instance * fontFromStyle = font_factory::Default()->FaceFromStyle(query); + fontSpec = font_factory::Default()->ConstructFontSpecification(fontFromStyle); + fontFromStyle->Unref(); + } + if (!fontSpec.empty()) { Glib::ustring newFontSpec = font_factory::Default()->ReplaceFontSpecificationFamily(fontSpec, family); if (!newFontSpec.empty() && fontSpec != newFontSpec) { @@ -4334,12 +4346,29 @@ sp_text_toolbox_style_toggled (GtkToggleButton *button, SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); + int result_fontspec = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONT_SPECIFICATION); - - Glib::ustring fontSpec = query->text->font_specification.value; - Glib::ustring newFontSpec; + int result_family = + sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTFAMILY); + + int result_style = + sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTSTYLE); + + int result_numbers = + sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS); + + Glib::ustring fontSpec = query->text->font_specification.set ? query->text->font_specification.value : ""; + Glib::ustring newFontSpec = ""; + + if (fontSpec.empty()) { + // Construct a new font specification if it does not yet exist + font_instance * fontFromStyle = font_factory::Default()->FaceFromStyle(query); + fontSpec = font_factory::Default()->ConstructFontSpecification(fontFromStyle); + fontFromStyle->Unref(); + } + switch (prop) { case 0: @@ -4348,6 +4377,7 @@ sp_text_toolbox_style_toggled (GtkToggleButton *button, newFontSpec = font_factory::Default()->FontSpecificationSetBold(fontSpec, active); } if (fontSpec != newFontSpec) { + // Don't even set the bold if the font didn't exist on the system sp_repr_css_set_property (css, "font-weight", active ? "bold" : "normal" ); } break; @@ -4359,14 +4389,15 @@ sp_text_toolbox_style_toggled (GtkToggleButton *button, newFontSpec = font_factory::Default()->FontSpecificationSetItalic(fontSpec, active); } if (fontSpec != newFontSpec) { + // Don't even set the italic if the font didn't exist on the system sp_repr_css_set_property (css, "font-style", active ? "italic" : "normal"); } break; } } - if (!fontSpec.empty()) { - sp_repr_css_set_property (css, "-inkscape-font-specification", fontSpec.c_str()); + if (!newFontSpec.empty()) { + sp_repr_css_set_property (css, "-inkscape-font-specification", newFontSpec.c_str()); } // If querying returned nothing, read the style from the text tool prefs (default style for new texts) @@ -5286,3 +5317,4 @@ static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* main + -- 2.30.2