|
|
#include "sol.h"
VSZASSERT
BOOL fMegaDiscardHack = fFalse; /* See klond.c's DiscardMove */
MOVE move = {0}; /* move data, pointed to by current pcol->pmove */
COLCLS *PcolclsCreate(INT tcls, INT (FAR *lpfnColProc)(), DX dxUp, DY dyUp, DX dxDn, DY dyDn, INT dcrdUp, INT dcrdDn) { COLCLS *pcolcls;
if((pcolcls = PAlloc(sizeof(COLCLS)))==NULL) return NULL;
Assert(lpfnColProc != NULL); pcolcls->tcls = tcls; pcolcls->lpfnColProc = lpfnColProc; pcolcls->ccolDep = 0; pcolcls->dxUp = dxUp; pcolcls->dyUp = dyUp; pcolcls->dxDn = dxDn; pcolcls->dyDn = dyDn; pcolcls->dcrdUp = dcrdUp; pcolcls->dcrdDn = dcrdDn; return pcolcls; }
COL *PcolCreate(COLCLS *pcolcls, X xLeft, Y yTop, X xRight, Y yBot, INT icrdMax) { COL *pcol;
if((pcol = PAlloc(sizeof(COL) + (icrdMax-1)*sizeof(CRD)))==NULL) return NULL; if( (pcol->pcolcls = pcolcls) != NULL ) pcol->lpfnColProc = pcolcls->lpfnColProc; pcol->rc.xLeft = xLeft; pcol->rc.yTop = yTop; pcol->rc.xRight = xRight; pcol->rc.yBot = yBot; pcol->icrdMax = icrdMax; pcol->icrdMac = 0; pcol->pmove = NULL; if(pcol->pcolcls != NULL) pcol->pcolcls->ccolDep++; return pcol; }
#ifdef DEBUG
INT SendColMsg(COL *pcol, INT msgc, WPARAM wp1, LPARAM wp2) { INT imdbg; INT wResult;
Assert(pcol != NULL); imdbg = ILogMsg(pcol, msgc, wp1, wp2, fFalse);
wResult = (*(pcol->lpfnColProc))(pcol, msgc, wp1, wp2); LogMsgResult(imdbg, wResult); return wResult; } #endif
VOID DrawBackExcl(COL *pcol, PT *ppt) { COLCLS *pcolcls;
pcolcls = pcol->pcolcls;
if(pcolcls->dxUp != 0 || pcolcls->dxDn != 0) DrawBackground(ppt->x+dxCrd, pcol->rc.yTop, pcol->rc.xRight, pcol->rc.yBot); if(pcolcls->dyUp != 0 || pcolcls->dyDn != 0) DrawBackground(pcol->rc.xLeft, ppt->y+dyCrd, pcol->rc.xRight, pcol->rc.yBot); }
BOOL DefFreeCol(COL *pcol) { COLCLS *pcolcls;
if((pcolcls = pcol->pcolcls) != NULL) { pcolcls = pcol->pcolcls; Assert(pcolcls->ccolDep > 0); if(--pcolcls->ccolDep == 0) { FreeP(pcol->pcolcls); } } FreeP(pcol); return fTrue; }
INT DefHit(COL *pcol, PT *ppt, INT icrdMin) { INT icrd; CRD *pcrd; HDC hdc, hdcCurSav; PT ptCrd; RC rc; INT OldusehdcCur;
if(!PtInRect((LPRECT)&pcol->rc, *(POINT *)ppt) || pcol->icrdMac == 0) return icrdNil; for(icrd = pcol->icrdMac-1; icrd >= icrdMin && (pcrd = &pcol->rgcrd[icrd])->fUp; icrd--) { if(FPtInCrd(pcrd, *ppt)) { move.ccrdSel = pcol->icrdMac-icrd; /* save where mouse hit card */ ptCrd = pcol->rgcrd[icrd].pt; move.delHit.dx = ptCrd.x - ppt->x; move.delHit.dy = ptCrd.y - ppt->y;
if(fOutlineDrag) goto Return;
hdc = GetDC(hwndApp); if(hdc == NULL)
{ // No longer referenced label.
//
//OOM0:
OOM(); return icrdNil; } move.hdcScreen = hdc; move.dyCol = dyCrd+(move.ccrdSel-1)*pcol->pcolcls->dyUp;
rc.xRight = (rc.xLeft = ptCrd.x) + dxCrd; rc.yTop = ptCrd.y; rc.yBot = rc.yTop+move.dyCol;
/* optimization: if column already drawn and visible on screen */ /* then blt it to col image right here. */ if(FRectAllVisible(hdc, &rc)) { BitBlt(move.hdcCol, 0, 0, dxCrd, move.dyCol, hdc, ptCrd.x, ptCrd.y, SRCCOPY); } else { OldusehdcCur = usehdcCur; usehdcCur = 1; hdcCurSav = HdcSet(move.hdcCol, ptCrd.x, ptCrd.y); DrawBackground(ptCrd.x, ptCrd.y, pcol->rc.xRight, pcol->rc.yBot); SendColMsg(pcol, msgcRender, icrd, pcol->icrdMac); HdcSet(hdcCurSav, 0, 0); usehdcCur = OldusehdcCur; } OldusehdcCur = usehdcCur; usehdcCur = 1; hdcCurSav = HdcSet(move.hdcScreenSave, ptCrd.x, ptCrd.y); DrawBackground(ptCrd.x, ptCrd.y, pcol->rc.xRight, pcol->rc.yBot); SendColMsg(pcol, msgcRender, icrd-1, WMax(0, icrd)); HdcSet(hdcCurSav, 0, 0); usehdcCur = OldusehdcCur;
Return: pcol->pmove = &move; move.icrdSel = icrd; return icrd; } } return icrdNil; }
BOOL DefMouseUp(COL *pcol, PT *pptPrev, BOOL fRender) { MOVE *pmove; VOID DrawOutline();
if(fRender) SendColMsg(pcol, msgcZip, 0, 0);
if(fOutlineDrag) { if(pptPrev->x != ptNil.x) SendColMsg(pcol, msgcDrawOutline, (INT_PTR) pptPrev, (INT_PTR) &ptNil); return fTrue; }
pmove = pcol->pmove; if (pcol->pmove == NULL) return fTrue;
if(pmove->fHdc) { if(pptPrev->x != ptNil.x) { BitBlt(pmove->hdcScreen, pptPrev->x+pmove->delHit.dx, pptPrev->y+pmove->delHit.dy, dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY); }
if(fRender) { SendColMsg(pcol, msgcRender, pmove->icrdSel-1, icrdToEnd); }
ReleaseDC(hwndApp, pmove->hdcScreen); pmove->hdcScreen = NULL; } return fTrue; }
/* Removes cards from pcol and puts them into pcolTemp */ /* ccrdSel and icrdSel must be set in pcol->pmove */ BOOL DefRemove(COL *pcol, COL *pcolTemp) { INT icrdSel; INT ccrdSel; INT ccrdShiftDown; /* amount left over in pcol */
Assert(pcol->pmove != NULL); if (pcol->pmove == NULL) return fTrue;
icrdSel = pcol->pmove->icrdSel; ccrdSel = pcol->pmove->ccrdSel; Assert(ccrdSel <= pcolTemp->icrdMax); /* save the cards to remove in pcolTemp */ bltb(&pcol->rgcrd[icrdSel], &pcolTemp->rgcrd[0], sizeof(CRD) * ccrdSel); pcolTemp->icrdMac = ccrdSel;
/* remove the cards from pcol */ Assert(icrdSel+ccrdSel <= pcol->icrdMax); ccrdShiftDown = pcol->icrdMac - (icrdSel+ccrdSel);
/* copy down any left over above the deleted cards */ if (ccrdShiftDown > 0) { bltb(&pcol->rgcrd[icrdSel+ccrdSel], &pcol->rgcrd[icrdSel], sizeof(CRD) * ccrdShiftDown); } pcol->icrdMac -= ccrdSel; /* no longer have this many cards */ /* pcol->pmove = NULL; Done in DefEndSel.. */ return fTrue; }
/* insert cards from pcolTemp into pcol at icrd */
BOOL DefInsert(COL *pcol, COL *pcolTemp, INT icrd) { INT icrdT;
icrdT = icrd == icrdToEnd ? pcol->icrdMac : icrd;
Assert(icrdT <= pcol->icrdMac); Assert(pcol->icrdMac+pcolTemp->icrdMac <= pcol->icrdMax); /* is it the hard case of inserting in the middle of a col? */ /* if so, expand pcol->rgcrd */ if(icrd != icrdToEnd) bltb(&pcol->rgcrd[icrdT], &pcol->rgcrd[icrdT+pcolTemp->icrdMac], sizeof(CRD) * pcolTemp->icrdMac); else icrd = pcol->icrdMac;
/* Insert the cards from pcolTemp to pcol */ bltb(&pcolTemp->rgcrd[0], &pcol->rgcrd[icrdT], sizeof(CRD) * pcolTemp->icrdMac);
pcol->icrdMac += pcolTemp->icrdMac; pcolTemp->icrdMac = 0; return fTrue; }
BOOL DefMove(COL *pcolDest, COL *pcolSrc, INT icrd) { INT icrdMacDestSav, icrdSelSav; COL *pcolTemp; BOOL fResult; BOOL fZip;
fZip = icrd & bitFZip; icrd &= icrdMask; Assert(pcolSrc->pmove != NULL); if (pcolSrc->pmove == NULL) return fTrue;
icrdSelSav = WMax(pcolSrc->pmove->icrdSel-1, 0); icrdMacDestSav = (icrd == icrdToEnd) ? pcolDest->icrdMac : icrd; if((pcolTemp = PcolCreate(NULL, 0, 0, 0, 0, pcolSrc->pmove->ccrdSel)) == NULL) return fFalse;
fResult = SendColMsg(pcolSrc, msgcRemove, (INT_PTR)pcolTemp, 0) && SendColMsg(pcolDest, msgcInsert, (INT_PTR) pcolTemp, icrd) && SendColMsg(pcolDest, msgcComputeCrdPos, icrdMacDestSav, fFalse) && (!fZip || SendColMsg(pcolSrc, msgcZip, 0, 0)) && (!fOutlineDrag || SendColMsg(pcolSrc, msgcRender, icrdSelSav, icrdToEnd)) && SendColMsg(pcolDest, msgcRender, icrdMacDestSav, icrdToEnd) && SendColMsg(pcolSrc, msgcEndSel, fFalse, 0); FreeP(pcolTemp); return fResult; }
BOOL DefCopy(COL *pcolDest, COL *pcolSrc, BOOL fAll) { Assert(pcolSrc->icrdMac <= pcolDest->icrdMax); if(fAll) bltb(pcolSrc, pcolDest, sizeof(COL)+(pcolSrc->icrdMac-1)*sizeof(CRD)); else { bltb(pcolSrc->rgcrd, pcolDest->rgcrd, pcolSrc->icrdMac*sizeof(CRD)); pcolDest->icrdMac = pcolSrc->icrdMac; } return(SendColMsg(pcolDest, msgcRender, 0, icrdToEnd)); }
BOOL DefRender(COL *pcol, INT icrdFirst, INT icrdLast) { INT icrd; INT icrdMac; CRD *pcrd, *pcrdPrev; COLCLS *pcolcls;
icrdFirst = WMax(icrdFirst, 0); Assert(icrdLast >= 0); if(!FGetHdc()) return fFalse; if(pcol->icrdMac == 0 || icrdLast == 0) { DrawBackground(pcol->rc.xLeft, pcol->rc.yTop, pcol->rc.xRight, pcol->rc.yBot); if(icrdLast == 0) goto EraseExtra; } else { Assert(icrdToEnd >= 0); Assert(icrdToEnd > pcol->icrdMac); Assert(icrdLast == icrdToEnd || icrdLast <= pcol->icrdMac); icrdMac = WMin(pcol->icrdMac, icrdLast);
for(icrd = icrdFirst; icrd < icrdMac; icrd++) { pcrd = &pcol->rgcrd[icrd]; if(icrd == icrdFirst || pcrd->pt.x != pcrdPrev->pt.x || pcrd->pt.y != pcrdPrev->pt.y || pcrd->fUp) DrawCard(pcrd); pcrdPrev = pcrd; } EraseExtra: /* hack to make dealing quicker */ if(pgmCur->fDealt || pcol->pcolcls->tcls == tclsDeck) { pcolcls = pcol->pcolcls; pcrd = &pcol->rgcrd[icrdLast == 0 ? 0 : icrdMac-1]; DrawBackExcl(pcol, &pcrd->pt); } }
ReleaseHdc(); return fTrue; }
BOOL DefPaint(COL *pcol, PAINTSTRUCT *ppaint) { INT icrd;
if(ppaint == NULL) icrd = 0; else { if(!FRectIsect(&pcol->rc, (RC *)&ppaint->rcPaint)) return fFalse;
if(pcol->icrdMac == 0) icrd = 0; else { for(icrd = 0; icrd < pcol->icrdMac ;icrd++) if(FCrdRectIsect(&pcol->rgcrd[icrd], (RC *)&ppaint->rcPaint)) break; if(icrd == pcol->icrdMac) return fFalse; } }
return SendColMsg(pcol, msgcRender, icrd, icrdToEnd); }
/* New super cool dragging, does five blts, but no clippin' */
BOOL DefDrawOutline(COL *pcol, PT *ppt, PT *pptPrev) { HDC hdc, hdcT; HBITMAP hbmT; MOVE *pmove; PT pt, ptPrev; DEL del; COLCLS *pcolcls;
Assert(pcol->pmove != NULL); pmove = pcol->pmove; if (pcol->pmove == NULL) return fTrue;
OffsetPt(ppt, &pmove->delHit, &pt); if(pptPrev->x != ptNil.x) OffsetPt(pptPrev, &pmove->delHit, &ptPrev);
if(fOutlineDrag) { pcolcls = pcol->pcolcls; DrawOutline(&pt, pmove->ccrdSel, 0, pcolcls->dyUp); if(pptPrev->x != ptNil.x) { DrawOutline(&ptPrev, pmove->ccrdSel, 0, pcolcls->dyUp); } return fTrue; } hdc = pmove->hdcScreen; Assert(hdc != NULL);
hdcT = pmove->hdcT; Assert(hdcT != NULL);
hbmT = pmove->hbmT; Assert(hbmT != NULL);
/* screen to save hdc */ BitBlt(hdcT, 0, 0, dxCrd, pmove->dyCol, hdc, pt.x, pt.y, SRCCOPY); /* if not the first time */ if(pptPrev->x != ptNil.x) { del.dx = pptPrev->x - ppt->x; del.dy = pptPrev->y - ppt->y; /* save old screen to save hdc */ BitBlt(hdcT, del.dx, del.dy, dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY); BitBlt(pmove->hdcScreenSave, -del.dx, -del.dy, dxCrd, pmove->dyCol, pmove->hdcCol, 0, 0, SRCCOPY); }
BitBlt(hdc, pt.x, pt.y, dxCrd, pmove->dyCol, pmove->hdcCol, 0, 0, SRCCOPY); if(pptPrev->x != ptNil.x) { BitBlt(hdc, ptPrev.x, ptPrev.y, dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY); }
/* swap pmove->hdcT and pmove->hdcScreenSave */ hdcT = pmove->hdcScreenSave; pmove->hdcScreenSave = pmove->hdcT; pmove->hdcT = hdcT;
/* swap pmove->hbmT and pmove->hbmScreenSaveOld */ hbmT = pmove->hbmScreenSaveOld; pmove->hbmScreenSaveOld = pmove->hbmT; pmove->hbmT = hbmT;
return fTrue; }
BOOL DefComputeCrdPos(COL *pcol, INT icrdFirst, BOOL fAssumeDown) { INT icrd; CRD *pcrd; COLCLS *pcolcls; PT pt;
Assert(icrdFirst >= 0); if(icrdFirst == 0) { pt.x = pcol->rc.xLeft; pt.y = pcol->rc.yTop; } else { Assert(icrdFirst < pcol->icrdMac); pt = pcol->rgcrd[--icrdFirst].pt; /* Used by discard, because discard piles are handled differently */ if(fMegaDiscardHack) icrdFirst++; }
pcolcls = pcol->pcolcls; for(icrd = icrdFirst; icrd < pcol->icrdMac; icrd++) { pcrd = &pcol->rgcrd[icrd]; pcrd->pt = pt; if(pcrd->fUp && !fAssumeDown) { if(icrd % pcolcls->dcrdUp == pcolcls->dcrdUp-1) { pt.x += pcolcls->dxUp; pt.y += pcolcls->dyUp; } } else if(icrd % pcolcls->dcrdDn == pcolcls->dcrdDn-1) { pt.x += pcolcls->dxDn; pt.y += pcolcls->dyDn; } } return fTrue; }
VOID InvertCardPt(PT *ppt) { RC rc;
rc.xRight = (rc.xLeft = ppt->x) + dxCrd; rc.yBot = (rc.yTop = ppt->y) + dyCrd; InvertRc(&rc); }
INT DefValidMovePt(COL *pcolDest, COL *pcolSrc, PT *ppt) { RC rc;
Assert(pcolSrc->pmove != NULL); if (pcolSrc->pmove == NULL) return fTrue;
Assert((X *)&(((RC *)(0))->xLeft) == (X *)&(((PT *)(0))->x)); Assert((Y *)&(((RC *)(0))->yTop) == (Y *)&(((PT *)(0))->y));
OffsetPt(ppt, &pcolSrc->pmove->delHit, (PT *)&rc); rc.xRight = rc.xLeft+dxCrd; rc.yBot = rc.yTop+dyCrd; if(pcolDest->icrdMac == 0) { if(!FRectIsect(&rc, &pcolDest->rc)) return icrdNil; } else if(!(FCrdRectIsect(&pcolDest->rgcrd[pcolDest->icrdMac-1], &rc))) return icrdNil;
return SendColMsg(pcolDest, msgcValidMove, (INT_PTR) pcolSrc, 0) ? pcolDest->icrdMac : icrdNil; }
BOOL DefSel(COL *pcol, INT icrdFirst, INT ccrd) { #ifdef DEBUG
INT icol;
for(icol = 0; icol < pgmCur->icolMac; icol++) Assert(pgmCur->rgpcol[icol]->pmove == NULL); #endif
move.delHit.dx = move.delHit.dy = 0; if(icrdFirst == icrdEnd) { if(pcol->icrdMac > 0) { move.icrdSel = pcol->icrdMac-1; move.ccrdSel = 1; goto Return; } else return icrdNil; } if(ccrd == ccrdToEnd) ccrd = pcol->icrdMac-icrdFirst; Assert(icrdFirst < pcol->icrdMac); Assert(icrdFirst+ccrd <= pcol->icrdMac); move.icrdSel = icrdFirst; move.ccrdSel = ccrd; Return: pcol->pmove = &move; return move.icrdSel; }
BOOL DefEndSel(COL *pcol, BOOL fReleaseDC) { pcol->pmove = NULL; return fTrue; }
BOOL DefFlip(COL *pcol, BOOL fUp) { INT icrd; MOVE *pmove; INT icrdMac; Assert(pcol->pmove != NULL); if (pcol->pmove == NULL) return fTrue;
pmove = pcol->pmove;
icrdMac = pmove->icrdSel+pmove->ccrdSel; for(icrd = pmove->icrdSel; icrd < icrdMac; icrd++) pcol->rgcrd[icrd].fUp = (short)fUp; return fTrue; }
BOOL DefInvert(COL *pcol) { INT icrdSel, ccrdSel; INT icrd, icrdMid;
Assert(pcol->pmove != NULL); if (pcol->pmove == NULL) return fTrue;
icrdSel = pcol->pmove->icrdSel; ccrdSel = pcol->pmove->ccrdSel;
icrdMid = icrdSel+ccrdSel/2; for(icrd = icrdSel; icrd < icrdMid; icrd++) SwapCards(&pcol->rgcrd[icrd], &pcol->rgcrd[2*icrdSel+ccrdSel-1-icrd]);
return fTrue; }
BOOL DefDragInvert(COL *pcol) {
if(fOutlineDrag) { if(!FGetHdc()) return fFalse; Assert((X *)&((RC *)(0))->xLeft == (X *)&((PT *)(0))->x); Assert((Y *)&((RC *)(0))->yTop == (Y *)&((PT *)(0))->y); InvertCardPt(pcol->icrdMac > 0 ? &pcol->rgcrd[pcol->icrdMac-1].pt : (PT *)&pcol->rc); ReleaseHdc(); } return fTrue; }
INT DefNumCards(COL *pcol, BOOL fUpOnly) { INT icrd;
if(fUpOnly) { for(icrd = pcol->icrdMac-1; icrd >= 0 && pcol->rgcrd[icrd].fUp; icrd--) ; Assert(pcol->icrdMac-1-icrd >= 0); return pcol->icrdMac-1-icrd; } else return pcol->icrdMac; }
BOOL DefGetPtInCrd(COL *pcol, INT icrd, PT *ppt) { PT *pptT; if(icrd == 0) pptT = (PT *)&pcol->rc; else { pptT = &pcol->rgcrd[icrd].pt; Assert(icrd < pcol->icrdMac); } ppt->x = pptT->x+dxCrd/2; ppt->y = pptT->y; return fTrue; }
BOOL DefShuffle(COL *pcol) { INT iSwitch; CRD crdT; INT icrd; CRD *pcrdS; // INT cdecl rand();
#define iSwitchMax 5
for(iSwitch = 0; iSwitch < iSwitchMax; iSwitch++) { for(icrd = 0; icrd < pcol->icrdMac; icrd++) { pcrdS = &pcol->rgcrd[rand() % pcol->icrdMac]; crdT = pcol->rgcrd[icrd]; pcol->rgcrd[icrd] = *pcrdS; *pcrdS = crdT; } } return fTrue; }
#define izipMax 35
VOID APIENTRY DdaProc(INT x, INT y, LPARAM lpextra) { COL *pcol; PT pt;
pcol = (COL *)lpextra; if (pcol->pmove == NULL) return;
if(pcol->pmove->izip++ < izipMax) return; pcol->pmove->izip = 0; pt.x = x; pt.y = y; SendColMsg(pcol, msgcDrawOutline, (INT_PTR) &pt, (INT_PTR) &pgmCur->ptMousePrev); pgmCur->ptMousePrev = pt; }
INT DefZip(COL *pcol) { PT ptDest; MOVE *pmove;
/* When outline-dragging is checked, that starting point can be ptNil and
* in this case we draw a line starting from (7FFF, 7FFF) and this * causes the temporary hang! So, avoid the LineDDA() call when the * prev point is ptNil; * Fix for Bug #8182 --SANKAR-- 01-23-90 */ if(pgmCur->ptMousePrev.x == ptNil.x) return(fTrue);
pmove = pcol->pmove; if (pcol->pmove == NULL) return fTrue;
/* Don't use OffsetPt here, it's sense is wrong */ ptDest = pcol->rgcrd[pmove->icrdSel].pt; ptDest.x -= pmove->delHit.dx; ptDest.y -= pmove->delHit.dy;
pmove->izip = 0; LineDDA(pgmCur->ptMousePrev.x, pgmCur->ptMousePrev.y, ptDest.x, ptDest.y, DdaProc, (LPARAM) pcol ); return fTrue; }
INT DefColProc(COL *pcol, INT msgc, WPARAM wp1, LPARAM wp2) { switch(msgc) { case msgcInit: return fTrue;
case msgcEnd: return DefFreeCol(pcol);
case msgcClearCol: pcol->pmove = NULL; pcol->icrdMac = 0; /* more? */ return fTrue;
case msgcHit: /* wp1 = ppt, return icrdHit/icrdNil */ return DefHit(pcol, (PT *)wp1, (INT)wp2);
case msgcMouseUp: return DefMouseUp(pcol, (PT *) wp1, (INT)wp2);
case msgcDblClk: return fFalse;
case msgcSel: /* wp1 = icrdSel, icrdEnd if last card, wp2 = ccrdSel, ccrdToEnd if all to end */ return DefSel(pcol, (INT)wp1, (INT)wp2);
case msgcEndSel: return DefEndSel(pcol, (BOOL)wp1);
case msgcNumCards: return DefNumCards(pcol, (BOOL)wp1);
case msgcFlip: /* wp1 = fUp */ return DefFlip(pcol, (BOOL)wp1);
case msgcInvert: return DefInvert(pcol);
case msgcRemove: /* wp1 = pcolTemp, return fTrue/fFalse */ return DefRemove(pcol, (COL *) wp1);
case msgcInsert: /* wp1 = pcolTemp, */ /* wp2 = icrd to insert after, icrdToEnd if at end*/ return DefInsert(pcol, (COL *)wp1, (INT)wp2);
case msgcMove: /* wp1 = pcolSrc, wp2 = icrd, (icrdToEnd = to endcrd) */ /* return fTrue/fFalse */ return DefMove(pcol, (COL *) wp1, (INT)wp2);
case msgcCopy: /* wp1 = pcolSrc, wp2 = fAll (if true then copy all of col struct)*/ return DefCopy(pcol, (COL *) wp1, (BOOL)wp2);
case msgcValidMove: /* wp1 = pcolSrc, wp2 = icrd, (icrdToEnd = to endcrd) */ /* this must be supplied by game */ return fFalse;
case msgcValidMovePt: return DefValidMovePt(pcol, (COL *) wp1, (PT *)wp2);
case msgcRender: /* wp1 = icrdFirst, return fTrue/fFalse*/ return DefRender(pcol, (INT)wp1, (INT)wp2); case msgcPaint: /* wp1 = ppaint, if NULL then paint all */ return DefPaint(pcol, (PAINTSTRUCT *) wp1);
case msgcDrawOutline: /* wp1 = ppt , wp2 = pptPrev*/ return DefDrawOutline(pcol, (PT *) wp1, (PT *) wp2);
case msgcComputeCrdPos: /* wp1 = icrdFirst */ return DefComputeCrdPos(pcol, (INT)wp1, (BOOL)wp2);
case msgcDragInvert: return DefDragInvert(pcol);
case msgcGetPtInCrd: return DefGetPtInCrd(pcol, (INT)wp1, (PT *)wp2);
case msgcValidKbdColSel: return fTrue;
case msgcValidKbdCrdSel: return fTrue;
case msgcShuffle: return DefShuffle(pcol);
case msgcAnimate: return fFalse;
case msgcZip: return DefZip(pcol); }
Assert(fFalse); return fFalse; }
|