winamp/Src/Wasabi/api/skin/widgets/xuirect.cpp
2024-09-24 14:54:57 +02:00

187 lines
4.5 KiB
C++

#include <precomp.h>
#include "xuirect.h"
#include <tataki/canvas/ifc_canvas.h>
#include <bfc/parse/paramparser.h>
#include <api/skin/skinfilter.h>
#include <api/wnd/PaintCanvas.h>
#define BLTSIZE 1
namespace RectEdges
{
enum { LEFT = 1, RIGHT = 2, TOP = 4, BOTTOM = 8 };
};
using namespace RectEdges;
XMLParamPair ScriptRect::params[] = {
{SCRIPTRECT_SETCOLOR, L"COLOR"},
{SCRIPTRECT_EDGES, L"EDGES"},
{SCRIPTRECT_SETFILLED, L"FILLED"},
{SCRIPTRECT_GAMMAGROUP, L"GAMMAGROUP"},
{SCRIPTRECT_THICKNESS, L"THICKNESS"},
};
ScriptRect::ScriptRect()
: pixel(BLTSIZE, BLTSIZE, NULL)
{
filled = 0;
myxuihandle = newXuiHandle();
CreateXMLParameters(myxuihandle);
color.setColorGroup(L"");
resetPixel();
edges = LEFT | RIGHT | TOP | BOTTOM;
thickness = 1;
}
void ScriptRect::CreateXMLParameters(int master_handle)
{
//SCRIPTRECT_PARENT::CreateXMLParameters(master_handle);
int numParams = sizeof(params) / sizeof(params[0]);
hintNumberOfParams(myxuihandle, numParams);
for (int i = 0;i < numParams;i++)
if (params[i].id == SCRIPTRECT_SETCOLOR)
addParam(myxuihandle, params[i], XUI_ATTRIBUTE_REQUIRED);
else
addParam(myxuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
}
ScriptRect::~ScriptRect()
{}
int ScriptRect::onInit()
{
SCRIPTRECT_PARENT::onInit();
return 1;
}
int ScriptRect::onPaint(Canvas *c)
{
if (c == NULL)
{
PaintCanvas pc;
if (!pc.beginPaint(this)) return 0;
return ScriptRect::onPaint(&pc);
}
// check for colors changing on us
if (!color.iteratorValid()) resetPixel();
//RECT src = {0, 0, BLTSIZE, BLTSIZE};
if (filled)
{
RECT dst;
getClientRect(&dst);
c->fillRectAlpha(&dst, color.v(), getPaintingAlpha());
// pixel./*getSkinBitmap()->*/stretchToRectAlpha(c, &src, &dst, getPaintingAlpha());
}
else
{
RECT dst, odst;
getClientRect(&odst);
if (edges & TOP)
{
dst = odst;
dst.bottom = dst.top + thickness;
c->fillRectAlpha(&dst, color.v(), getPaintingAlpha());
//pixel./*getSkinBitmap()->*/stretchToRectAlpha(c, &src, &dst, getPaintingAlpha());
}
if (edges & BOTTOM)
{
dst = odst;
dst.top = dst.bottom - thickness;
c->fillRectAlpha(&dst, color.v(), getPaintingAlpha());
//pixel./*getSkinBitmap()->*/stretchToRectAlpha(c, &src, &dst, getPaintingAlpha());
}
if (edges & RIGHT)
{
dst = odst;
dst.top++; dst.bottom--;
dst.left = dst.right - thickness;
c->fillRectAlpha(&dst, color.v(), getPaintingAlpha());
//pixel./*getSkinBitmap()->*/stretchToRectAlpha(c, &src, &dst, getPaintingAlpha());
}
if (edges & LEFT)
{
dst = odst;
dst.right = dst.left + thickness;
c->fillRectAlpha(&dst, color.v(), getPaintingAlpha());
//pixel./*getSkinBitmap()->*/stretchToRectAlpha(c, &src, &dst, getPaintingAlpha());
}
}
return 1;
}
int ScriptRect::setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value)
{
if (xuihandle != myxuihandle)
return SCRIPTRECT_PARENT::setXuiParam(xuihandle, xmlattributeid, xmlattributename, value);
switch (xmlattributeid)
{
case SCRIPTRECT_SETCOLOR:
{
ARGB32 prev_color = color;
color.setElementName(value);
//CUT color = WASABI_API_SKIN->skin_getColorElement((char*)value);
if (color.v() != prev_color)
{
//CUT? ApplySkinFilters::apply(NULL, getXmlParamByName("gammagroup"), &color, BLTSIZE, BLTSIZE);
resetPixel();
invalidate();
}
}
break;
case SCRIPTRECT_GAMMAGROUP:
{
ARGB32 prev_color = color;
color.setColorGroup(value);
if (color.v() != prev_color)
{
resetPixel();
invalidate();
}
}
break;
case SCRIPTRECT_SETFILLED:
{
int was_filled = filled;
filled = WTOI(value);
if (was_filled != filled) invalidate();
}
break;
case SCRIPTRECT_EDGES:
{
int prev_edges = edges;
ParamParser pp((const wchar_t *)value);
edges = 0;
edges |= !!pp.hasString(L"left") * LEFT;
edges |= !!pp.hasString(L"right") * RIGHT;
edges |= !!pp.hasString(L"top") * TOP;
edges |= !!pp.hasString(L"bottom") * BOTTOM;
if (edges != prev_edges) invalidate();
}
break;
case SCRIPTRECT_THICKNESS:
{
int prev_thickness = thickness;
thickness = WTOI(value);
if (thickness < 1) thickness = 1;
if (thickness != prev_thickness) invalidate();
}
break;
default:
return 0;
}
return 1;
}
void ScriptRect::resetPixel()
{
pixel.fillBits(0xFF000000 | RGBTOBGR(color.v()));
}