]> git.lyx.org Git - lyx.git/commitdiff
Fix and simplify computation of painter monochrome mode
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 11 Jul 2020 21:56:48 +0000 (23:56 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 11 Jul 2020 22:01:46 +0000 (00:01 +0200)
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.

src/frontends/NullPainter.h
src/frontends/Painter.h
src/frontends/qt/GuiPainter.cpp
src/frontends/qt/GuiPainter.h
src/mathed/InsetMathMacro.cpp
src/mathed/InsetMathMacroTemplate.cpp

index 6984e7ca50e941de1674169f2e70a587f27cab1c..55a773e09cbe5ba9206eee426e5ad5551a5a0e95 100644 (file)
@@ -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.
index fc6cc41e0c7ca936b8b35a4162be2f2b6bf2db39..718718f9798a30682dc6b9f9efee81f851ec0d82 100644 (file)
@@ -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.
index b40078ed826069a6f5ef72710714213c4d13f002..d9074cb427c0f3a6050374bc1bcf26b4a1a90f4c 100644 (file)
@@ -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();
 }
 
 
index 0c85194a4da9a9202574d5729756b6e38053984f..22d69a7fe330a50ce7ce75b2f2b4d073ffe03ce1 100644 (file)
@@ -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<QColor> monochrome_min_;
-       ///
-       std::stack<QColor> monochrome_max_;
+       std::stack<QColor> monochrome_blend_;
        /// convert into Qt color, possibly applying the monochrome mode
        QColor computeColor(Color col);
        /// possibly apply monochrome mode
index 72224f43752a3863486b8d4d1d56b8122fed9f44..e119dbefefa7b69b4babaabaab552ae52ccbae8d 100644 (file)
@@ -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);
 }
 
 
index 50362552fb1fe1c4f5d00b37b48a93f3b396a976..62561b62fe99c00f458abf7439432112fc29cf56 100644 (file)
@@ -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)))));
        }