RichEdit::Skin

This commit is contained in:
Mirek Fidler 2024-11-20 10:57:21 +01:00
parent c3f31d5af6
commit a2cf7058e5
3 changed files with 12 additions and 113 deletions

View file

@ -306,8 +306,6 @@ int Grayscale2(const Color& c)
return (c.GetR() + c.GetG() + c.GetB()) / 3;
}
#if 1
double C_R = 0.32;
double C_G = 0.5;
double C_B = 0.2;
@ -348,85 +346,6 @@ Color DarkTheme(Color color)
Saturate255(int(b + saturation)));
}
#else // older worse algorithm
double DarkTheme_c[3] = { 0.3, 0.5, 0.2 };
int DarkTheme_middle = 155;
Color DarkTheme(Color color)
{
if(IsNull(color))
return Null;
double v[3];
v[0] = color.GetR();
v[1] = color.GetG();
v[2] = color.GetB();
// this represent physiological perception of brightness of R,G,B. Sum = 1
static double *c = DarkTheme_c; // with this set, blues and reds are more pronounced
double m0 = c[0] * v[0] + c[1] * v[1] + c[2] * v[2]; // base brightness
const int middle = DarkTheme_middle; // this value represents gamma-like feature, imbalance of perception of dark vs bright
const double up = (256.0 - middle) / middle;
const double down = 1 / up;
double m; // target brightness
if(m0 < middle)
m = middle + (middle - m0) * up;
else
m = middle - (m0 - middle) * down;
int i0 = 0;
int i1 = 1;
int i2 = 2;
if(v[i0] > v[i1])
Swap(i0, i1);
if(v[i1] > v[i2])
Swap(i1, i2);
if(v[i0] > v[i1])
Swap(i0, i1);
if(m0 < m) {
m -= m0;
double a = min(v[i2] + m, 255.0) - v[i2];
v[i0] += a;
v[i1] += a;
v[i2] += a;
m -= a;
a = min(v[i1] + m / (c[i0] + c[i1]), 255.0) - v[i1];
v[i0] += a;
v[i1] += a;
m -= (c[i0] + c[i1]) * a;
v[i0] = min(v[i0] + m / c[i1], 255.0);
}
else {
m = m0 - m;
double a = v[i0] - max(v[i0] - m, 0.0);
v[i0] -= a;
v[i1] -= a;
v[i2] -= a;
m -= a;
a = v[i1] - max(v[i1] - m / (c[i1] + c[i2]), 0.0);
v[i1] -= a;
v[i2] -= a;
m -= (c[i1] + c[i2]) * a;
v[i2] = max(v[i2] - m / c[i2], 0.0);
}
return Color((int)v[0], (int)v[1], (int)v[2]);
}
#endif
#if 1
Color DarkThemeCached(Color c)
{
const int N = 256; // must be 2^N
@ -449,30 +368,5 @@ Color DarkThemeCached(Color c)
cache.icolor[i] = c;
return cache.ocolor[i] = DarkTheme(cache.icolor[i]);
}
#else
Color DarkThemeCached(Color c)
{
const int N = 8;
thread_local struct Cache {
Color icolor[N];
Color ocolor[N];
int ii = 0;
Cache() {
for(int i = 0; i < N; i++) {
icolor[i] = Color(0, 0, 0);
ocolor[i] = Color(255, 255, 255);
}
}
} cache;
#define DO(i) if(cache.icolor[i] == c) return cache.ocolor[i];
DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7);
cache.ii = (cache.ii + 1) & (N - 1);
cache.icolor[cache.ii] = c;
c = DarkTheme(c);
cache.ocolor[cache.ii] = c;
return c;
}
#endif
}

View file

@ -608,6 +608,17 @@ void StdIndexEntryDlg(String& s)
EditText(s, t_("Index Entry"), t_("Index entry"), CharFilterAscii128, 1000);
}
void RichEdit::Skin()
{
adjustunits.Image(RichEditImg::AdjustUnits());
ink.ColorImage(RichEditImg::InkColor())
.NullImage(RichEditImg::NullInkColor())
.StaticImage(RichEditImg::ColorA());
paper.ColorImage(RichEditImg::PaperColor())
.NullImage(RichEditImg::NullPaperColor())
.StaticImage(RichEditImg::ColorA());
}
RichEdit::RichEdit()
{
floating_zoom = Null;
@ -651,7 +662,6 @@ RichEdit::RichEdit()
Layout();
SetSb();
adjustunits.Image(RichEditImg::AdjustUnits());
adjustunits <<= THISBACK(SetupUnits);
ruler.Add(adjustunits.RightPosZ(4, 16).VSizePosZ(2, 2));
@ -710,13 +720,7 @@ RichEdit::RichEdit()
gototable.WhenSelect = THISBACK(Goto);
ink.ColorImage(RichEditImg::InkColor())
.NullImage(RichEditImg::NullInkColor())
.StaticImage(RichEditImg::ColorA());
ink.NotNull();
paper.ColorImage(RichEditImg::PaperColor())
.NullImage(RichEditImg::NullPaperColor())
.StaticImage(RichEditImg::ColorA());
ink <<= THISBACK(SetInk);
ink.Tip(t_("Text color"));
paper <<= THISBACK(SetPaper);

View file

@ -226,6 +226,7 @@ public:
virtual Point GetPreedit();
virtual Font GetPreeditFont();
virtual Rect GetCaret() const;
virtual void Skin();
private:
virtual int GetCharAt(int64 i) const { return GetChar((int)i); }