mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 22:02:49 -06:00
125 lines
2.5 KiB
C++
125 lines
2.5 KiB
C++
#include "IconDes.h"
|
|
|
|
namespace Upp {
|
|
|
|
void AlphaCtrl::Layout()
|
|
{
|
|
MakeImage();
|
|
}
|
|
|
|
void AlphaCtrl::Paint(Draw& w)
|
|
{
|
|
Size sz = GetSize();
|
|
Size isz = IconDesImg::Alpha().GetSize();
|
|
w.DrawImage(0, isz.cy, img);
|
|
DrawFrame(w, 0, isz.cy, sz.cx, sz.cy - isz.cy, SColorText());
|
|
int h = sz.cy - isz.cy - 2;
|
|
if(!mask) {
|
|
w.DrawRect(DPI(15), isz.cy + 1, 1, h, SColorPaper());
|
|
w.DrawRect(DPI(16), isz.cy + 1, 1, h, SColorText());
|
|
w.DrawRect(DPI(17), isz.cy + 1, 1, h, SColorPaper());
|
|
w.DrawRect(sz.cx - DPI(17), isz.cy + 1, 1, h, SColorPaper());
|
|
w.DrawRect(sz.cx - DPI(16), isz.cy + 1, 1, h, SColorText());
|
|
w.DrawRect(sz.cx - DPI(15), isz.cy + 1, 1, h, SColorPaper());
|
|
}
|
|
int a = mask ? maskvalue : alpha;
|
|
int x = a == 0 ? DPI(8) - isz.cx / 2 :
|
|
a == 255 ? sz.cx - DPI(8) - isz.cx / 2
|
|
: DPI(16) + a * (sz.cx - DPI(32)) / 255 - isz.cx / 2;
|
|
w.DrawImage(x, 0, IconDesImg::Alpha());
|
|
}
|
|
|
|
void AlphaCtrl::DoPoint(Point p)
|
|
{
|
|
Size sz = GetSize();
|
|
if(mask)
|
|
maskvalue = p.x < sz.cx / 2 ? 0 : 255;
|
|
else
|
|
if(p.x < DPI(16) || sz.cx < DPI(32))
|
|
alpha = 0;
|
|
else
|
|
if(p.x > sz.cx - DPI(16))
|
|
alpha = 255;
|
|
else
|
|
alpha = 255 * (p.x - DPI(16)) / (sz.cx - DPI(32));
|
|
Refresh();
|
|
UpdateActionRefresh();
|
|
}
|
|
|
|
void AlphaCtrl::LeftDown(Point p, dword keyflags)
|
|
{
|
|
DoPoint(p);
|
|
SetCapture();
|
|
}
|
|
|
|
void AlphaCtrl::MouseMove(Point p, dword keyflags)
|
|
{
|
|
if(HasCapture())
|
|
DoPoint(p);
|
|
}
|
|
|
|
static void sPaintCol(ImageBuffer& b, int x, int y, int h, RGBA c)
|
|
{
|
|
RGBA *t = b[y] + x;
|
|
while(h-- > 0) {
|
|
*t = c;
|
|
t += b.GetWidth();
|
|
}
|
|
}
|
|
|
|
void AlphaCtrl::MakeImage()
|
|
{
|
|
Size sz = GetSize();
|
|
sz.cy -= IconDesImg::Alpha().GetHeight();
|
|
if(sz.cx <= DPI(32) || sz.cy < 0) {
|
|
img = Null;
|
|
return;
|
|
}
|
|
ImageBuffer b(GetSize());
|
|
Color c = mask ? Black() : color;
|
|
for(int i = 1; i < sz.cx; i++) {
|
|
int a = mask ? i < sz.cx / 2 ? 0 : 255
|
|
: i < DPI(16) ? 0 : i > sz.cx - DPI(16) ? 255 : min(255, 255 * i / (sz.cx - DPI(32)) - 1);
|
|
int h = sz.cy / 2;
|
|
sPaintCol(b, i, 0, h, Blend((i & DPI(8)) ? White : Black, c, a));
|
|
sPaintCol(b, i, h, h, Blend((i & DPI(8)) ? Black : White, c, a));
|
|
}
|
|
img = b;
|
|
Refresh();
|
|
}
|
|
|
|
void AlphaCtrl::SetColor(Color c)
|
|
{
|
|
color = c;
|
|
MakeImage();
|
|
}
|
|
|
|
void AlphaCtrl::Mask(bool m)
|
|
{
|
|
mask = m;
|
|
MakeImage();
|
|
Refresh();
|
|
}
|
|
|
|
|
|
void AlphaCtrl::Set(int a)
|
|
{
|
|
(mask ? maskvalue : alpha) = a;
|
|
UpdateRefresh();
|
|
}
|
|
|
|
int AlphaCtrl::Get() const
|
|
{
|
|
return mask ? maskvalue : alpha;
|
|
}
|
|
|
|
AlphaCtrl::AlphaCtrl()
|
|
{
|
|
BackPaint();
|
|
Transparent();
|
|
alpha = 255;
|
|
mask = false;
|
|
maskvalue = 255;
|
|
}
|
|
|
|
}
|