diff options
Diffstat (limited to 'app/wlib/mswlib')
| -rw-r--r-- | app/wlib/mswlib/mswbitmap.c | 6 | ||||
| -rw-r--r-- | app/wlib/mswlib/mswdraw.c | 3442 | ||||
| -rw-r--r-- | app/wlib/mswlib/mswmisc.c | 152 |
3 files changed, 1845 insertions, 1755 deletions
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 = ¢erPen; - 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 = ¢erPen; + 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 ×Font[bold][italic]; - } else if (family == F_HELV) { - return &helvFont[bold][italic]; - } else { - return NULL; - } + if (family == F_TIMES) { + return ×Font[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; |
