CtrlLib, Draw: Support for chameleon animations

This commit is contained in:
Mirek Fidler 2025-11-29 14:52:58 +01:00
parent 9398b45e93
commit a1b2632749
14 changed files with 290 additions and 69 deletions

View file

@ -0,0 +1,13 @@
description "Skinning Button using Chameleon\377";
uses
CtrlLib;
file
main.cpp,
Chameleon.lay,
Chameleon.iml;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,13 @@
PREMULTIPLIED
IMAGE_ID(B)
IMAGE_ID(Bh)
IMAGE_ID(Bp)
IMAGE_ID(Bd)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,99,224,96,224,96,96,2,66,16,56,112,224,192,127,32,133,21,195,228,254,255,199,142,97,234,32,236,134,255,174)
IMAGE_DATA(174,241,255,115,115,189,255,55,52,56,98,200,131,228,146,147,3,254,55,54,58,254,159,50,197,28,67,30,164,15,36,55)
IMAGE_DATA(111,158,209,255,221,187,149,49,228,65,102,130,244,193,228,208,229,113,185,143,160,255,72,13,12,134,134,6,236,24,166,22)
IMAGE_DATA(204,70,13,12,116,121,244,192,64,151,71,15,12,116,121,244,192,192,176,31,135,251,168,30,24,255,113,96,120,204,128,49)
IMAGE_DATA(122,196,208,91,30,187,251,168,30,24,13,224,152,193,196,48,117,131,89,158,144,255,0,179,40,241,48,0,0,0,0,0)
IMAGE_END_DATA(160, 4)

View file

@ -0,0 +1,9 @@
LAYOUT(ChameleonLayout, 228, 68)
ITEM(Upp::Button, host, SetLabel(t_("Button")).LeftPosZ(8, 68).TopPosZ(8, 24))
ITEM(Upp::Button, std, SetLabel(t_("Button")).LeftPosZ(80, 68).TopPosZ(8, 24))
ITEM(Upp::Button, classic, SetLabel(t_("Button")).LeftPosZ(152, 68).TopPosZ(8, 24))
ITEM(Upp::Button, color, SetLabel(t_("Button")).LeftPosZ(8, 68).TopPosZ(36, 24))
ITEM(Upp::Button, img, SetLabel(t_("Button")).LeftPosZ(80, 68).TopPosZ(36, 24))
ITEM(Upp::Button, fn, SetLabel(t_("Button")).LeftPosZ(152, 68).TopPosZ(36, 24))
END_LAYOUT

View file

@ -0,0 +1,123 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#define LAYOUTFILE <Animation/Chameleon.lay>
#include <CtrlCore/lay.h>
#define IMAGECLASS MyButtonImg
#define IMAGEFILE <Animation/Chameleon.iml>
#include <Draw/iml.h>
struct ChAnimatedButtonLook {
int status;
int width;
Color pen;
Color color;
ChAnimatedButtonLook() {}
};
Value AnimatedEllipse(Ctrl *ctrl, Draw& draw, const Rect& rect, const Value& v, int op, Color)
{
struct Rec {
Ptr<Ctrl> ctrl;
int start = 0;
};
static ArrayMap<Ctrl *, Rec> rec;
rec.RemoveIf([](int i) { return !rec[i].ctrl; });
if(IsTypeRaw<ChAnimatedButtonLook>(v)) {
const auto& e = ValueTo<ChAnimatedButtonLook>(v);
switch(op) {
case LOOK_MARGINS:
return Rect(e.width, e.width, e.width, e.width);
case LOOK_PAINT:
draw.Clipoff(rect);
{
Size sz = rect.GetSize();
DrawPainter w(draw, rect.GetSize());
w.Clear();
w.RoundedRectangle(Rect(sz).Deflated(DPI(2)), DPI(3)).Fill(e.color);
w.Stroke(DPI(e.width), e.pen);
if(ctrl) {
if(e.status == CTRL_PRESSED) {
Rec& r = rec.GetAdd(ctrl);
int tm = msecs();
if(!r.ctrl) {
r.ctrl = ctrl;
r.start = tm;
}
double ani = (msecs() - r.start) / 3;
if(ani < 300) {
w.Circle(Rect(sz).CenterPoint(), ani).Fill((int)max(255 - ani, 0.0) * SLtGray());
Ptr<Ctrl> h = ctrl;
SetTimeCallback(20, [=] { if(h) h->Refresh(); });
}
}
else {
int q = rec.Find(ctrl);
if(q >= 0 && rec[q].ctrl)
rec[q].ctrl = nullptr;
}
}
}
draw.End();
return 1;
}
}
return Null;
}
INITBLOCK {
ChLookFn(AnimatedEllipse);
}
Button::Style AnimationStyle()
{
Button::Style s = Button::StyleNormal();
auto Look = [](int status, int width, Color pen, Color color) {
ChAnimatedButtonLook e;
e.status = status;
e.width = width;
e.pen = pen;
e.color = color;
return RawToValue(e);
};
s.look[0] = Look(0, 1, Black, LtGray);
s.look[1] = Look(1, 2, Blue, WhiteGray);
s.look[2] = Look(2, 2, Blue, White);
s.look[3] = Look(3, 1, Black, Gray);
s.focus_use_ok = false; // otherwise Button would use OK style for focused button
return s;
}
void AnimationSkin()
{
Button::StyleNormal().Write() = AnimationStyle();
}
struct MyApp : WithChameleonLayout<TopWindow> {
Button::Style scolor, simage, sfn;
MyApp();
};
MyApp::MyApp()
{
CtrlLayout(*this, "Animation example");
SetSkin(AnimationSkin);
}
GUI_APP_MAIN
{
MyApp().Run();
}

View file

@ -313,6 +313,8 @@ void Index<T>::Shrink()
template <typename T>
void Index<T>::Remove(const int *sorted_list, int count)
{
if(count == 0)
return;
if(HasUnlinked()) {
Vector<bool> u;
u.SetCount(GetCount());

View file

@ -339,7 +339,7 @@ const Button::Style *Button::St() const
return st;
}
void Button::PaintButton(Draw& w, const Rect& r, const Button::Style& st, int visualstate, bool focus,
void Button::PaintButton(Ctrl *ctrl, Draw& w, const Rect& r, const Button::Style& st, int visualstate, bool focus,
const String& label, Font font, const Image& img,
bool monoimg, int accesskey, bool visibleaccesskeys, bool disabled)
{
@ -355,7 +355,7 @@ void Button::PaintButton(Draw& w, const Rect& r, const Button::Style& st, int vi
dl.accesskey = accesskey;
if(monoimg)
dl.lcolor = SColorText;
ChPaint(w, r, st.look[visualstate]);
ChPaint(ctrl, w, r, st.look[visualstate]);
dl.ink = st.textcolor[visualstate];
if(monoimg)
dl.lcolor = st.monocolor[visualstate];
@ -368,7 +368,7 @@ void Button::PaintButton(Draw& w, const Rect& r, const Button::Style& st, int vi
void Button::Paint(Draw& w)
{
PaintButton(w, GetSize(), *St(), GetVisualState(), HasFocus(),
PaintButton(this, w, GetSize(), *St(), GetVisualState(), HasFocus(),
label, font, img,
monoimg, accesskey, VisibleAccessKeys(), !IsShowEnabled());
}
@ -752,7 +752,7 @@ void ButtonOption::Paint(Draw& w) {
HasMouseIn() || HasFocus() ? CTRL_HOT :
CTRL_NORMAL;
if(option) i = CTRL_PRESSED;
ChPaint(w, sz, style->look[i]);
ChPaint(this, w, sz, style->look[i]);
dl.ink = style->textcolor[i];
dl.Paint(w, 3, 3, sz.cx - 6, sz.cy - 6, true);
if(HasFocus() && style->drawfocus)

View file

@ -213,7 +213,7 @@ void MenuItemBase::PaintTopItem(Draw& w, int state) {
hltxt = IsDark(bg) ? White() : Black();
}
else
ChPaint(w, 0, 0, sz.cx, sz.cy, style->topitem[state]);
ChPaint(this, w, 0, 0, sz.cx, sz.cy, style->topitem[state]);
}
else
if(opaque)
@ -326,7 +326,7 @@ void MenuItem::Paint(Draw& w)
if(hl) {
if(GUI_GlobalStyle() >= GUISTYLE_XP)
ChPaint(w, 0, 0, sz.cx, sz.cy, style->item);
ChPaint(this, w, 0, 0, sz.cx, sz.cy, style->item);
else
w.DrawRect(sz, SColorHighlight);
}
@ -352,7 +352,7 @@ void MenuItem::Paint(Draw& w)
if(IsNull(style->icheck))
DrawXPButton(w, rr, BUTTON_EDGE|BUTTON_CHECKED);
else
ChPaint(w, rr, style->icheck);
ChPaint(this, w, rr, style->icheck);
}
}
else {

View file

@ -450,7 +450,7 @@ Rect MultiButton::Paint0(Draw& w, bool getcr)
GetLR(l, r);
w.Clip(l, 0, r - l, sz.cy);
}
ChPaint(w, sz, style->edge[style->activeedge ? mst : 0]);
ChPaint(this, w, sz, style->edge[style->activeedge ? mst : 0]);
Color p = paper;
if(frm && style->activeedge && HasFocus())
p = SColorHighlight();
@ -459,7 +459,7 @@ Rect MultiButton::Paint0(Draw& w, bool getcr)
if(IsEnabled() && IsEditable())
p = Nvl(p, style->paper);
if(!IsNull(p) && !IsNull(style->coloredge))
ChPaint(w, sz, style->coloredge, p);
ChPaint(this, w, sz, style->coloredge, p);
if(style->clipedge)
w.End();
}
@ -477,33 +477,33 @@ Rect MultiButton::Paint0(Draw& w, bool getcr)
: right ? style->rmiddle[st] : style->right[st];
if(!nobg) {
if(ComplexFrame())
ChPaint(w, x, border, cx, sz.cy - 2 * border, style->simple[st]);
ChPaint(this, w, x, border, cx, sz.cy - 2 * border, style->simple[st]);
else
if(frm) {
if(IsTrivial() && style->usetrivial)
dopaint = false;
ChPaint(w, x, border, cx, sz.cy - 2 * border,
ChPaint(this, w, x, border, cx, sz.cy - 2 * border,
dopaint ? v : style->trivial[st]);
}
else {
w.Clip(x, 0, cx, sz.cy);
ChPaint(w, sz, style->look[Frame() ? mst : st]);
ChPaint(this, w, sz, style->look[Frame() ? mst : st]);
if(IsNull(v) || !Frame()) {
if((!IsTrivial() || style->trivialsep) && IsEnabled() && IsEditable()) {
if(b.left) {
if(left)
ChPaint(w, x, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
ChPaint(w, x + cx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
ChPaint(this, w, x, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
ChPaint(this, w, x + cx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
}
else {
ChPaint(w, x, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
ChPaint(this, w, x, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
if(right)
ChPaint(w, x + cx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
ChPaint(this, w, x + cx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
}
}
}
else
ChPaint(w, x, 0, cx, sz.cy, v);
ChPaint(this, w, x, 0, cx, sz.cy, v);
w.End();
}
}
@ -556,18 +556,18 @@ Rect MultiButton::Paint0(Draw& w, bool getcr)
}
else {
w.Clip(lx, 0, rx - lx, sz.cy);
ChPaint(w, sz, style->look[mst]);
ChPaint(this, w, sz, style->look[mst]);
Rect m = style->margin;
r = Rect(max(lx, m.left), m.top, min(rx, sz.cx - m.right), sz.cy - m.bottom);
if(!IsTrivial() || style->trivialsep) {
if(left) {
r.left++;
if(IsEnabled() && IsEditable())
ChPaint(w, lx, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
ChPaint(this, w, lx, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep1);
}
if(right) {
if(IsEnabled() && IsEditable())
ChPaint(w, rx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
ChPaint(this, w, rx - 1, style->sepm, 1, sz.cy - 2 * style->sepm, style->sep2);
r.right--;
}
}

View file

@ -82,14 +82,14 @@ void ProgressIndicator::Paint(Draw& w) {
else {
Rect r = GetMargins();
if(sz.cx > sz.cy) {
ChPaint(w, sz, style->hlook);
ChPaint(this, w, sz, style->hlook);
w.Clip(r.left, r.top, sz.cx - r.left - r.right, sz.cy - r.top - r.bottom);
ChPaintNoCache(w, r.left + p0, r.top, p, sz.cy - r.top - r.bottom, style->hchunk);
ChPaintNoCache(this, w, r.left + p0, r.top, p, sz.cy - r.top - r.bottom, style->hchunk);
}
else {
ChPaint(w, sz, style->vlook);
ChPaint(this, w, sz, style->vlook);
w.Clip(r.left, r.top, sz.cx - r.left - r.right, sz.cy - r.top - r.bottom);
ChPaintNoCache(w, r.left, sz.cy - r.bottom - p - p0, sz.cx - r.left - r.right, p, style->vchunk);
ChPaintNoCache(this, w, r.left, sz.cy - r.bottom - p - p0, sz.cx - r.left - r.right, p, style->vchunk);
}
w.End();
}

View file

@ -106,7 +106,7 @@ public:
static const Style& StyleScroll();
static const Style& StyleNaked();
static void PaintButton(Draw& w, const Rect& r, const Button::Style& st, int visualstate, bool focus,
static void PaintButton(Ctrl *ctrl, Draw& w, const Rect& r, const Button::Style& st, int visualstate, bool focus,
const String& label, Font font, const Image& img,
bool monoimg, int accesskey, bool visibaleaccesskeys, bool disabled);

View file

@ -228,19 +228,19 @@ void ScrollBar::Paint(Draw& w)
pr = style->through ? GetSize() : Slider();
}
if(i != 2 || thumbsize >= style->thumbmin)
ChPaint(w, pr, l[i][p == i ? CTRL_PRESSED : light == i && !buttons_capture ? CTRL_HOT : CTRL_NORMAL]);
ChPaint(this, w, pr, l[i][p == i ? CTRL_PRESSED : light == i && !buttons_capture ? CTRL_HOT : CTRL_NORMAL]);
if(i != 2)
w.End();
}
}
else {
if(style->through)
ChPaint(w, sz, l[0][CTRL_DISABLED]);
ChPaint(this, w, sz, l[0][CTRL_DISABLED]);
else
if(IsHorz())
ChPaint(w, cc, 0, sz.cx, sz.cy, l[0][CTRL_DISABLED]);
ChPaint(this, w, cc, 0, sz.cx, sz.cy, l[0][CTRL_DISABLED]);
else
ChPaint(w, 0, cc, sz.cx, sz.cy, l[0][CTRL_DISABLED]);
ChPaint(this, w, 0, cc, sz.cx, sz.cy, l[0][CTRL_DISABLED]);
}
PaintButtons(w, this);
}

View file

@ -40,7 +40,7 @@ void VirtualButtons::PaintButtons(Draw& w, Ctrl *ctrl)
for(int i = 0; i < ButtonCount(); i++) {
Rect r = ButtonRect(i);
if(r.GetWidth() > 0 && r.GetHeight() > 0)
Button::PaintButton(w, ButtonRect(i), ButtonStyle(i), ButtonVisualState(ctrl, i), false,
Button::PaintButton(nullptr, w, ButtonRect(i), ButtonStyle(i), ButtonVisualState(ctrl, i), false,
String(), StdFont(), ButtonImage(i),
ButtonMono(i), 0, false, !ButtonEnabled(i));
}

View file

@ -70,8 +70,6 @@ void ChLookWith(Value *look, const Image& image, const Color *color, int n)
look[i] = ChLookWith(look[i], image, color[i]);
}
Value sChOp(Draw& w, const Rect& r, const Value& v, int op, Color ink = Null);
struct sChBorder {
const ColorF *border;
Value face;
@ -300,13 +298,47 @@ Value ChLookFnImage(Draw& w, const Rect& r, const Image& img, int op, Color ink)
return ChLookFnImage(w, r, img, op, ink, img.GetHotSpot(), img.Get2ndSpot());
}
Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
struct ChPainterFn__ {
Value (*op)(Draw& w, const Rect& r, const Value& v, int op, Color ink) = nullptr;
Value (*op2)(Ctrl *ctrl, Draw& w, const Rect& r, const Value& v, int op, Color ink) = nullptr;
};
static Vector<ChPainterFn__> sChPainterFns;
static Value sChOp(Ctrl *ctrl, Draw& w, const Rect& r, const Value& v, int op, Color ink = Null)
{
if(r.right < r.left || r.bottom < r.top)
return Rect(0, 0, 0, 0);
Value q;
if(!IsNull(v))
for(auto& a : ReverseRange(sChPainterFns)) {
q = a.op ? (*a.op)(w, r, v, op, ink) : (*a.op2)(ctrl, w, r, v, op, ink);
if(!IsNull(q))
break;
}
return q;
}
void ChLookFn(Value (*fn)(Draw& w, const Rect& r, const Value& v, int op, Color ink))
{
if(FindMatch(sChPainterFns, [&](const ChPainterFn__& m) { return m.op == fn; }) < 0)
sChPainterFns.Add().op = fn;
}
void ChLookFn(Value (*fn)(Ctrl *ctrl, Draw& w, const Rect& r, const Value& v, int op, Color ink))
{
if(FindMatch(sChPainterFns, [&](const ChPainterFn__& m) { return m.op2 == fn; }) < 0)
sChPainterFns.Add().op2 = fn;
}
Value StdChLookFn(Ctrl *ctrl, Draw& w, const Rect& r, const Value& v, int op, Color ink)
{
if(IsType<sChLookWith>(v)) {
const sChLookWith& x = ValueTo<sChLookWith>(v);
if(op == LOOK_PAINT) {
LOGPNG(AsString(x.img.GetSerialId()), x.img);
ChPaint(w, r, x.look);
ChPaint(ctrl, w, r, x.look);
Point p = r.CenterPos(x.img.GetSize()) + x.offset;
if(x.colorfn)
w.DrawImage(p.x, p.y, x.img, (*x.colorfn)(x.ii));
@ -317,7 +349,7 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
w.DrawImage(p.x, p.y, x.img);
return 1;
}
return sChOp(w, r, x.look, op);
return sChOp(ctrl, w, r, x.look, op);
}
if(IsType<sChBorder>(v)) {
@ -325,7 +357,7 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
int n = (int)(intptr_t)*b.border;
switch(op) {
case LOOK_PAINT:
ChPaint(w, r.Deflated(n), b.face);
ChPaint(ctrl, w, r.Deflated(n), b.face);
// fall through - need to paint border now
case LOOK_PAINTEDGE:
DrawBorder(w, r, b.border);
@ -355,20 +387,6 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
return Null;
}
typedef Value (*ChPainterFn)(Draw& w, const Rect& r, const Value& v, int op, Color ink);
Vector<ChPainterFn>& sChps()
{
static Vector<ChPainterFn> x;
return x;
}
void ChLookFn(Value (*fn)(Draw& w, const Rect& r, const Value& v, int op, Color ink))
{
if(FindIndex(sChps(), fn) < 0)
sChps().Add(fn);
}
struct sStyleCh : Moveable<sStyleCh> {
byte *status;
void (*init)();
@ -437,43 +455,74 @@ void ChFinish()
SColor::Refresh();
}
Value sChOp(Draw& w, const Rect& r, const Value& v, int op, Color ink)
void ChPaint(Ctrl *ctrl, Draw& w,const Rect& r, const Value& look, Color ink)
{
if(r.right < r.left || r.bottom < r.top)
return Rect(0, 0, 0, 0);
Value q;
if(!IsNull(v))
for(int i = sChps().GetCount() - 1; i >= 0; i--) {
q = (*sChps()[i])(w, r, v, op, ink);
if(!IsNull(q))
break;
}
return q;
sChOp(ctrl, w, r, look, LOOK_PAINT, ink);
}
void ChPaint(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(ctrl, w, RectC(x, y, cx, cy), look, LOOK_PAINT, ink);
}
void ChPaintNoCache(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(ctrl, w, RectC(x, y, cx, cy), look, LOOK_PAINT|LOOK_NOCACHE, ink);
}
void ChPaintEdge(Ctrl *ctrl, Draw& w,const Rect& r, const Value& look, Color ink)
{
sChOp(ctrl, w, r, look, LOOK_PAINTEDGE, ink);
}
void ChPaintEdge(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(ctrl, w, RectC(x, y, cx, cy), look, LOOK_PAINTEDGE, ink);
}
void ChPaintBody(Ctrl *ctrl, Draw& w, const Rect& r, const Value& look, Color ink)
{
Rect m = ChMargins(ctrl, look);
w.Clip(r);
ChPaint(ctrl, w, Rect(r.left - m.left, r.top - m.top, r.right + m.right, r.bottom + m.bottom),
look, ink);
w.End();
}
void ChPaintBody(Ctrl *ctrl, Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink)
{
ChPaintBody(ctrl, w, RectC(x, y, cx, cy), look, ink);
}
Rect ChMargins(Ctrl *ctrl, const Value& look)
{
NilDraw w;
return sChOp(ctrl, w, Null, look, LOOK_MARGINS);
}
void ChPaint(Draw& w, const Rect& r, const Value& look, Color ink)
{
sChOp(w, r, look, LOOK_PAINT, ink);
sChOp(nullptr, w, r, look, LOOK_PAINT, ink);
}
void ChPaint(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(w, RectC(x, y, cx, cy), look, LOOK_PAINT, ink);
sChOp(nullptr, w, RectC(x, y, cx, cy), look, LOOK_PAINT, ink);
}
void ChPaintNoCache(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(w, RectC(x, y, cx, cy), look, LOOK_PAINT|LOOK_NOCACHE, ink);
sChOp(nullptr, w, RectC(x, y, cx, cy), look, LOOK_PAINT|LOOK_NOCACHE, ink);
}
void ChPaintEdge(Draw& w, const Rect& r, const Value& look, Color ink)
{
sChOp(w, r, look, LOOK_PAINTEDGE, ink);
sChOp(nullptr, w, r, look, LOOK_PAINTEDGE, ink);
}
void ChPaintEdge(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink)
{
sChOp(w, RectC(x, y, cx, cy), look, LOOK_PAINTEDGE, ink);
sChOp(nullptr, w, RectC(x, y, cx, cy), look, LOOK_PAINTEDGE, ink);
}
void ChPaintBody(Draw& w, const Rect& r, const Value& look, Color ink)
@ -493,7 +542,7 @@ void ChPaintBody(Draw& w, int x, int y, int cx, int cy, const Value& look, Color
Rect ChMargins(const Value& look)
{
NilDraw w;
return sChOp(w, Null, look, LOOK_MARGINS);
return sChOp(nullptr, w, Null, look, LOOK_MARGINS);
}
void DeflateMargins(Rect& r, const Rect& m)

View file

@ -2,7 +2,7 @@ enum LookOp {
LOOK_PAINT,
LOOK_MARGINS,
LOOK_PAINTEDGE,
LOOK_NOCACHE = 0x8000,
};
@ -11,6 +11,9 @@ enum {
CH_EDITFIELD_IMAGE = -1001, // special Image hotspot x2 value, y2 is then x and y for the purposes of painting
};
class Ctrl;
void ChLookFn(Value (*fn)(Ctrl *ctrl, Draw& w, const Rect& r, const Value& look, int lookop, Color ink));
void ChLookFn(Value (*fn)(Draw& w, const Rect& r, const Value& look, int lookop, Color ink));
Image AdjustColors(const Image& img);
@ -21,6 +24,15 @@ void ColoredOverride(Iml& target, Iml& source);
void ChReset();
void ChFinish();
void ChPaint(Ctrl *ctrl, Draw& w,const Rect& r, const Value& look, Color ink = Null);
void ChPaint(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink = Null);
void ChPaintNoCache(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink = Null);
void ChPaintEdge(Ctrl *ctrl, Draw& w,const Rect& r, const Value& look, Color ink = Null);
void ChPaintEdge(Ctrl *ctrl, Draw& w,int x, int y, int cx, int cy, const Value& look, Color ink = Null);
void ChPaintBody(Ctrl *ctrl, Draw& w, const Rect& r, const Value& look, Color ink = Null);
void ChPaintBody(Ctrl *ctrl, Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink = Null);
Rect ChMargins(Ctrl *ctrl, const Value& look);
void ChPaint(Draw& w, const Rect& r, const Value& look, Color ink = Null);
void ChPaint(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink = Null);
void ChPaintNoCache(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink = Null);
@ -119,4 +131,4 @@ void ChLookWith(Value *look, const Image& image, const Color *color, int n = 4)
//private:
void ChRegisterStyle__(byte& state, byte& registered, void (*init)());
Value ChBorder(const ColorF *colors, const Value& face = SColorFace());
Value ChBorder(const ColorF *colors, const Value& face = SColorFace());