]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix visibility calculations
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Jul 2021 12:55:34 +0000 (13:55 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Jul 2021 12:55:34 +0000 (13:55 +0100)
src/libserver/css/css_rule.cxx
src/libserver/html/html_block.hxx

index d8c3a04ddf3b8012935d9b89c130059a91a5b361..17301e724e3e296b3aebaad84d196065d6a32eb4 100644 (file)
@@ -413,7 +413,8 @@ css_declarations_block::compile_to_block(rspamd_mempool_t *pool) const -> rspamd
                        opacity = vals.back().to_number().value_or(opacity);
                        break;
                }
-               case css_property_type::PROPERTY_FONT_COLOR: {
+               case css_property_type::PROPERTY_FONT_COLOR:
+               case css_property_type::PROPERTY_COLOR: {
                        auto color = vals.back().to_color();
                        if (color) {
                                block->set_fgcolor(color.value());
index f2bbf1d64db2e26bfe4acb8d63aa4560cc04b68f..28ab3bae1236556e2f908a027318a8f971ba9070 100644 (file)
@@ -179,6 +179,21 @@ struct html_block {
                        }
                }
 
+               auto is_similar_colors = [](const rspamd::css::css_color &fg, const rspamd::css::css_color &bg) -> bool {
+                       auto diff_r = std::abs(fg.r - bg.r);
+                       auto diff_g = std::abs(fg.g - bg.g);
+                       auto diff_b = std::abs(fg.b - bg.b);
+                       auto ravg = (fg.r + bg.r) / 2.0;
+
+                       diff_r *= diff_r;
+                       diff_g *= diff_g;
+                       diff_b *= diff_b;
+
+                       auto diff = std::sqrt(2.0 * diff_r + 4.0 * diff_g + 3.0 * diff_b +
+                                                                 (ravg * (diff_r - diff_b) / 256.0)) / 256.0;
+
+                       return diff < 0.1;
+               };
                /* Check if we have both bg/fg colors */
                if ((mask & (bg_color_mask|fg_color_mask)) == (bg_color_mask|fg_color_mask)) {
                        if (fg_color.alpha < 10) {
@@ -189,24 +204,33 @@ struct html_block {
                        }
 
                        if (bg_color.alpha > 10) {
-                               auto diff_r = std::abs(fg_color.r - bg_color.r);
-                               auto diff_g = std::abs(fg_color.g - bg_color.g);
-                               auto diff_b = std::abs(fg_color.b - bg_color.b);
-                               auto ravg = (fg_color.r + bg_color.r) / 2.0;
-
-                               diff_r *= diff_r;
-                               diff_g *= diff_g;
-                               diff_b *= diff_b;
-
-                               auto diff = std::sqrt(2.0 * diff_r + 4.0 * diff_g + 3.0 * diff_b +
-                                                 (ravg * (diff_r - diff_b) / 256.0)) / 256.0;
-
-                               if (diff < 0.1) {
+                               if (is_similar_colors(fg_color, bg_color)) {
                                        mask |= invisible_flag|transparent_flag;
                                        return;
                                }
                        }
                }
+               else if (mask & fg_color_mask) {
+                       /* Merely fg color */
+                       if (fg_color.alpha < 10) {
+                               /* Too transparent */
+                               mask |= invisible_flag|transparent_flag;
+
+                               return;
+                       }
+
+                       /* Implicit fg color */
+                       if (is_similar_colors(fg_color, rspamd::css::css_color::white())) {
+                               mask |= invisible_flag|transparent_flag;
+                               return;
+                       }
+               }
+               else if (mask & bg_color_mask) {
+                       if (is_similar_colors(rspamd::css::css_color::black(), bg_color)) {
+                               mask |= invisible_flag|transparent_flag;
+                               return;
+                       }
+               }
 
                mask &= ~(invisible_flag|transparent_flag);
        }