summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGail Carmichael <gail.banaszkiewicz@gmail.com>2008-01-10 22:40:48 +0000
committergbanaszk <gbanaszk@users.sourceforge.net>2008-01-10 22:40:48 +0000
commit2b56810c6a95306616f8e64499bfa20476dc7dff (patch)
tree263eeb6eed8571cebe29fc574182ae35ca2d7e97 /src
parentFix small z-order error for 3D boxes (diff)
downloadinkscape-2b56810c6a95306616f8e64499bfa20476dc7dff.tar.gz
inkscape-2b56810c6a95306616f8e64499bfa20476dc7dff.zip
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. (bzr r4453)
Diffstat (limited to 'src')
-rw-r--r--src/desktop-style.cpp18
-rw-r--r--src/libnrtype/FontFactory.cpp4
-rw-r--r--src/widgets/toolbox.cpp44
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
+