commit abdb06e5f64f1d6f78bdd58552b8d2bf3c63db3f
Author: Koji Yokota <[email protected]>
Date:   Sun May 31 22:03:22 2026 +0900

    Upgrade ColorSet class to be based on 32bit colors
---
 src/Color.cpp                   | 270 +++++++++++++++++++++++++---------------
 src/Color.h                     |   7 +-
 src/ColorSet.h                  |  26 ++--
 src/LyXRC.cpp                   |   8 +-
 src/frontends/qt/ColorCache.cpp |   8 +-
 src/frontends/qt/GuiPrefs.cpp   |   2 +-
 6 files changed, 202 insertions(+), 119 deletions(-)

diff --git a/src/Color.cpp b/src/Color.cpp
index 6c3387fe41..f277de10b4 100644
--- a/src/Color.cpp
+++ b/src/Color.cpp
@@ -41,8 +41,8 @@ struct ColorSet::ColorEntry {
        ColorCode lcolor;
        char const * guiname;
        char const * latexname;
-       char const * x11hexname;
-       char const * x11darkhexname;
+       char const * hex32name;
+       char const * darkhex32name;
        char const * lyxname;
 };
 
@@ -80,24 +80,43 @@ string const X11hexname(RGBColor const & col)
 }
 
 
-RGBColor rgbFromHexName(string const & x11hexname)
+RGBColor rgbFromHexName(string const & hexname)
 {
-       LASSERT((x11hexname.size() == 7 || x11hexname.size() == 9)
-               && x11hexname[0] == '#', return RGBColor());
-       if (x11hexname.size() == 7) {
-               RGBColor c;
-               c.r = hexstrToInt(x11hexname.substr(1, 2));
-               c.g = hexstrToInt(x11hexname.substr(3, 2));
-               c.b = hexstrToInt(x11hexname.substr(5, 2));
-               return c;
+       // hexname accepts both 16bit and 32bit hex codes
+       LASSERT((hexname.size() == 7 || hexname.size() == 9)
+               && hexname[0] == '#', return RGBColor());
+       RGBColor c;
+       if (hexname.size() == 7) {
+               c.r = hexstrToInt(hexname.substr(1, 2));
+               c.g = hexstrToInt(hexname.substr(3, 2));
+               c.b = hexstrToInt(hexname.substr(5, 2));
        } else {
-               ARGBColor c;
-               c.a = hexstrToInt(x11hexname.substr(1, 2));
-               c.r = hexstrToInt(x11hexname.substr(3, 2));
-               c.g = hexstrToInt(x11hexname.substr(5, 2));
-               c.b = hexstrToInt(x11hexname.substr(7, 2));
-               return c;
+               c.r = hexstrToInt(hexname.substr(3, 2));
+               c.g = hexstrToInt(hexname.substr(5, 2));
+               c.b = hexstrToInt(hexname.substr(7, 2));
        }
+       return c;
+}
+
+
+ARGBColor argbFromHexName(string const & hexname)
+{
+       // hexname accepts both 16bit and 32bit hex codes
+       LASSERT((hexname.size() == 7 || hexname.size() == 9)
+               && hexname[0] == '#', return ARGBColor());
+       ARGBColor c;
+       if (hexname.size() == 7) {
+               c.a = 255;
+               c.r = hexstrToInt(hexname.substr(1, 2));
+               c.g = hexstrToInt(hexname.substr(3, 2));
+               c.b = hexstrToInt(hexname.substr(5, 2));
+       } else {
+               c.a = hexstrToInt(hexname.substr(1, 2));
+               c.r = hexstrToInt(hexname.substr(3, 2));
+               c.g = hexstrToInt(hexname.substr(5, 2));
+               c.b = hexstrToInt(hexname.substr(7, 2));
+       }
+       return c;
 }
 
 
@@ -217,39 +236,40 @@ std::ostream & operator<<(std::ostream & os, Color color)
 
 ColorSet::ColorSet()
 {
-       char const * grey40 = "#666666";
-       char const * grey60 = "#999999";
-       char const * grey80 = "#cccccc";
+       char const * grey40 = "#ff666666";
+       char const * grey60 = "#ff999999";
+       char const * grey80 = "#ffcccccc";
        // latex colors (xcolor package)
-       char const * black = "#000000";
-       char const * white = "#ffffff";
-       char const * blue = "#0000ff";
-       char const * brown = "#bf8040";
-       char const * cyan = "#00ffff";
-       char const * darkgray = "#404040";
-       char const * gray = "#808080";
-       char const * green = "#00ff00";
-       char const * lightgray = "#bfbfbf";
-       char const * lime = "#bfff00";
-       char const * magenta = "#ff00ff";
-       char const * olive = "#808000";
-       char const * orange = "#ff8000";
-       char const * pink = "#ffbfbf";
-       char const * purple = "#bf0040";
-       char const * red = "#ff0000";
-       char const * teal = "#008080";
-       char const * violet = "#800080";
-       char const * yellow = "#ffff00";
+       char const * black = "#ff000000";
+       char const * white = "#ffffffff";
+       char const * blue = "#ff0000ff";
+       char const * brown = "#ffbf8040";
+       char const * cyan = "#ff00ffff";
+       char const * darkgray = "#ff404040";
+       char const * gray = "#ff808080";
+       char const * green = "#ff00ff00";
+       char const * lightgray = "#ffbfbfbf";
+       char const * lime = "#ffbfff00";
+       char const * magenta = "#ffff00ff";
+       char const * olive = "#ff808000";
+       char const * orange = "#ffff8000";
+       char const * pink = "#ffffbfbf";
+       char const * purple = "#ffbf0040";
+       char const * red = "#ffff0000";
+       char const * teal = "#ff008080";
+       char const * violet = "#ff800080";
+       char const * yellow = "#ffffff00";
        // svg colors
-       char const * Brown = "#a52a2a";
-       char const * DarkRed = "#8b0000";
-       char const * Green = "#008000";
-       char const * IndianRed = "#cd5c5c";
-       char const * Linen = "#faf0e6";
-       char const * RoyalBlue = "#4169e1";
-
-       //char const * grey90 = "#e5e5e5";
-       //  ColorCode, gui, latex, x11hexname, x11darkhexname, lyx
+       char const * Brown = "#ffa52a2a";
+       char const * DarkRed = "#ff8b0000";
+       char const * Green = "#ff008000";
+       char const * IndianRed = "#ffcd5c5c";
+       char const * Linen = "#fffaf0e6";
+       char const * RoyalBlue = "#ff4169e1";
+       char const * Transparent = "#00000000";
+
+       //char const * grey90 = "#ffe5e5e5";
+       //  ColorCode, gui, latex, hex32name, darkhex32name, lyx
        // Warning: several of these entries are overridden in GuiApplication 
constructor
        // lyx color names are collected for users in Customization manual (B.# 
Dynamic colors)
        static ColorEntry const items[] = {
@@ -278,60 +298,60 @@ ColorSet::ColorSet()
        { Color_background, N_("background"), "background", Linen, black, 
"background" },
        { Color_foreground, N_("text"), "foreground", black, Linen, 
"foreground" },
        { Color_foreground_inverted, N_("text (inverted background)"), 
"foreground_inverted", Linen, black, "foreground_inverted" },
-       { Color_selection, N_("selection"), "selection", "#add8e6", "#add8e6", 
"selection" },
-       { Color_selectionmath, N_("selected math"), "selectionmath", "#00008B", 
"#00008B", "selectionmath" },
+       { Color_selection, N_("selection"), "selection", "#ffadd8e6", 
"#ffadd8e6", "selection" },
+       { Color_selectionmath, N_("selected math"), "selectionmath", 
"#ff00008b", "#ff00008b", "selectionmath" },
        { Color_selectiontext, N_("selected text"), "selectiontext", black, 
black, "selectiontext" },
-       { Color_preeditfocus, N_("preedit focus background"), "preeditfocus", 
"#add8e6", "#add8e6", "preeditfocus" },
+       { Color_preeditfocus, N_("preedit focus background"), "preeditfocus", 
"#ffadd8e6", "#ffadd8e6", "preeditfocus" },
        { Color_preeditfocustext, N_("preedit focus text"), "preeditfocustext", 
black, black, "preeditfocustext" },
-       { Color_preeditbg, N_("preedit background"), "preeditbg", Linen, black, 
"preeditbg" },
+       { Color_preeditbg, N_("preedit background"), "preeditbg", Transparent, 
Transparent, "preeditbg" },
        { Color_preedittext, N_("preedit text"), "preedittext", black, Linen, 
"preedittext" },
-       { Color_latex, N_("LaTeX text"), "latex", DarkRed, "#D66613", "latex" },
+       { Color_latex, N_("LaTeX text"), "latex", DarkRed, "#ffd66613", "latex" 
},
        { Color_preview, N_("previewed snippet"), "preview", black, Linen, 
"preview" },
        { Color_inlinecompletion, N_("inline completion"),
                "inlinecompletion", grey60, grey40, "inlinecompletion" },
        { Color_nonunique_inlinecompletion, N_("inline completion 
(non-unique)"),
                "nonuniqueinlinecompletion", grey80, grey60, 
"nonuniqueinlinecompletion" },
-       { Color_notelabel, N_("note label"), "note", yellow, "#FF6200", "note" 
},
-       { Color_notebg, N_("note background"), "notebg", yellow, "#5b5903", 
"notebg" },
+       { Color_notelabel, N_("note label"), "note", yellow, "#ffff6200", 
"note" },
+       { Color_notebg, N_("note background"), "notebg", yellow, "#ff5b5903", 
"notebg" },
        { Color_commentlabel, N_("comment label"), "comment", magenta, olive, 
"comment" },
        { Color_commentbg, N_("comment background"), "commentbg", Linen, black, 
"commentbg" },
-       { Color_greyedoutlabel, N_("greyedout inset label"), "greyedout", 
"#ff0080", "#ff0080", "greyedout" },
+       { Color_greyedoutlabel, N_("greyedout inset label"), "greyedout", 
"#ffff0080", "#ffff0080", "greyedout" },
        { Color_greyedouttext, N_("greyedout inset text"), "greyedouttext", 
grey80, grey40, "greyedouttext" },
        { Color_greyedoutbg, N_("greyedout inset background"), "greyedoutbg", 
Linen, black, "greyedoutbg" },
-       { Color_shadedbg, N_("shaded box"), "shaded", "#ff0000", "#f2af7d", 
"shaded" },
+       { Color_shadedbg, N_("shaded box"), "shaded", "#ffff0000", "#fff2af7d", 
"shaded" },
        { Color_listingsbg, N_("listings background"), "listingsbg", white, 
black, "listingsbg" },
-       { Color_branchlabel, N_("branch label"), "branchlabel", "#c88000", 
"#c88000", "branchlabel" },
-       { Color_footlabel, N_("footnote label"), "footlabel", "#00aaff", blue, 
"footlabel" },
+       { Color_branchlabel, N_("branch label"), "branchlabel", "#ffc88000", 
"#ffc88000", "branchlabel" },
+       { Color_footlabel, N_("footnote label"), "footlabel", "#ff00aaff", 
blue, "footlabel" },
        { Color_indexlabel, N_("index label"), "indexlabel", Green, teal, 
"indexlabel" },
-       { Color_marginlabel, N_("margin note label"), "marginlabel", "#aa55ff", 
violet, "marginlabel" },
-       { Color_nomlabel, N_("nomenclature label"), "nomlabel", "#ff6d2f", 
"#ff6d2f", "nomlabel" },
-       { Color_phantomtext, N_("phantom inset text"), "phantomtext", 
"#7f7f7f", "#7f7f7f", "phantomtext" },
+       { Color_marginlabel, N_("margin note label"), "marginlabel", 
"#ffaa55ff", violet, "marginlabel" },
+       { Color_nomlabel, N_("nomenclature label"), "nomlabel", "#ffff6d2f", 
"#ffff6d2f", "nomlabel" },
+       { Color_phantomtext, N_("phantom inset text"), "phantomtext", 
"#ff7f7f7f", "#ff7f7f7f", "phantomtext" },
        { Color_urllabel, N_("URL label"), "urllabel", blue, blue, "urllabel" },
-       { Color_textlabel1, N_("Text label 1"), "textlabel1", blue, "#86a4ff", 
"textlabel1" },
+       { Color_textlabel1, N_("Text label 1"), "textlabel1", blue, 
"#ff86a4ff", "textlabel1" },
        { Color_textlabel2, N_("Text label 2"), "textlabel2", Green, green, 
"textlabel2" },
        { Color_textlabel3, N_("Text label 3"), "textlabel3", magenta, magenta, 
"textlabel3" },
-       { Color_urltext, N_("URL text"), "urltext", blue, "#86a4ff", "urltext" 
},
+       { Color_urltext, N_("URL text"), "urltext", blue, "#ff86a4ff", 
"urltext" },
        { Color_depthbar, N_("depth bar"), "depthbar", IndianRed, IndianRed, 
"depthbar" },
        { Color_scroll, N_("scroll indicator"), "scroll", IndianRed, IndianRed, 
"scroll" },
-       { Color_language, N_("language"), "language", blue, "#86a4ff", 
"language" },
+       { Color_language, N_("language"), "language", blue, "#ff86a4ff", 
"language" },
        { Color_command, N_("command inset"), "command", black, black, 
"command" },
-       { Color_commandbg, N_("command inset background"), "commandbg", 
"#f0ffff", "#f0ffff", "commandbg" },
+       { Color_commandbg, N_("command inset background"), "commandbg", 
"#fff0ffff", "#fff0ffff", "commandbg" },
        { Color_commandframe, N_("command inset frame"), "commandframe", black, 
Linen, "commandframe" },
        { Color_special, N_("special character"), "special", RoyalBlue, 
RoyalBlue, "special" },
-       { Color_graphicsbg, N_("graphics background"), "graphicsbg", Linen, 
black, "graphicsbg" },
-       { Color_math, N_("math text"), "math", "#00008B", "#85F0FE", "math" },
-       { Color_mathbg, N_("math background"), "mathbg", Linen, black, "mathbg" 
},
+       { Color_graphicsbg, N_("graphics background"), "graphicsbg", 
Transparent, Transparent, "graphicsbg" },
+       { Color_math, N_("math text"), "math", "#ff00008b", "#ff85f0fe", "math" 
},
+       { Color_mathbg, N_("math background"), "mathbg", Transparent, 
Transparent, "mathbg" },
        { Color_mathmacrobg, N_("math macro background"), "mathmacrobg", Linen, 
black, "mathmacrobg" },
-       { Color_mathmacrohoverbg, N_("math macro hovered background"), 
"mathmacrohoverbg", "#cdc3b8",
+       { Color_mathmacrohoverbg, N_("math macro hovered background"), 
"mathmacrohoverbg", "#ffcdc3b8",
                grey80, "mathmacrohoverbg" },
-       { Color_mathmacrolabel, N_("math macro label"), "mathmacrolabel", 
"#a19992", "#a19992", "mathmacrolabel" },
-       { Color_mathmacroframe, N_("math macro frame"), "mathmacroframe", 
"#ede2d8", black, "mathmacroframe" },
+       { Color_mathmacrolabel, N_("math macro label"), "mathmacrolabel", 
"#ffa19992", "#ffa19992", "mathmacrolabel" },
+       { Color_mathmacroframe, N_("math macro frame"), "mathmacroframe", 
"#ffede2d8", black, "mathmacroframe" },
        { Color_mathmacroblend, N_("math macro blended out"), "mathmacroblend", 
black, Linen, "mathmacroblend" },
        { Color_mathmacrooldarg, N_("math macro old parameter"), 
"mathmacrooldarg", grey80, grey40, "mathmacrooldarg" },
        { Color_mathmacronewarg, N_("math macro new parameter"), 
"mathmacronewarg", black, Linen, "mathmacronewarg" },
        { Color_mathframe, N_("math frame"), "mathframe", magenta, magenta, 
"mathframe" },
        { Color_mathcorners, N_("math corners"), "mathcorners", Linen, black, 
"mathcorners" },
-       { Color_mathline, N_("math line"), "mathline", blue, "#86a4ff", 
"mathline" },
+       { Color_mathline, N_("math line"), "mathline", blue, "#ff86a4ff", 
"mathline" },
        { Color_collapsible, N_("collapsible inset text"), "collapsible", 
DarkRed, DarkRed, "collapsible" },
        { Color_collapsibleframe, N_("collapsible inset frame"), 
"collapsibleframe", IndianRed, IndianRed, "collapsibleframe" },
        { Color_insetbg, N_("inset background"), "insetbg", grey80, grey80, 
"insetbg" },
@@ -341,29 +361,29 @@ ColorSet::ColorSet()
        { Color_eolmarker, N_("end-of-line marker"), "eolmarker", Brown, Brown, 
"eolmarker" },
        { Color_added_space, N_("added space markers"), "added_space", Brown, 
Brown, "added_space" },
        { Color_appendix, N_("appendix marker"), "appendix", Brown, Brown, 
"appendix" },
-       { Color_changebar, N_("change bar"), "changebar", blue, "#86a4ff", 
"changebar" },
-       { Color_deletedtext_output, N_("changes - deleted text (exported 
output)"), "deletedtext", "#ff0000", "#ff0000", "deletedtext" },
-       { Color_addedtext_output, N_("changes - added text (exported output)"), 
"addedtext", "#0000ff", "#0000ff", "addedtext" },
-       { Color_changedtext_workarea_author1, N_("changed text (workarea, 1st 
author)"), "changedtextauthor1", "#0000ff", "#86a4ff", "changedtextauthor1" },
-       { Color_changedtext_workarea_author2, N_("changed text (workarea, 2nd 
author)"), "changedtextauthor2", "#ff00ff", "#ee86ee", "changedtextauthor2" },
-       { Color_changedtext_workarea_author3, N_("changed text (workarea, 3rd 
author)"), "changedtextauthor3", "#ff0000", "#ea8989", "changedtextauthor3" },
-       { Color_changedtext_workarea_author4, N_("changed text (workarea, 4th 
author)"), "changedtextauthor4", "#aa00ff", "#c371ec", "changedtextauthor4" },
-       { Color_changedtext_workarea_author5, N_("changed text (workarea, 5th 
author)"), "changedtextauthor5", "#55aa00", "#acd780", "changedtextauthor5" },
-       { Color_changedtext_workarea_comparison, N_("changed text (workarea, 
document comparison)"), "changedtextcomparison", "#008080", "#719FB0", 
"changedtextcomparison" },
+       { Color_changebar, N_("change bar"), "changebar", blue, "#ff86a4ff", 
"changebar" },
+       { Color_deletedtext_output, N_("changes - deleted text (exported 
output)"), "deletedtext", "#ffff0000", "#ffff0000", "deletedtext" },
+       { Color_addedtext_output, N_("changes - added text (exported output)"), 
"addedtext", "#ff0000ff", "#ff0000ff", "addedtext" },
+       { Color_changedtext_workarea_author1, N_("changed text (workarea, 1st 
author)"), "changedtextauthor1", "#ff0000ff", "#ff86a4ff", "changedtextauthor1" 
},
+       { Color_changedtext_workarea_author2, N_("changed text (workarea, 2nd 
author)"), "changedtextauthor2", "#ffff00ff", "#ffee86ee", "changedtextauthor2" 
},
+       { Color_changedtext_workarea_author3, N_("changed text (workarea, 3rd 
author)"), "changedtextauthor3", "#ffff0000", "#ffea8989", "changedtextauthor3" 
},
+       { Color_changedtext_workarea_author4, N_("changed text (workarea, 4th 
author)"), "changedtextauthor4", "#ffaa00ff", "#ffc371ec", "changedtextauthor4" 
},
+       { Color_changedtext_workarea_author5, N_("changed text (workarea, 5th 
author)"), "changedtextauthor5", "#ff55aa00", "#ffacd780", "changedtextauthor5" 
},
+       { Color_changedtext_workarea_comparison, N_("changed text (workarea, 
document comparison)"), "changedtextcomparison", "#ff008080", "#ff719fb0", 
"changedtextcomparison" },
        { Color_deletedtext_workarea_modifier, N_("changes - deleted text 
brightness (workarea)"), "deletedtextmodifier", white, white, 
"deletedtextmodifier" },
        { Color_tabularline, N_("table line"), "tabularline", black, Linen, 
"tabularline" },
-       { Color_tabularonoffline, N_("table on/off line"), "tabularonoffline", 
"#b0c4de", "#23497b", "tabularonoffline" },
+       { Color_tabularonoffline, N_("table on/off line"), "tabularonoffline", 
"#ffb0c4de", "#ff23497b", "tabularonoffline" },
        { Color_bottomarea, N_("bottom area"), "bottomarea", grey40, grey80, 
"bottomarea" },
-       { Color_newpage, N_("new page"), "newpage", blue, "#86a4ff", "newpage" 
},
+       { Color_newpage, N_("new page"), "newpage", blue, "#ff86a4ff", 
"newpage" },
        { Color_pagebreak, N_("page break / line break"), "pagebreak", 
RoyalBlue, RoyalBlue, "pagebreak" },
-       { Color_buttonframe, N_("button frame"), "buttonframe", "#dcd2c8", 
"#dcd2c8", "buttonframe" },
-       { Color_buttonbg, N_("button background"), "buttonbg", "#dcd2c8", 
"#dcd2c8", "buttonbg" },
-       { Color_buttonhoverbg, N_("button background under focus"), 
"buttonhoverbg", "#C7C7CA", "#C7C7CA", "buttonhoverbg" },
+       { Color_buttonframe, N_("button frame"), "buttonframe", "#ffdcd2c8", 
"#ffdcd2c8", "buttonframe" },
+       { Color_buttonbg, N_("button background"), "buttonbg", "#ffdcd2c8", 
"#ffdcd2c8", "buttonbg" },
+       { Color_buttonhoverbg, N_("button background under focus"), 
"buttonhoverbg", "#ffc7c7ca", "#ffc7c7ca", "buttonhoverbg" },
        { Color_command_broken, N_("command inset (broken reference)"), 
"command", white, white, "command_broken" },
        { Color_buttonbg_broken, N_("button background (broken reference)"), 
"commandbg", red, red, "commandbg_broken" },
        { Color_buttonframe_broken, N_("button frame (broken reference)"), 
"commandframe", red, red, "commandframe_broken" },
        { Color_buttonhoverbg_broken, N_("button background (broken reference) 
under focus"),
-               "buttonhoverbg", "#DB0B0B", "#DB0B0B", "buttonhoverbg_broken" },
+               "buttonhoverbg", "#ffdb0b0b", "#ffdb0b0b", 
"buttonhoverbg_broken" },
        { Color_paragraphmarker, N_("paragraph marker"), "paragraphmarker", 
grey80, grey40, "paragraphmarker"},
        { Color_previewframe, N_("preview frame"), "previewframe", black, 
Linen, "previewframe"},
        { Color_bookmark, N_("bookmark"), "bookmark", RoyalBlue, RoyalBlue, 
"bookmark" },
@@ -384,8 +404,8 @@ void ColorSet::fill(ColorEntry const & entry)
        Information in;
        in.lyxname   = entry.lyxname;
        in.latexname = entry.latexname;
-       in.x11hexname   = entry.x11hexname;
-       in.x11darkhexname   = entry.x11darkhexname;
+       in.hex32name   = entry.hex32name;
+       in.darkhex32name   = entry.darkhex32name;
        in.guiname   = entry.guiname;
        infotab[entry.lcolor] = in;
        lyxcolors[entry.lyxname] = entry.lcolor;
@@ -406,7 +426,8 @@ string const ColorSet::getX11HexName(ColorCode c, bool 
const darkmode) const
 {
        InfoTab::const_iterator it = infotab.find(c);
        if (it != infotab.end())
-               return darkmode ? it->second.x11darkhexname : 
it->second.x11hexname;
+               return darkmode ? "#" + it->second.darkhex32name.substr(3, 6) :
+                                 "#" + it->second.hex32name.substr(3, 6);
 
        lyxerr << "LyX internal error: Missing color"
                  " entry in Color.cpp for " << c << '\n'
@@ -425,7 +446,8 @@ pair<string, string> const 
ColorSet::getAllX11HexNames(ColorCode c) const
 {
        InfoTab::const_iterator it = infotab.find(c);
        if (it != infotab.end())
-               return make_pair(it->second.x11hexname, 
it->second.x11darkhexname);
+               return make_pair("#" + it->second.hex32name.substr(3, 6),
+                                "#" + it->second.darkhex32name.substr(3, 6));
 
        lyxerr << "LyX internal error: Missing color"
                  " entry in Color.cpp for " << c << '\n'
@@ -434,6 +456,38 @@ pair<string, string> const 
ColorSet::getAllX11HexNames(ColorCode c) const
 }
 
 
+string const ColorSet::get32bitHexName(ColorCode c, bool const darkmode) const
+{
+       InfoTab::const_iterator it = infotab.find(c);
+       if (it != infotab.end())
+               return darkmode ? it->second.darkhex32name : 
it->second.hex32name;
+
+       lyxerr << "LyX internal error: Missing color"
+                 " entry in Color.cpp for " << c << '\n'
+              << "Using black." << endl;
+       return darkmode ? "#fffaf0e6" : "black";
+}
+
+
+string const ColorSet::get32bitHexName(string const & lyxname, bool const 
darkmode) const
+{
+       return getX11HexName(getFromLyXName(lyxname), darkmode);
+}
+
+
+pair<string, string> const ColorSet::getAll32bitHexNames(ColorCode c) const
+{
+       InfoTab::const_iterator it = infotab.find(c);
+       if (it != infotab.end())
+               return make_pair(it->second.hex32name, 
it->second.darkhex32name);
+
+       lyxerr << "LyX internal error: Missing color"
+                 " entry in Color.cpp for " << c << '\n'
+              << "Using black." << endl;
+       return make_pair("black", "#fffaf0e6");
+}
+
+
 string const ColorSet::getLaTeXName(ColorCode c) const
 {
        InfoTab::const_iterator it = infotab.find(c);
@@ -452,8 +506,8 @@ string const ColorSet::getLyXName(ColorCode c) const
 }
 
 
-bool ColorSet::setColor(ColorCode col, string const & x11hexname,
-                       string const & x11darkhexname)
+bool ColorSet::setColor(ColorCode col, string const & hexname,
+                       string const & darkhexname)
 {
        InfoTab::iterator it = infotab.find(col);
        if (it == infotab.end()) {
@@ -468,15 +522,30 @@ bool ColorSet::setColor(ColorCode col, string const & 
x11hexname,
                return false;
        }
 
-       if (!x11hexname.empty())
-               it->second.x11hexname = x11hexname;
-       it->second.x11darkhexname = (x11darkhexname.empty()) ? x11hexname : 
x11darkhexname;
+       LASSERT((hexname.empty()
+                || ((hexname.size() == 7 || hexname.size() == 9)
+                    && hexname[0] == '#'))
+               && (darkhexname.empty()
+                   || ((darkhexname.size() == 7 || darkhexname.size() == 9)
+                       && darkhexname[0] == '#')),
+               return true);
+
+       if (!hexname.empty())
+               it->second.hex32name = hexname.size() == 7 ?
+                           "#ff" + hexname.substr(1, 6) : hexname;
+
+       if (!darkhexname.empty())
+               it->second.darkhex32name = darkhexname.size() == 7 ?
+                           "#ff" + darkhexname.substr(1, 6) : darkhexname;
+       else
+               it->second.darkhex32name = hexname.size() == 7 ?
+                           "#ff" + hexname.substr(1, 6) : hexname;
        return true;
 }
 
 
-bool ColorSet::setColor(string const & lyxname, string const & x11hexname,
-                       string const & x11darkhexname)
+bool ColorSet::setColor(string const & lyxname, string const & hexname,
+                       string const & darkhexname)
 {
        string const lcname = ascii_lowercase(lyxname);
        if (lyxcolors.find(lcname) == lyxcolors.end()) {
@@ -485,7 +554,7 @@ bool ColorSet::setColor(string const & lyxname, string 
const & x11hexname,
                addColor(static_cast<ColorCode>(infotab.size()), lcname);
        }
 
-       return setColor(lyxcolors[lcname], x11hexname, x11darkhexname);
+       return setColor(lyxcolors[lcname], hexname, darkhexname);
 }
 
 
@@ -608,5 +677,4 @@ ColorSet lcolor;
 // An equally evil global system Color instance
 ColorSet system_lcolor;
 
-
 } // namespace lyx
diff --git a/src/Color.h b/src/Color.h
index e85efbfbae..8ba9587831 100644
--- a/src/Color.h
+++ b/src/Color.h
@@ -60,7 +60,12 @@ public:
 std::ostream & operator<<(std::ostream & os, Color color);
 
 std::string const X11hexname(RGBColor const & col);
-RGBColor rgbFromHexName(std::string const & x11hexname);
+/// Returns RGBColor from 16- or 32-bit hex name
+/// Alpha value is omitted for 32-bit hex name
+RGBColor rgbFromHexName(std::string const & hexname);
+/// Returns ARGBColor from 16- or 32-bit hex name
+/// 16-bit hex name is interpreted as a solid color
+ARGBColor argbFromHexName(std::string const & hexname);
 std::string const outputLaTeXColor(RGBColor const & color);
 /// Inverse of outputLaTeXColor
 RGBColor const RGBColorFromLaTeX(std::string const & color);
diff --git a/src/ColorSet.h b/src/ColorSet.h
index c9dbaa3da2..78e3f2a08e 100644
--- a/src/ColorSet.h
+++ b/src/ColorSet.h
@@ -52,16 +52,16 @@ public:
         *  \returns true if successful. The optional third argument passes
         *  a color for dark mode.
         */
-       bool setColor(ColorCode col, std::string const & x11hexname,
-                     std::string const & x11darkhexname = std::string());
+       bool setColor(ColorCode col, std::string const & hexname,
+                     std::string const & darkhexname = std::string());
 
        /** set the given LyX color to the color defined by the X11
         *  hex name given \returns true if successful. A new color entry
         *  is created if the color is unknown. The optional third argument 
passes
         *  a color for dark mode.
         */
-       bool setColor(std::string const & lyxname, std::string const & 
x11hexname,
-                     std::string const & x11darkhexname = std::string());
+       bool setColor(std::string const & lyxname, std::string const & hexname,
+                     std::string const & darkhexname = std::string());
 
        /** set the given LyX color to a latexcolor if not yet defined
         *  \returns true if successful. A new color entry
@@ -87,6 +87,16 @@ public:
        /// Get the X11 hexname of \c color.
        std::pair<std::string, std::string> const getAllX11HexNames(ColorCode 
c) const;
 
+       /// Get the 32bit hexname of \c color.
+       std::string const get32bitHexName(ColorCode c, bool const darkmode = 
false) const;
+
+       /// Get the 32bit hexname of \c color.
+       std::string const get32bitHexName(std::string const & lyxname,
+                                       bool const darkmode = false) const;
+
+       /// Get the 32bit hexname of \c color.
+       std::pair<std::string, std::string> const getAll32bitHexNames(ColorCode 
c) const;
+
        /// Get the LaTeX name of \c color.
        std::string const getLaTeXName(ColorCode c) const;
 
@@ -115,10 +125,10 @@ private:
                std::string guiname;
                /// the name used in LaTeX
                std::string latexname;
-               /// the name for X11
-               std::string x11hexname;
-               /// matching X11 color for dark mode
-               std::string x11darkhexname;
+               /// the 32bit hex name
+               std::string hex32name;
+               /// matching 32bit color for dark mode
+               std::string darkhex32name;
                /// the name for LyX
                std::string lyxname;
        };
diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp
index b26b948139..6ab8044b64 100644
--- a/src/LyXRC.cpp
+++ b/src/LyXRC.cpp
@@ -2108,11 +2108,11 @@ void LyXRC::write(ostream & os, bool 
ignore_system_lyxrc, string const & name) c
        case RC_SET_COLOR:
                for (int i = 0; i < Color_ignore; ++i) {
                        ColorCode lc = static_cast<ColorCode>(i);
-                       string const col = lcolor.getAllX11HexNames(lc).first;
-                       string const darkcol = 
lcolor.getAllX11HexNames(lc).second;
+                       string const col = lcolor.getAll32bitHexNames(lc).first;
+                       string const darkcol = 
lcolor.getAll32bitHexNames(lc).second;
                        if (ignore_system_lyxrc
-                           || col != system_lcolor.getAllX11HexNames(lc).first
-                           || darkcol != 
system_lcolor.getAllX11HexNames(lc).second) {
+                           || col != 
system_lcolor.getAll32bitHexNames(lc).first
+                           || darkcol != 
system_lcolor.getAll32bitHexNames(lc).second) {
                                os << "\\set_color \""
                                   << lcolor.getLyXName(lc) << "\" \""
                                   << col << "\" \""
diff --git a/src/frontends/qt/ColorCache.cpp b/src/frontends/qt/ColorCache.cpp
index ec0676d79b..210f5c68c4 100644
--- a/src/frontends/qt/ColorCache.cpp
+++ b/src/frontends/qt/ColorCache.cpp
@@ -71,10 +71,10 @@ void ColorCache::init()
        for (int col = 0; col <= Color_ignore; ++col) {
                // light-mode color
                lcolors_[col].first =
-                   QColor(lcolor.getX11HexName(ColorCode(col), false).c_str());
+                   QColor(lcolor.get32bitHexName(ColorCode(col), 
false).c_str());
                // dark-mode color
                lcolors_[col].second =
-                    QColor(lcolor.getX11HexName(ColorCode(col), true).c_str());
+                    QColor(lcolor.get32bitHexName(ColorCode(col), 
true).c_str());
        }
 
        initialized_ = true;
@@ -134,8 +134,8 @@ ColorPair ColorCache::getAll(Color const & color, bool 
syscolors) const
                };
        }
        // used by branches
-       return {QColor(lcolor.getX11HexName(color.baseColor, false).c_str()),
-               QColor(lcolor.getX11HexName(color.baseColor, true).c_str())};
+       return {QColor(lcolor.get32bitHexName(color.baseColor, false).c_str()),
+               QColor(lcolor.get32bitHexName(color.baseColor, true).c_str())};
 }
 
 
diff --git a/src/frontends/qt/GuiPrefs.cpp b/src/frontends/qt/GuiPrefs.cpp
index f75f914a3c..29aa070489 100644
--- a/src/frontends/qt/GuiPrefs.cpp
+++ b/src/frontends/qt/GuiPrefs.cpp
@@ -1932,7 +1932,7 @@ void PrefColors::initializeColorsTV()
 
 QColor PrefColors::getCurrentColor(ColorCode color_code, bool const 
is_dark_mode) const
 {
-       return lcolor.getX11HexName(color_code, is_dark_mode).c_str();
+       return lcolor.get32bitHexName(color_code, is_dark_mode).c_str();
 }
 
 
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to