Hello community, here is the log from the commit of package librsvg for openSUSE:Factory checked in at 2019-11-10 22:05:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/librsvg (Old) and /work/SRC/openSUSE:Factory/.librsvg.new.2990 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "librsvg" Sun Nov 10 22:05:42 2019 rev:95 rq:746227 version:2.46.3 Changes: -------- --- /work/SRC/openSUSE:Factory/librsvg/librsvg.changes 2019-10-30 14:39:59.081682237 +0100 +++ /work/SRC/openSUSE:Factory/.librsvg.new.2990/librsvg.changes 2019-11-10 22:05:44.882564407 +0100 @@ -1,0 +2,14 @@ +Thu Nov 7 07:51:06 UTC 2019 - Fabian Vogt <[email protected]> + +- Add patches to fix coloring of symbolic icons (glgo#GNOME/librsvg#525): + * 0001-croco.rs-Add-struct-definition-for-CRSimpleSel.patch + * 0002-Compute-the-specificity-of-CSS-selectors.patch + * 0003-525-Consider-specificity-when-applying-CSS-selector-.patch + +------------------------------------------------------------------- +Wed Nov 6 01:24:01 UTC 2019 - Yifan Jiang <[email protected]> + +- Remove BuildRequires rust-std. The replacement rust-std-static + is already required by rust. + +------------------------------------------------------------------- New: ---- 0001-croco.rs-Add-struct-definition-for-CRSimpleSel.patch 0002-Compute-the-specificity-of-CSS-selectors.patch 0003-525-Consider-specificity-when-applying-CSS-selector-.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ librsvg.spec ++++++ --- /var/tmp/diff_new_pack.lWAuw5/_old 2019-11-10 22:05:46.738566817 +0100 +++ /var/tmp/diff_new_pack.lWAuw5/_new 2019-11-10 22:05:46.794566890 +0100 @@ -28,12 +28,14 @@ URL: https://wiki.gnome.org/Projects/LibRsvg Source0: https://download.gnome.org/sources/librsvg/2.46/%{name}-%{version}.tar.xz Source99: baselibs.conf - +# PATCH-FIX-UPSTREAM https://gitlab.gnome.org/GNOME/librsvg/issues/525 +Patch1: 0001-croco.rs-Add-struct-definition-for-CRSimpleSel.patch +Patch2: 0002-Compute-the-specificity-of-CSS-selectors.patch +Patch3: 0003-525-Consider-specificity-when-applying-CSS-selector-.patch BuildRequires: cargo BuildRequires: gobject-introspection-devel BuildRequires: pkgconfig BuildRequires: rust >= 1.34 -BuildRequires: rust-std BuildRequires: vala BuildRequires: pkgconfig(cairo) >= 1.16.0 BuildRequires: pkgconfig(cairo-png) >= 1.2.0 ++++++ 0001-croco.rs-Add-struct-definition-for-CRSimpleSel.patch ++++++ >From 00795b4d94858be229da7e47c046f9f2bf3f579c Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero <[email protected]> Date: Wed, 6 Nov 2019 17:13:15 -0600 Subject: [PATCH 1/3] croco.rs: Add struct definition for CRSimpleSel --- rsvg_internals/src/croco.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/rsvg_internals/src/croco.rs b/rsvg_internals/src/croco.rs index 892aca9b..21ac8051 100644 --- a/rsvg_internals/src/croco.rs +++ b/rsvg_internals/src/croco.rs @@ -6,9 +6,9 @@ use libc; // Opaque types from libcroco, or those which we only manipulate through libcroco functions pub type CRString = gpointer; -pub type CRSimpleSel = gpointer; pub type CRParser = gpointer; pub type CRTerm = gpointer; +pub type CRAdditionalSel = gpointer; pub type CRStatus = u32; @@ -22,9 +22,22 @@ pub struct CRParsingLocation { pub byte_offset: libc::c_uint, } +#[repr(C)] +pub struct CRSimpleSel { + pub type_mask: libc::c_int, + pub is_case_sentive: gboolean, + pub name: CRString, + pub combinator: libc::c_int, + pub add_sel: CRAdditionalSel, + pub specificity: libc::c_ulong, + pub next: *mut CRSimpleSel, + pub prev: *mut CRSimpleSel, + pub location: CRParsingLocation, +} + #[repr(C)] pub struct CRSelector { - pub simple_sel: CRSimpleSel, + pub simple_sel: *mut CRSimpleSel, pub next: *mut CRSelector, pub prev: *mut CRSelector, @@ -91,7 +104,7 @@ extern "C" { pub fn cr_selector_ref(a_this: *mut CRSelector); pub fn cr_selector_unref(a_this: *mut CRSelector) -> gboolean; - pub fn cr_simple_sel_to_string(a_this: CRSimpleSel) -> *mut libc::c_char; + pub fn cr_simple_sel_to_string(a_this: *mut CRSimpleSel) -> *mut libc::c_char; pub fn cr_string_peek_raw_str(a_this: CRString) -> *const libc::c_char; -- 2.23.0 ++++++ 0002-Compute-the-specificity-of-CSS-selectors.patch ++++++ >From 5796011ea5232783ee89e8467a76656873a3f7b4 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero <[email protected]> Date: Wed, 6 Nov 2019 17:59:53 -0600 Subject: [PATCH 2/3] Compute the specificity of CSS selectors And remove the unused function CssRules::lookup() --- rsvg_internals/src/croco.rs | 2 ++ rsvg_internals/src/css.rs | 44 ++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/rsvg_internals/src/croco.rs b/rsvg_internals/src/croco.rs index 21ac8051..7bee041d 100644 --- a/rsvg_internals/src/croco.rs +++ b/rsvg_internals/src/croco.rs @@ -11,6 +11,7 @@ pub type CRTerm = gpointer; pub type CRAdditionalSel = gpointer; pub type CRStatus = u32; +pub const CR_OK: u32 = 0; pub type CREncoding = u32; pub const CR_UTF_8: CREncoding = 5; @@ -105,6 +106,7 @@ extern "C" { pub fn cr_selector_unref(a_this: *mut CRSelector) -> gboolean; pub fn cr_simple_sel_to_string(a_this: *mut CRSimpleSel) -> *mut libc::c_char; + pub fn cr_simple_sel_compute_specificity(a_this: *mut CRSimpleSel) -> CRStatus; pub fn cr_string_peek_raw_str(a_this: CRString) -> *const libc::c_char; diff --git a/rsvg_internals/src/css.rs b/rsvg_internals/src/css.rs index 2bb4a3b9..c8ae072c 100644 --- a/rsvg_internals/src/css.rs +++ b/rsvg_internals/src/css.rs @@ -73,11 +73,17 @@ impl<'i> AtRuleParser<'i> for DeclParser { } #[derive(Clone, Hash, PartialEq, Eq)] -pub struct Selector(String); +pub struct Selector { + name: String, + specificity: u64, +} impl Selector { - fn new(s: &str) -> Selector { - Selector(s.to_string()) + fn new(s: &str, specificity: u64) -> Selector { + Selector { + name: s.to_string(), + specificity, + } } } @@ -196,10 +202,6 @@ impl CssRules { decl_list.add_declaration(declaration); } - pub fn lookup(&self, selector: &str) -> Option<&DeclarationList> { - self.get_declarations(&Selector::new(selector)) - } - pub fn get_declarations(&self, selector: &Selector) -> Option<&DeclarationList> { self.selectors_to_declarations.get(selector) } @@ -219,12 +221,12 @@ impl CssRules { let id = node_data.get_id(); // * - if *selector == Selector::new("*") { + if selector.name == "*" { return true; } // tag - if *selector == Selector::new(element_name) { + if selector.name == element_name { return true; } @@ -234,7 +236,7 @@ impl CssRules { // tag.class#id if let Some(id) = id { let target = format!("{}.{}#{}", element_name, cls, id); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } } @@ -242,20 +244,20 @@ impl CssRules { // .class#id if let Some(id) = id { let target = format!(".{}#{}", cls, id); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } } // tag.class let target = format!("{}.{}", element_name, cls); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } // didn't find anything more specific, just apply the class style let target = format!(".{}", cls); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } } @@ -265,13 +267,13 @@ impl CssRules { if let Some(id) = id { // id let target = format!("#{}", id); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } // tag#id let target = format!("{}#{}", element_name, id); - if *selector == Selector::new(&target) { + if selector.name == target { return true; } } @@ -375,7 +377,15 @@ unsafe extern "C" fn css_property( while !cur_sel.is_null() { let simple_sel = (*cur_sel).simple_sel; + cur_sel = (*cur_sel).next; + if !simple_sel.is_null() { + if cr_simple_sel_compute_specificity(simple_sel) != CR_OK { + continue; + } + + let specificity = u64::from((*simple_sel).specificity); + let raw_selector_name = cr_simple_sel_to_string(simple_sel) as *mut libc::c_char; if !raw_selector_name.is_null() { @@ -405,14 +415,12 @@ unsafe extern "C" fn css_property( handler_data .css_rules - .add_declaration(Selector::new(&selector_name), declaration); + .add_declaration(Selector::new(&selector_name, specificity), declaration); } Err(_) => (), // invalid property name or invalid value; ignore } } } - - cur_sel = (*cur_sel).next; } } -- 2.23.0 ++++++ 0003-525-Consider-specificity-when-applying-CSS-selector-.patch ++++++ >From 657d061bf66f1b289c8f915f21da82fa5915d920 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero <[email protected]> Date: Wed, 6 Nov 2019 18:03:27 -0600 Subject: [PATCH 3/3] (#525): Consider specificity when applying CSS selector matches We still don't consider ordering of rules in stylesheets, but at least we handle specificity for conflicting matches with this. Fixes https://gitlab.gnome.org/GNOME/librsvg/issues/525 Without tests/fixtures/reftests/525-specificity-ref.png to avoid binary diff. --- rsvg_internals/src/css.rs | 8 ++++-- tests/fixtures/reftests/525-specificity.svg | 27 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/reftests/525-specificity.svg diff --git a/rsvg_internals/src/css.rs b/rsvg_internals/src/css.rs index c8ae072c..dee9e9ba 100644 --- a/rsvg_internals/src/css.rs +++ b/rsvg_internals/src/css.rs @@ -282,7 +282,7 @@ impl CssRules { } pub fn get_matches(&self, node_data: &NodeData) -> Vec<Selector> { - self.selectors_to_declarations + let mut matches: Vec<_> = self.selectors_to_declarations .iter() .filter_map(|(selector, _)| { if self.selector_matches_node(selector, node_data) { @@ -292,7 +292,11 @@ impl CssRules { } }) .map(Selector::clone) - .collect() + .collect(); + + matches.as_mut_slice().sort_by(|sel_a, sel_b| sel_a.specificity.cmp(&sel_b.specificity)); + + matches } } diff --git a/tests/fixtures/reftests/525-specificity.svg b/tests/fixtures/reftests/525-specificity.svg new file mode 100644 index 00000000..2fb1c525 --- /dev/null +++ b/tests/fixtures/reftests/525-specificity.svg @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" + xmlns:xi="http://www.w3.org/2001/XInclude" + width="16" + height="16"> + <style type="text/css"> + rect,circle,path { + fill: rgb(0,255,0) !important; + } + .warning { + fill: rgb(255,0,0) !important; + } + .error { + fill: rgb(0,255,0) !important; + } + .success { + fill: rgb(0,255,0) !important; + } + </style> + <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"> + <path d="M6.5 0C2.922 0 0 2.922 0 6.5S2.922 13 6.5 13c.17 0 .333-.018.5-.031v-2.031c-.167.018-.327.062-.5.062A4.485 4.485 0 0 1 2 6.5C2 4.003 4.003 2 6.5 2S11 4.003 11 6.5c0 .173-.044.333-.063.5h2.032c.013-.167.031-.33.031-.5C13 2.922 10.078 0 6.5 0z" style="line-height:normal;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" color="#000" font-weight="400" font-size="xx-small" font-family="Sans" overflow="visible" fill="#2e3436"/> + <path d="M6.492 2.992A.5.5 0 0 0 6 3.5V6H4.5a.5.5 0 1 0 0 1h2a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.508-.508z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal" color="#000" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#2e3436"/> + <path class="warning" d="M8.875 8.068a.861.861 0 0 0-.875.87v6.195a.86.86 0 0 0 .875.867h6.25a.86.86 0 0 0 .875-.867V8.938a.861.861 0 0 0-.875-.87zM11 9h2v2.5s0 .5-.5.5h-1c-.5 0-.5-.5-.5-.5zm.5 4h1c.277 0 .5.223.5.5v1c0 .277-.223.5-.5.5h-1a.499.499 0 0 1-.5-.5v-1c0-.277.223-.5.5-.5z" style="marker:none" color="#bebebe" overflow="visible" fill="#f57900"/> + </svg> + +</svg> \ No newline at end of file -- 2.23.0
