sfx2: more diverse colors from string hash creation

Change-Id: I3aa1ddefd26435cd20ec17ec7750073ac1407dc0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166945
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Tested-by: Jenkins
diff --git a/sfx2/source/dialog/StyleList.cxx b/sfx2/source/dialog/StyleList.cxx
index dac7706..f7bafd3 100644
--- a/sfx2/source/dialog/StyleList.cxx
+++ b/sfx2/source/dialog/StyleList.cxx
@@ -65,6 +65,7 @@

#include <vcl/virdev.hxx>
#include <basegfx/color/bcolortools.hxx>
#include <random>

using namespace css;
using namespace css::beans;
@@ -98,19 +99,34 @@ namespace
{
Color ColorHash(std::u16string_view rString)
{
    static std::vector aSaturationArray{ 0.90, 0.75, 0.60 };
    static std::vector aLightnessArray = aSaturationArray;
    constexpr auto aSaturationArray = std::to_array<sal_uInt16>({ 90, 75, 60 });
    constexpr auto aBrightnessArray = std::to_array<sal_uInt16>({ 100, 80, 60 });
    constexpr auto aTintOrShadeArray
        = std::to_array<sal_Int16>({ 1'500, 3'000, 4'500, 6'500, 7'500 });

    sal_uInt32 nStringHash = rtl_ustr_hashCode_WithLength(rString.data(), rString.length());

    double nHue = nStringHash % 359;
    double nSaturation = aSaturationArray[nStringHash / 360 % aSaturationArray.size()];
    double nLightness
        = aLightnessArray[nStringHash / 360 / aSaturationArray.size() % aLightnessArray.size()];
    // Twist the hash number with a RNG twister so we can get very different number even when the string hash
    // differs only slightly. For example "Heading 1" and "Heading 2" are very close, so we would get a color
    // that is very similar and with number quantization could result in the same color.
    std::mt19937 twister;
    twister.seed(nStringHash); // setting the hash for
    nStringHash = twister();

    basegfx::BColor aHSLColor(nHue, nSaturation, nLightness);
    double fHue = (nStringHash % 60) * 6;
    nStringHash = nStringHash / 60;

    return Color(basegfx::utils::hsl2rgb(aHSLColor));
    double fSaturation = aSaturationArray[nStringHash % aSaturationArray.size()];
    nStringHash = nStringHash / aSaturationArray.size();

    double fBrightness = aBrightnessArray[nStringHash % aBrightnessArray.size()];
    nStringHash = nStringHash / aBrightnessArray.size();

    auto aColor = Color::HSBtoRGB(fHue, fSaturation, fBrightness);
    double fTintOrShade = aTintOrShadeArray[nStringHash % aTintOrShadeArray.size()];
    aColor.ApplyTintOrShade(fTintOrShade);

    return aColor;
}

// used to disallow the default character style in the styles highlighter character styles color map
@@ -694,7 +710,7 @@ static bool IsExpanded_Impl(const std::vector<OUString>& rEntries, std::u16strin
static void lcl_Insert(weld::TreeView& rTreeView, const OUString& rName, SfxStyleFamily eFam,
                       const weld::TreeIter* pParent, weld::TreeIter* pRet, SfxViewShell* pViewSh)
{
    Color aColor(ColorHash(rName));
    Color aColor = ColorHash(rName);

    int nColor;
    if (eFam == SfxStyleFamily::Para)