summaryrefslogtreecommitdiff
path: root/app/wlib
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib')
-rw-r--r--app/wlib/gtklib/CMakeLists.txt6
-rw-r--r--app/wlib/gtklib/bitmap.c13
-rw-r--r--app/wlib/gtklib/browserhelp.c2
-rw-r--r--app/wlib/gtklib/button.c7
-rw-r--r--app/wlib/gtklib/gtkint.h3
-rw-r--r--app/wlib/gtklib/pixbuf.c11
-rw-r--r--app/wlib/gtklib/print.c8
-rw-r--r--app/wlib/gtklib/tooltip.c6
-rw-r--r--app/wlib/gtklib/util.c85
-rw-r--r--app/wlib/gtklib/window.c10
-rw-r--r--app/wlib/gtklib/wpref.c15
-rw-r--r--app/wlib/include/wlib.h20
-rw-r--r--app/wlib/mswlib/mswbitmap.c6
-rw-r--r--app/wlib/mswlib/mswdraw.c3442
-rw-r--r--app/wlib/mswlib/mswmisc.c152
15 files changed, 1960 insertions, 1826 deletions
diff --git a/app/wlib/gtklib/CMakeLists.txt b/app/wlib/gtklib/CMakeLists.txt
index 6c673d9..ab0d790 100644
--- a/app/wlib/gtklib/CMakeLists.txt
+++ b/app/wlib/gtklib/CMakeLists.txt
@@ -3,6 +3,7 @@
target_include_directories(xtrkcad-wlib
PRIVATE
${xtrkcad-lib_SOURCE_DIR}
+ ${xtrkcad-lib_BINARY_DIR}
)
target_sources(xtrkcad-wlib
@@ -78,6 +79,11 @@ find_package (GTK2)
# configure for GTK's native Unix print
find_package (GTKUnixPrint)
+# Needed for xtc.image1 include
+add_dependencies(xtrkcad-wlib
+ genbitmaps
+)
+
target_include_directories(xtrkcad-wlib
PRIVATE
${GTK_INCLUDE_DIRS}
diff --git a/app/wlib/gtklib/bitmap.c b/app/wlib/gtklib/bitmap.c
index b1ff2ed..7136461 100644
--- a/app/wlib/gtklib/bitmap.c
+++ b/app/wlib/gtklib/bitmap.c
@@ -67,8 +67,11 @@ wBitmapCreate( wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
gtk_widget_realize( parent->widget ); /* force allocation, if pending */
}
- /* create the bitmap from supplied xpm data */
- pixbuf = gdk_pixbuf_new_from_xpm_data( (const char **)iconP->bits );
+ /* create the bitmap from supplied data */
+ assert ( *(int*)iconP->bits == 0x47646b50 ||
+ *(int*)iconP->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, iconP->bits, FALSE, NULL );
+
g_object_ref_sink(pixbuf);
image = gtk_image_new_from_pixbuf( pixbuf );
gtk_widget_show( image );
@@ -106,7 +109,7 @@ wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
ip->color = color;
// Copy bits
int nBytes = ( ( w + 7 ) / 8 ) * h;
- ip->bits = (char*)malloc( nBytes );
+ ip->bits = (wIconBitMap_t)malloc( nBytes );
memcpy( (void*)ip->bits, bits, nBytes );
return ip;
}
@@ -117,7 +120,7 @@ wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
* \returns icon handle
*/
-wIcon_p wIconCreatePixMap( char *pm[] )
+wIcon_p wIconCreatePixMap( wIconBitMap_t pm )
{
wIcon_p ip;
ip = (wIcon_p)malloc( sizeof *ip );
@@ -125,7 +128,7 @@ wIcon_p wIconCreatePixMap( char *pm[] )
ip->w = 0;
ip->h = 0;
ip->color = 0;
- ip->bits = pm;
+ ip->bits = (wIconBitMap_t) pm;
return ip;
}
diff --git a/app/wlib/gtklib/browserhelp.c b/app/wlib/gtklib/browserhelp.c
index 6d2ac5d..9b32d79 100644
--- a/app/wlib/gtklib/browserhelp.c
+++ b/app/wlib/gtklib/browserhelp.c
@@ -91,7 +91,7 @@ TopicToUrl(char **helpUrl, const char *topic)
void wHelp(const char * topic)
{
int rc;
- char *url;
+ char *url = NULL;
// char *currentPath;
assert(topic != NULL);
diff --git a/app/wlib/gtklib/button.c b/app/wlib/gtklib/button.c
index 7193b11..c337f46 100644
--- a/app/wlib/gtklib/button.c
+++ b/app/wlib/gtklib/button.c
@@ -33,6 +33,7 @@
#include "gtkint.h"
#include "i18n.h"
+#include "assert.h"
#define MIN_BUTTON_WIDTH (80)
@@ -97,7 +98,11 @@ void wlibSetLabel(
bm = (wIcon_p)labelStr;
if (bm->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
+ // check gdk_pixbuf header
+ assert ( *(int*)bm->bits == 0x47646b50 ||
+ *(int*)bm->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, bm->bits, FALSE, NULL );
+
} else {
pixbuf = wlibPixbufFromXBM( bm );
}
diff --git a/app/wlib/gtklib/gtkint.h b/app/wlib/gtklib/gtkint.h
index e3757a4..b1f44e4 100644
--- a/app/wlib/gtklib/gtkint.h
+++ b/app/wlib/gtklib/gtkint.h
@@ -27,6 +27,7 @@
#include "gdk/gdk.h"
#include "gtk/gtk.h"
+#include <assert.h>
#ifdef WINDOWS
#define strcasecmp _stricmp
@@ -137,7 +138,7 @@ struct wIcon_t {
wWinPix_t w;
wWinPix_t h;
wDrawColor color;
- const void * bits;
+ wIconBitMap_t bits;
};
extern char wConfigName[];
diff --git a/app/wlib/gtklib/pixbuf.c b/app/wlib/gtklib/pixbuf.c
index 0d6e8b7..d0c1068 100644
--- a/app/wlib/gtklib/pixbuf.c
+++ b/app/wlib/gtklib/pixbuf.c
@@ -48,14 +48,20 @@ GdkPixbuf* wlibMakePixbuf(
wIcon_p ip)
{
GdkPixbuf * pixbuf;
+#ifdef LATER
char line0[40];
char line2[40];
+#endif
assert(ip != NULL);
- if (ip->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
+ assert( ip->gtkIconType == gtkIcon_pixmap );
+ assert ( *(int*)ip->bits == 0x47646b50 ||
+ *(int*)ip->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, ip->bits, FALSE, NULL );
+#ifdef LATER
} else {
+ assert( ip->gtkIconType != gtkIcon_pixmap );
const char * bits;
long rgb;
int row,col,wb;
@@ -92,6 +98,7 @@ GdkPixbuf* wlibMakePixbuf(
g_free(pixmapData[row+3]);
}
}
+#endif
return pixbuf;
}
diff --git a/app/wlib/gtklib/print.c b/app/wlib/gtklib/print.c
index 609efa9..2c7c278 100644
--- a/app/wlib/gtklib/print.c
+++ b/app/wlib/gtklib/print.c
@@ -755,7 +755,7 @@ void psPrintString(
/** \todo use a getter function instead of double conversion */
desc = pango_font_description_from_string(wlibFontTranslate(fp));
- pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
+ pango_font_description_set_absolute_size(desc, fs * PANGO_SCALE * scale_text);
// render the string to a Pango layout
pango_layout_set_font_description(layout, desc);
@@ -1063,14 +1063,14 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
psPrint_d.dpi = p_def;
scale_adjust = 72/p_def;
} else {
- if (printTextScale > 0.0) {
- scale_text = printTextScale;
- }
if (printScale > 0.0) {
scale_adjust = printScale;
}
psPrint_d.dpi = 72;
}
+ if (printTextScale > 0.0) {
+ scale_text = printTextScale;
+ }
// in XTrackCAD 0,0 is top left, in cairo bottom left. This is
// corrected via the following transformations.
diff --git a/app/wlib/gtklib/tooltip.c b/app/wlib/gtklib/tooltip.c
index 75c8870..7c1eef9 100644
--- a/app/wlib/gtklib/tooltip.c
+++ b/app/wlib/gtklib/tooltip.c
@@ -159,9 +159,9 @@ void wControlSetBalloon( wControl_p b, wWinPix_t dx, wWinPix_t dy,
//GtkWidget *alignment;
GdkColor color;
- color.red = 0x00C5 * 65536/255;
- color.green = 0x006F * 65536/255;
- color.blue = 0x0078 * 65536/255;
+ color.red = 0x00FE * 65536/255;
+ color.green = 0x007F * 65536/255;
+ color.blue = 0x007F * 65536/255;
balloonF = gtk_window_new( GTK_WINDOW_POPUP );
gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
diff --git a/app/wlib/gtklib/util.c b/app/wlib/gtklib/util.c
index 3f746e6..b8777fd 100644
--- a/app/wlib/gtklib/util.c
+++ b/app/wlib/gtklib/util.c
@@ -76,7 +76,7 @@ static wBool_t reverseIcon =
#endif
#endif
-
+static bool audioOn;
/*
*****************************************************************************
@@ -97,45 +97,38 @@ GdkPixbuf* wlibPixbufFromXBM(
wIcon_p ip)
{
GdkPixbuf * pixbuf;
-
- char line0[40];
- char line2[40];
-
- char ** pixmapData;
- int row, col, wb;
- long rgb;
- const char * bits;
-
- wb = (ip->w + 7) / 8;
- pixmapData = (char**) malloc((3 + ip->h) * sizeof *pixmapData);
- pixmapData[0] = line0;
- rgb = wDrawGetRGB(ip->color);
- sprintf(line0, " %ld %ld 2 1", ip->w, ip->h);
- sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb >> 16)&0xFF, (rgb >> 8)&0xFF,
- rgb & 0xFF);
- pixmapData[1] = ". c None s None";
- pixmapData[2] = line2;
- bits = ip->bits;
-
- for (row = 0; row < ip->h; row++) {
- pixmapData[row + 3] = (char*) malloc((ip->w + 1) * sizeof **pixmapData);
-
- for (col = 0; col < ip->w; col++) {
- if (bits[ row * wb + (col >> 3) ] & (1 << (col & 07))) {
- pixmapData[row + 3][col] = '#';
- } else {
- pixmapData[row + 3][col] = '.';
+ wIconBitMap_t bits = ip->bits;
+ static unsigned char background[4] = { 0xFF, 0xFF, 0xFF, 0x0 };
+ long rgb = wDrawGetRGB(ip->color);
+ unsigned char foreground[4];
+ foreground[0] = ( rgb >> 16 ) & 0xFF;
+ foreground[1] = ( rgb >> 8 ) &0xFF;
+ foreground[2] = rgb & 0xFF;
+ foreground[3] = 0xFF;
+ int wb = (ip->w + 7) / 8;
+ size_t siz = ip->h * (wb * 8) * 4 * sizeof ( unsigned char );
+ unsigned char * pData = (unsigned char*)malloc( siz );
+ unsigned char * pCurr = pData;
+ int iStride = cairo_format_stride_for_width( CAIRO_FORMAT_RGB24, ip->w );
+
+ for ( int y = 0; y < ip->h; y++ ) {
+ for ( int x = 0; x < ip->w; x++ ) {
+ int iIndex = y * wb + ( x >> 3 );
+ int iOffset = x & 0x7;
+ unsigned char iValue = bits[ iIndex ];
+ int iMask = 1<<iOffset;
+ wBool_t bOn = (iValue & iMask) ? TRUE : FALSE ;
+ for ( int p = 0; p < 4; p++ ) {
+ *pCurr++ = ( bOn ? foreground[p] : background[p] );
}
+// printf( bOn?"*":" " );
}
- pixmapData[row + 3][ip->w] = 0;
+// printf( "\n" );
}
+// printf("\n");
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
-
- for (row = 0; row < ip->h; row++) {
- free(pixmapData[row + 3]);
- }
- free(pixmapData);
+ pixbuf = gdk_pixbuf_new_from_data( pData, GDK_COLORSPACE_RGB, TRUE, 8,
+ ip->w, ip->h, iStride, NULL, NULL );
return pixbuf;
}
@@ -355,13 +348,27 @@ wControl_p wlibGetControlFromPos(
*****************************************************************************
*/
+
/**
- * Beep!
- * \return
+ * Change audio setting.
+ *
+ * \param setting true: beep is on
+ */
+void
+wSetAudio(bool setting)
+{
+ audioOn = (setting > 0);
+}
+
+/**
+ * Sound speaker if audio is enabled.
+ *
*/
void wBeep(void)
{
- gdk_display_beep(gdk_display_get_default());
+ if(audioOn) {
+ gdk_display_beep(gdk_display_get_default());
+ }
}
/**
diff --git a/app/wlib/gtklib/window.c b/app/wlib/gtklib/window.c
index b8a3cdf..f5050ea 100644
--- a/app/wlib/gtklib/window.c
+++ b/app/wlib/gtklib/window.c
@@ -53,7 +53,7 @@ static int keyState;
static wBool_t gtkBlockEnabled = TRUE;
static wBool_t maximize_at_next_show = FALSE;
-#include "../../bin/bitmaps/xtc.xpm"
+#include "bitmaps/xtc.image1"
static GdkPixbuf *windowIconPixbuf = NULL;
/*
@@ -305,7 +305,7 @@ void wWinSetSize(
void wWinShow(
wWin_p win, /* Window */
- wBool_t show) /* Command */
+ unsigned show) /* Command */
{
//GtkRequisition min_req, pref_req;
@@ -318,7 +318,8 @@ void wWinShow(
}
int width, height;
-
+ show &= ~(DONTGRABFOCUS); // flag is ignored on Linux
+
if (show) {
keyState = 0;
getPos(win);
@@ -360,6 +361,7 @@ void wWinShow(
gtk_window_present(GTK_WINDOW(win->gtkwin));
+
gdk_window_raise(gtk_widget_get_window(win->gtkwin));
if (win->shown && win->modalLevel > 0) {
@@ -1049,7 +1051,7 @@ static wWin_p wWinCommonCreate(
}
if ( windowIconPixbuf == NULL ) {
- windowIconPixbuf = gdk_pixbuf_new_from_xpm_data((const char**)&xtc_xpm);
+ windowIconPixbuf = gdk_pixbuf_new_from_inline(-1, (unsigned char *)xtc_image1, FALSE, NULL);
}
gtk_window_set_icon( GTK_WINDOW(w->gtkwin), windowIconPixbuf );
diff --git a/app/wlib/gtklib/wpref.c b/app/wlib/gtklib/wpref.c
index 356dd95..d83f3e9 100644
--- a/app/wlib/gtklib/wpref.c
+++ b/app/wlib/gtklib/wpref.c
@@ -107,6 +107,11 @@ const char * wGetAppLibDir( void )
return appLibDir;
}
+ strcpy(appLibDir, XTRKCAD_INSTALL_PREFIX "/" XTRKCAD_SHARE_INSTALL_DIR);
+ if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR(buf.st_mode)) {
+ return appLibDir;
+ }
+
char * dir1 = "/usr/share/";
char * dir2 = "/usr/local/share/";
char * beta = "";
@@ -265,13 +270,15 @@ wlibSetProfileFilename(char *name)
if (name && name[0]) {
size_t length;
length = snprintf(profileFile, 0, "%s", name);
- profileFile = malloc(length + sizeof(NULL));
+ length += sizeof("");
+ profileFile = malloc(length);
snprintf( profileFile, length, "%s", name );
} else {
size_t length;
length = snprintf(profileFile, 0, "%s/%s.rc", workDir, wConfigName );
- profileFile = malloc(length + sizeof(NULL));
- length = snprintf(profileFile, length+sizeof(NULL), "%s/%s.rc", workDir, wConfigName );
+ length += sizeof("");
+ profileFile = malloc(length);
+ length = snprintf(profileFile, length, "%s/%s.rc", workDir, wConfigName );
}
}
@@ -631,4 +638,4 @@ wPrefFormatLine(const char* section, const char* name, const char* value, char*
value = "";
}
sprintf(result, "%s.%s: %s", section, name, value);
-} \ No newline at end of file
+}
diff --git a/app/wlib/include/wlib.h b/app/wlib/include/wlib.h
index 88b2806..2bc0396 100644
--- a/app/wlib/include/wlib.h
+++ b/app/wlib/include/wlib.h
@@ -91,8 +91,15 @@ wControl_p wBitmapCreate(wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
const struct wIcon_t * iconP);
wIcon_p wIconCreateBitMap(wWinPix_t w, wWinPix_t h, const char *bits,
wDrawColor color);
-wIcon_p wIconCreatePixMap(char *pm[]);
-void wIconSetColor(wIcon_p ip, wDrawColor color);
+#ifndef WINDOWS
+// png's are a string pointer:
+typedef const unsigned char * wIconBitMap_t;
+#else
+// xpm's are an array of string pointers:
+typedef const unsigned char ** wIconBitMap_t;
+#endif
+wIcon_p wIconCreatePixMap( const wIconBitMap_t );
+void wIconSetColor( wIcon_p, wDrawColor );
/*------------------------------------------------------------------------------
*
@@ -168,9 +175,9 @@ void wInitAppName(char *appName);
const char * wGetAppLibDir( void );
const char * wGetAppWorkDir( void );
const char * wGetUserHomeDir( void );
-wBool_t wCheckExecutable( void );
-void wBeep( void );
+void wSetAudio(bool setting);
+void wBeep( void );
wBool_t wNotice( const char *, const char *, const char * );
int wNotice3( const char *, const char *, const char *, const char * );
void wHelp( const char * );
@@ -228,8 +235,6 @@ void wGetDisplaySize( wWinPix_t*, wWinPix_t* );
wIcon_p wIconCreateBitMap( wWinPix_t, wWinPix_t, const char * bits,
wDrawColor );
-wIcon_p wIconCreatePixMap( char *[] );
-void wIconSetColor( wIcon_p, wDrawColor );
void wIconDraw( wDraw_p d, wIcon_p bm, wWinPix_t x, wWinPix_t y );
void wConvertToCharSet( char *, int );
@@ -280,7 +285,8 @@ wWin_p wWinPopupCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
wWin_p wMain( int, char *[] );
void wWinSetBigIcon( wWin_p, wIcon_p );
void wWinSetSmallIcon( wWin_p, wIcon_p );
-void wWinShow( wWin_p, wBool_t );
+#define DONTGRABFOCUS 0x100
+void wWinShow( wWin_p, unsigned show );
wBool_t wWinIsVisible( wWin_p );
wBool_t wWinIsMaximized( wWin_p win);
void wWinGetSize ( wWin_p, wWinPix_t *, wWinPix_t * );
diff --git a/app/wlib/mswlib/mswbitmap.c b/app/wlib/mswlib/mswbitmap.c
index 9069c35..6b36231 100644
--- a/app/wlib/mswlib/mswbitmap.c
+++ b/app/wlib/mswlib/mswbitmap.c
@@ -332,7 +332,7 @@ wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
* \return pointer to icon, call free() if not needed anymore.
*/
-wIcon_p wIconCreatePixMap( char *pm[])
+wIcon_p wIconCreatePixMap( wIconBitMap_t pm )
{
wIcon_p ip;
int col, r, g, b;
@@ -356,7 +356,7 @@ wIcon_p wIconCreatePixMap( char *pm[])
ip->type = mswIcon_pixmap;
/* extract values */
- cp = pm[0];
+ cp = (char*)(pm[0]);
width = (int)strtol(cp, &cq, 10 ); /* width of image */
height = (int)strtol(cq, &cq, 10 ); /* height of image */
col = (int)strtol(cq, &cq, 10 ); /* number of colors used */
@@ -431,7 +431,7 @@ wIcon_p wIconCreatePixMap( char *pm[])
cq = ip->pixels + lineLength * i;
/* get the next row */
- cp = pm[ ip->h - i + ip->colorcnt ];
+ cp = (char*)(pm[ ip->h - i + ip->colorcnt ]);
/* for all pixels in row */
for( j = 0; j < ip->w; j++ ) {
/* get the pixel info */
diff --git a/app/wlib/mswlib/mswdraw.c b/app/wlib/mswlib/mswdraw.c
index 7ab38ac..8849b04 100644
--- a/app/wlib/mswlib/mswdraw.c
+++ b/app/wlib/mswlib/mswdraw.c
@@ -32,6 +32,7 @@
#include "mswint.h"
#include <FreeImage.h>
+#include <wingdi.h>
wBool_t wDrawDoTempDraw = TRUE;
/*
@@ -48,44 +49,42 @@ static wBool_t initted = FALSE;
static FARPROC oldDrawProc;
-
-static long tmpOp = 0x990066;
-static long setOp = 0x8800c6;
-static long clrOp = 0xbb0226;
+static long setOp = SRCCOPY;
+static long clrOp = MERGEPAINT;
#define CENTERMARK_LENGTH 4
static bool bDrawMainBM = 0;
typedef struct {
- double x, y;
+ double x, y;
} coOrd;
#ifdef SLOW
static wDrawPix_t XWINPIX2DRAWPIX( wDraw_p d, wWinPix_t ix )
{
- return (wDrawPix_t)ix;
+ return (wDrawPix_t)ix;
}
static wDrawPix_t YWINPIX2DRAWPIX( wDraw_p d, wWinPix_t iy )
{
- wWinPix_t y;
- y = (wDrawPix_t)(d->h-2-iy);
- return y;
+ wWinPix_t y;
+ y = (wDrawPix_t)(d->h-2-iy);
+ return y;
}
static wWinPix_t XDRAWPIX2WINPIX( wDraw_p d, wDrawPix_t xx )
{
- wWinPix_t ix;
- ix = (wWinPix_t)(xx);
- return ix;
+ wWinPix_t ix;
+ ix = (wWinPix_t)(xx);
+ return ix;
}
static wWinPix_t YDRAWPIX2WINPIX( wDraw_p d, wDrawPix_t y )
{
- wWinPix_t iy;
- iy = (d->h)-2 - (wWinPix_t)(y);
- return iy;
+ wWinPix_t iy;
+ iy = (d->h)-2 - (wWinPix_t)(y);
+ return iy;
}
#else
@@ -113,34 +112,36 @@ static wWinPix_t YDRAWPIX2WINPIX( wDraw_p d, wDrawPix_t y )
void wDrawDelayUpdate(
- wDraw_p d,
- wBool_t delay )
+ wDraw_p d,
+ wBool_t delay )
{
}
wBool_t wDrawSetTempMode(
- wDraw_p bd,
- wBool_t bTemp )
+ wDraw_p bd,
+ wBool_t bTemp )
{
- wBool_t rc = bd->bTempMode;
- bd->bTempMode = bTemp;
- if (rc == FALSE && bTemp == TRUE) {
- // Main to Temp drawing
- // Copy mainBM to tempBM
- wDrawClearTemp( bd );
- if (bDrawMainBM) { return rc; }
- HDC hDcOld = CreateCompatibleDC(bd->hDc);
- HBITMAP hBmOld = SelectObject(hDcOld, bd->hBmMain);
- SelectObject(bd->hDc, bd->hBmTemp);
- BitBlt(bd->hDc, 0, 0,
- bd->w, bd->h,
- hDcOld, 0, 0,
- SRCCOPY);
- SelectObject(hDcOld, hBmOld);
- DeleteDC(hDcOld);
- bd->bCopiedMain = TRUE;
- }
- return rc;
+ wBool_t rc = bd->bTempMode;
+ bd->bTempMode = bTemp;
+ if (rc == FALSE && bTemp == TRUE) {
+ // Main to Temp drawing
+ // Copy mainBM to tempBM
+ wDrawClearTemp( bd );
+ if (bDrawMainBM) {
+ return rc;
+ }
+ HDC hDcOld = CreateCompatibleDC(bd->hDc);
+ HBITMAP hBmOld = SelectObject(hDcOld, bd->hBmMain);
+ SelectObject(bd->hDc, bd->hBmTemp);
+ BitBlt(bd->hDc, 0, 0,
+ bd->w, bd->h,
+ hDcOld, 0, 0,
+ SRCCOPY);
+ SelectObject(hDcOld, hBmOld);
+ DeleteDC(hDcOld);
+ bd->bCopiedMain = TRUE;
+ }
+ return rc;
}
/**
@@ -154,229 +155,261 @@ wBool_t wDrawSetTempMode(
* \param dopt IN drawing options
*/
static void setDrawMode(
- wDraw_p d,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- long centerPen[] = {40,10,20,10};
- long phantomPen[] = {40,10,20,10,20,10};
-
- HPEN hOldPen;
- static wDraw_p d0;
- static wDrawWidth dw0 = -1;
- static wDrawLineType_e lt0 = (wDrawLineType_e)-1;
- static wDrawColor dc0 = -1;
- static LOGBRUSH logBrush = { 0, 0, 0 };
- DWORD penStyle;
-
- if ( wDrawDoTempDraw && (dopt & wDrawOptTemp) ) {
- SelectObject(d->hDc, d->hBmTemp);
- } else {
- SelectObject(d->hDc, d->hBmMain);
- }
-
- if ( d->hasPalette ) {
- int winPaletteClock = mswGetPaletteClock();
- if ( d->paletteClock < winPaletteClock ) {
- RealizePalette( d->hDc );
- d->paletteClock = winPaletteClock;
- }
- }
-
- SetROP2( d->hDc, R2_COPYPEN );
- if ( d == d0 && dw0 == dw && lt == lt0 && dc == dc0 ) {
- return;
- }
-
- // make sure that the line width is at least 1!
- if( !dw ) {
- dw++;
- }
-
- d0 = d; dw0 = dw; lt0 = lt; dc0 = dc;
-
- void * penarray = NULL;
- int penarray_size = 0;
-
- logBrush.lbColor = mswGetColor(d->hasPalette,dc);
- if ( lt==wDrawLineSolid ) {
- penStyle = PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT;
- } else if (lt == wDrawLineDot) {
- penStyle = PS_GEOMETRIC | PS_DOT;
- } else if (lt == wDrawLineDash) {
- penStyle = PS_GEOMETRIC | PS_DASH;
- } else if (lt == wDrawLineDashDot) {
- penStyle = PS_GEOMETRIC | PS_DASHDOT;
- } else if ( lt == wDrawLineDashDotDot) {
- penStyle = PS_GEOMETRIC | PS_DASHDOTDOT;
- } else if ( lt == wDrawLineCenter) {
- penStyle = PS_GEOMETRIC | PS_USERSTYLE;
- penarray = &centerPen;
- penarray_size = sizeof(centerPen)/sizeof(long);
- } else if ( lt == wDrawLinePhantom) {
- penStyle = PS_GEOMETRIC | PS_USERSTYLE;
- penarray = &phantomPen;
- penarray_size = sizeof(phantomPen) / sizeof(long);
- } else {
- penStyle = PS_GEOMETRIC | PS_SOLID;
- }
- d->hPen = ExtCreatePen( penStyle,
- dw,
- &logBrush,
- penarray_size,
- penarray );
- hOldPen = SelectObject( d->hDc, d->hPen );
- DeleteObject( hOldPen );
+ long centerPen[] = {40,10,20,10};
+ long phantomPen[] = {40,10,20,10,20,10};
+
+ HPEN hOldPen;
+ static wDraw_p d0;
+ static wDrawWidth dw0 = -1;
+ static wDrawLineType_e lt0 = (wDrawLineType_e)-1;
+ static wDrawColor dc0 = -1;
+ static LOGBRUSH logBrush = { 0, 0, 0 };
+ DWORD penStyle;
+
+ if ( wDrawDoTempDraw && (dopt & wDrawOptTemp) ) {
+ SelectObject(d->hDc, d->hBmTemp);
+ } else {
+ SelectObject(d->hDc, d->hBmMain);
+ }
+
+ if ( d->hasPalette ) {
+ int winPaletteClock = mswGetPaletteClock();
+ if ( d->paletteClock < winPaletteClock ) {
+ RealizePalette( d->hDc );
+ d->paletteClock = winPaletteClock;
+ }
+ }
+
+ SetROP2( d->hDc, R2_COPYPEN );
+ if ( d == d0 && dw0 == dw && lt == lt0 && dc == dc0 ) {
+ return;
+ }
+
+ // make sure that the line width is at least 1!
+ if( !dw ) {
+ dw++;
+ }
+
+ d0 = d;
+ dw0 = dw;
+ lt0 = lt;
+ dc0 = dc;
+
+ void * penarray = NULL;
+ int penarray_size = 0;
+
+ logBrush.lbColor = mswGetColor(d->hasPalette,dc);
+ if ( lt==wDrawLineSolid ) {
+ penStyle = PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT;
+ } else if (lt == wDrawLineDot) {
+ penStyle = PS_GEOMETRIC | PS_DOT;
+ } else if (lt == wDrawLineDash) {
+ penStyle = PS_GEOMETRIC | PS_DASH;
+ } else if (lt == wDrawLineDashDot) {
+ penStyle = PS_GEOMETRIC | PS_DASHDOT;
+ } else if ( lt == wDrawLineDashDotDot) {
+ penStyle = PS_GEOMETRIC | PS_DASHDOTDOT;
+ } else if ( lt == wDrawLineCenter) {
+ penStyle = PS_GEOMETRIC | PS_USERSTYLE;
+ penarray = &centerPen;
+ penarray_size = sizeof(centerPen)/sizeof(long);
+ } else if ( lt == wDrawLinePhantom) {
+ penStyle = PS_GEOMETRIC | PS_USERSTYLE;
+ penarray = &phantomPen;
+ penarray_size = sizeof(phantomPen) / sizeof(long);
+ } else {
+ penStyle = PS_GEOMETRIC | PS_SOLID;
+ }
+ d->hPen = ExtCreatePen( penStyle,
+ dw,
+ &logBrush,
+ penarray_size,
+ penarray );
+ hOldPen = SelectObject( d->hDc, d->hPen );
+ DeleteObject( hOldPen );
}
static void setDrawBrush(
- wDraw_p d,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- HBRUSH hOldBrush;
- static wDraw_p d0;
- static wDrawColor dc0 = -1;
-
- setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
- if ( d == d0 && dc == dc0 ) {
- return;
- }
-
- d0 = d; dc0 = dc;
-
- d->hBrush = CreateSolidBrush(
- mswGetColor(d->hasPalette,dc) );
- hOldBrush = SelectObject( d->hDc, d->hBrush );
- DeleteObject( hOldBrush );
+ HBRUSH hOldBrush;
+ static wDraw_p d0;
+ static wDrawColor dc0 = -1;
+
+ setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
+ if ( d == d0 && dc == dc0 ) {
+ return;
+ }
+
+ d0 = d;
+ dc0 = dc;
+
+ d->hBrush = CreateSolidBrush(
+ mswGetColor(d->hasPalette,dc) );
+ hOldBrush = SelectObject( d->hDc, d->hBrush );
+ DeleteObject( hOldBrush );
}
static void myInvalidateRect(
- wDraw_p d,
- RECT * prect )
+ wDraw_p d,
+ RECT * prect )
{
- if ( prect->top < 0 ) { prect->top = 0; }
- if ( prect->left < 0 ) { prect->left = 0; }
- if ( prect->bottom > d->h ) { prect->bottom = d->h; }
- if ( prect->right > d->w ) { prect->right = d->w; }
- InvalidateRect( d->hWnd, prect, FALSE );
+ if ( prect->top < 0 ) {
+ prect->top = 0;
+ }
+ if ( prect->left < 0 ) {
+ prect->left = 0;
+ }
+ if ( prect->bottom > d->h ) {
+ prect->bottom = d->h;
+ }
+ if ( prect->right > d->w ) {
+ prect->right = d->w;
+ }
+ InvalidateRect( d->hWnd, prect, FALSE );
}
static int clip0( POINT * p0, POINT * p1, wDraw_p d )
{
- long int x0=p0->x, y0=p0->y, x1=p1->x, y1=p1->y;
- long int dx, dy;
- if ( x0<0 && x1<0 ) { return 0; }
- if ( y0<0 && y1<0 ) { return 0; }
- dx=x1-x0;
- dy=y1-y0;
- if ( x0 < 0 ) {
- y0 -= x0*dy/dx;
- x0 = 0;
- }
- if ( y0 < 0 ) {
- if ( (x0 -= y0*dx/dy) < 0 ) { return 0; }
- y0 = 0;
- }
- if ( x1 < 0 ) {
- y1 -= x1*dy/dx;
- x1 = 0;
- }
- if ( y1 < 0 ) {
- if ( (x1 -= y1*dx/dy) < 0 ) { return 0; }
- y1 = 0;
- }
- p0->x = (int)x0;
- p0->y = (int)y0;
- p1->x = (int)x1;
- p1->y = (int)y1;
- return 1;
+ long int x0=p0->x, y0=p0->y, x1=p1->x, y1=p1->y;
+ long int dx, dy;
+ if ( x0<0 && x1<0 ) {
+ return 0;
+ }
+ if ( y0<0 && y1<0 ) {
+ return 0;
+ }
+ dx=x1-x0;
+ dy=y1-y0;
+ if ( x0 < 0 ) {
+ y0 -= x0*dy/dx;
+ x0 = 0;
+ }
+ if ( y0 < 0 ) {
+ if ( (x0 -= y0*dx/dy) < 0 ) {
+ return 0;
+ }
+ y0 = 0;
+ }
+ if ( x1 < 0 ) {
+ y1 -= x1*dy/dx;
+ x1 = 0;
+ }
+ if ( y1 < 0 ) {
+ if ( (x1 -= y1*dx/dy) < 0 ) {
+ return 0;
+ }
+ y1 = 0;
+ }
+ p0->x = (int)x0;
+ p0->y = (int)y0;
+ p1->x = (int)x1;
+ p1->y = (int)y1;
+ return 1;
}
void wDrawLine(
- wDraw_p d,
- wDrawPix_t p0x,
- wDrawPix_t p0y,
- wDrawPix_t p1x,
- wDrawPix_t p1y,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t p0x,
+ wDrawPix_t p0y,
+ wDrawPix_t p1x,
+ wDrawPix_t p1y,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- POINT p0, p1;
- RECT rect;
- setDrawMode( d, dw, lt, dc, dopt );
- p0.x = XDRAWPIX2WINPIX(d,p0x);
- p0.y = YDRAWPIX2WINPIX(d,p0y);
- p1.x = XDRAWPIX2WINPIX(d,p1x);
- p1.y = YDRAWPIX2WINPIX(d,p1y);
-
- MoveTo( d->hDc, p0.x, p0.y );
- LineTo( d->hDc, p1.x, p1.y );
- if (d->hWnd) {
- if (dw==0) {
- dw = 1;
- }
- dw++;
- if (p0.y<p1.y) {
- rect.top = p0.y-dw;
- rect.bottom = p1.y+dw;
- } else {
- rect.top = p1.y-dw;
- rect.bottom = p0.y+dw;
- }
- if (p0.x<p1.x) {
- rect.left = p0.x-dw;
- rect.right = p1.x+dw;
- } else {
- rect.left = p1.x-dw;
- rect.right = p0.x+dw;
- }
- myInvalidateRect( d, &rect );
- }
+ POINT p0, p1;
+ RECT rect;
+ setDrawMode( d, dw, lt, dc, dopt );
+ p0.x = XDRAWPIX2WINPIX(d,p0x);
+ p0.y = YDRAWPIX2WINPIX(d,p0y);
+ p1.x = XDRAWPIX2WINPIX(d,p1x);
+ p1.y = YDRAWPIX2WINPIX(d,p1y);
+
+ MoveTo( d->hDc, p0.x, p0.y );
+ LineTo( d->hDc, p1.x, p1.y );
+ if (d->hWnd) {
+ if (dw==0) {
+ dw = 1;
+ }
+ dw++;
+ if (p0.y<p1.y) {
+ rect.top = p0.y-dw;
+ rect.bottom = p1.y+dw;
+ } else {
+ rect.top = p1.y-dw;
+ rect.bottom = p0.y+dw;
+ }
+ if (p0.x<p1.x) {
+ rect.left = p0.x-dw;
+ rect.right = p1.x+dw;
+ } else {
+ rect.left = p1.x-dw;
+ rect.right = p0.x+dw;
+ }
+ myInvalidateRect( d, &rect );
+ }
}
static double d2r(double angle)
{
- angle *= (M_PI / 180.0);
- return angle;
+ angle *= (M_PI / 180.0);
+ return angle;
}
static double mswsin( double angle )
{
- while (angle < 0.0) { angle += 360.0; }
- while (angle >= 360.0) { angle -= 360.0; }
- angle *= (M_PI*2.0)/360.0;
- return sin( angle );
+ while (angle < 0.0) {
+ angle += 360.0;
+ }
+ while (angle >= 360.0) {
+ angle -= 360.0;
+ }
+ angle *= (M_PI*2.0)/360.0;
+ return sin( angle );
}
static double mswcos( double angle )
{
- while (angle < 0.0) { angle += 360.0; }
- while (angle >= 360.0) { angle -= 360.0; }
- angle *= (M_PI*2.0)/360.0;
- return cos( angle );
+ while (angle < 0.0) {
+ angle += 360.0;
+ }
+ while (angle >= 360.0) {
+ angle -= 360.0;
+ }
+ angle *= (M_PI*2.0)/360.0;
+ return cos( angle );
}
static double mswasin( double x, double h )
{
- double angle;
- angle = asin( x/h );
- angle /= (M_PI*2.0)/360.0;
- return angle;
+ double angle;
+ angle = asin( x/h );
+ angle /= (M_PI*2.0)/360.0;
+ return angle;
}
static double mswNormalizeAngle( double a )
{
- while (a<0.0) { a += 360.0; }
- while (a>=360.0) { a -= 360.0; }
- return a;
+ while (a<0.0) {
+ a += 360.0;
+ }
+ while (a>=360.0) {
+ a -= 360.0;
+ }
+ return a;
}
/**
@@ -395,192 +428,197 @@ static double mswNormalizeAngle( double a )
void wDrawArc(
- wDraw_p d,
- wDrawPix_t px,
- wDrawPix_t py,
- wDrawPix_t r,
- double a0,
- double a1,
- int sizeCenter,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawPix_t r,
+ double a0,
+ double a1,
+ int sizeCenter,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- int i, cnt;
- POINT p0, p1, ps, pe, pp0, pp1, pp2, pc;
- wDrawPix_t psx, psy, pex, pey;
- double aa, ai;
- RECT rect;
- int needMoveTo;
- wBool_t fakeArc = FALSE;
-
- // calculate the center coordinates
- pc.x = XDRAWPIX2WINPIX( d, px );
- pc.y = YDRAWPIX2WINPIX( d, py );
-
- p0.x = XDRAWPIX2WINPIX(d,px-r);
- p0.y = YDRAWPIX2WINPIX(d,py+r);
- p1.x = XDRAWPIX2WINPIX(d,px+r);
- p1.y = YDRAWPIX2WINPIX(d,py-r);
-
- pex = px + r * mswsin(a0);
- pey = py + r * mswcos(a0);
- psx = px + r * mswsin(a0+a1);
- psy = py + r * mswcos(a0+a1);
-
- /*pointOnCircle( &pe, p, r, a0 );
- pointOnCircle( &ps, p, r, a0+a1 );*/
- ps.x = XDRAWPIX2WINPIX(d,psx);
- ps.y = YDRAWPIX2WINPIX(d,psy);
- pe.x = XDRAWPIX2WINPIX(d,pex);
- pe.y = YDRAWPIX2WINPIX(d,pey);
-
- setDrawMode( d, dw, lt, dc, dopt );
-
- if (dw == 0) {
- dw = 1;
- }
-
- if ( r > 30000 || a1 < 1.0 ) {
- /* The book says 32K but experience says otherwise */
- fakeArc = TRUE;
- }
-
- // Starting point
- psx = px + r * mswsin(a0);
- psy = py + r * mswcos(a0);
- pp0.x = XDRAWPIX2WINPIX( d, psx );
- pp0.y = YDRAWPIX2WINPIX( d, psy );
-
- if ( fakeArc ) {
- cnt = (int)(a1 / 2);
- if ( cnt <= 0 ) { cnt = 1; }
- if ( cnt > 180 ) { cnt = 180; }
-
- ai = d2r(a1) / cnt;
- aa = d2r(a0);
- needMoveTo = TRUE;
-
- for ( i=0; i<cnt; i++ ) {
- aa += ai;
- psx = px + r * sin(aa);
- psy = py + r * cos(aa);
- pp2.x = pp1.x = XDRAWPIX2WINPIX( d, psx );
- pp2.y = pp1.y = YDRAWPIX2WINPIX( d, psy );
- if ( clip0( &pp0, &pp1, d ) ) {
- if (needMoveTo) {
- MoveTo( d->hDc, pp0.x, pp0.y );
- needMoveTo = FALSE;
- }
- LineTo( d->hDc, pp1.x, pp1.y );
- } else {
- needMoveTo = TRUE;
- }
- pp0.x = pp2.x; pp0.y = pp2.y;
- }
- } else {
- DWORD rr = XDRAWPIX2WINPIX( d, r );
- SetArcDirection( d->hDc,AD_CLOCKWISE );
-
- // Draw two arcs from the center to eliminate the odd pie-shaped end artifact
- if ( dw > 2.0 ) {
- double a2 = a1 / 2.0;
- pp2.x = XDRAWPIX2WINPIX( d, px + r * mswsin(a0+a2) );
- pp2.y = YDRAWPIX2WINPIX( d, py + r * mswcos(a0+a2) );
-
- MoveTo( d->hDc, pp2.x, pp2.y );
- AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
- (float)(-a2) );
- MoveTo( d->hDc, pp2.x, pp2.y );
- AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
- (float)(a2) );
- } else {
- MoveTo( d->hDc, pp0.x, pp0.y );
- AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - a0),
- (float)(-a1) );
- }
- }
-
- // should the center of the arc be drawn?
- if( sizeCenter ) {
-
- // now draw the crosshair
- MoveTo( d->hDc, pc.x - CENTERMARK_LENGTH*sizeCenter, pc.y );
- LineTo( d->hDc, pc.x + CENTERMARK_LENGTH*sizeCenter, pc.y );
- MoveTo( d->hDc, pc.x, pc.y - CENTERMARK_LENGTH*sizeCenter );
- LineTo( d->hDc, pc.x, pc.y + CENTERMARK_LENGTH*sizeCenter );
-
- // invalidate the area of the crosshair
- rect.top = pc.y - CENTERMARK_LENGTH*sizeCenter - 1;
- rect.bottom = pc.y + CENTERMARK_LENGTH*sizeCenter + 1;
- rect.left = pc.x - CENTERMARK_LENGTH*sizeCenter - 1;
- rect.right = pc.x + CENTERMARK_LENGTH*sizeCenter + 1;
- myInvalidateRect( d, &rect );
- }
-
- if (d->hWnd) {
- dw++;
- a1 += a0;
- if (a1>360.0) {
- rect.top = p0.y;
- } else {
- rect.top = min(pe.y,ps.y);
- }
- if (a1>(a0>180?360.0:0.0)+180) {
- rect.bottom = p1.y;
- } else {
- rect.bottom = max(pe.y,ps.y);
- }
- if (a1>(a0>270?360.0:0.0)+270) {
- rect.left = p0.x;
- } else {
- rect.left = min(pe.x,ps.x);
- }
- if (a1>(a0>90?360.0:0.0)+90) {
- rect.right = p1.x;
- } else {
- rect.right = max(pe.x,ps.x);
- }
- rect.top -= dw;
- rect.bottom += dw;
- rect.left -= dw;
- rect.right += dw;
- myInvalidateRect( d, &rect );
-
- }
+ int i, cnt;
+ POINT p0, p1, ps, pe, pp0, pp1, pp2, pc;
+ wDrawPix_t psx, psy, pex, pey;
+ double aa, ai;
+ RECT rect;
+ int needMoveTo;
+ wBool_t fakeArc = FALSE;
+
+ // calculate the center coordinates
+ pc.x = XDRAWPIX2WINPIX( d, px );
+ pc.y = YDRAWPIX2WINPIX( d, py );
+
+ p0.x = XDRAWPIX2WINPIX(d,px-r);
+ p0.y = YDRAWPIX2WINPIX(d,py+r);
+ p1.x = XDRAWPIX2WINPIX(d,px+r);
+ p1.y = YDRAWPIX2WINPIX(d,py-r);
+
+ pex = px + r * mswsin(a0);
+ pey = py + r * mswcos(a0);
+ psx = px + r * mswsin(a0+a1);
+ psy = py + r * mswcos(a0+a1);
+
+ /*pointOnCircle( &pe, p, r, a0 );
+ pointOnCircle( &ps, p, r, a0+a1 );*/
+ ps.x = XDRAWPIX2WINPIX(d,psx);
+ ps.y = YDRAWPIX2WINPIX(d,psy);
+ pe.x = XDRAWPIX2WINPIX(d,pex);
+ pe.y = YDRAWPIX2WINPIX(d,pey);
+
+ setDrawMode( d, dw, lt, dc, dopt );
+
+ if (dw == 0) {
+ dw = 1;
+ }
+
+ if ( r > 30000 || a1 < 1.0 ) {
+ /* The book says 32K but experience says otherwise */
+ fakeArc = TRUE;
+ }
+
+ // Starting point
+ psx = px + r * mswsin(a0);
+ psy = py + r * mswcos(a0);
+ pp0.x = XDRAWPIX2WINPIX( d, psx );
+ pp0.y = YDRAWPIX2WINPIX( d, psy );
+
+ if ( fakeArc ) {
+ cnt = (int)(a1 / 2);
+ if ( cnt <= 0 ) {
+ cnt = 1;
+ }
+ if ( cnt > 180 ) {
+ cnt = 180;
+ }
+
+ ai = d2r(a1) / cnt;
+ aa = d2r(a0);
+ needMoveTo = TRUE;
+
+ for ( i=0; i<cnt; i++ ) {
+ aa += ai;
+ psx = px + r * sin(aa);
+ psy = py + r * cos(aa);
+ pp2.x = pp1.x = XDRAWPIX2WINPIX( d, psx );
+ pp2.y = pp1.y = YDRAWPIX2WINPIX( d, psy );
+ if ( clip0( &pp0, &pp1, d ) ) {
+ if (needMoveTo) {
+ MoveTo( d->hDc, pp0.x, pp0.y );
+ needMoveTo = FALSE;
+ }
+ LineTo( d->hDc, pp1.x, pp1.y );
+ } else {
+ needMoveTo = TRUE;
+ }
+ pp0.x = pp2.x;
+ pp0.y = pp2.y;
+ }
+ } else {
+ DWORD rr = XDRAWPIX2WINPIX( d, r );
+ SetArcDirection( d->hDc,AD_CLOCKWISE );
+
+ // Draw two arcs from the center to eliminate the odd pie-shaped end artifact
+ if ( dw > 2.0 ) {
+ double a2 = a1 / 2.0;
+ pp2.x = XDRAWPIX2WINPIX( d, px + r * mswsin(a0+a2) );
+ pp2.y = YDRAWPIX2WINPIX( d, py + r * mswcos(a0+a2) );
+
+ MoveTo( d->hDc, pp2.x, pp2.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
+ (float)(-a2) );
+ MoveTo( d->hDc, pp2.x, pp2.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
+ (float)(a2) );
+ } else {
+ MoveTo( d->hDc, pp0.x, pp0.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - a0),
+ (float)(-a1) );
+ }
+ }
+
+ // should the center of the arc be drawn?
+ if( sizeCenter ) {
+
+ // now draw the crosshair
+ MoveTo( d->hDc, pc.x - CENTERMARK_LENGTH*sizeCenter, pc.y );
+ LineTo( d->hDc, pc.x + CENTERMARK_LENGTH*sizeCenter, pc.y );
+ MoveTo( d->hDc, pc.x, pc.y - CENTERMARK_LENGTH*sizeCenter );
+ LineTo( d->hDc, pc.x, pc.y + CENTERMARK_LENGTH*sizeCenter );
+
+ // invalidate the area of the crosshair
+ rect.top = pc.y - CENTERMARK_LENGTH*sizeCenter - 1;
+ rect.bottom = pc.y + CENTERMARK_LENGTH*sizeCenter + 1;
+ rect.left = pc.x - CENTERMARK_LENGTH*sizeCenter - 1;
+ rect.right = pc.x + CENTERMARK_LENGTH*sizeCenter + 1;
+ myInvalidateRect( d, &rect );
+ }
+
+ if (d->hWnd) {
+ dw++;
+ a1 += a0;
+ if (a1>360.0) {
+ rect.top = p0.y;
+ } else {
+ rect.top = min(pe.y,ps.y);
+ }
+ if (a1>(a0>180?360.0:0.0)+180) {
+ rect.bottom = p1.y;
+ } else {
+ rect.bottom = max(pe.y,ps.y);
+ }
+ if (a1>(a0>270?360.0:0.0)+270) {
+ rect.left = p0.x;
+ } else {
+ rect.left = min(pe.x,ps.x);
+ }
+ if (a1>(a0>90?360.0:0.0)+90) {
+ rect.right = p1.x;
+ } else {
+ rect.right = max(pe.x,ps.x);
+ }
+ rect.top -= dw;
+ rect.bottom += dw;
+ rect.left -= dw;
+ rect.right += dw;
+ myInvalidateRect( d, &rect );
+
+ }
}
void wDrawPoint(
- wDraw_p d,
- wDrawPix_t px,
- wDrawPix_t py,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- POINT p0;
- RECT rect;
-
- p0.x = XDRAWPIX2WINPIX(d,px);
- p0.y = YDRAWPIX2WINPIX(d,py);
-
- if ( p0.x < 0 || p0.y < 0 ) {
- return;
- }
- if ( p0.x >= d->w || p0.y >= d->h ) {
- return;
- }
- setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
-
- SetPixel( d->hDc, p0.x, p0.y, mswGetColor(d->hasPalette,
- dc) /*colorPalette.palPalEntry[dc]*/ );
- if (d->hWnd) {
- rect.top = p0.y-1;
- rect.bottom = p0.y+1;
- rect.left = p0.x-1;
- rect.right = p0.x+1;
- myInvalidateRect( d, &rect );
- }
+ POINT p0;
+ RECT rect;
+
+ p0.x = XDRAWPIX2WINPIX(d,px);
+ p0.y = YDRAWPIX2WINPIX(d,py);
+
+ if ( p0.x < 0 || p0.y < 0 ) {
+ return;
+ }
+ if ( p0.x >= d->w || p0.y >= d->h ) {
+ return;
+ }
+ setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
+
+ SetPixel( d->hDc, p0.x, p0.y, mswGetColor(d->hasPalette,
+ dc) /*colorPalette.palPalEntry[dc]*/ );
+ if (d->hWnd) {
+ rect.top = p0.y-1;
+ rect.bottom = p0.y+1;
+ rect.left = p0.x-1;
+ rect.right = p0.x+1;
+ myInvalidateRect( d, &rect );
+ }
}
/*
@@ -593,155 +631,155 @@ void wDrawPoint(
static LOGFONT logFont = {
- /* Initial default values */
- -24, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial"
- };
+ /* Initial default values */
+ -24, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+};
static LOGFONT timesFont[2][2] = {
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times"
- },
- {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times"
- }
- },
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times"
- },
- {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times"
- }
- }
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ },
+ {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ }
+ },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ },
+ {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ }
+ }
};
static LOGFONT helvFont[2][2] = {
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial"
- },
- {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial"
- }
- },
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial"
- },
- {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Hevletica"
- }
- }
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ },
+ {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ }
+ },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ },
+ {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Hevletica"
+ }
+ }
};
void mswFontInit( void )
{
- const char * face;
- long size;
- /** @prefs [msw window font] face=FontName */
- face = wPrefGetString( "msw window font", "face" );
- /** @prefs [msw window font] size=-24 */
- wPrefGetInteger( "msw window font", "size", &size, -24 );
- if (face) {
- strncpy( logFont.lfFaceName, face, LF_FACESIZE );
- }
- logFont.lfHeight = (int)size;
+ const char * face;
+ long size;
+ /** @prefs [msw window font] face=FontName */
+ face = wPrefGetString( "msw window font", "face" );
+ /** @prefs [msw window font] size=-24 */
+ wPrefGetInteger( "msw window font", "size", &size, -24 );
+ if (face) {
+ strncpy( logFont.lfFaceName, face, LF_FACESIZE );
+ }
+ logFont.lfHeight = (int)size;
}
@@ -751,74 +789,74 @@ static double fontFactor = 1.0;
static void doChooseFont( void )
{
- int rc;
- memset( &chooseFont, 0, sizeof chooseFont );
- chooseFont.lStructSize = sizeof chooseFont;
- chooseFont.hwndOwner = mswHWnd;
- chooseFont.lpLogFont = &logFont;
- chooseFont.Flags = CF_SCREENFONTS|CF_SCALABLEONLY|CF_INITTOLOGFONTSTRUCT;
- chooseFont.nFontType = SCREEN_FONTTYPE;
- rc = ChooseFont( &chooseFont );
- if (rc) {
- fontSize = (wFontSize_t)(-logFont.lfHeight * 72) / 96.0 / fontFactor;
- if (fontSize < 1) {
- fontSize = 1;
- }
- wPrefSetString( "msw window font", "face", logFont.lfFaceName );
- wPrefSetInteger( "msw window font", "size", logFont.lfHeight );
- }
+ int rc;
+ memset( &chooseFont, 0, sizeof chooseFont );
+ chooseFont.lStructSize = sizeof chooseFont;
+ chooseFont.hwndOwner = mswHWnd;
+ chooseFont.lpLogFont = &logFont;
+ chooseFont.Flags = CF_SCREENFONTS|CF_SCALABLEONLY|CF_INITTOLOGFONTSTRUCT;
+ chooseFont.nFontType = SCREEN_FONTTYPE;
+ rc = ChooseFont( &chooseFont );
+ if (rc) {
+ fontSize = (wFontSize_t)(-logFont.lfHeight * 72) / 96.0 / fontFactor;
+ if (fontSize < 1) {
+ fontSize = 1;
+ }
+ wPrefSetString( "msw window font", "face", logFont.lfFaceName );
+ wPrefSetInteger( "msw window font", "size", logFont.lfHeight );
+ }
}
static int computeFontSize( wDraw_p d, double siz )
{
- int ret;
- siz = (siz * d->DPI) / 72.0;
- ret = (int)(siz * fontFactor);
- if (ret < 1) {
- ret = 1;
- }
- return -ret;
+ int ret;
+ siz = (siz * d->DPI) / 72.0;
+ ret = (int)(siz * fontFactor);
+ if (ret < 1) {
+ ret = 1;
+ }
+ return -ret;
}
void wDrawGetTextSize(
- wDrawPix_t *w,
- wDrawPix_t *h,
- wDrawPix_t *d,
- wDrawPix_t *a,
- wDraw_p bd,
- const char * text,
- wFont_p fp,
- double siz )
+ wDrawPix_t *w,
+ wDrawPix_t *h,
+ wDrawPix_t *d,
+ wDrawPix_t *a,
+ wDraw_p bd,
+ const char * text,
+ wFont_p fp,
+ double siz )
{
- wWinPix_t x, y;
- HFONT newFont, prevFont;
- DWORD extent;
- int oldLfHeight;
- TEXTMETRIC textMetric;
-
- if (fp == NULL) {
- fp = &logFont;
- }
- fp->lfEscapement = 0;
- oldLfHeight = fp->lfHeight;
- fp->lfHeight = computeFontSize( bd, siz );
- fp->lfWidth = 0;
- newFont = CreateFontIndirect( fp );
- prevFont = SelectObject( bd->hDc, newFont );
- extent = GetTextExtent( bd->hDc, CAST_AWAY_CONST text, (int)(strlen(text)) );
-
- GetTextMetrics(bd->hDc, &textMetric);
-
- x = LOWORD(extent);
- y = HIWORD(extent);
- *w = (wDrawPix_t)x;
- *h = (wDrawPix_t)y;
- *d = (wDrawPix_t)textMetric.tmDescent;
- *a = (wDrawPix_t)textMetric.tmAscent;
-
- SelectObject( bd->hDc, prevFont );
- DeleteObject( newFont );
- fp->lfHeight = oldLfHeight;
+ wWinPix_t x, y;
+ HFONT newFont, prevFont;
+ DWORD extent;
+ int oldLfHeight;
+ TEXTMETRIC textMetric;
+
+ if (fp == NULL) {
+ fp = &logFont;
+ }
+ fp->lfEscapement = 0;
+ oldLfHeight = fp->lfHeight;
+ fp->lfHeight = computeFontSize( bd, siz );
+ fp->lfWidth = 0;
+ newFont = CreateFontIndirect( fp );
+ prevFont = SelectObject( bd->hDc, newFont );
+ extent = GetTextExtent( bd->hDc, CAST_AWAY_CONST text, (int)(strlen(text)) );
+
+ GetTextMetrics(bd->hDc, &textMetric);
+
+ x = LOWORD(extent);
+ y = HIWORD(extent);
+ *w = (wDrawPix_t)x;
+ *h = (wDrawPix_t)y;
+ *d = (wDrawPix_t)textMetric.tmDescent;
+ *a = (wDrawPix_t)textMetric.tmAscent;
+
+ SelectObject( bd->hDc, prevFont );
+ DeleteObject( newFont );
+ fp->lfHeight = oldLfHeight;
}
/**
* Draw text
@@ -834,79 +872,79 @@ void wDrawGetTextSize(
* \param dopts drawing options
*/
void wDrawString(
- wDraw_p d,
- wDrawPix_t px,
- wDrawPix_t py,
- double angle,
- const char * text,
- wFont_p fp,
- double siz,
- wDrawColor dc,
- wDrawOpts dopts)
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ double angle,
+ const char * text,
+ wFont_p fp,
+ double siz,
+ wDrawColor dc,
+ wDrawOpts dopts)
{
- int x, y;
- HFONT newFont, prevFont;
- DWORD extent;
- int w, h;
- RECT rect;
- int oldLfHeight;
-
- if (fp == NULL) {
- fp = &logFont;
- }
-
- oldLfHeight = fp->lfHeight;
- fp->lfEscapement = (int)(angle*10.0);
- fp->lfHeight = computeFontSize(d, siz);
- fp->lfWidth = 0;
- newFont = CreateFontIndirect(fp);
- x = XDRAWPIX2WINPIX(d,px) + (int)(mswsin(angle)*fp->lfHeight-0.5);
- y = YDRAWPIX2WINPIX(d,py) + (int)(mswcos(angle)*fp->lfHeight-0.5);
-
- setDrawMode( d, 0, wDrawLineSolid, dc, dopts );
- prevFont = SelectObject(d->hDc, newFont);
- SetBkMode(d->hDc, TRANSPARENT);
-
- if (dopts & wDrawOutlineFont) {
- HPEN oldPen;
- BeginPath(d->hDc);
- TextOut(d->hDc, x, y, text, (int)strlen(text));
- EndPath(d->hDc);
-
- // Now draw outline text
- oldPen = SelectObject(d->hDc,
- CreatePen(PS_SOLID, 1,
- mswGetColor(d->hasPalette, dc)));
- StrokePath(d->hDc);
- SelectObject(d->hDc, oldPen);
- } else {
- COLORREF old;
-
- old = SetTextColor(d->hDc, mswGetColor(d->hasPalette, dc));
- TextOut(d->hDc, x, y, text, (int)(strlen(text)));
- SetTextColor(d->hDc, old);
- }
-
- extent = GetTextExtent(d->hDc, CAST_AWAY_CONST text, (int)(strlen(text)));
- SelectObject(d->hDc, prevFont);
- w = LOWORD(extent);
- h = HIWORD(extent);
-
- if (d->hWnd) {
- rect.top = y - (w + h + 1);
- rect.bottom = y + (w + h + 1);
- rect.left = x - (w + h + 1);
- rect.right = x + (w + h + 1);
- myInvalidateRect(d, &rect);
- }
-
- DeleteObject(newFont);
- fp->lfHeight = oldLfHeight;
+ int x, y;
+ HFONT newFont, prevFont;
+ DWORD extent;
+ int w, h;
+ RECT rect;
+ int oldLfHeight;
+
+ if (fp == NULL) {
+ fp = &logFont;
+ }
+
+ oldLfHeight = fp->lfHeight;
+ fp->lfEscapement = (int)(angle*10.0);
+ fp->lfHeight = computeFontSize(d, siz);
+ fp->lfWidth = 0;
+ newFont = CreateFontIndirect(fp);
+ x = XDRAWPIX2WINPIX(d,px) + (int)(mswsin(angle)*fp->lfHeight-0.5);
+ y = YDRAWPIX2WINPIX(d,py) + (int)(mswcos(angle)*fp->lfHeight-0.5);
+
+ setDrawMode( d, 0, wDrawLineSolid, dc, dopts );
+ prevFont = SelectObject(d->hDc, newFont);
+ SetBkMode(d->hDc, TRANSPARENT);
+
+ if (dopts & wDrawOutlineFont) {
+ HPEN oldPen;
+ BeginPath(d->hDc);
+ TextOut(d->hDc, x, y, text, (int)strlen(text));
+ EndPath(d->hDc);
+
+ // Now draw outline text
+ oldPen = SelectObject(d->hDc,
+ CreatePen(PS_SOLID, 1,
+ mswGetColor(d->hasPalette, dc)));
+ StrokePath(d->hDc);
+ SelectObject(d->hDc, oldPen);
+ } else {
+ COLORREF old;
+
+ old = SetTextColor(d->hDc, mswGetColor(d->hasPalette, dc));
+ TextOut(d->hDc, x, y, text, (int)(strlen(text)));
+ SetTextColor(d->hDc, old);
+ }
+
+ extent = GetTextExtent(d->hDc, CAST_AWAY_CONST text, (int)(strlen(text)));
+ SelectObject(d->hDc, prevFont);
+ w = LOWORD(extent);
+ h = HIWORD(extent);
+
+ if (d->hWnd) {
+ rect.top = y - (w + h + 1);
+ rect.bottom = y + (w + h + 1);
+ rect.left = x - (w + h + 1);
+ rect.right = x + (w + h + 1);
+ myInvalidateRect(d, &rect);
+ }
+
+ DeleteObject(newFont);
+ fp->lfHeight = oldLfHeight;
}
static const char * wCurFont( void )
{
- return logFont.lfFaceName;
+ return logFont.lfFaceName;
}
void wInitializeFonts()
@@ -915,29 +953,29 @@ void wInitializeFonts()
wFont_p wStandardFont( int family, wBool_t bold, wBool_t italic )
{
- if (family == F_TIMES) {
- return &timesFont[bold][italic];
- } else if (family == F_HELV) {
- return &helvFont[bold][italic];
- } else {
- return NULL;
- }
+ if (family == F_TIMES) {
+ return &timesFont[bold][italic];
+ } else if (family == F_HELV) {
+ return &helvFont[bold][italic];
+ } else {
+ return NULL;
+ }
}
void wSelectFont( const char * title )
{
- doChooseFont();
+ doChooseFont();
}
wFontSize_t wSelectedFontSize( void )
{
- return fontSize;
+ return fontSize;
}
void wSetSelectedFontSize(wFontSize_t size)
{
- fontSize = size;
+ fontSize = size;
}
/*
@@ -951,58 +989,58 @@ void wSetSelectedFontSize(wFontSize_t size)
void wDrawFilledRectangle(
- wDraw_p d,
- wDrawPix_t px,
- wDrawPix_t py,
- wDrawPix_t sx,
- wDrawPix_t sy,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawPix_t sx,
+ wDrawPix_t sy,
+ wDrawColor color,
+ wDrawOpts opts )
{
- int mode;
- RECT rect;
- if (d == NULL) {
- return;
- }
- setDrawBrush( d, color, opts );
- if (opts & wDrawOptTransparent) {
- mode = R2_NOTXORPEN;
- } else {
- mode = R2_COPYPEN;
- }
- SetROP2(d->hDc, mode);
- rect.left = XDRAWPIX2WINPIX(d,px);
- rect.right = XDRAWPIX2WINPIX(d,px+sx);
- rect.top = YDRAWPIX2WINPIX(d,py+sy);
- rect.bottom = YDRAWPIX2WINPIX(d,py);
- if ( rect.right < 0 ||
- rect.bottom < 0 ) {
- return;
- }
- if ( rect.left < 0 ) {
- rect.left = 0;
- }
- if ( rect.top < 0 ) {
- rect.top = 0;
- }
- if ( rect.left > d->w ||
- rect.top > d->h ) {
- return;
- }
- if ( rect.right > d->w ) {
- rect.right = d->w;
- }
- if ( rect.bottom > d->h ) {
- rect.bottom = d->h;
- }
- Rectangle( d->hDc, rect.left, rect.top, rect.right, rect.bottom );
- if (d->hWnd) {
- rect.top--;
- rect.left--;
- rect.bottom++;
- rect.right++;
- myInvalidateRect( d, &rect );
- }
+ int mode;
+ RECT rect;
+ if (d == NULL) {
+ return;
+ }
+ setDrawBrush( d, color, opts );
+ if (opts & wDrawOptTransparent) {
+ mode = R2_NOTXORPEN;
+ } else {
+ mode = R2_COPYPEN;
+ }
+ SetROP2(d->hDc, mode);
+ rect.left = XDRAWPIX2WINPIX(d,px);
+ rect.right = XDRAWPIX2WINPIX(d,px+sx);
+ rect.top = YDRAWPIX2WINPIX(d,py+sy);
+ rect.bottom = YDRAWPIX2WINPIX(d,py);
+ if ( rect.right < 0 ||
+ rect.bottom < 0 ) {
+ return;
+ }
+ if ( rect.left < 0 ) {
+ rect.left = 0;
+ }
+ if ( rect.top < 0 ) {
+ rect.top = 0;
+ }
+ if ( rect.left > d->w ||
+ rect.top > d->h ) {
+ return;
+ }
+ if ( rect.right > d->w ) {
+ rect.right = d->w;
+ }
+ if ( rect.bottom > d->h ) {
+ rect.bottom = d->h;
+ }
+ Rectangle( d->hDc, rect.left, rect.top, rect.right, rect.bottom );
+ if (d->hWnd) {
+ rect.top--;
+ rect.left--;
+ rect.bottom++;
+ rect.right++;
+ myInvalidateRect( d, &rect );
+ }
}
#ifdef DRAWFILLPOLYLOG
@@ -1027,34 +1065,34 @@ static dynArr_t wFillType_da;
*/
static void addPoint(
- wDraw_p d,
- int pk,
- coOrd * pp,
- BYTE type, RECT * pr)
+ wDraw_p d,
+ int pk,
+ coOrd * pp,
+ BYTE type, RECT * pr)
{
- POINT p;
- p.x = XDRAWPIX2WINPIX(d, pp->x);
- p.y = YDRAWPIX2WINPIX(d, pp->y);
+ POINT p;
+ p.x = XDRAWPIX2WINPIX(d, pp->x);
+ p.y = YDRAWPIX2WINPIX(d, pp->y);
#ifdef DRAWFILLPOLYLOG
- fprintf(logF, " q[%d] = {%d,%d}\n", pk, p.x, p.y);
+ fprintf(logF, " q[%d] = {%d,%d}\n", pk, p.x, p.y);
#endif
- DYNARR_N(POINT, wFillPoints_da, pk) = p;
- DYNARR_N(BYTE, wFillType_da, pk) = type;
-
- if (p.x < pr->left) {
- pr->left = p.x;
- }
- if (p.x > pr->right) {
- pr->right = p.x;
- }
- if (p.y < pr->top) {
- pr->top = p.y;
- }
- if (p.y > pr->bottom) {
- pr->bottom = p.y;
- }
+ DYNARR_N(POINT, wFillPoints_da, pk) = p;
+ DYNARR_N(BYTE, wFillType_da, pk) = type;
+
+ if (p.x < pr->left) {
+ pr->left = p.x;
+ }
+ if (p.x > pr->right) {
+ pr->right = p.x;
+ }
+ if (p.y < pr->top) {
+ pr->top = p.y;
+ }
+ if (p.y > pr->bottom) {
+ pr->bottom = p.y;
+ }
}
/**
@@ -1074,191 +1112,191 @@ static void addPoint(
*/
void wDrawPolygon(
- wDraw_p d,
- wDrawPix_t node[][2],
- wPolyLine_e type[],
- wIndex_t cnt,
- wDrawColor color,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawOpts opts,
- int fill,
- int open)
+ wDraw_p d,
+ wDrawPix_t node[][2],
+ wPolyLine_e type[],
+ wIndex_t cnt,
+ wDrawColor color,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawOpts opts,
+ int fill,
+ int open)
{
- RECT rect;
- int i, prevNode, nextNode;
- int pointCount = 0;
- coOrd endPoint0, endPoint1, controlPoint0, controlPoint1;
- coOrd point, startingPoint;
- BOOL rc;
- int closed = 0;
-
- if (d == NULL) {
- return;
- }
-
- // make sure the array for the points is large enough
- // worst case are rounded corners that require 4 points
- DYNARR_RESET(POINT,wFillPoints_da);
- DYNARR_SET(POINT,wFillPoints_da,(cnt + 1) * 4);
- DYNARR_RESET(BYTE,wFillType_da);
- DYNARR_SET(POINT,wFillType_da, (cnt + 1) * 4);
-
- BeginPath(d->hDc);
-
- if (fill) {
- int mode;
- setDrawBrush(d, color, opts);
- if (opts & wDrawOptTransparent) {
- mode = R2_NOTXORPEN;
- } else {
- mode = R2_COPYPEN;
- }
- SetROP2(d->hDc, mode);
-
- } else {
- setDrawMode(d, dw, lt, color, opts);
- }
-
- rect.left = rect.right = XDRAWPIX2WINPIX(d,node[cnt-1][0]-1);
- rect.top = rect.bottom = YDRAWPIX2WINPIX(d,node[cnt-1][1]+1);
+ RECT rect;
+ int i, prevNode, nextNode;
+ int pointCount = 0;
+ coOrd endPoint0, endPoint1, controlPoint0, controlPoint1;
+ coOrd point, startingPoint;
+ BOOL rc;
+ int closed = 0;
+
+ if (d == NULL) {
+ return;
+ }
+
+ // make sure the array for the points is large enough
+ // worst case are rounded corners that require 4 points
+ DYNARR_RESET(POINT,wFillPoints_da);
+ DYNARR_SET(POINT,wFillPoints_da,(cnt + 1) * 4);
+ DYNARR_RESET(BYTE,wFillType_da);
+ DYNARR_SET(POINT,wFillType_da, (cnt + 1) * 4);
+
+ BeginPath(d->hDc);
+
+ if (fill) {
+ int mode;
+ setDrawBrush(d, color, opts);
+ if (opts & wDrawOptTransparent) {
+ mode = R2_NOTXORPEN;
+ } else {
+ mode = R2_COPYPEN;
+ }
+ SetROP2(d->hDc, mode);
+
+ } else {
+ setDrawMode(d, dw, lt, color, opts);
+ }
+
+ rect.left = rect.right = XDRAWPIX2WINPIX(d,node[cnt-1][0]-1);
+ rect.top = rect.bottom = YDRAWPIX2WINPIX(d,node[cnt-1][1]+1);
#ifdef DRAWFILLPOLYLOG
- logF = fopen("log.txt", "a");
- fprintf(logF, "\np[%d] = {%d,%d}\n", cnt-1, node[0][0], node[0][1]);
+ logF = fopen("log.txt", "a");
+ fprintf(logF, "\np[%d] = {%d,%d}\n", cnt-1, node[0][0], node[0][1]);
#endif
- for (i=0; i<cnt; i++) {
- wPolyLine_e type1;
- point.x = node[i][0];
- point.y = node[i][1];
- if (type != NULL) {
- type1 = type[i];
- } else {
- type1 = wPolyLineStraight;
- }
-
- if (type1 == wPolyLineRound || type1 == wPolyLineSmooth) {
- prevNode = (i == 0) ? cnt - 1 : i - 1;
- nextNode = (i == cnt - 1) ? 0 : i + 1;
-
- // calculate distance to neighboring nodes
- int prevXDistance = (wWinPix_t)(node[i][0] - node[prevNode][0]);
- int prevYDistance = (wWinPix_t)(node[i][1] - node[prevNode][1]);
- int nextXDistance = (wWinPix_t)(node[nextNode][0]-node[i][0]);
- int nextYDistance = (wWinPix_t)(node[nextNode][1]-node[i][1]);
-
- // distance from node to endpoints of curve is half the line length
- endPoint0.x = (prevXDistance/2)+node[prevNode][0];
- endPoint0.y = (prevYDistance/2)+node[prevNode][1];
- endPoint1.x = (nextXDistance/2)+node[i][0];
- endPoint1.y = (nextYDistance/2)+node[i][1];
-
- if (type1 == wPolyLineRound) {
- double distNext = (nextXDistance*nextXDistance + nextYDistance * nextYDistance);
- double distPrev = (prevXDistance*prevXDistance + prevYDistance * prevYDistance);
- // but should be half of the shortest line length (equidistant from node) for round
- if ((distPrev > 0) && (distNext > 0)) {
- double ratio = sqrt(distPrev / distNext);
- if (distPrev < distNext) {
- endPoint1.x = ((nextXDistance*ratio) / 2) + node[i][0];
- endPoint1.y = ((nextYDistance*ratio) / 2) + node[i][1];
- } else {
- endPoint0.x = node[i][0] - (prevXDistance / (2 * ratio));
- endPoint0.y = node[i][1] - (prevYDistance / (2 * ratio));
- }
- }
- // experience says that the best look is achieved if the
- // control points are in the middle between end point and node
- controlPoint0.x = (node[i][0] - endPoint0.x) / 2 + endPoint0.x;
- controlPoint0.y = (node[i][1] - endPoint0.y) / 2 + endPoint0.y;
-
- controlPoint1.x = (endPoint1.x - node[i][0]) / 2 + node[i][0];
- controlPoint1.y = (endPoint1.y - node[i][1]) / 2 + node[i][1];
- } else {
- controlPoint0 = point;
- controlPoint1 = point;
- }
- }
-
- if (i==0) {
- if (type1 == wPolyLineStraight || open) {
- // for straight lines or open shapes use the starting point as passed
- addPoint(d, pointCount++, &point, PT_MOVETO, &rect);
- startingPoint = point;
- } else {
- // for Bezier begin with the calculated starting point
- addPoint(d, pointCount++, &endPoint0, PT_MOVETO, &rect);
- addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &endPoint1, PT_BEZIERTO, &rect);
- startingPoint = endPoint0;
- }
- } else {
- if (type1 == wPolyLineStraight || (open && (i==cnt-1))) {
- addPoint(d, pointCount++, &point, PT_LINETO, &rect);
- } else {
- if (i==cnt-1 && !open) {
- closed = TRUE;
- }
- addPoint(d, pointCount++, &endPoint0, PT_LINETO, &rect);
- addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &endPoint1,
- PT_BEZIERTO | (closed ? PT_CLOSEFIGURE : 0), &rect);
- }
- }
- }
-
- if (!open && !closed) {
- addPoint(d, pointCount++, &startingPoint, PT_LINETO, &rect);
- }
- rc = PolyDraw(d->hDc, wFillPoints_da.ptr, wFillType_da.ptr, pointCount);
-
- EndPath(d->hDc);
-
- if (fill && !open) {
- FillPath(d->hDc);
- } else {
- StrokePath(d->hDc);
- }
-
- if (d->hWnd) {
- rect.top--;
- rect.left--;
- rect.bottom++;
- rect.right++;
- myInvalidateRect(d, &rect);
- }
+ for (i=0; i<cnt; i++) {
+ wPolyLine_e type1;
+ point.x = node[i][0];
+ point.y = node[i][1];
+ if (type != NULL) {
+ type1 = type[i];
+ } else {
+ type1 = wPolyLineStraight;
+ }
+
+ if (type1 == wPolyLineRound || type1 == wPolyLineSmooth) {
+ prevNode = (i == 0) ? cnt - 1 : i - 1;
+ nextNode = (i == cnt - 1) ? 0 : i + 1;
+
+ // calculate distance to neighboring nodes
+ int prevXDistance = (wWinPix_t)(node[i][0] - node[prevNode][0]);
+ int prevYDistance = (wWinPix_t)(node[i][1] - node[prevNode][1]);
+ int nextXDistance = (wWinPix_t)(node[nextNode][0]-node[i][0]);
+ int nextYDistance = (wWinPix_t)(node[nextNode][1]-node[i][1]);
+
+ // distance from node to endpoints of curve is half the line length
+ endPoint0.x = (prevXDistance/2)+node[prevNode][0];
+ endPoint0.y = (prevYDistance/2)+node[prevNode][1];
+ endPoint1.x = (nextXDistance/2)+node[i][0];
+ endPoint1.y = (nextYDistance/2)+node[i][1];
+
+ if (type1 == wPolyLineRound) {
+ double distNext = (nextXDistance*nextXDistance + nextYDistance * nextYDistance);
+ double distPrev = (prevXDistance*prevXDistance + prevYDistance * prevYDistance);
+ // but should be half of the shortest line length (equidistant from node) for round
+ if ((distPrev > 0) && (distNext > 0)) {
+ double ratio = sqrt(distPrev / distNext);
+ if (distPrev < distNext) {
+ endPoint1.x = ((nextXDistance*ratio) / 2) + node[i][0];
+ endPoint1.y = ((nextYDistance*ratio) / 2) + node[i][1];
+ } else {
+ endPoint0.x = node[i][0] - (prevXDistance / (2 * ratio));
+ endPoint0.y = node[i][1] - (prevYDistance / (2 * ratio));
+ }
+ }
+ // experience says that the best look is achieved if the
+ // control points are in the middle between end point and node
+ controlPoint0.x = (node[i][0] - endPoint0.x) / 2 + endPoint0.x;
+ controlPoint0.y = (node[i][1] - endPoint0.y) / 2 + endPoint0.y;
+
+ controlPoint1.x = (endPoint1.x - node[i][0]) / 2 + node[i][0];
+ controlPoint1.y = (endPoint1.y - node[i][1]) / 2 + node[i][1];
+ } else {
+ controlPoint0 = point;
+ controlPoint1 = point;
+ }
+ }
+
+ if (i==0) {
+ if (type1 == wPolyLineStraight || open) {
+ // for straight lines or open shapes use the starting point as passed
+ addPoint(d, pointCount++, &point, PT_MOVETO, &rect);
+ startingPoint = point;
+ } else {
+ // for Bezier begin with the calculated starting point
+ addPoint(d, pointCount++, &endPoint0, PT_MOVETO, &rect);
+ addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &endPoint1, PT_BEZIERTO, &rect);
+ startingPoint = endPoint0;
+ }
+ } else {
+ if (type1 == wPolyLineStraight || (open && (i==cnt-1))) {
+ addPoint(d, pointCount++, &point, PT_LINETO, &rect);
+ } else {
+ if (i==cnt-1 && !open) {
+ closed = TRUE;
+ }
+ addPoint(d, pointCount++, &endPoint0, PT_LINETO, &rect);
+ addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &endPoint1,
+ PT_BEZIERTO | (closed ? PT_CLOSEFIGURE : 0), &rect);
+ }
+ }
+ }
+
+ if (!open && !closed) {
+ addPoint(d, pointCount++, &startingPoint, PT_LINETO, &rect);
+ }
+ rc = PolyDraw(d->hDc, wFillPoints_da.ptr, wFillType_da.ptr, pointCount);
+
+ EndPath(d->hDc);
+
+ if (fill && !open) {
+ FillPath(d->hDc);
+ } else {
+ StrokePath(d->hDc);
+ }
+
+ if (d->hWnd) {
+ rect.top--;
+ rect.left--;
+ rect.bottom++;
+ rect.right++;
+ myInvalidateRect(d, &rect);
+ }
}
#define MAX_FILLCIRCLE_POINTS (30)
void wDrawFilledCircle(
- wDraw_p d,
- wDrawPix_t x,
- wDrawPix_t y,
- wDrawPix_t r,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opts )
{
- POINT p0, p1;
- RECT rect;
- static wDrawPix_t circlePts[MAX_FILLCIRCLE_POINTS][2];
-
- p0.x = XDRAWPIX2WINPIX(d,x-r);
- p0.y = YDRAWPIX2WINPIX(d,y+r);
- p1.x = XDRAWPIX2WINPIX(d,x+r);
- p1.y = YDRAWPIX2WINPIX(d,y-r);
-
- setDrawBrush( d, color, opts );
- Ellipse( d->hDc, p0.x, p0.y, p1.x, p1.y );
- if (d->hWnd) {
- rect.top = p0.y;
- rect.bottom = p1.y;
- rect.left = p0.x;
- rect.right = p1.x;
- myInvalidateRect( d, &rect );
- }
+ POINT p0, p1;
+ RECT rect;
+ static wDrawPix_t circlePts[MAX_FILLCIRCLE_POINTS][2];
+
+ p0.x = XDRAWPIX2WINPIX(d,x-r);
+ p0.y = YDRAWPIX2WINPIX(d,y+r);
+ p1.x = XDRAWPIX2WINPIX(d,x+r);
+ p1.y = YDRAWPIX2WINPIX(d,y-r);
+
+ setDrawBrush( d, color, opts );
+ Ellipse( d->hDc, p0.x, p0.y, p1.x, p1.y );
+ if (d->hWnd) {
+ rect.top = p0.y;
+ rect.bottom = p1.y;
+ rect.left = p0.x;
+ rect.right = p1.x;
+ myInvalidateRect( d, &rect );
+ }
}
/*
@@ -1271,124 +1309,124 @@ void wDrawFilledCircle(
void wDrawSaveImage(
- wDraw_p bd )
+ wDraw_p bd )
{
- if ( bd->hBmBackup ) {
- SelectObject( bd->hDcBackup, bd->hBmBackupOld );
- DeleteObject( bd->hBmBackup );
- bd->hBmBackup = (HBITMAP)0;
- }
- if ( bd->hDcBackup == (HDC)0 ) {
- bd->hDcBackup = CreateCompatibleDC( bd->hDc );
- }
- bd->hBmBackup = CreateCompatibleBitmap( bd->hDc, bd->w, bd->h );
- bd->hBmBackupOld = SelectObject( bd->hDcBackup, bd->hBmBackup );
- BitBlt( bd->hDcBackup, 0, 0, bd->w, bd->h, bd->hDc, 0, 0, SRCCOPY );
+ if ( bd->hBmBackup ) {
+ SelectObject( bd->hDcBackup, bd->hBmBackupOld );
+ DeleteObject( bd->hBmBackup );
+ bd->hBmBackup = (HBITMAP)0;
+ }
+ if ( bd->hDcBackup == (HDC)0 ) {
+ bd->hDcBackup = CreateCompatibleDC( bd->hDc );
+ }
+ bd->hBmBackup = CreateCompatibleBitmap( bd->hDc, bd->w, bd->h );
+ bd->hBmBackupOld = SelectObject( bd->hDcBackup, bd->hBmBackup );
+ BitBlt( bd->hDcBackup, 0, 0, bd->w, bd->h, bd->hDc, 0, 0, SRCCOPY );
}
void wDrawRestoreImage(
- wDraw_p bd )
+ wDraw_p bd )
{
- if ( bd->hBmBackup == (HBITMAP)0 ) {
- mswFail( "wDrawRestoreImage: hBmBackup == 0" );
- return;
- }
- BitBlt( bd->hDc, 0, 0, bd->w, bd->h, bd->hDcBackup, 0, 0, SRCCOPY );
- InvalidateRect( bd->hWnd, NULL, FALSE );
+ if ( bd->hBmBackup == (HBITMAP)0 ) {
+ mswFail( "wDrawRestoreImage: hBmBackup == 0" );
+ return;
+ }
+ BitBlt( bd->hDc, 0, 0, bd->w, bd->h, bd->hDcBackup, 0, 0, SRCCOPY );
+ InvalidateRect( bd->hWnd, NULL, FALSE );
}
void wDrawClearTemp( wDraw_p d )
{
- RECT rect;
- SelectObject( d->hDc, d->hBmTemp );
- BitBlt(d->hDc, 0, 0, d->w, d->h, d->hDc, 0, 0, WHITENESS);
- if (d->hWnd) {
- rect.top = 0;
- rect.bottom = d->h;
- rect.left = 0;
- rect.right = d->w;
- InvalidateRect( d->hWnd, &rect, FALSE );
- }
+ RECT rect;
+ SelectObject( d->hDc, d->hBmTemp );
+ BitBlt(d->hDc, 0, 0, d->w, d->h, d->hDc, 0, 0, WHITENESS);
+ if (d->hWnd) {
+ rect.top = 0;
+ rect.bottom = d->h;
+ rect.left = 0;
+ rect.right = d->w;
+ InvalidateRect( d->hWnd, &rect, FALSE );
+ }
}
void wDrawClear( wDraw_p d )
{
- SelectObject( d->hDc, d->hBmMain );
- // BitBlt is faster than Rectangle
- BitBlt(d->hDc, 0, 0, d->w, d->h, d->hDc, 0, 0, WHITENESS);
- wDrawClearTemp(d);
+ SelectObject( d->hDc, d->hBmMain );
+ // BitBlt is faster than Rectangle
+ BitBlt(d->hDc, 0, 0, d->w, d->h, d->hDc, 0, 0, WHITENESS);
+ wDrawClearTemp(d);
}
void wDrawSetSize(
- wDraw_p d,
- wWinPix_t width,
- wWinPix_t height, void * redraw)
+ wDraw_p d,
+ wWinPix_t width,
+ wWinPix_t height, void * redraw)
{
- d->w = width;
- d->h = height;
- if (!SetWindowPos( d->hWnd, HWND_TOP, 0, 0,
- d->w, d->h, SWP_NOMOVE|SWP_NOZORDER)) {
- mswFail("wDrawSetSize: SetWindowPos");
- }
- /*wRedraw( d );*/
+ d->w = width;
+ d->h = height;
+ if (!SetWindowPos( d->hWnd, HWND_TOP, 0, 0,
+ d->w, d->h, SWP_NOMOVE|SWP_NOZORDER)) {
+ mswFail("wDrawSetSize: SetWindowPos");
+ }
+ /*wRedraw( d );*/
}
void wDrawGetSize(
- wDraw_p d,
- wWinPix_t * width,
- wWinPix_t * height )
+ wDraw_p d,
+ wWinPix_t * width,
+ wWinPix_t * height )
{
- *width = d->w-2;
- *height = d->h-2;
+ *width = d->w-2;
+ *height = d->h-2;
}
void * wDrawGetContext( wDraw_p d )
{
- return d->data;
+ return d->data;
}
double wDrawGetDPI( wDraw_p d )
{
- return d->DPI;
+ return d->DPI;
}
double wDrawGetMaxRadius( wDraw_p d )
{
- return 4096.0;
+ return 4096.0;
}
void wDrawClip(
- wDraw_p d,
- wDrawPix_t x,
- wDrawPix_t y,
- wDrawPix_t w,
- wDrawPix_t h )
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h )
{
- wWinPix_t ix0, iy0, ix1, iy1;
- HRGN hRgnClip;
- ix0 = XDRAWPIX2WINPIX(d,x);
- iy0 = YDRAWPIX2WINPIX(d,y);
- ix1 = XDRAWPIX2WINPIX(d,x+w);
- iy1 = YDRAWPIX2WINPIX(d,y+h);
- /* Note: Ydim is upside down so iy1<iy0 */
- hRgnClip = CreateRectRgn( ix0, iy1, ix1, iy0 );
- SelectClipRgn( d->hDc, hRgnClip );
- DeleteObject( hRgnClip );
+ wWinPix_t ix0, iy0, ix1, iy1;
+ HRGN hRgnClip;
+ ix0 = XDRAWPIX2WINPIX(d,x);
+ iy0 = YDRAWPIX2WINPIX(d,y);
+ ix1 = XDRAWPIX2WINPIX(d,x+w);
+ iy1 = YDRAWPIX2WINPIX(d,y+h);
+ /* Note: Ydim is upside down so iy1<iy0 */
+ hRgnClip = CreateRectRgn( ix0, iy1, ix1, iy0 );
+ SelectClipRgn( d->hDc, hRgnClip );
+ DeleteObject( hRgnClip );
}
void wRedraw( wDraw_p d )
{
- wDrawClear( d );
- if (d->drawRepaint) {
- d->drawRepaint( d, d->data, 0, 0 );
- }
+ wDrawClear( d );
+ if (d->drawRepaint) {
+ d->drawRepaint( d, d->data, 0, 0 );
+ }
}
/*
@@ -1405,74 +1443,74 @@ static wCursor_t curCursor = wCursorNormal;
void DoSetCursor()
{
- switch (curCursor) {
- case wCursorNormal:
- default:
- SetCursor(LoadCursor(NULL, IDC_ARROW));
- break;
-
- case wCursorWait:
- SetCursor(LoadCursor(NULL, IDC_WAIT));
- break;
-
- case wCursorCross:
- SetCursor(LoadCursor(NULL, IDC_CROSS));
- break;
-
- case wCursorIBeam:
- SetCursor(LoadCursor(NULL, IDC_IBEAM));
- break;
-
- case wCursorQuestion:
- SetCursor(LoadCursor(NULL, IDC_HELP));
- break;
-
- case wCursorHand:
- SetCursor(LoadCursor(NULL, IDC_HAND));
- break;
-
- case wCursorNo:
- SetCursor(LoadCursor(NULL, IDC_NO));
- break;
-
- case wCursorSizeAll:
- SetCursor(LoadCursor(NULL, IDC_SIZEALL));
- break;
-
- case wCursorSizeNESW:
- SetCursor(LoadCursor(NULL, IDC_SIZENESW));
- break;
-
- case wCursorSizeNWSE:
- SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
- break;
-
- case wCursorSizeNS:
- SetCursor(LoadCursor(NULL, IDC_SIZENS));
- break;
-
- case wCursorSizeWE:
- SetCursor(LoadCursor(NULL, IDC_SIZEWE));
- break;
-
- case wCursorAppStart:
- SetCursor(LoadCursor(NULL, IDC_APPSTARTING));
- break;
-
- case wCursorNone:
- if (!dontHideCursor) {
- SetCursor(NULL);
- }
- break;
- }
+ switch (curCursor) {
+ case wCursorNormal:
+ default:
+ SetCursor(LoadCursor(NULL, IDC_ARROW));
+ break;
+
+ case wCursorWait:
+ SetCursor(LoadCursor(NULL, IDC_WAIT));
+ break;
+
+ case wCursorCross:
+ SetCursor(LoadCursor(NULL, IDC_CROSS));
+ break;
+
+ case wCursorIBeam:
+ SetCursor(LoadCursor(NULL, IDC_IBEAM));
+ break;
+
+ case wCursorQuestion:
+ SetCursor(LoadCursor(NULL, IDC_HELP));
+ break;
+
+ case wCursorHand:
+ SetCursor(LoadCursor(NULL, IDC_HAND));
+ break;
+
+ case wCursorNo:
+ SetCursor(LoadCursor(NULL, IDC_NO));
+ break;
+
+ case wCursorSizeAll:
+ SetCursor(LoadCursor(NULL, IDC_SIZEALL));
+ break;
+
+ case wCursorSizeNESW:
+ SetCursor(LoadCursor(NULL, IDC_SIZENESW));
+ break;
+
+ case wCursorSizeNWSE:
+ SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
+ break;
+
+ case wCursorSizeNS:
+ SetCursor(LoadCursor(NULL, IDC_SIZENS));
+ break;
+
+ case wCursorSizeWE:
+ SetCursor(LoadCursor(NULL, IDC_SIZEWE));
+ break;
+
+ case wCursorAppStart:
+ SetCursor(LoadCursor(NULL, IDC_APPSTARTING));
+ break;
+
+ case wCursorNone:
+ if (!dontHideCursor) {
+ SetCursor(NULL);
+ }
+ break;
+ }
}
void wSetCursor(wDraw_p win,
- wCursor_t cursor)
+ wCursor_t cursor)
{
- curCursor = cursor;
- DoSetCursor();
+ curCursor = cursor;
+ DoSetCursor();
}
@@ -1486,14 +1524,14 @@ void wSetCursor(wDraw_p win,
*/
struct wDrawBitMap_t {
- wDrawBitMap_p next;
- wDrawPix_t x;
- wDrawPix_t y;
- wDrawPix_t w;
- wDrawPix_t h;
- char * bmx;
- wDrawColor color;
- HBITMAP bm;
+ wDrawBitMap_p next;
+ wDrawPix_t x;
+ wDrawPix_t y;
+ wDrawPix_t w;
+ wDrawPix_t h;
+ char * bmx;
+ wDrawColor color;
+ HBITMAP bm;
};
static wDrawBitMap_p bmRoot = NULL;
@@ -1501,87 +1539,87 @@ extern wDrawColor drawColorWhite;
extern wDrawColor drawColorBlack;
void wDrawBitMap(
- wDraw_p d,
- wDrawBitMap_p bm,
- wDrawPix_t px,
- wDrawPix_t py,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawBitMap_p bm,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
- HDC bmDc;
- HBITMAP oldBm;
- DWORD mode;
- int x0, y0;
- RECT rect;
-
- x0 = XDRAWPIX2WINPIX(d,px-bm->x);
- y0 = YDRAWPIX2WINPIX(d,py-bm->y+bm->h);
+ HDC bmDc;
+ HBITMAP oldBm;
+ DWORD mode;
+ int x0, y0;
+ RECT rect;
+
+ x0 = XDRAWPIX2WINPIX(d,px-bm->x);
+ y0 = YDRAWPIX2WINPIX(d,py-bm->y+bm->h);
#ifdef LATER
- if ( noNegDrawArgs > 0 && ( x0 < 0 || y0 < 0 ) ) {
- return;
- }
+ if ( noNegDrawArgs > 0 && ( x0 < 0 || y0 < 0 ) ) {
+ return;
+ }
#endif
- if (dc == drawColorWhite) {
- mode = clrOp;
- dc = drawColorBlack;
- } else {
- mode = setOp;
- }
-
- if ( bm->color != dc ) {
- if ( bm->bm ) {
- DeleteObject( bm->bm );
- }
- bm->bm = mswCreateBitMap( mswGetColor(d->hasPalette,
- dc) /*colorPalette.palPalEntry[dc]*/, RGB( 255, 255, 255 ),
- RGB( 255, 255, 255 ), (wWinPix_t)bm->w, (wWinPix_t)bm->h, bm->bmx );
- bm->color = dc;
- }
-
- bmDc = CreateCompatibleDC( d->hDc );
- setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
- oldBm = SelectObject( bmDc, bm->bm );
- BitBlt( d->hDc, x0, y0, (wWinPix_t)bm->w, (wWinPix_t)bm->h, bmDc, 0, 0, mode );
- SelectObject( bmDc, oldBm );
- DeleteDC( bmDc );
- if (d->hWnd) {
- rect.top = y0-1;
- rect.bottom = rect.top+ (wWinPix_t)bm->h+1;
- rect.left = x0-1;
- rect.right = rect.left+ (wWinPix_t)bm->w+1;
- myInvalidateRect( d, &rect );
- }
+ if (dc == drawColorWhite) {
+ mode = clrOp;
+ dc = drawColorBlack;
+ } else {
+ mode = setOp;
+ }
+
+ if ( bm->color != dc ) {
+ if ( bm->bm ) {
+ DeleteObject( bm->bm );
+ }
+ bm->bm = mswCreateBitMap( mswGetColor(d->hasPalette,
+ dc) /*colorPalette.palPalEntry[dc]*/, RGB(255, 255, 255),
+ RGB( 255, 255, 255 ), (wWinPix_t)bm->w, (wWinPix_t)bm->h, bm->bmx );
+ bm->color = dc;
+ }
+
+ bmDc = CreateCompatibleDC( d->hDc );
+ setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
+ oldBm = SelectObject( bmDc, bm->bm );
+ BitBlt( d->hDc, x0, y0, (wWinPix_t)bm->w, (wWinPix_t)bm->h, bmDc, 0, 0, mode );
+ SelectObject( bmDc, oldBm );
+ DeleteDC( bmDc );
+ if (d->hWnd) {
+ rect.top = y0-1;
+ rect.bottom = rect.top+ (wWinPix_t)bm->h+1;
+ rect.left = x0-1;
+ rect.right = rect.left+ (wWinPix_t)bm->w+1;
+ myInvalidateRect( d, &rect );
+ }
}
wDrawBitMap_p wDrawBitMapCreate(
- wDraw_p d,
- int w,
- int h,
- int x,
- int y,
- const unsigned char * bits )
+ wDraw_p d,
+ int w,
+ int h,
+ int x,
+ int y,
+ const unsigned char * bits )
{
- wDrawBitMap_p bm;
- int bmSize = ((w+7)/8) * h;
- bm = (wDrawBitMap_p)malloc( sizeof *bm );
- if (bmRoot == NULL) {
- bmRoot = bm;
- bm->next = NULL;
- } else {
- bm->next = bmRoot;
- bmRoot = bm;
- }
- bm->x = x;
- bm->y = y;
- bm->w = w;
- bm->h = h;
- bm->bmx = malloc( bmSize );
- bm->bm = (HBITMAP)0;
- bm->color = -1;
- memcpy( bm->bmx, bits, bmSize );
- /*bm->bm = mswCreateBitMap( GetSysColor(COLOR_BTNTEXT), RGB( 255, 255, 255 ), w, h, bits );*/
- return bm;
+ wDrawBitMap_p bm;
+ int bmSize = ((w+7)/8) * h;
+ bm = (wDrawBitMap_p)malloc( sizeof *bm );
+ if (bmRoot == NULL) {
+ bmRoot = bm;
+ bm->next = NULL;
+ } else {
+ bm->next = bmRoot;
+ bmRoot = bm;
+ }
+ bm->x = x;
+ bm->y = y;
+ bm->w = w;
+ bm->h = h;
+ bm->bmx = malloc( bmSize );
+ bm->bm = (HBITMAP)0;
+ bm->color = -1;
+ memcpy( bm->bmx, bits, bmSize );
+ /*bm->bm = mswCreateBitMap( GetSysColor(COLOR_BTNTEXT), RGB( 255, 255, 255 ), w, h, bits );*/
+ return bm;
}
/*
@@ -1595,348 +1633,394 @@ wDrawBitMap_p wDrawBitMapCreate(
static int doSetFocus = 1;
LRESULT FAR PASCAL XEXPORT mswDrawPush(
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
- wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
- wDraw_p b;
- wWinPix_t ix, iy;
- wDrawPix_t x, y;
- HDC hDc;
- PAINTSTRUCT ps;
- wAction_t action;
- RECT rect;
- HWND activeWnd;
- HWND focusWnd;
- wAccelKey_e extChar;
-
- switch( message ) {
- case WM_CREATE:
- b = (wDraw_p)mswMapIndex( inx );
- hDc = GetDC(hWnd);
- if ( b->option & BD_DIRECT ) {
- b->hDc = hDc;
- b->hBmMain = 0;
- b->hBmTemp = 0;
- b->hBmOld = 0;
- } else {
- b->hDc = CreateCompatibleDC( hDc );
- b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
- b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
- b->hBmOld = SelectObject( b->hDc, b->hBmMain );
- }
- if (mswPalette) {
- SelectPalette( b->hDc, mswPalette, 0 );
- RealizePalette( b->hDc );
- }
- b->wFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSX );
- b->hFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSY );
- double dpi;
- /** @prefs [Preference] ScreenDPI=96.0 Sets DPI of screen */
- wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
- b->DPI = dpi;
- b->hWnd = hWnd;
- SetROP2( b->hDc, R2_WHITE );
- Rectangle( b->hDc, 0, 0, b->w, b->h );
- if ( (b->option & BD_DIRECT) == 0 ) {
- SetROP2( hDc, R2_WHITE );
- Rectangle( hDc, 0, 0, b->w, b->h );
- ReleaseDC( hWnd, hDc );
- }
- break;
- case WM_SIZE:
- b = (wDraw_p)mswMapIndex( inx );
- ix = LOWORD( lParam );
- iy = HIWORD( lParam );
- b->w = ix+2;
- b->h = iy+2;
- if (b->hWnd) {
- if ( b->option & BD_DIRECT ) {
- } else {
- hDc = GetDC( b->hWnd );
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
+ wDraw_p b;
+ wWinPix_t ix, iy;
+ wDrawPix_t x, y;
+ HDC hDc;
+ PAINTSTRUCT ps;
+ wAction_t action;
+ RECT rect;
+ HWND activeWnd;
+ HWND focusWnd;
+ wAccelKey_e extChar;
+
+ switch( message ) {
+ case WM_CREATE:
+ b = (wDraw_p)mswMapIndex( inx );
+ hDc = GetDC(hWnd);
+ if ( b->option & BD_DIRECT ) {
+ b->hDc = hDc;
+ b->hBmMain = 0;
+ b->hBmTemp = 0;
+ b->hBmOld = 0;
+ } else {
+ b->hDc = CreateCompatibleDC( hDc );
+ b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
+ b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
+ b->hBmOld = SelectObject( b->hDc, b->hBmMain );
+ }
+ if (mswPalette) {
+ SelectPalette( b->hDc, mswPalette, 0 );
+ RealizePalette( b->hDc );
+ }
+ b->wFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSX );
+ b->hFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSY );
+ double dpi;
+ /** @prefs [Preference] ScreenDPI=96.0 Sets DPI of screen */
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+ b->DPI = dpi;
+ b->hWnd = hWnd;
+ SetROP2( b->hDc, R2_WHITE );
+ Rectangle( b->hDc, 0, 0, b->w, b->h );
+ if ( (b->option & BD_DIRECT) == 0 ) {
+ SetROP2( hDc, R2_WHITE );
+ Rectangle( hDc, 0, 0, b->w, b->h );
+ ReleaseDC( hWnd, hDc );
+ }
+ break;
+ case WM_SIZE:
+ b = (wDraw_p)mswMapIndex( inx );
+ ix = LOWORD( lParam );
+ iy = HIWORD( lParam );
+ b->w = ix+2;
+ b->h = iy+2;
+ if (b->hWnd) {
+ if ( b->option & BD_DIRECT ) {
+ } else {
+ hDc = GetDC( b->hWnd );
//- DeleteObject( b->hBmOld );
- DeleteObject( b->hBmMain );
- DeleteObject( b->hBmTemp );
- b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
- b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
+ DeleteObject( b->hBmMain );
+ DeleteObject( b->hBmTemp );
+ b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
+ b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
//- b->hBmOld = SelectObject( b->hDc, b->hBmMain );
- ReleaseDC( b->hWnd, hDc );
- SetROP2( b->hDc, R2_WHITE );
- Rectangle( b->hDc, 0, 0, b->w, b->h );
- }
- }
- /*if (b->drawResize)
- b->drawResize( b, b->size );*/
- if (b->drawRepaint) {
- b->drawRepaint( b, b->data, 0, 0 );
- }
- return (LRESULT)0;
- case WM_MOUSEMOVE:
- activeWnd = GetActiveWindow();
- focusWnd = GetFocus();
- if (focusWnd != hWnd) {
- b = (wDraw_p)mswMapIndex( inx );
- if (!b) {
- break;
- }
- if ( !((wControl_p)b->parent) ) {
- break;
- }
- if ( ((wControl_p)b->parent)->hWnd != activeWnd ) {
- break;
- }
- }
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_RBUTTONDOWN:
- case WM_RBUTTONUP:
- case WM_LBUTTONDBLCLK:
- case WM_MBUTTONUP:
- case WM_MBUTTONDOWN:
- if (message == WM_LBUTTONDOWN) {
- action = wActionLDown;
- } else if (message == WM_RBUTTONDOWN) {
- action = wActionRDown;
- } else if (message == WM_LBUTTONUP) {
- action = wActionLUp;
- } else if (message == WM_RBUTTONUP) {
- action = wActionRUp;
- } else if (message == WM_MBUTTONUP) {
- action = wActionMUp;
- } else if (message == WM_MBUTTONDOWN) {
- action = wActionMDown;
- } else if (message == WM_LBUTTONDBLCLK) {
- action = wActionLDownDouble;
- } else {
- if ( (wParam & MK_LBUTTON) != 0) {
- action = wActionLDrag;
- } else if ( (wParam & MK_RBUTTON) != 0) {
- action = wActionRDrag;
- } else if ( (wParam & MK_MBUTTON) != 0) {
- action = wActionMDrag;
- } else {
- action = wActionMove;
- }
- }
- b = (wDraw_p)mswMapIndex( inx );
- if (!b) {
- break;
- }
- if (doSetFocus && message != WM_MOUSEMOVE) {
- SetFocus( ((wControl_p)b->parent)->hWnd );
- }
- if ( (b->option&BD_NOCAPTURE) == 0 ) {
- if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN) {
- SetCapture( b->hWnd );
- } else if (message == WM_LBUTTONUP || message == WM_RBUTTONUP) {
- ReleaseCapture();
- }
- }
- ix = LOWORD( lParam );
- iy = HIWORD( lParam );
- x = XWINPIX2DRAWPIX( b, ix );
- y = YWINPIX2DRAWPIX( b, iy );
- b->lastX = x;
- b->lastY = y;
- if (b->action) {
- b->action( b, b->data, action, x, y );
- }
- if (b->hWnd) {
- UpdateWindow(b->hWnd);
- }
- return (LRESULT)0;
- case WM_CHAR:
- b = (wDraw_p)mswMapIndex( inx );
- extChar = wAccelKey_None;
- if (lParam & 0x01000000L)
- switch( wParam ) {
- case VK_DELETE: extChar = wAccelKey_Del; break;
- case VK_INSERT: extChar = wAccelKey_Ins; break;
- case VK_HOME: extChar = wAccelKey_Home; break;
- case VK_END: extChar = wAccelKey_End; break;
- case VK_PRIOR: extChar = wAccelKey_Pgup; break;
- case VK_NEXT: extChar = wAccelKey_Pgdn; break;
- case VK_UP: extChar = wAccelKey_Up; break;
- case VK_DOWN: extChar = wAccelKey_Down; break;
- case VK_RIGHT: extChar = wAccelKey_Right; break;
- case VK_LEFT: extChar = wAccelKey_Left; break;
- case VK_BACK: extChar = wAccelKey_Back; break;
- case VK_F1: extChar = wAccelKey_F1; break;
- case VK_F2: extChar = wAccelKey_F2; break;
- case VK_F3: extChar = wAccelKey_F3; break;
- case VK_F4: extChar = wAccelKey_F4; break;
- case VK_F5: extChar = wAccelKey_F5; break;
- case VK_F6: extChar = wAccelKey_F6; break;
- case VK_F7: extChar = wAccelKey_F7; break;
- case VK_F8: extChar = wAccelKey_F8; break;
- case VK_F9: extChar = wAccelKey_F9; break;
- case VK_F10: extChar = wAccelKey_F10; break;
- case VK_F11: extChar = wAccelKey_F11; break;
- case VK_F12: extChar = wAccelKey_F12; break;
- }
- if (b && b->action) {
- if (extChar != wAccelKey_None) {
- b->action( b, b->data, wActionExtKey + ( (int)extChar << 8 ), b->lastX,
- b->lastY );
- } else {
- b->action( b, b->data, wActionText + ( (int)wParam << 8 ), b->lastX,
- b->lastY );
- }
- }
- return (LRESULT)0;
-
- case WM_PAINT:
- b = (wDraw_p)mswMapIndex( inx );
- if (b && b->type == B_DRAW) {
- if (GetUpdateRect( b->hWnd, &rect, FALSE )) {
- hDc = BeginPaint( hWnd, &ps );
- if ( b->hasPalette ) {
- int winPaletteClock = mswGetPaletteClock();
- if ( b->paletteClock < winPaletteClock ) {
- RealizePalette( hDc );
- b->paletteClock = winPaletteClock;
- }
- }
- HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
-
- if (bDrawMainBM) {
- BitBlt(hDc, rect.left, rect.top,
- rect.right - rect.left, rect.bottom - rect.top,
- b->hDc, rect.left, rect.top,
- SRCCOPY);
- }
- SelectObject( b->hDc, b->bCopiedMain?b->hBmTemp:b->hBmMain );
- BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- bDrawMainBM?SRCAND:SRCCOPY);
- SelectObject( b->hDc, hBmOld );
- EndPaint( hWnd, &ps );
- b->bCopiedMain = FALSE;
- }
- }
- break;
- case WM_DESTROY:
- b = (wDraw_p)mswMapIndex( inx );
- if (b && b->type == B_DRAW) {
- if (b->hDc) {
- DeleteDC( b->hDc );
- b->hDc = (HDC)0;
- }
- if (b->hDcBackup) {
- DeleteDC( b->hDcBackup );
- b->hDcBackup = (HDC)0;
- }
- }
- break;
-
- case WM_SETCURSOR:
- // Set cursor based on wSetCursor
- DoSetCursor();
- // return TRUE to suppress my parent from overriding me
- return TRUE;
-
- default:
- break;
- }
- return DefWindowProc( hWnd, message, wParam, lParam );
+ ReleaseDC( b->hWnd, hDc );
+ SetROP2( b->hDc, R2_WHITE );
+ Rectangle( b->hDc, 0, 0, b->w, b->h );
+ }
+ }
+ /*if (b->drawResize)
+ b->drawResize( b, b->size );*/
+ if (b->drawRepaint) {
+ b->drawRepaint( b, b->data, 0, 0 );
+ }
+ return (LRESULT)0;
+ case WM_MOUSEMOVE:
+ activeWnd = GetActiveWindow();
+ focusWnd = GetFocus();
+ if (focusWnd != hWnd) {
+ b = (wDraw_p)mswMapIndex( inx );
+ if (!b) {
+ break;
+ }
+ if ( !((wControl_p)b->parent) ) {
+ break;
+ }
+ if ( ((wControl_p)b->parent)->hWnd != activeWnd ) {
+ break;
+ }
+ }
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ case WM_LBUTTONDBLCLK:
+ case WM_MBUTTONUP:
+ case WM_MBUTTONDOWN:
+ if (message == WM_LBUTTONDOWN) {
+ action = wActionLDown;
+ } else if (message == WM_RBUTTONDOWN) {
+ action = wActionRDown;
+ } else if (message == WM_LBUTTONUP) {
+ action = wActionLUp;
+ } else if (message == WM_RBUTTONUP) {
+ action = wActionRUp;
+ } else if (message == WM_MBUTTONUP) {
+ action = wActionMUp;
+ } else if (message == WM_MBUTTONDOWN) {
+ action = wActionMDown;
+ } else if (message == WM_LBUTTONDBLCLK) {
+ action = wActionLDownDouble;
+ } else {
+ if ( (wParam & MK_LBUTTON) != 0) {
+ action = wActionLDrag;
+ } else if ( (wParam & MK_RBUTTON) != 0) {
+ action = wActionRDrag;
+ } else if ( (wParam & MK_MBUTTON) != 0) {
+ action = wActionMDrag;
+ } else {
+ action = wActionMove;
+ }
+ }
+ b = (wDraw_p)mswMapIndex( inx );
+ if (!b) {
+ break;
+ }
+ if (doSetFocus && message != WM_MOUSEMOVE) {
+ SetFocus( ((wControl_p)b->parent)->hWnd );
+ }
+ if ( (b->option&BD_NOCAPTURE) == 0 ) {
+ if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN) {
+ SetCapture( b->hWnd );
+ } else if (message == WM_LBUTTONUP || message == WM_RBUTTONUP) {
+ ReleaseCapture();
+ }
+ }
+ ix = LOWORD( lParam );
+ iy = HIWORD( lParam );
+ x = XWINPIX2DRAWPIX( b, ix );
+ y = YWINPIX2DRAWPIX( b, iy );
+ b->lastX = x;
+ b->lastY = y;
+ if (b->action) {
+ b->action( b, b->data, action, x, y );
+ }
+ if (b->hWnd) {
+ UpdateWindow(b->hWnd);
+ }
+ return (LRESULT)0;
+ case WM_CHAR:
+ b = (wDraw_p)mswMapIndex( inx );
+ extChar = wAccelKey_None;
+ if (lParam & 0x01000000L)
+ switch( wParam ) {
+ case VK_DELETE:
+ extChar = wAccelKey_Del;
+ break;
+ case VK_INSERT:
+ extChar = wAccelKey_Ins;
+ break;
+ case VK_HOME:
+ extChar = wAccelKey_Home;
+ break;
+ case VK_END:
+ extChar = wAccelKey_End;
+ break;
+ case VK_PRIOR:
+ extChar = wAccelKey_Pgup;
+ break;
+ case VK_NEXT:
+ extChar = wAccelKey_Pgdn;
+ break;
+ case VK_UP:
+ extChar = wAccelKey_Up;
+ break;
+ case VK_DOWN:
+ extChar = wAccelKey_Down;
+ break;
+ case VK_RIGHT:
+ extChar = wAccelKey_Right;
+ break;
+ case VK_LEFT:
+ extChar = wAccelKey_Left;
+ break;
+ case VK_BACK:
+ extChar = wAccelKey_Back;
+ break;
+ case VK_F1:
+ extChar = wAccelKey_F1;
+ break;
+ case VK_F2:
+ extChar = wAccelKey_F2;
+ break;
+ case VK_F3:
+ extChar = wAccelKey_F3;
+ break;
+ case VK_F4:
+ extChar = wAccelKey_F4;
+ break;
+ case VK_F5:
+ extChar = wAccelKey_F5;
+ break;
+ case VK_F6:
+ extChar = wAccelKey_F6;
+ break;
+ case VK_F7:
+ extChar = wAccelKey_F7;
+ break;
+ case VK_F8:
+ extChar = wAccelKey_F8;
+ break;
+ case VK_F9:
+ extChar = wAccelKey_F9;
+ break;
+ case VK_F10:
+ extChar = wAccelKey_F10;
+ break;
+ case VK_F11:
+ extChar = wAccelKey_F11;
+ break;
+ case VK_F12:
+ extChar = wAccelKey_F12;
+ break;
+ }
+ if (b && b->action) {
+ if (extChar != wAccelKey_None) {
+ b->action( b, b->data, wActionExtKey + ( (int)extChar << 8 ), b->lastX,
+ b->lastY );
+ } else {
+ b->action( b, b->data, wActionText + ( (int)wParam << 8 ), b->lastX,
+ b->lastY );
+ }
+ }
+ return (LRESULT)0;
+
+ case WM_PAINT:
+ b = (wDraw_p)mswMapIndex( inx );
+ if (b && b->type == B_DRAW) {
+ if (GetUpdateRect( b->hWnd, &rect, FALSE )) {
+ hDc = BeginPaint( hWnd, &ps );
+ if ( b->hasPalette ) {
+ int winPaletteClock = mswGetPaletteClock();
+ if ( b->paletteClock < winPaletteClock ) {
+ RealizePalette( hDc );
+ b->paletteClock = winPaletteClock;
+ }
+ }
+ HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
+
+ if (bDrawMainBM) {
+ BitBlt(hDc, rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCCOPY);
+ }
+ SelectObject( b->hDc, b->bCopiedMain?b->hBmTemp:b->hBmMain );
+ BitBlt( hDc, rect.left, rect.top,
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ bDrawMainBM?SRCAND:SRCCOPY);
+ SelectObject( b->hDc, hBmOld );
+ EndPaint( hWnd, &ps );
+ b->bCopiedMain = FALSE;
+ }
+ }
+ break;
+ case WM_DESTROY:
+ b = (wDraw_p)mswMapIndex( inx );
+ if (b && b->type == B_DRAW) {
+ if (b->hDc) {
+ DeleteDC( b->hDc );
+ b->hDc = (HDC)0;
+ }
+ if (b->hDcBackup) {
+ DeleteDC( b->hDcBackup );
+ b->hDcBackup = (HDC)0;
+ }
+ }
+ break;
+
+ case WM_SETCURSOR:
+ // Set cursor based on wSetCursor
+ DoSetCursor();
+ // return TRUE to suppress my parent from overriding me
+ return TRUE;
+
+ default:
+ break;
+ }
+ return DefWindowProc( hWnd, message, wParam, lParam );
}
static LRESULT drawMsgProc( wDraw_p b, HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam )
{
- wAction_t action;
-
- switch( message ) {
- case WM_MOUSEWHEEL:
- /* handle mouse wheel events */
- if (GET_KEYSTATE_WPARAM(wParam) & (MK_SHIFT|MK_MBUTTON) ) {
- if (GET_KEYSTATE_WPARAM(wParam) & MK_CONTROL ) {
- if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
- action = wActionScrollLeft;
- } else {
- action = wActionScrollRight;
- }
- } else {
- if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
- action = wActionScrollUp;
- } else {
- action = wActionScrollDown;
- }
- }
- } else {
- if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
- action = wActionWheelUp;
- } else {
- action = wActionWheelDown;
- }
- }
- if (b->action) {
- b->action( b, b->data, action, b->lastX, b->lastY );
- }
- return (LRESULT)0;
- case WM_MOUSEHWHEEL:
- if ( GET_KEYSTATE_WPARAM(wParam) & (MK_SHIFT|MK_MBUTTON)) {
- if ( GET_WHEEL_DELTA_WPARAM(wParam) > 0 ) {
- action = wActionScrollRight;
- } else {
- action = wActionScrollLeft;
- }
- }
- if (b->action) {
- b->action( b, b->data, action, b->lastX, b->lastY );
- }
- return (LRESULT)0;
- }
-
- return DefWindowProc( hWnd, message, wParam, lParam );
+ wAction_t action;
+
+ switch( message ) {
+ case WM_MOUSEWHEEL:
+ /* handle mouse wheel events */
+ if (GET_KEYSTATE_WPARAM(wParam) & (MK_SHIFT|MK_MBUTTON) ) {
+ if (GET_KEYSTATE_WPARAM(wParam) & MK_CONTROL ) {
+ if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
+ action = wActionScrollLeft;
+ } else {
+ action = wActionScrollRight;
+ }
+ } else {
+ if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
+ action = wActionScrollUp;
+ } else {
+ action = wActionScrollDown;
+ }
+ }
+ } else {
+ if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) {
+ action = wActionWheelUp;
+ } else {
+ action = wActionWheelDown;
+ }
+ }
+ if (b->action) {
+ b->action( b, b->data, action, b->lastX, b->lastY );
+ }
+ return (LRESULT)0;
+ case WM_MOUSEHWHEEL:
+ if ( GET_KEYSTATE_WPARAM(wParam) & (MK_SHIFT|MK_MBUTTON)) {
+ if ( GET_WHEEL_DELTA_WPARAM(wParam) > 0 ) {
+ action = wActionScrollRight;
+ } else {
+ action = wActionScrollLeft;
+ }
+ }
+ if (b->action) {
+ b->action( b, b->data, action, b->lastX, b->lastY );
+ }
+ return (LRESULT)0;
+ }
+
+ return DefWindowProc( hWnd, message, wParam, lParam );
}
static void drawDoneProc( wControl_p b )
{
- wDraw_p d = (wDraw_p)b;
- if (d->hBmMain) {
- SelectObject( d->hDc, d->hBmOld );
- DeleteObject( d->hBmMain );
- d->hBmMain = (HBITMAP)0;
- DeleteObject( d->hBmTemp );
- d->hBmTemp = (HBITMAP)0;
- }
- if (d->hPen) {
- SelectObject( d->hDc, GetStockObject( BLACK_PEN ) );
- DeleteObject( d->hPen );
- d->hPen = (HPEN)0;
- }
- if (d->hBrush) {
- SelectObject( d->hDc, GetStockObject( BLACK_BRUSH) );
- DeleteObject( d->hBrush );
- d->hBrush = (HBRUSH)0;
- }
- if (d->hDc) {
- DeleteDC( d->hDc );
- d->hDc = (HDC)0;
- }
- if ( d->hDcBackup ) {
- DeleteDC( d->hDcBackup );
- d->hDcBackup = (HDC)0;
- }
- while (bmRoot) {
- if (bmRoot->bm) {
- DeleteObject( bmRoot->bm );
- }
- bmRoot = bmRoot->next;
- }
+ wDraw_p d = (wDraw_p)b;
+ if (d->hBmMain) {
+ SelectObject( d->hDc, d->hBmOld );
+ DeleteObject( d->hBmMain );
+ d->hBmMain = (HBITMAP)0;
+ DeleteObject( d->hBmTemp );
+ d->hBmTemp = (HBITMAP)0;
+ }
+ if (d->hPen) {
+ SelectObject( d->hDc, GetStockObject( BLACK_PEN ) );
+ DeleteObject( d->hPen );
+ d->hPen = (HPEN)0;
+ }
+ if (d->hBrush) {
+ SelectObject( d->hDc, GetStockObject( BLACK_BRUSH) );
+ DeleteObject( d->hBrush );
+ d->hBrush = (HBRUSH)0;
+ }
+ if (d->hDc) {
+ DeleteDC( d->hDc );
+ d->hDc = (HDC)0;
+ }
+ if ( d->hDcBackup ) {
+ DeleteDC( d->hDcBackup );
+ d->hDcBackup = (HDC)0;
+ }
+ while (bmRoot) {
+ if (bmRoot->bm) {
+ DeleteObject( bmRoot->bm );
+ }
+ bmRoot = bmRoot->next;
+ }
}
static callBacks_t drawCallBacks = {
- NULL,
- drawDoneProc,
- (messageCallback_p)drawMsgProc
+ NULL,
+ drawDoneProc,
+ (messageCallback_p)drawMsgProc
};
static wDraw_p drawList = NULL;
@@ -1944,97 +2028,97 @@ static wDraw_p drawList = NULL;
void mswRedrawAll( void )
{
- wDraw_p p;
- for ( p=drawList; p; p=p->drawNext ) {
- if (p->drawRepaint) {
- p->drawRepaint( p, p->data, 0, 0 );
- }
- }
+ wDraw_p p;
+ for ( p=drawList; p; p=p->drawNext ) {
+ if (p->drawRepaint) {
+ p->drawRepaint( p, p->data, 0, 0 );
+ }
+ }
}
void mswRepaintAll( void )
{
- wDraw_p b;
- HDC hDc;
- RECT rect;
- PAINTSTRUCT ps;
-
- for ( b=drawList; b; b=b->drawNext ) {
- if (GetUpdateRect( b->hWnd, &rect, FALSE )) {
- hDc = BeginPaint( b->hWnd, &ps );
- HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
- BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- SRCCOPY );
- SelectObject( b->hDc, b->hBmTemp );
- BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- SRCAND );
- SelectObject( b->hDc, hBmOld );
- EndPaint( b->hWnd, &ps );
- }
- }
+ wDraw_p b;
+ HDC hDc;
+ RECT rect;
+ PAINTSTRUCT ps;
+
+ for ( b=drawList; b; b=b->drawNext ) {
+ if (GetUpdateRect( b->hWnd, &rect, FALSE )) {
+ hDc = BeginPaint( b->hWnd, &ps );
+ HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
+ BitBlt( hDc, rect.left, rect.top,
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCCOPY );
+ SelectObject( b->hDc, b->hBmTemp );
+ BitBlt( hDc, rect.left, rect.top,
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCAND );
+ SelectObject( b->hDc, hBmOld );
+ EndPaint( b->hWnd, &ps );
+ }
+ }
}
wDraw_p wDrawCreate(
- wWin_p parent,
- wWinPix_t x,
- wWinPix_t y,
- const char * helpStr,
- long option,
- wWinPix_t w,
- wWinPix_t h,
- void * data,
- wDrawRedrawCallBack_p redrawProc,
- wDrawActionCallBack_p action )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ long option,
+ wWinPix_t w,
+ wWinPix_t h,
+ void * data,
+ wDrawRedrawCallBack_p redrawProc,
+ wDrawActionCallBack_p action )
{
- wDraw_p d;
- RECT rect;
- int index;
- HDC hDc;
-
- d = mswAlloc( parent, B_DRAW, NULL, sizeof *d, data, &index );
- mswComputePos( (wControl_p)d, x, y );
- d->w = w;
- d->h = h;
- d->drawRepaint = NULL;
- d->action = action;
- d->option = option;
-
- d->hWnd = CreateWindow( mswDrawWindowClassName, NULL,
- WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER,
- d->x, d->y, w, h,
- ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
-
- if (d->hWnd == (HWND)0) {
- mswFail( "CreateWindow(DRAW)" );
- return d;
- }
-
- GetWindowRect( d->hWnd, &rect );
-
- d->w = rect.right - rect.left;
- d->h = rect.bottom - rect.top;
- d->drawRepaint = redrawProc;
- /*if (d->drawRepaint)
- d->drawRepaint( d, d->data, 0.0, 0.0 );*/
-
- mswAddButton( (wControl_p)d, FALSE, helpStr );
- mswCallBacks[B_DRAW] = &drawCallBacks;
- d->drawNext = drawList;
- drawList = d;
- if (mswPalette) {
- hDc = GetDC( d->hWnd );
- d->hasPalette = TRUE;
- SelectPalette( hDc, mswPalette, 0 );
- ReleaseDC( d->hWnd, hDc );
- }
- d->bCopiedMain = FALSE;
- return d;
+ wDraw_p d;
+ RECT rect;
+ int index;
+ HDC hDc;
+
+ d = mswAlloc( parent, B_DRAW, NULL, sizeof *d, data, &index );
+ mswComputePos( (wControl_p)d, x, y );
+ d->w = w;
+ d->h = h;
+ d->drawRepaint = NULL;
+ d->action = action;
+ d->option = option;
+
+ d->hWnd = CreateWindow( mswDrawWindowClassName, NULL,
+ WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER,
+ d->x, d->y, w, h,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
+
+ if (d->hWnd == (HWND)0) {
+ mswFail( "CreateWindow(DRAW)" );
+ return d;
+ }
+
+ GetWindowRect( d->hWnd, &rect );
+
+ d->w = rect.right - rect.left;
+ d->h = rect.bottom - rect.top;
+ d->drawRepaint = redrawProc;
+ /*if (d->drawRepaint)
+ d->drawRepaint( d, d->data, 0.0, 0.0 );*/
+
+ mswAddButton( (wControl_p)d, FALSE, helpStr );
+ mswCallBacks[B_DRAW] = &drawCallBacks;
+ d->drawNext = drawList;
+ drawList = d;
+ if (mswPalette) {
+ hDc = GetDC( d->hWnd );
+ d->hasPalette = TRUE;
+ SelectPalette( hDc, mswPalette, 0 );
+ ReleaseDC( d->hWnd, hDc );
+ }
+ d->bCopiedMain = FALSE;
+ return d;
}
/*
@@ -2047,75 +2131,75 @@ wDraw_p wDrawCreate(
wDraw_p wBitMapCreate( wWinPix_t w, wWinPix_t h, int planes )
{
- wDraw_p d;
- HDC hDc;
-
- d = (wDraw_p)calloc(1,sizeof *d);
- d->type = B_DRAW;
- d->shown = TRUE;
- d->x = 0;
- d->y = 0;
- d->w = w;
- d->h = h;
- d->drawRepaint = NULL;
- d->action = NULL;
- d->option = 0;
-
- hDc = GetDC(mswHWnd);
- d->hDc = CreateCompatibleDC( hDc );
- if ( d->hDc == (HDC)0 ) {
- wNoticeEx( NT_ERROR, "CreateBitMap: CreateDC fails", "Ok", NULL );
- return FALSE;
- }
- d->hBmMain = CreateCompatibleBitmap( hDc, d->w, d->h );
- if ( d->hBmMain == (HBITMAP)0 ) {
- wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Main fails", "Ok", NULL );
- ReleaseDC(mswHWnd, hDc);
- return FALSE;
- }
- d->hBmTemp = CreateCompatibleBitmap( hDc, d->w, d->h );
- if ( d->hBmTemp == (HBITMAP)0 ) {
- wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Temp fails", "Ok", NULL );
- ReleaseDC(mswHWnd, hDc);
- return FALSE;
- }
- d->hasPalette = (GetDeviceCaps(hDc,RASTERCAPS ) & RC_PALETTE) != 0;
- ReleaseDC( mswHWnd, hDc );
- d->hBmOld = SelectObject( d->hDc, d->hBmMain );
- if (mswPalette) {
- SelectPalette( d->hDc, mswPalette, 0 );
- RealizePalette( d->hDc );
- }
- d->wFactor = (double)GetDeviceCaps( d->hDc, LOGPIXELSX );
- d->hFactor = (double)GetDeviceCaps( d->hDc, LOGPIXELSY );
- d->DPI = 96.0; /*min( d->wFactor, d->hFactor );*/
- d->hWnd = 0;
- wDrawClear(d);
+ wDraw_p d;
+ HDC hDc;
+
+ d = (wDraw_p)calloc(1,sizeof *d);
+ d->type = B_DRAW;
+ d->shown = TRUE;
+ d->x = 0;
+ d->y = 0;
+ d->w = w;
+ d->h = h;
+ d->drawRepaint = NULL;
+ d->action = NULL;
+ d->option = 0;
+
+ hDc = GetDC(mswHWnd);
+ d->hDc = CreateCompatibleDC( hDc );
+ if ( d->hDc == (HDC)0 ) {
+ wNoticeEx( NT_ERROR, "CreateBitMap: CreateDC fails", "Ok", NULL );
+ return FALSE;
+ }
+ d->hBmMain = CreateCompatibleBitmap( hDc, d->w, d->h );
+ if ( d->hBmMain == (HBITMAP)0 ) {
+ wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Main fails", "Ok", NULL );
+ ReleaseDC(mswHWnd, hDc);
+ return FALSE;
+ }
+ d->hBmTemp = CreateCompatibleBitmap( hDc, d->w, d->h );
+ if ( d->hBmTemp == (HBITMAP)0 ) {
+ wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Temp fails", "Ok", NULL );
+ ReleaseDC(mswHWnd, hDc);
+ return FALSE;
+ }
+ d->hasPalette = (GetDeviceCaps(hDc,RASTERCAPS ) & RC_PALETTE) != 0;
+ ReleaseDC( mswHWnd, hDc );
+ d->hBmOld = SelectObject( d->hDc, d->hBmMain );
+ if (mswPalette) {
+ SelectPalette( d->hDc, mswPalette, 0 );
+ RealizePalette( d->hDc );
+ }
+ d->wFactor = (double)GetDeviceCaps( d->hDc, LOGPIXELSX );
+ d->hFactor = (double)GetDeviceCaps( d->hDc, LOGPIXELSY );
+ d->DPI = 96.0; /*min( d->wFactor, d->hFactor );*/
+ d->hWnd = 0;
+ wDrawClear(d);
//- SetROP2( d->hDc, R2_WHITE );
//- Rectangle( d->hDc, 0, 0, d->w, d->h );
- return d;
+ return d;
}
wBool_t wBitMapDelete( wDraw_p d )
{
- if (d->hPen) {
- SelectObject( d->hDc, GetStockObject( BLACK_PEN ) );
- DeleteObject( d->hPen );
- d->hPen = (HPEN)0;
- }
- if (d->hBmMain) {
- SelectObject( d->hDc, d->hBmOld );
- DeleteObject( d->hBmMain );
- d->hBmMain = (HBITMAP)0;
- DeleteObject( d->hBmTemp );
- d->hBmTemp = (HBITMAP)0;
- }
- if (d->hDc) {
- DeleteDC( d->hDc );
- d->hDc = (HDC)0;
- }
- free(d);
- return TRUE;
+ if (d->hPen) {
+ SelectObject( d->hDc, GetStockObject( BLACK_PEN ) );
+ DeleteObject( d->hPen );
+ d->hPen = (HPEN)0;
+ }
+ if (d->hBmMain) {
+ SelectObject( d->hDc, d->hBmOld );
+ DeleteObject( d->hBmMain );
+ d->hBmMain = (HBITMAP)0;
+ DeleteObject( d->hBmTemp );
+ d->hBmTemp = (HBITMAP)0;
+ }
+ if (d->hDc) {
+ DeleteDC( d->hDc );
+ d->hDc = (HDC)0;
+ }
+ free(d);
+ return TRUE;
}
/**
@@ -2130,74 +2214,74 @@ wBool_t wBitMapDelete( wDraw_p d )
wBool_t
wBitMapWriteFile(wDraw_p d, const char * fileName)
{
- FIBITMAP *dib = NULL;
- FIBITMAP *dib2 = NULL;
- FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
- BOOL bSuccess = FALSE;
-
- if (d->hBmMain) {
-
- BITMAP bm;
- GetObject(d->hBmMain, sizeof(BITMAP), (LPSTR)&bm);
- dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel, 0, 0, 0);
- // The GetDIBits function clears the biClrUsed and biClrImportant BITMAPINFO members (dont't know why)
- // So we save these infos below. This is needed for palettized images only.
- int nColors = FreeImage_GetColorsUsed(dib);
- HDC dc = GetDC(NULL);
- GetDIBits(dc,
- d->hBmMain,
- 0,
- FreeImage_GetHeight(dib),
- FreeImage_GetBits(dib),
- FreeImage_GetInfo(dib),
- DIB_RGB_COLORS);
- ReleaseDC(NULL, dc);
-
- // restore BITMAPINFO members
- FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
- FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
- // we will get a 32 bit bitmap on Windows systems with invalid alpha
- // so it needs to be converted to 24 bits.
- // (see: https://sourceforge.net/p/freeimage/discussion/36110/thread/0699ce8e/ )
- dib2 = FreeImage_ConvertTo24Bits(dib);
- FreeImage_Unload(dib);
- }
-
- // Try to guess the file format from the file extension
- fif = FreeImage_GetFIFFromFilename(fileName);
- if (fif != FIF_UNKNOWN) {
- // Check that the dib can be saved in this format
- BOOL bCanSave;
-
- FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib2);
- if (image_type == FIT_BITMAP) {
- // standard bitmap type
- WORD bpp = FreeImage_GetBPP(dib2);
- bCanSave = (FreeImage_FIFSupportsWriting(fif) &&
- FreeImage_FIFSupportsExportBPP(fif, bpp));
- } else {
- // special bitmap type
- bCanSave = FreeImage_FIFSupportsExportType(fif, image_type);
- }
-
- if (bCanSave) {
- int flags;
-
- switch (fif) {
- case FIF_JPEG:
- flags = JPEG_QUALITYNORMAL;
- break;
- case FIF_PNG:
- flags = PNG_DEFAULT;
- break;
- default:
- flags = 0; // whatver the default is for the file format
- }
- bSuccess = FreeImage_Save(fif, dib2, fileName, flags);
- }
- }
- FreeImage_Unload(dib2);
-
- return bSuccess;
+ FIBITMAP *dib = NULL;
+ FIBITMAP *dib2 = NULL;
+ FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
+ BOOL bSuccess = FALSE;
+
+ if (d->hBmMain) {
+
+ BITMAP bm;
+ GetObject(d->hBmMain, sizeof(BITMAP), (LPSTR)&bm);
+ dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel, 0, 0, 0);
+ // The GetDIBits function clears the biClrUsed and biClrImportant BITMAPINFO members (dont't know why)
+ // So we save these infos below. This is needed for palettized images only.
+ int nColors = FreeImage_GetColorsUsed(dib);
+ HDC dc = GetDC(NULL);
+ GetDIBits(dc,
+ d->hBmMain,
+ 0,
+ FreeImage_GetHeight(dib),
+ FreeImage_GetBits(dib),
+ FreeImage_GetInfo(dib),
+ DIB_RGB_COLORS);
+ ReleaseDC(NULL, dc);
+
+ // restore BITMAPINFO members
+ FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
+ FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
+ // we will get a 32 bit bitmap on Windows systems with invalid alpha
+ // so it needs to be converted to 24 bits.
+ // (see: https://sourceforge.net/p/freeimage/discussion/36110/thread/0699ce8e/ )
+ dib2 = FreeImage_ConvertTo24Bits(dib);
+ FreeImage_Unload(dib);
+ }
+
+ // Try to guess the file format from the file extension
+ fif = FreeImage_GetFIFFromFilename(fileName);
+ if (fif != FIF_UNKNOWN) {
+ // Check that the dib can be saved in this format
+ BOOL bCanSave;
+
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib2);
+ if (image_type == FIT_BITMAP) {
+ // standard bitmap type
+ WORD bpp = FreeImage_GetBPP(dib2);
+ bCanSave = (FreeImage_FIFSupportsWriting(fif) &&
+ FreeImage_FIFSupportsExportBPP(fif, bpp));
+ } else {
+ // special bitmap type
+ bCanSave = FreeImage_FIFSupportsExportType(fif, image_type);
+ }
+
+ if (bCanSave) {
+ int flags;
+
+ switch (fif) {
+ case FIF_JPEG:
+ flags = JPEG_QUALITYNORMAL;
+ break;
+ case FIF_PNG:
+ flags = PNG_DEFAULT;
+ break;
+ default:
+ flags = 0; // whatver the default is for the file format
+ }
+ bSuccess = FreeImage_Save(fif, dib2, fileName, flags);
+ }
+ }
+ FreeImage_Unload(dib2);
+
+ return bSuccess;
}
diff --git a/app/wlib/mswlib/mswmisc.c b/app/wlib/mswlib/mswmisc.c
index 4bf9481..3c7c964 100644
--- a/app/wlib/mswlib/mswmisc.c
+++ b/app/wlib/mswlib/mswmisc.c
@@ -132,6 +132,7 @@ static int mResizeBorderW;
static int mResizeBorderH;
static int mMenuH;
static int screenWidth = 0, screenHeight = 0;
+static RECT screenRect;
static wWin_p mswWin = NULL;
static wWin_p winFirst, winLast;
@@ -201,6 +202,8 @@ static char * filterImageFiles[] = { N_("All image files"),
static HICON hWindowIcon;
+static bool audioOn;
+
/*
*****************************************************************************
*
@@ -589,8 +592,8 @@ static void getSavedSizeAndPos(
int state;
w = h = 0;
- xadj = 1;
- yadj = mTitleH + 1;
+ xadj = 0;
+ yadj = 0;
if (option & F_RESIZE) {
xadj += mResizeBorderW * 2;
yadj += mResizeBorderH * 2;
@@ -598,16 +601,19 @@ static void getSavedSizeAndPos(
xadj += mFixBorderW * 2;
yadj += mFixBorderH * 2;
}
- //if (option & F_MENUBAR) {
- // yadj += mMenuH;
- //}
+
+ yadj += mTitleH;
+ if (option & F_MENUBAR) {
+ yadj += mMenuH;
+ }
if ((option & F_RESIZE) &&
- (cp = wPrefGetStringBasic("msw window size", nameStr)) &&
- (state = (int)strtol(cp, &cq, 10), cp != cq) && // state is not used
- (cp = cq, w = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
- (cp = cq, h = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
- ) {
+ (cp = wPrefGetStringBasic("msw window size", nameStr)) &&
+ (state = (int)strtol(cp, &cq, 10), cp != cq) && // state is not used
+ (cp = cq, w = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
+ (cp = cq, h = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
+ )
+ {
if (w < 10) {
w = 10;
}
@@ -616,11 +622,12 @@ static void getSavedSizeAndPos(
h = 10;
}
- if (w > screenWidth - xadj) {
+ // Make sure the dialog fits in the screen
+ if (w + xadj > screenWidth) {
w = screenWidth - xadj;
}
- if (h > screenHeight - yadj) {
+ if (h + yadj > screenHeight) {
h = screenHeight - yadj;
}
@@ -629,28 +636,25 @@ static void getSavedSizeAndPos(
}
if ((cp = wPrefGetStringBasic("msw window pos", nameStr)) &&
- (x = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
- (cp = cq, y = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
- ) {
- if (y < 0) {
- y = 0;
+ (x = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
+ (cp = cq, y = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
+ )
+ {
+ // Position the dialog so its not off screen
+ if (y < screenRect.top) {
+ y = screenRect.top;
}
- if (x < 0) {
- x = 0;
+ if (x < screenRect.left) {
+ x = screenRect.left;
}
- // Make sure we can see the dialog
- xadj += 100;
- yadj += 100;
-
-
- if (y + h > screenHeight - yadj) {
- y = screenHeight - yadj - h;
+ if (y + h + yadj > screenRect.bottom) {
+ y = screenRect.bottom - h - yadj;
}
- if (x + w > screenWidth - xadj) {
- x = screenWidth - xadj - w;
+ if (x + w + xadj > screenRect.right) {
+ x = screenRect.right - w - xadj;
}
*rx = x;
@@ -1192,7 +1196,7 @@ void wGetDisplaySize(wWinPix_t * width, wWinPix_t * height)
void wWinGetSize(wWin_p w, wWinPix_t * width, wWinPix_t * height)
{
RECT rect;
- GetWindowRect(w->hWnd, &rect);
+ // GetWindowRect(w->hWnd, &rect);
GetClientRect(w->hWnd, &rect);
w->w = rect.right - rect.left;
w->h = rect.bottom - rect.top;
@@ -1204,6 +1208,7 @@ void wWinGetSize(wWin_p w, wWinPix_t * width, wWinPix_t * height)
void wWinSetSize(wWin_p w, wWinPix_t width, wWinPix_t height)
{
RECT rect;
+ HWND hWnd = GetFocus();
w->w = width;
w->h = height;
rect.left = 0;
@@ -1220,6 +1225,7 @@ void wWinSetSize(wWin_p w, wWinPix_t width, wWinPix_t height)
}
InvalidateRect(w->hWnd, NULL, TRUE);
+ SetFocus(hWnd);
}
@@ -1274,13 +1280,13 @@ static void savePos(wWin_p win)
void wWinShow(
wWin_p win,
- BOOL_T show)
+ unsigned show)
{
wWinPix_t x, y;
wWin_p win1;
win->busy = TRUE;
- if (show) {
+ if (show & ~(DONTGRABFOCUS) ) {
if (win->centerWin) {
x = (screenWidth-win->w)/2;
y = (screenHeight-win->h)/2;
@@ -1309,7 +1315,10 @@ void wWinShow(
}
if (mswHWnd == (HWND)0 || !IsIconic(mswHWnd)) {
- ShowWindow(win->hWnd, SW_SHOW);
+ if (show & DONTGRABFOCUS)
+ ShowWindow(win->hWnd, SW_SHOWNOACTIVATE);
+ else
+ ShowWindow(win->hWnd, SW_SHOW);
if (win->focusChainFirst) {
SetFocus(win->focusChainFirst->hWnd);
@@ -1791,34 +1800,6 @@ void wControlHilite(
*****************************************************************************
*/
-
-void wMessage(
- wWin_p w,
- const char * msg,
- int beep)
-{
- HDC hDc;
- int oldRop;
- wWinPix_t h;
- RECT rect;
- LABELFONTDECL
-
- if (beep) {
- MessageBeep(0);
- }
-
- GetClientRect(w->hWnd, &rect);
- hDc = GetDC(w->hWnd);
- oldRop = SetROP2(hDc, R2_WHITE);
- h = w->h+2;
- Rectangle(hDc, 0, h, w->w, h);
- SetROP2(hDc, oldRop);
- LABELFONTSELECT
- TextOut(hDc, 0, h, msg, (int)(strlen(msg)));
- LABELFONTRESET
- ReleaseDC(w->hWnd, hDc);
-}
-
/**
* Open a document using an external application
*
@@ -2025,10 +2006,27 @@ void mswSetTrigger(
}
}
+/**
+ * Change audio setting.
+ *
+ * \param setting true: beep is on
+ */
+void
+wSetAudio(bool setting)
+{
+ audioOn = (setting > 0);
+}
+
+/**
+ * Sound speaker if audio is enabled.
+ *
+ */
void wBeep(void)
{
- MessageBeep(MB_OK);
+ if (audioOn) {
+ MessageBeep(MB_OK);
+ }
}
/**
@@ -2048,8 +2046,8 @@ int wNoticeEx(
const char * no)
{
int res;
- UINT flag;
- char *headline;
+ UINT flag = 0;
+ char *headline = "";
switch (type) {
case NT_INFORMATION:
@@ -2422,7 +2420,7 @@ GetImageFileFormats(void)
char *current = filter;
char *message;
- for (int i = 0; i < sizeof(filterImageFiles) / sizeof(filterImageFiles[0]);
+ for (int i = 0; i < sizeof(filterImageFiles) / sizeof(filterImageFiles[0]) - 1;
i += 2) {
message = gettext(filterImageFiles[i]);
strcpy(current, message);
@@ -3007,7 +3005,9 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
/* Not a Draw control */
- MessageBeep(MB_ICONHAND);
+ if (audioOn) {
+ MessageBeep(MB_ICONHAND);
+ }
return (LRESULT)0;
break;
@@ -3388,15 +3388,21 @@ int PASCAL WinMain(HINSTANCE hinstCurrent, HINSTANCE hinstPrevious,
}
}
+ // Area not obscured by desktop toolbars
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0);
+ screenWidth = screenRect.right - screenRect.left;
+ screenHeight = screenRect.bottom - screenRect.top;
+
mswHInst = hinstCurrent;
- mTitleH = GetSystemMetrics(SM_CYCAPTION) - 1;
- mFixBorderW = GetSystemMetrics(SM_CXBORDER);
- mFixBorderH = GetSystemMetrics(SM_CYBORDER);
- mResizeBorderW = GetSystemMetrics(SM_CXFRAME);
- mResizeBorderH = GetSystemMetrics(SM_CYFRAME);
- mMenuH = GetSystemMetrics(SM_CYMENU) + 1;
- screenWidth = GetSystemMetrics(SM_CXSCREEN);
- screenHeight = GetSystemMetrics(SM_CYSCREEN);
+ mTitleH = GetSystemMetrics(SM_CYCAPTION);
+ mMenuH = GetSystemMetrics(SM_CYMENU); // + GetSystemMetrics(SM_CYMENUSIZE);
+ mFixBorderW = GetSystemMetrics(SM_CXBORDER); // + GetSystemMetrics(SM_CXEDGE);
+ mFixBorderH = GetSystemMetrics(SM_CYBORDER); // + GetSystemMetrics(SM_CYEDGE);
+ mResizeBorderW = GetSystemMetrics(SM_CXSIZEFRAME); // + GetSystemMetrics(SM_CXEDGE);
+ mResizeBorderH = GetSystemMetrics(SM_CYSIZEFRAME); // + GetSystemMetrics(SM_CYEDGE);
+ // screenWidth = GetSystemMetrics(SM_CXSCREEN);
+ // screenHeight = GetSystemMetrics(SM_CYSCREEN);
+
mswLabelFont = GetStockObject(DEFAULT_GUI_FONT);
hDc = GetDC(0);
mswScale = GetDeviceCaps(hDc, LOGPIXELSX) / 96.0;