wxCursor(wxImage) added (Chris Elliott, patch 517439)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-02-21 15:22:58 +00:00
parent 1af5934b54
commit bff4ec6360
3 changed files with 85 additions and 1 deletions

View File

@@ -67,6 +67,15 @@ icon file, to specify the cursor hotspot relative to the top left of the image.
Constructs a cursor using a cursor identifier. Constructs a cursor using a cursor identifier.
\func{}{wxCursor}{\param{const wxImage\&}{ image}}
Constructs a cursor from a wxImage. The cursor is monochome, colors with the RGB elements all greater
than 127 will be foreground, colors less than this background. The mask (if any) will be used as transparent.
In MSW the foreground will be white and the background black. The cursor is resized to 32x32
In GTK, the two most frequent colors will be used for foreground and background. The cursor will be displayed
at the size of the image.
\func{}{wxCursor}{\param{const wxCursor\&}{ cursor}} \func{}{wxCursor}{\param{const wxCursor\&}{ cursor}}
Copy constructor. This uses reference counting so is a cheap operation. Copy constructor. This uses reference counting so is a cheap operation.

View File

@@ -12,6 +12,8 @@
#ifndef _WX_CURSOR_H_ #ifndef _WX_CURSOR_H_
#define _WX_CURSOR_H_ #define _WX_CURSOR_H_
#include <wx/image.h>
#ifdef __GNUG__ #ifdef __GNUG__
#pragma interface "cursor.h" #pragma interface "cursor.h"
#endif #endif
@@ -55,7 +57,7 @@ public:
// Copy constructors // Copy constructors
wxCursor(const wxCursor& cursor) { Ref(cursor); } wxCursor(const wxCursor& cursor) { Ref(cursor); }
wxCursor(const wxImage & image) ;
wxCursor(const char bits[], int width, int height, wxCursor(const char bits[], int width, int height,
int hotSpotX = -1, int hotSpotY = -1, int hotSpotX = -1, int hotSpotY = -1,
const char maskBits[] = NULL); const char maskBits[] = NULL);

View File

@@ -120,6 +120,79 @@ wxCursor::wxCursor()
{ {
} }
wxCursor::wxCursor( const wxImage & image )
{
//image has to be 32x32
wxImage image32 = image.Scale(32,32);
unsigned char * rgbBits = image32.GetData();
int w = image32.GetWidth() ;
int h = image32.GetHeight() ;
bool bHasMask = image32.HasMask() ;
int imagebitcount = (w*h)/8;
unsigned char r, g, b ;
unsigned char * bits = new unsigned char [imagebitcount];
unsigned char * maskBits = new unsigned char [imagebitcount];
int i,j, i8; unsigned char c, cMask;
for (i=0; i<imagebitcount; i++)
{
bits[i] = 0;
i8 = i * 8;
//unlike gtk, the pixels go in the opposite order in the bytes
cMask = 128;
for (j=0; j<8; j++)
{
// possible overflow if we do the summation first ?
c = rgbBits[(i8+j)*3]/3 + rgbBits[(i8+j)*3+1]/3 + rgbBits[(i8+j)*3+2]/3 ;
//if average value is > mid grey
if (c>127)
bits[i] = bits[i] | cMask ;
cMask = cMask / 2 ;
}
}
if (bHasMask)
{
r = image32.GetMaskRed() ;
g = image32.GetMaskGreen() ;
b = image32.GetMaskBlue() ;
for (i=0; i<imagebitcount; i++)
{
maskBits[i] = 0x0;
i8 = i * 8;
cMask = 128;
for (j=0; j<8; j++)
{
if (rgbBits[(i8+j)*3] == r && rgbBits[(i8+j)*3+1] == g && rgbBits[(i8+j)*3+2] == b)
maskBits[i] = maskBits[i] | cMask ;
cMask = cMask / 2 ;
}
}
}
else
{
for (i=0; i<imagebitcount; i++)
maskBits[i]= 0x0 ;
}
int hotSpotX = image32.GetOptionInt(wxCUR_HOTSPOT_X);
int hotSpotY = image32.GetOptionInt(wxCUR_HOTSPOT_Y);
if (hotSpotX < 0 || hotSpotX >= w)
hotSpotX = 0;
if (hotSpotY < 0 || hotSpotY >= h)
hotSpotY = 0;
wxCursorRefData *refData = new wxCursorRefData;
m_refData = refData;
refData->m_hCursor = (WXHCURSOR) CreateCursor ( wxGetInstance(), hotSpotX, hotSpotY, w, h, /*AND*/ maskBits, /*XOR*/ bits );
delete [] bits ;
delete [] maskBits;
}
wxCursor::wxCursor(const char WXUNUSED(bits)[], wxCursor::wxCursor(const char WXUNUSED(bits)[],
int WXUNUSED(width), int WXUNUSED(width),
int WXUNUSED(height), int WXUNUSED(height),