Changed: #927 Move OS specific code from client or server to NeL when it's possible
This commit is contained in:
parent
1306f1d2d0
commit
c20188e90a
3 changed files with 79 additions and 58 deletions
|
@ -621,6 +621,10 @@ public:
|
||||||
|
|
||||||
void getDibData(uint8*& extractData);
|
void getDibData(uint8*& extractData);
|
||||||
|
|
||||||
|
#ifdef NL_OS_WINDOWS
|
||||||
|
HICON getHICON(sint iconWidth, sint iconHeight, sint iconDepth, const NLMISC::CRGBA &col = NLMISC::CRGBA::White, sint hotSpotX = 0, sint hotSpotY = 0, bool cursor = false) const;
|
||||||
|
#endif
|
||||||
|
|
||||||
CBitmap& operator= (const CBitmap& from)
|
CBitmap& operator= (const CBitmap& from)
|
||||||
{
|
{
|
||||||
if (&from == this)
|
if (&from == this)
|
||||||
|
|
|
@ -1500,7 +1500,7 @@ uint32 CBitmap::getHeight(uint32 mipMap) const
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------*\
|
||||||
getHeight
|
getSize
|
||||||
\*-------------------------------------------------------------------*/
|
\*-------------------------------------------------------------------*/
|
||||||
uint32 CBitmap::getSize(uint32 numMipMap) const
|
uint32 CBitmap::getSize(uint32 numMipMap) const
|
||||||
{
|
{
|
||||||
|
@ -4107,5 +4107,78 @@ void CBitmap::getDibData(uint8*& extractData)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef NL_OS_WINDOWS
|
||||||
|
|
||||||
|
HICON CBitmap::getHICON(sint iconWidth, sint iconHeight, sint iconDepth, const NLMISC::CRGBA &col, sint hotSpotX, sint hotSpotY, bool cursor) const
|
||||||
|
{
|
||||||
|
HICON result = NULL;
|
||||||
|
CBitmap colorBm;
|
||||||
|
colorBm.resize(iconWidth, iconHeight, CBitmap::RGBA);
|
||||||
|
const CRGBA *srcColorPtr = (CRGBA *) &(getPixels()[0]);
|
||||||
|
const CRGBA *srcColorPtrLast = srcColorPtr + (iconWidth * iconHeight);
|
||||||
|
CRGBA *destColorPtr = (CRGBA *) &(colorBm.getPixels()[0]);
|
||||||
|
static volatile uint8 alphaThreshold = 127;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
destColorPtr->modulateFromColor(*srcColorPtr, col);
|
||||||
|
std::swap(destColorPtr->R, destColorPtr->B);
|
||||||
|
++ srcColorPtr;
|
||||||
|
++ destColorPtr;
|
||||||
|
}
|
||||||
|
while (srcColorPtr != srcColorPtrLast);
|
||||||
|
//
|
||||||
|
HBITMAP colorHbm = NULL;
|
||||||
|
HBITMAP maskHbm = NULL;
|
||||||
|
//
|
||||||
|
if (iconDepth == 16)
|
||||||
|
{
|
||||||
|
std::vector<uint16> colorBm16(iconWidth * iconHeight);
|
||||||
|
const CRGBA *src32 = (const CRGBA *) &colorBm.getPixels(0)[0];
|
||||||
|
|
||||||
|
for (uint k = 0; k < colorBm16.size(); ++k)
|
||||||
|
{
|
||||||
|
colorBm16[k] = ((uint16)(src32[k].R&0xf8)>>3) | ((uint16)(src32[k].G&0xfc)<<3) | ((uint16)(src32[k].B & 0xf8)<<8);
|
||||||
|
}
|
||||||
|
|
||||||
|
colorHbm = CreateBitmap(iconWidth, iconHeight, 1, 16, &colorBm16[0]);
|
||||||
|
std::vector<uint8> bitMask((iconWidth * iconHeight + 7) / 8, 0);
|
||||||
|
|
||||||
|
for (uint k = 0;k < colorBm16.size(); ++k)
|
||||||
|
{
|
||||||
|
if (src32[k].A <= 120)
|
||||||
|
{
|
||||||
|
bitMask[k / 8] |= (0x80 >> (k & 7));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maskHbm = CreateBitmap(iconWidth, iconHeight, 1, 1, &bitMask[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
colorHbm = CreateBitmap(iconWidth, iconHeight, 1, 32, &colorBm.getPixels(0)[0]);
|
||||||
|
maskHbm = CreateBitmap(iconWidth, iconHeight, 1, 32, &colorBm.getPixels(0)[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ICONINFO iconInfo;
|
||||||
|
iconInfo.fIcon = cursor ? FALSE:TRUE;
|
||||||
|
iconInfo.xHotspot = (DWORD) hotSpotX;
|
||||||
|
iconInfo.yHotspot = (DWORD) hotSpotY;
|
||||||
|
iconInfo.hbmMask = maskHbm;
|
||||||
|
iconInfo.hbmColor = colorHbm;
|
||||||
|
|
||||||
|
if (colorHbm && maskHbm)
|
||||||
|
{
|
||||||
|
result = CreateIconIndirect(&iconInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (colorHbm) DeleteObject(colorHbm);
|
||||||
|
if (maskHbm) DeleteObject(maskHbm);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // NLMISC
|
} // NLMISC
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,6 @@ HICON CCustomMouse::buildCursor(const CBitmap &src, NLMISC::CRGBA col, uint8 rot
|
||||||
uint mouseH = GetSystemMetrics(SM_CYCURSOR);
|
uint mouseH = GetSystemMetrics(SM_CYCURSOR);
|
||||||
nlassert(src.getWidth() == mouseW);
|
nlassert(src.getWidth() == mouseW);
|
||||||
nlassert(src.getHeight() == mouseH);
|
nlassert(src.getHeight() == mouseH);
|
||||||
HICON result = 0;
|
|
||||||
CBitmap rotSrc = src;
|
CBitmap rotSrc = src;
|
||||||
if (rot > 3) rot = 3; // mimic behavior of 'CViewRenderer::drawRotFlipBitmapTiled' (why not rot & 3 ??? ...)
|
if (rot > 3) rot = 3; // mimic behavior of 'CViewRenderer::drawRotFlipBitmapTiled' (why not rot & 3 ??? ...)
|
||||||
switch(rot)
|
switch(rot)
|
||||||
|
@ -380,62 +379,7 @@ HICON CCustomMouse::buildCursor(const CBitmap &src, NLMISC::CRGBA col, uint8 rot
|
||||||
case 2: rotSrc.rot90CW(); rotSrc.rot90CW(); break;
|
case 2: rotSrc.rot90CW(); rotSrc.rot90CW(); break;
|
||||||
case 3: rotSrc.rot90CCW(); break;
|
case 3: rotSrc.rot90CCW(); break;
|
||||||
}
|
}
|
||||||
CBitmap colorBm;
|
return rotSrc.getHICON(mouseW, mouseH, _ColorDepth == ColorDepth16 ? 16:32, col, hotSpotX, hotSpotY, true);
|
||||||
colorBm.resize(mouseW, mouseH, CBitmap::RGBA);
|
|
||||||
const CRGBA *srcColorPtr = (CRGBA *) &(rotSrc.getPixels()[0]);
|
|
||||||
const CRGBA *srcColorPtrLast = srcColorPtr + (mouseW * mouseH);
|
|
||||||
CRGBA *destColorPtr = (CRGBA *) &(colorBm.getPixels()[0]);
|
|
||||||
static volatile uint8 alphaThreshold = 127;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
destColorPtr->modulateFromColor(*srcColorPtr, col);
|
|
||||||
std::swap(destColorPtr->R, destColorPtr->B);
|
|
||||||
++ srcColorPtr;
|
|
||||||
++ destColorPtr;
|
|
||||||
}
|
|
||||||
while (srcColorPtr != srcColorPtrLast);
|
|
||||||
//
|
|
||||||
HBITMAP colorHbm = 0;
|
|
||||||
HBITMAP maskHbm = 0;
|
|
||||||
//
|
|
||||||
if (_ColorDepth == ColorDepth16)
|
|
||||||
{
|
|
||||||
std::vector<uint16> colorBm16(colorBm.getWidth() * colorBm.getHeight());
|
|
||||||
const CRGBA *src32 = (const CRGBA *) &colorBm.getPixels(0)[0];
|
|
||||||
for (uint k = 0;k < colorBm16.size(); ++k)
|
|
||||||
{
|
|
||||||
colorBm16[k] = ((uint16)(src32[k].R&0xf8)>>3) | ((uint16)(src32[k].G&0xfc)<<3) | ((uint16)(src32[k].B & 0xf8)<<8);
|
|
||||||
}
|
|
||||||
colorHbm = CreateBitmap(mouseW, mouseH, 1, 16, &colorBm16[0]);
|
|
||||||
std::vector<uint8> bitMask((colorBm.getWidth() * colorBm.getHeight() + 7) / 8, 0);
|
|
||||||
for (uint k = 0;k < colorBm16.size(); ++k)
|
|
||||||
{
|
|
||||||
if (src32[k].A <= 120)
|
|
||||||
{
|
|
||||||
bitMask[k / 8] |= (0x80 >> (k & 7));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
maskHbm = CreateBitmap(mouseW, mouseH, 1, 1, &bitMask[0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
colorHbm = CreateBitmap(mouseW, mouseH, 1, 32, &colorBm.getPixels(0)[0]);
|
|
||||||
maskHbm = CreateBitmap(mouseW, mouseH, 1, 32, &colorBm.getPixels(0)[0]);
|
|
||||||
}
|
|
||||||
ICONINFO iconInfo;
|
|
||||||
iconInfo.fIcon = FALSE;
|
|
||||||
iconInfo.xHotspot = (DWORD) hotSpotX;
|
|
||||||
iconInfo.yHotspot = (DWORD) hotSpotY;
|
|
||||||
iconInfo.hbmMask = maskHbm;
|
|
||||||
iconInfo.hbmColor = colorHbm;
|
|
||||||
if (colorHbm && maskHbm)
|
|
||||||
{
|
|
||||||
result = CreateIconIndirect(&iconInfo);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
if (colorHbm) DeleteObject(colorHbm);
|
|
||||||
if (maskHbm) DeleteObject(maskHbm);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue