From: Jean-Marc Lasgouttes Date: Sat, 11 Jul 2020 21:56:48 +0000 (+0200) Subject: Fix and simplify computation of painter monochrome mode X-Git-Tag: lyx-2.4.0dev-acb2ca7b~614 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=77036f543488b534dbe35466049083b348d8914f;p=lyx.git Fix and simplify computation of painter monochrome mode The old code in GuiPainter::filterColor did not work. Tricks with colors should take place in HSV space, not RGB IMO. Replace the code with a simpler one which maps the grayscale value of the original color on the blend color. It works nin the case where original color is red, but might not work as well when blend color is not black. Time will tell. Fixes bug #11904. --- diff --git a/src/frontends/NullPainter.h b/src/frontends/NullPainter.h index 6984e7ca50..55a773e09c 100644 --- a/src/frontends/NullPainter.h +++ b/src/frontends/NullPainter.h @@ -95,8 +95,8 @@ public: int preeditText(int, int, char_type, FontInfo const &, preedit_style) { return 0; } - /// start monochrome painting mode, i.e. map every color into [min,max] - void enterMonochromeMode(Color const &, Color const &) {} + /// start monochrome painting mode, i.e. map every color a shade of \c blend. + void enterMonochromeMode(Color const &) {} /// leave monochrome painting mode void leaveMonochromeMode() {} /// draws a wavy line that can be used for underlining. diff --git a/src/frontends/Painter.h b/src/frontends/Painter.h index fc6cc41e0c..718718f979 100644 --- a/src/frontends/Painter.h +++ b/src/frontends/Painter.h @@ -176,9 +176,8 @@ public: virtual int preeditText(int x, int y, char_type c, FontInfo const & f, preedit_style style) = 0; - /// start monochrome painting mode, i.e. map every color into [min,max] - virtual void enterMonochromeMode(Color const & min, - Color const & max) = 0; + /// start monochrome painting mode, i.e. map every color a shade of \c blend. + virtual void enterMonochromeMode(Color const & blend) = 0; /// leave monochrome painting mode virtual void leaveMonochromeMode() = 0; /// draws a wavy line that can be used for underlining. diff --git a/src/frontends/qt/GuiPainter.cpp b/src/frontends/qt/GuiPainter.cpp index b40078ed82..d9074cb427 100644 --- a/src/frontends/qt/GuiPainter.cpp +++ b/src/frontends/qt/GuiPainter.cpp @@ -91,44 +91,25 @@ QColor GuiPainter::computeColor(Color col) QColor GuiPainter::filterColor(QColor const & col) { - if (monochrome_min_.empty()) + if (monochrome_blend_.empty()) return col; - // map into [min,max] interval - QColor const & min = monochrome_min_.top(); - QColor const & max = monochrome_max_.top(); - - qreal v = col.valueF(); - v *= v; // make it a bit steeper (i.e. darker) - - qreal minr, ming, minb; - qreal maxr, maxg, maxb; - min.getRgbF(&minr, &ming, &minb); - max.getRgbF(&maxr, &maxg, &maxb); - - QColor c; - c.setRgbF( - v * (minr - maxr) + maxr, - v * (ming - maxg) + maxg, - v * (minb - maxb) + maxb); - return c; + QColor const blend = monochrome_blend_.top(); + return QColor::fromHsv(blend.hue(), blend.saturation(), qGray(col.rgb())); } -void GuiPainter::enterMonochromeMode(Color const & min, Color const & max) +void GuiPainter::enterMonochromeMode(Color const & blend) { - QColor qmin = filterColor(guiApp->colorCache().get(min)); - QColor qmax = filterColor(guiApp->colorCache().get(max)); - monochrome_min_.push(qmin); - monochrome_max_.push(qmax); + QColor qblend = filterColor(guiApp->colorCache().get(blend)); + monochrome_blend_.push(qblend); } void GuiPainter::leaveMonochromeMode() { - LASSERT(!monochrome_min_.empty(), return); - monochrome_min_.pop(); - monochrome_max_.pop(); + LASSERT(!monochrome_blend_.empty(), return); + monochrome_blend_.pop(); } diff --git a/src/frontends/qt/GuiPainter.h b/src/frontends/qt/GuiPainter.h index 0c85194a4d..22d69a7fe3 100644 --- a/src/frontends/qt/GuiPainter.h +++ b/src/frontends/qt/GuiPainter.h @@ -135,9 +135,8 @@ public: virtual void buttonText(int x, int baseline, docstring const & s, FontInfo const & font, Color back, Color frame, int offset); - /// start monochrome painting mode, i.e. map every color into [min,max] - virtual void enterMonochromeMode(Color const & min, - Color const & max); + /// start monochrome painting mode, i.e. map every color a shade of \c blend. + virtual void enterMonochromeMode(Color const & blend); /// leave monochrome painting mode virtual void leaveMonochromeMode(); @@ -193,9 +192,7 @@ private: Painter::line_style current_ls_; int current_lw_; /// - std::stack monochrome_min_; - /// - std::stack monochrome_max_; + std::stack monochrome_blend_; /// convert into Qt color, possibly applying the monochrome mode QColor computeColor(Color col); /// possibly apply monochrome mode diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp index 72224f4375..e119dbefef 100644 --- a/src/mathed/InsetMathMacro.cpp +++ b/src/mathed/InsetMathMacro.cpp @@ -142,7 +142,7 @@ public: void afterDraw(PainterInfo const & pi) const { if (mathMacro_->editMetrics(pi.base.bv)) - pi.pain.enterMonochromeMode(Color_mathbg, Color_mathmacroblend); + pi.pain.enterMonochromeMode(Color_mathmacroblend); } /// void metrics(MetricsInfo &, Dimension &) const { @@ -386,7 +386,7 @@ void InsetMathMacro::afterMetrics() const void InsetMathMacro::beforeDraw(PainterInfo const & pi) const { if (d->editing_[pi.base.bv]) - pi.pain.enterMonochromeMode(Color_mathbg, Color_mathmacroblend); + pi.pain.enterMonochromeMode(Color_mathmacroblend); } diff --git a/src/mathed/InsetMathMacroTemplate.cpp b/src/mathed/InsetMathMacroTemplate.cpp index 50362552fb..62561b62fe 100644 --- a/src/mathed/InsetMathMacroTemplate.cpp +++ b/src/mathed/InsetMathMacroTemplate.cpp @@ -286,9 +286,9 @@ void InsetMathWrapper::draw(PainterInfo & pi, int x, int y) const class InsetColoredCell : public InsetMathNest { public: /// - InsetColoredCell(Buffer * buf, ColorCode min, ColorCode max); + InsetColoredCell(Buffer * buf, ColorCode blend); /// - InsetColoredCell(Buffer * buf, ColorCode min, ColorCode max, MathAtom const & atom); + InsetColoredCell(Buffer * buf, ColorCode blend, MathAtom const & atom); /// void draw(PainterInfo &, int x, int y) const; /// @@ -298,20 +298,18 @@ protected: /// Inset * clone() const; /// - ColorCode min_; - /// - ColorCode max_; + ColorCode blend_; }; -InsetColoredCell::InsetColoredCell(Buffer * buf, ColorCode min, ColorCode max) - : InsetMathNest(buf, 1), min_(min), max_(max) +InsetColoredCell::InsetColoredCell(Buffer * buf, ColorCode blend) + : InsetMathNest(buf, 1), blend_(blend) { } -InsetColoredCell::InsetColoredCell(Buffer * buf, ColorCode min, ColorCode max, MathAtom const & atom) - : InsetMathNest(buf, 1), min_(min), max_(max) +InsetColoredCell::InsetColoredCell(Buffer * buf, ColorCode blend, MathAtom const & atom) + : InsetMathNest(buf, 1), blend_(blend) { cell(0).insert(0, atom); } @@ -331,7 +329,7 @@ void InsetColoredCell::metrics(MetricsInfo & mi, Dimension & dim) const void InsetColoredCell::draw(PainterInfo & pi, int x, int y) const { - pi.pain.enterMonochromeMode(min_, max_); + pi.pain.enterMonochromeMode(blend_); cell(0).draw(pi, x, y); pi.pain.leaveMonochromeMode(); } @@ -497,7 +495,7 @@ void InsetMathMacroTemplate::createLook(int args) const // color it light grey, if it is to be removed when the cursor leaves if (i == argsInLook_) { optData->push_back(MathAtom( - new InsetColoredCell(buffer_, Color_mathbg, Color_mathmacrooldarg))); + new InsetColoredCell(buffer_, Color_mathmacrooldarg))); optData = &(*optData)[optData->size() - 1].nucleus()->cell(0); } @@ -513,7 +511,7 @@ void InsetMathMacroTemplate::createLook(int args) const arg.push_back(MathAtom(new InsetMathMacroArgument(i + 1))); if (i >= argsInLook_) { look_.push_back(MathAtom(new InsetColoredCell(buffer_, - Color_mathbg, Color_mathmacrooldarg, + Color_mathmacrooldarg, MathAtom(new InsetMathBrace(arg))))); } else look_.push_back(MathAtom(new InsetMathBrace(arg))); @@ -522,7 +520,7 @@ void InsetMathMacroTemplate::createLook(int args) const MathData arg; arg.push_back(MathAtom(new InsetMathMacroArgument(i + 1))); look_.push_back(MathAtom(new InsetColoredCell(buffer_, - Color_mathbg, Color_mathmacronewarg, + Color_mathmacronewarg, MathAtom(new InsetMathBrace(arg))))); }