104 lines
2.0 KiB
C++
104 lines
2.0 KiB
C++
#include "api.h"
|
|
#include "SkinCursorElement.h"
|
|
#include "PaletteManager.h"
|
|
#include <tataki/canvas/bltcanvas.h>
|
|
|
|
SkinCursorElement::SkinCursorElement(const wchar_t *_id, const wchar_t *_bitmapid, int _x, int _y, int script_id, int secondarycounter, const wchar_t *path, ifc_xmlreaderparams *p)
|
|
{
|
|
id = _id;
|
|
bitmap = _bitmapid;
|
|
x = _x;
|
|
y = _y;
|
|
icon = NULL;
|
|
scriptid = script_id;
|
|
seccount = secondarycounter;
|
|
|
|
if (p != NULL)
|
|
{
|
|
for (size_t i = 0;i != p->getNbItems();i++)
|
|
params.addItem(p->getItemName(i), p->getItemValue(i));
|
|
}
|
|
rootpath = path;
|
|
}
|
|
|
|
SkinCursorElement::~SkinCursorElement()
|
|
{
|
|
if (icon != 0)
|
|
{
|
|
#ifdef WIN32
|
|
DestroyIcon(icon);
|
|
#else
|
|
DebugString("portme: ~skincursorelement\n");
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void SkinCursorElement::makeCursor()
|
|
{
|
|
if (icon)
|
|
{
|
|
#ifdef WIN32
|
|
DestroyIcon(icon);
|
|
#else
|
|
DebugString("portme: skincursorelement::makeCursor\n");
|
|
#endif
|
|
icon = NULL;
|
|
}
|
|
|
|
#ifdef WIN32
|
|
ICONINFO info;
|
|
info.fIcon = FALSE;
|
|
info.xHotspot = x;
|
|
info.yHotspot = y;
|
|
|
|
// make AND bitmask from alpha channel
|
|
|
|
SkinBitmap bm(bitmap);
|
|
int *bits = (int *)bm.getBits();
|
|
int _x = bm.getX();
|
|
int _y = bm.getY();
|
|
int w = bm.getWidth();
|
|
int h = bm.getHeight();
|
|
int fw = bm.getFullWidth();
|
|
//CUT: int fh = bm.getFullHeight();
|
|
|
|
BltCanvas c(w, h, NULL, 8);
|
|
unsigned __int8 *d = (unsigned __int8 *)c.getBits();
|
|
for (int i = 0;i < h;i++)
|
|
{
|
|
int *p = bits + _x + x + (_y + y) * fw;
|
|
int j = w;
|
|
while (j--)
|
|
{
|
|
int a = (*p++ & 0xFF000000) >> 24;
|
|
*d++ = (a > 0x7F) ? 0xFF : 0;
|
|
}
|
|
}
|
|
|
|
// copy bits onto a canvas to get hbitmap
|
|
BltCanvas cc(w, h);
|
|
bm.blit(&cc, 0, 0);
|
|
|
|
info.hbmMask = c.getBitmap();
|
|
info.hbmColor = cc.getBitmap();
|
|
|
|
// create cursor
|
|
icon = CreateIconIndirect(&info);
|
|
#else
|
|
DebugString("portme: skincursorelement::makeCursor\n");
|
|
#endif
|
|
}
|
|
|
|
OSCURSOR SkinCursorElement::getCursor()
|
|
{
|
|
if (icon == INVALIDOSCURSORHANDLE)
|
|
makeCursor();
|
|
return icon;
|
|
}
|
|
|
|
SkinItem *SkinCursorElement::getAncestor()
|
|
{
|
|
return WASABI_API_PALETTE->getCursorAncestor(this);
|
|
} |