Annotation of pmsdk/samples/linefrac/lfcmd.c, revision 1.1.1.1

1.1       root        1: /************************************************************************
                      2: *
                      3: *   lfcmd.c -- Subroutines for menu command processing for LineFractal.
                      4: *
                      5: *   Created by Microsoft Corporation, 1989
                      6: *
                      7: ************************************************************************/
                      8: 
                      9: #define INCL_WIN
                     10: #define INCL_GPI
                     11: #define INCL_BITMAPFILEFORMAT
                     12: #define INCL_DOSSEMAPHORES
                     13: #define INCL_DOSMEMMGR
                     14: #define INCL_DOSPROCESS
                     15: #include <os2.h>
                     16: 
                     17: #include <mt\stdio.h>
                     18: #include <mt\stdlib.h>
                     19: #include <mt\math.h>
                     20: 
                     21: #include "opendlg.h"
                     22: 
                     23: #define INCL_GLOBALS
                     24: #define INCL_THREADS
                     25: #include "linefrac.h"
                     26: 
                     27: #define INCL_LFCMD
                     28: #define INCL_LFDLG
                     29: #define INCL_LFMAIN
                     30: #define INCL_LFTHREAD
                     31: #define INCL_LFPS
                     32: #define INCL_LFDRAW
                     33: #define INCL_LFUTIL
                     34: #define INCL_LFFILE
                     35: #include "lffuncs.h"
                     36: 
                     37: 
                     38: 
                     39: 
                     40: /************************************************************************
                     41: *
                     42: *   Macros
                     43: *
                     44: *   Helper macros for repetitious code.
                     45: *
                     46: ************************************************************************/
                     47: 
                     48: #define UPDATE_MENU_BOOL(var, val)                             \
                     49:        {                                                       \
                     50:            TOGGLE_BOOL((var));                                 \
                     51:            TOGGLE_MENU_ITEM(global.hwndFrame, (val), (var));   \
                     52:        }
                     53: 
                     54: #define UPDATE_MENU_LIST(var, val)                             \
                     55:        {                                                       \
                     56:            UNCHECK_MENU_ITEM(global.hwndFrame, (var));         \
                     57:            (var) = (val);                                      \
                     58:            CHECK_MENU_ITEM(global.hwndFrame, (var));           \
                     59:        }
                     60: 
                     61: 
                     62: 
                     63: 
                     64: /************************************************************************
                     65: *
                     66: *   Global Variables
                     67: *
                     68: *   global     Global data block.
                     69: *   aulRops    Array of BitBlt rops available for pasting.
                     70: *   aXform     Array of built-in transforms and default positioning
                     71: *                and sizing information.
                     72: *
                     73: ************************************************************************/
                     74: 
                     75: extern GLOBALDATA global;
                     76: extern XFORMDATA  aXform[];
                     77: 
                     78: ULONG aulRops[] =
                     79: {
                     80:       ROP_SRCCOPY,
                     81:       ROP_SRCAND,
                     82:       ROP_SRCPAINT,
                     83:       ROP_SRCINVERT,
                     84:     (~ROP_SRCCOPY)   & 0xFF,
                     85:     (~ROP_SRCAND)    & 0xFF,
                     86:     (~ROP_SRCPAINT)  & 0xFF,
                     87:     (~ROP_SRCINVERT) & 0xFF
                     88: };
                     89: 
                     90: char *pszAttrs = "Previous attributes not read yet.";
                     91: 
                     92: 
                     93: 
                     94: 
                     95: /************************************************************************
                     96: *
                     97: *   LfCommand
                     98: *
                     99: *   Dispatches menu commands to the proper handlers.
                    100: *
                    101: ************************************************************************/
                    102: 
                    103: VOID
                    104: LfCommand(hwnd, id)
                    105: HWND hwnd;
                    106: USHORT id;
                    107: {
                    108:     switch (id)
                    109:     {
                    110: 
                    111:     /********************************************************************
                    112:     *
                    113:     *  File menu
                    114:     *
                    115:     ********************************************************************/
                    116: 
                    117:     case IDM_LOAD:
                    118:     case IDM_SAVE:
                    119:     case IDM_ABOUT:
                    120:        LfFileMenu(hwnd, id);
                    121:        break;
                    122: 
                    123:     /********************************************************************
                    124:     *
                    125:     *  Edit menu
                    126:     *
                    127:     ********************************************************************/
                    128: 
                    129:     case IDM_SELECT:
                    130:     case IDM_SELECTALL:
                    131:     case IDM_CUT:
                    132:     case IDM_COPY:
                    133:     case IDM_PASTE:
                    134:     case IDM_USECLIPBRD:
                    135:     case IDM_PASTES:
                    136:     case IDM_PASTEDSA:
                    137:     case IDM_PASTEDSO:
                    138:     case IDM_PASTEDSX:
                    139:     case IDM_PASTESN:
                    140:     case IDM_PASTEDSAN:
                    141:     case IDM_PASTEDSON:
                    142:     case IDM_PASTEDSXN:
                    143:        LfEditMenu(hwnd, id);
                    144:        break;
                    145: 
                    146:     /********************************************************************
                    147:     *
                    148:     *  Thread menu
                    149:     *
                    150:     ********************************************************************/
                    151: 
                    152:     case IDM_DCPOSTSCRIPT:
                    153:     case IDM_DCPROPRINTER:
                    154:     case IDM_DCDIRECT:
                    155:     case IDM_DCMEMORY:
                    156:     case IDM_EDITTHREADPARAMS:
                    157:     case IDM_THR0TOTOP:
                    158:     case IDM_THR1TOTOP:
                    159:     case IDM_THR2TOTOP:
                    160:     case IDM_THR3TOTOP:
                    161:     case IDM_THR4TOTOP:
                    162:     case IDM_THR5TOTOP:
                    163:     case IDM_THR6TOTOP:
                    164:     case IDM_THR7TOTOP:
                    165:     case IDM_THR8TOTOP:
                    166:     case IDM_THR9TOTOP:
                    167:     case IDM_KILLTOPTHREAD:
                    168:     case IDM_KILLALLTHREADS:
                    169:     case IDM_AUTOSWITCH:
                    170:     case IDM_SWITCHDELAY:
                    171:     case IDM_UPDATEMENUS:
                    172:     case IDM_THREADINHERITANCE:
                    173:        LfThreadMenu(hwnd, id);
                    174:        break;
                    175: 
                    176:     /********************************************************************
                    177:     *
                    178:     *  Control menu
                    179:     *
                    180:     ********************************************************************/
                    181: 
                    182:     case IDM_CLEARBITMAP:
                    183:     case IDM_COPYBITMAPTOSCREEN:
                    184:     case IDM_SQUAREBITMAP:
                    185:     case IDM_RESIZEBITMAPTOWINDOW:
                    186:     case IDM_MOUSECHANGESRECURSION:
                    187:     case IDM_ANIMATEPTR:
                    188:     case IDM_PTRPREFERENCES:
                    189:     case IDM_TIMERDELAY:
                    190:        if (LfControlMenu(hwnd, id))
                    191:            goto lfcmd_redraw;
                    192:        break;
                    193: 
                    194:     /********************************************************************
                    195:     *
                    196:     *  Fractal menu
                    197:     *
                    198:     ********************************************************************/
                    199: 
                    200:     case IDM_SHARKTOOTH:
                    201:     case IDM_SAWTOOTH:
                    202:     case IDM_KOCH:
                    203:     case IDM_SPACEFILLER:
                    204:     case IDM_STOVE:
                    205:     case IDM_SQUAREWAVE:
                    206:     case IDM_HOURGLASS:
                    207:     case IDM_FRACREDRAW:
                    208:        if (LfFractalMenu(hwnd, id))
                    209:            goto lfcmd_redraw;
                    210:        break;
                    211: 
                    212:     /********************************************************************
                    213:     *
                    214:     *  Primitive menu
                    215:     *
                    216:     ********************************************************************/
                    217: 
                    218:     case IDM_POLYLINE:
                    219:     case IDM_POLYFILLET:
                    220:     case IDM_POLYSPLINE:
                    221:     case IDM_POLYMARKER:
                    222:     case IDM_PEANO:
                    223:     case IDM_PRIMREDRAW:
                    224:        if (LfPrimitiveMenu(hwnd, id))
                    225:            goto lfcmd_redraw;
                    226:        break;
                    227: 
                    228:     /********************************************************************
                    229:     *
                    230:     *  Attributes menu
                    231:     *
                    232:     ********************************************************************/
                    233: 
                    234:     case IDM_LINEATTRS:
                    235:     case IDM_MARKERATTRS:
                    236:     case IDM_AREAATTRS:
                    237:     case IDM_IMAGEATTRS:
                    238:     case IDM_MISCATTRS:
                    239:     case IDM_DIMENSIONS:
                    240:     case IDM_DRAGDIMS:
                    241:     case IDM_ATTRREDRAW:
                    242:        if (LfAttributesMenu(hwnd, id))
                    243:            goto lfcmd_redraw;
                    244:        break;
                    245: 
                    246:     /********************************************************************
                    247:     *
                    248:     *  Environment menu
                    249:     *
                    250:     ********************************************************************/
                    251: 
                    252:     case IDM_AUTORESIZE:
                    253:     case IDM_AUTOSELECTDIMS:
                    254:     case IDM_CLEARONREDRAW:
                    255:     case IDM_AUTOSTARTREDRAW:
                    256:     case IDM_COLLECTBOUNDS:
                    257:        LfEnvironmentMenu(hwnd, id);
                    258:        break;
                    259: 
                    260:     /********************************************************************
                    261:     *
                    262:     *  Control menu, continued.  These two commands dovetail
                    263:     *  conveniently,  so they are placed out of sequence here.
                    264:     *
                    265:     ********************************************************************/
                    266: 
                    267: lfcmd_redraw:
                    268:     case IDM_REDRAW:
                    269:        DosSemClear(&(global.pThrTop)->lSemRedraw);
                    270: 
                    271:        /* Fall through to restart the drawing. */
                    272: 
                    273:     case IDM_ABORT:
                    274:        global.pThrTop->fInterrupted = TRUE;
                    275:        break;
                    276:     }
                    277: }
                    278: 
                    279: 
                    280: 
                    281: 
                    282: /************************************************************************
                    283: *
                    284: *   LfFileMenu
                    285: *
                    286: *   These commands allow the loading and saving of bitmaps from threads
                    287: *   with memory DC's.  The about box shows the version number, title,
                    288: *   and author.
                    289: *
                    290: ************************************************************************/
                    291: 
                    292: VOID
                    293: LfFileMenu(hwnd, id)
                    294: HWND hwnd;
                    295: USHORT id;
                    296: {
                    297:     switch (id)
                    298:     {
                    299:     case IDM_LOAD:
                    300:        if (global.pThrTop->dcType == IDM_DCMEMORY)
                    301:            LfReadFile(hwnd, global.pThrTop);
                    302:        else
                    303:            MyMessageBox(hwnd, "Cannot load bitmap into a\nnon-memory DC.");
                    304:        break;
                    305: 
                    306:     case IDM_SAVE:
                    307:        if (global.pThrTop->dcType == IDM_DCMEMORY)
                    308:            LfWriteFile(hwnd, global.pThrTop);
                    309:        else
                    310:            MyMessageBox(hwnd, "Cannot save bitmap from a\nnon-memory DC.");
                    311:        break;
                    312: 
                    313:     case IDM_ABOUT:
                    314:        WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)AboutDlg, NULL,
                    315:                       IDR_ABOUTDLG, NULL );
                    316:        break;
                    317:     }
                    318: }
                    319: 
                    320: 
                    321: 
                    322: 
                    323: /************************************************************************
                    324: *
                    325: *   LfEditMenu
                    326: *
                    327: *   These commands allow for cutting, copying, and pasting of rectangles
                    328: *   of bits.  The user can drag a rectangle or select the entire surface.
                    329: *   The GpiBitBlt rop to use when pasting can be any of those listed.
                    330: *   The user can specify that the system clipboard be used for storing
                    331: *   the cut or copied bits, or that a private bitmap be used.
                    332: *
                    333: ************************************************************************/
                    334: 
                    335: VOID
                    336: LfEditMenu(hwnd, id)
                    337: HWND hwnd;
                    338: USHORT id;
                    339: {
                    340:     switch (id)
                    341:     {
                    342:     case IDM_SELECT:
                    343:        global.fSelecting = TRUE;
                    344:        break;
                    345: 
                    346:     case IDM_SELECTALL:
                    347:        LfSelectAll(hwnd);
                    348:        break;
                    349: 
                    350:     case IDM_CUT:
                    351:        if (global.fShowSelectRc)
                    352:            LfCut(hwnd);
                    353:        break;
                    354: 
                    355:     case IDM_COPY:
                    356:        if (global.fShowSelectRc)
                    357:            LfCopy(hwnd);
                    358:        break;
                    359: 
                    360:     case IDM_PASTE:
                    361:        if (global.fHaveSelectRc)
                    362:        {
                    363:            HPS hps;
                    364: 
                    365:            global.fPasting = TRUE;
                    366:            if (global.fShowSelectRc && global.fTempSelect)
                    367:            {
                    368:                hps = WinGetPS(hwnd);
                    369:                LfShowSelectRc(hps, &global.rclSelect);
                    370:                WinReleasePS(hps);
                    371:                global.fShowSelectRc = FALSE;
                    372:                global.fTempSelect = FALSE;
                    373:            }
                    374:            if (!global.fShowSelectRc)
                    375:            {
                    376:                global.fShowSelectRc = TRUE;
                    377:                hps = WinGetPS(hwnd);
                    378:                LfShowSelectRc(hps, &global.rclCutCopy);
                    379:                WinReleasePS(hps);
                    380:            }
                    381:        }
                    382:        break;
                    383: 
                    384:     case IDM_USECLIPBRD:
                    385:        UPDATE_MENU_BOOL(global.fUseClipbrd, IDM_USECLIPBRD);
                    386:        break;
                    387: 
                    388:     /********************************************************************/
                    389: 
                    390:     case IDM_PASTES:
                    391:     case IDM_PASTEDSA:
                    392:     case IDM_PASTEDSO:
                    393:     case IDM_PASTEDSX:
                    394:     case IDM_PASTESN:
                    395:     case IDM_PASTEDSAN:
                    396:     case IDM_PASTEDSON:
                    397:     case IDM_PASTEDSXN:
                    398:        UNCHECK_MENU_ITEM(global.hwndFrame, global.usRopIndex+IDM_PASTES);
                    399:        global.usRopIndex = id - IDM_PASTES;
                    400:        CHECK_MENU_ITEM(global.hwndFrame, global.usRopIndex+IDM_PASTES);
                    401:        global.ulPasteROP = aulRops[global.usRopIndex];
                    402:        break;
                    403:     }
                    404: }
                    405: 
                    406: 
                    407: 
                    408: 
                    409: /************************************************************************
                    410: *
                    411: *   LfThreadMenu
                    412: *
                    413: *   These commands allow the creation, viewing, editing, and deletion
                    414: *   of up to 10 independently drawing threads. The middle group
                    415: *   allow for simple animation by cycling through the threads at
                    416: *   a user-selectable rate.  The updating of menus can be disabled to
                    417: *   allow a faster thread-switch rate. The last group determine how
                    418: *   new threads will look and act.  If inheritance is enabled, a new
                    419: *   thread will be drawn with the attributes of the top thread, otherwise
                    420: *   it will use the program's default values.
                    421: *
                    422: ************************************************************************/
                    423: 
                    424: VOID
                    425: LfThreadMenu(hwnd, id)
                    426: HWND hwnd;
                    427: USHORT id;
                    428: {
                    429:     static char *szError1 = "Could not start thread.";
                    430: 
                    431:     switch (id)
                    432:     {
                    433:     case IDM_DCPOSTSCRIPT:
                    434:     case IDM_DCPROPRINTER:
                    435:        break;  /* not implemented yet */
                    436: 
                    437:     case IDM_DCDIRECT:
                    438:        {
                    439:            PTHR pthr;
                    440: 
                    441:            if (global.cThr < MAX_THREADS)
                    442:                if (pthr = LfStartThread(IDM_DCDIRECT))
                    443:                {
                    444:                    (global.aThr)[global.cThr] = pthr;
                    445:                    ++global.cThr;
                    446:                    pthr->dcType = id;
                    447: 
                    448:                    LfBringThreadToTop(pthr);
                    449:                    break;
                    450:                }
                    451:            MyMessageBox(hwnd, szError1);
                    452:        }
                    453:        break;
                    454: 
                    455:     case IDM_DCMEMORY:
                    456: 
                    457:        if (global.cThr < MAX_THREADS)
                    458:        {
                    459:            if (global.fFirstThread)
                    460:            {
                    461:                global.bm.cx        = (USHORT) (global.rcl.xRight - global.rcl.xLeft);
                    462:                global.bm.cy        = (USHORT) (global.rcl.yTop   - global.rcl.yBottom);
                    463:                global.bm.cPlanes   = 0;
                    464:                global.bm.cBitCount = 0;
                    465:                global.fFirstThread = FALSE;
                    466:            }
                    467:            else if (global.fThreadInheritance)
                    468:            {
                    469:                global.bm.cx        = (USHORT) global.pThrTop->rcl.xRight;
                    470:                global.bm.cy        = (USHORT) global.pThrTop->rcl.yTop;
                    471:                global.bm.cPlanes   = global.pThrTop->cPlanes;
                    472:                global.bm.cBitCount = global.pThrTop->cBitCount;
                    473:            }
                    474:            else
                    475:            {
                    476:                global.bm.cx        = (USHORT) (global.rcl.xRight - global.rcl.xLeft);
                    477:                global.bm.cy        = (USHORT) (global.rcl.yTop   - global.rcl.yBottom);
                    478:                global.bm.cPlanes   = 0;
                    479:                global.bm.cBitCount = 0;
                    480:                if (!WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)BitmapParamsDlg, NULL,
                    481:                               IDR_BITMAPPARAMSDLG, NULL ))
                    482:                    break;      /* if user hit "cancel", don't start thread */
                    483:            }
                    484: 
                    485:            {
                    486:                PTHR pthr;
                    487: 
                    488:                if (pthr = LfStartThread(IDM_DCMEMORY))
                    489:                {
                    490:                    (global.aThr)[global.cThr] = pthr;
                    491:                    ++global.cThr;
                    492:                    pthr->dcType = id;
                    493: 
                    494:                    LfBringThreadToTop(pthr);
                    495:                    break;
                    496:                }
                    497:            }
                    498:        }
                    499:        MyMessageBox(hwnd, szError1);
                    500:        break;
                    501: 
                    502:     case IDM_EDITTHREADPARAMS:
                    503:        if (global.pThrTop->dcType == IDM_DCMEMORY)
                    504:        {
                    505:            USHORT cxT, cyT, cpT, cbT;
                    506: 
                    507:            cxT = global.bm.cx        = (USHORT) global.pThrTop->rcl.xRight;
                    508:            cyT = global.bm.cy        = (USHORT) global.pThrTop->rcl.yTop;
                    509:            cpT = global.bm.cPlanes   = global.pThrTop->cPlanes;
                    510:            cbT = global.bm.cBitCount = global.pThrTop->cBitCount;
                    511: 
                    512:            if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)BitmapParamsDlg, NULL,
                    513:                           IDR_BITMAPPARAMSDLG, NULL ))
                    514:                if ((cxT != global.bm.cx)      ||
                    515:                    (cyT != global.bm.cy)      ||
                    516:                    (cpT != global.bm.cPlanes) ||
                    517:                    (cbT != global.bm.cBitCount))
                    518:                    LfResizePS(global.pThrTop);
                    519:        }
                    520:        else
                    521:            MyMessageBox(hwnd, "No editable DC parameters.");
                    522:        break;
                    523: 
                    524:     case IDM_THR0TOTOP:
                    525:     case IDM_THR1TOTOP:
                    526:     case IDM_THR2TOTOP:
                    527:     case IDM_THR3TOTOP:
                    528:     case IDM_THR4TOTOP:
                    529:     case IDM_THR5TOTOP:
                    530:     case IDM_THR6TOTOP:
                    531:     case IDM_THR7TOTOP:
                    532:     case IDM_THR8TOTOP:
                    533:     case IDM_THR9TOTOP:
                    534:        {
                    535:            USHORT i;
                    536: 
                    537:            if ((i = id-IDM_THR0TOTOP) < global.cThr)
                    538:                LfBringThreadToTop(global.aThr[i]);
                    539:        }
                    540:        break;
                    541: 
                    542:     case IDM_KILLTOPTHREAD:
                    543:        {
                    544:            PTHR pthr;
                    545: 
                    546:            pthr = global.pThrTop;
                    547:            if (global.cThr > 1)
                    548:            {
                    549:                SHORT i;
                    550: 
                    551:                if ((i = global.iThrTop+1) == global.cThr)
                    552:                    i -= 2;
                    553:                LfBringThreadToTop(global.aThr[i]);
                    554:            }
                    555:            else
                    556:                LfBringThreadToTop(NULL);
                    557: 
                    558:            LfKillThread(pthr);
                    559:            LfBringThreadToTop(global.pThrTop);     /* update global.iThrTop and menu */
                    560: 
                    561:            /* If no threads left, then start over. */
                    562:            if (global.cThr == 0)
                    563:            {
                    564:                global.fFirstThread = TRUE;
                    565:                WinSendMsg(hwnd, WM_COMMAND, (MPARAM)IDM_DCMEMORY, 0);
                    566:            }
                    567:        }
                    568:        break;
                    569: 
                    570:     case IDM_KILLALLTHREADS:
                    571:        {
                    572:            SHORT i;
                    573: 
                    574:            /* Delete them all and start over. */
                    575:            LfBringThreadToTop(NULL);
                    576:            for (i = global.cThr-1; i >= 0; --i)
                    577:                LfKillThread(global.aThr[i]);
                    578:            global.fFirstThread = TRUE;
                    579:            WinSendMsg(hwnd, WM_COMMAND, (MPARAM)IDM_DCMEMORY, 0);
                    580:        }
                    581:        break;
                    582: 
                    583:     /********************************************************************/
                    584: 
                    585:     case IDM_AUTOSWITCH:
                    586:        UPDATE_MENU_BOOL(global.fAutoSwitch, IDM_AUTOSWITCH);
                    587:        if (global.fAutoSwitch)
                    588:            WinStartTimer(global.hab, global.hwnd, IDT_AUTOSWITCH, global.usSwitchDelay);
                    589:        else
                    590:            WinStopTimer(global.hab, global.hwnd, IDT_AUTOSWITCH);
                    591:        break;
                    592: 
                    593:     case IDM_SWITCHDELAY:
                    594:        WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)SwitchDelayDlg, NULL,
                    595:                       IDR_SWITCHDELAYDLG, NULL );
                    596:        break;
                    597: 
                    598:     case IDM_UPDATEMENUS:
                    599:        UPDATE_MENU_BOOL(global.fUpdateMenusOnThreadSwitch, IDM_UPDATEMENUS);
                    600:        break;
                    601: 
                    602:     /********************************************************************/
                    603: 
                    604:     case IDM_THREADINHERITANCE:
                    605:        UPDATE_MENU_BOOL(global.fThreadInheritance, IDM_THREADINHERITANCE);
                    606:        break;
                    607: 
                    608:     }
                    609: }
                    610: 
                    611: 
                    612: 
                    613: 
                    614: /************************************************************************
                    615: *
                    616: *   LfControlMenu
                    617: *
                    618: *   These commands cause global effects.  The top set cause immediate
                    619: *   results.  The bottom set determine how the program reacts to
                    620: *   certain events (mouse movement and button messages, timer messages).
                    621: *
                    622: ************************************************************************/
                    623: 
                    624: BOOL
                    625: LfControlMenu(hwnd, id)
                    626: HWND hwnd;
                    627: USHORT id;
                    628: {
                    629:     BOOL fRedraw = FALSE;
                    630: 
                    631:     switch (id)
                    632:     {
                    633:     case IDM_CLEARBITMAP:
                    634:        LfClearRect(global.pThrTop, NULL);
                    635:        break;
                    636: 
                    637:     case IDM_COPYBITMAPTOSCREEN:
                    638:        if (global.pThrTop->hps)
                    639:            WinInvalidateRect(global.hwnd, &(global.pThrTop)->rcl, FALSE);
                    640:        break;
                    641: 
                    642:     case IDM_SQUAREBITMAP:
                    643:        LfSquareBitmap(hwnd);
                    644:        break;
                    645: 
                    646:     case IDM_RESIZEBITMAPTOWINDOW:
                    647:        LfResizeBitmapToWindow();
                    648:        fRedraw = TRUE;
                    649:        break;
                    650: 
                    651:     /********************************************************************/
                    652: 
                    653:     case IDM_MOUSECHANGESRECURSION:
                    654:        UPDATE_MENU_BOOL(global.fMouseChangesRecursion, IDM_MOUSECHANGESRECURSION);
                    655:        break;
                    656: 
                    657:     case IDM_ANIMATEPTR:
                    658:        UPDATE_MENU_BOOL(global.fAnimatePtr, IDM_ANIMATEPTR);
                    659:        if (global.fAnimatePtr)
                    660:            global.usPtrIncr = 1;
                    661:        else
                    662:        {
                    663:            global.usPtrIncr = 0;
                    664:            global.usCurPtr  = global.usUserPtr;
                    665:        }
                    666:        break;
                    667: 
                    668:     case IDM_PTRPREFERENCES:
                    669:        WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)PtrPreferencesDlg, NULL,
                    670:                       IDR_PTRPREFERENCESDLG, NULL );
                    671:        break;
                    672: 
                    673:     case IDM_TIMERDELAY:
                    674:        WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)TimerDelayDlg, NULL,
                    675:                       IDR_TIMERDELAYDLG, NULL );
                    676:        break;
                    677:     }
                    678: 
                    679:     return fRedraw;
                    680: }
                    681: 
                    682: 
                    683: 
                    684: 
                    685: /************************************************************************
                    686: *
                    687: *   LfFractalMenu
                    688: *
                    689: *   These commands select the fractal similarity transform, i.e. the
                    690: *   basic fractal shape, for a thread.
                    691: *
                    692: ************************************************************************/
                    693: 
                    694: BOOL
                    695: LfFractalMenu(hwnd, id)
                    696: HWND hwnd;
                    697: USHORT id;
                    698: {
                    699:     BOOL fRedraw = FALSE;
                    700: 
                    701:     switch (id)
                    702:     {
                    703:     case IDM_SHARKTOOTH:
                    704:     case IDM_SAWTOOTH:
                    705:     case IDM_KOCH:
                    706:     case IDM_SPACEFILLER:
                    707:     case IDM_STOVE:
                    708:     case IDM_SQUAREWAVE:
                    709:     case IDM_HOURGLASS:
                    710:        LfSelectXform(hwnd, global.pThrTop, id);
                    711:        if (global.pThrTop->fFracRedraw)
                    712:            fRedraw = TRUE;
                    713:        break;
                    714: 
                    715:     /********************************************************************/
                    716: 
                    717:     case IDM_FRACREDRAW:
                    718:        UPDATE_MENU_BOOL(global.pThrTop->fFracRedraw, IDM_FRACREDRAW);
                    719:        break;
                    720:     }
                    721: 
                    722:     return fRedraw;
                    723: }
                    724: 
                    725: 
                    726: 
                    727: 
                    728: /************************************************************************
                    729: *
                    730: *   LfPrimitiveMenu
                    731: *
                    732: *   These commands select the drawing primitive used to output the
                    733: *   fractal for a thread.
                    734: *
                    735: ************************************************************************/
                    736: 
                    737: BOOL
                    738: LfPrimitiveMenu(hwnd, id)
                    739: HWND hwnd;
                    740: USHORT id;
                    741: {
                    742:     BOOL fRedraw = FALSE;
                    743: 
                    744:     switch (id)
                    745:     {
                    746:     case IDM_POLYLINE:
                    747:     case IDM_POLYFILLET:
                    748:     case IDM_POLYSPLINE:
                    749:     case IDM_POLYMARKER:
                    750:     case IDM_PEANO:
                    751:        LfSelectPrim(hwnd, global.pThrTop, id);
                    752:        if (global.pThrTop->fPrimRedraw)
                    753:            fRedraw = TRUE;
                    754:        break;
                    755: 
                    756:     /********************************************************************/
                    757: 
                    758:     case IDM_PRIMREDRAW:
                    759:        UPDATE_MENU_BOOL(global.pThrTop->fPrimRedraw, IDM_PRIMREDRAW);
                    760:        break;
                    761:     }
                    762: 
                    763:     return fRedraw;
                    764: }
                    765: 
                    766: 
                    767: 
                    768: 
                    769: /************************************************************************
                    770: *
                    771: *   LfAttributesMenu
                    772: *
                    773: *   These commands allow the user to alter all the drawing attributes
                    774: *   of a fractal (color, mix mode, marker symbol, etc.), as well as
                    775: *   some fractal-related attributes such as width, height, offset,
                    776: *   number of sides to polygonal frame, and rotation.  Each thread
                    777: *   has an independent set of all these attributes.
                    778: *
                    779: ************************************************************************/
                    780: 
                    781: BOOL
                    782: LfAttributesMenu(hwnd, id)
                    783: HWND hwnd;
                    784: USHORT id;
                    785: {
                    786:     BOOL fRedraw = FALSE;
                    787: 
                    788:     switch (id)
                    789:     {
                    790:     case IDM_LINEATTRS:
                    791:        if (global.fUpdateAttrs && (global.flLineAttrs & LFA_LINEALL))
                    792:            MyMessageBox(hwnd, pszAttrs);
                    793:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)LineAttrsDlg, NULL,
                    794:                       IDR_LINEATTRSDLG, NULL ))
                    795:            fRedraw = TRUE;
                    796:        break;
                    797: 
                    798:     case IDM_MARKERATTRS:
                    799:        if (global.fUpdateAttrs && (global.flMarkerAttrs & LFA_MARKALL))
                    800:            MyMessageBox(hwnd, pszAttrs);
                    801:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)MarkerAttrsDlg, NULL,
                    802:                       IDR_MARKERATTRSDLG, NULL ))
                    803:            fRedraw = TRUE;
                    804:        break;
                    805: 
                    806:     case IDM_AREAATTRS:
                    807:        if (global.fUpdateAttrs && (global.flAreaAttrs & LFA_AREAALL))
                    808:            MyMessageBox(hwnd, pszAttrs);
                    809:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)AreaAttrsDlg, NULL,
                    810:                       IDR_AREAATTRSDLG, NULL ))
                    811:            fRedraw = TRUE;
                    812:        break;
                    813: 
                    814:     case IDM_IMAGEATTRS:
                    815:        if (global.fUpdateAttrs && (global.flImageAttrs & LFA_IMAGEALL))
                    816:            MyMessageBox(hwnd, pszAttrs);
                    817:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)ImageAttrsDlg, NULL,
                    818:                       IDR_IMAGEATTRSDLG, NULL ))
                    819:            fRedraw = TRUE;
                    820:        break;
                    821: 
                    822:     case IDM_MISCATTRS:
                    823:        if (global.fUpdateAttrs && (global.flMiscAttrs & (LFA_RECURSION |
                    824:                LFA_CPTMAX | LFA_POLYGONSIDES | LFA_ROTATION)))
                    825:            MyMessageBox(hwnd, pszAttrs);
                    826:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)MiscAttrsDlg, NULL,
                    827:                       IDR_MISCATTRSDLG, NULL ))
                    828:            fRedraw = TRUE;
                    829:        break;
                    830: 
                    831:     case IDM_DIMENSIONS:
                    832:        if (global.fUpdateAttrs && (global.flMiscAttrs & (LFA_XOFF |
                    833:                LFA_YOFF | LFA_XSCALE | LFA_YSCALE)))
                    834:            MyMessageBox(hwnd, pszAttrs);
                    835:        if (WinDlgBox( HWND_DESKTOP, hwnd, (PFNWP)DimensionsDlg, NULL,
                    836:                       IDR_DIMENSIONSDLG, NULL ))
                    837:            fRedraw = TRUE;
                    838:        break;
                    839: 
                    840:     case IDM_DRAGDIMS:
                    841:        global.fTracking = TRUE;
                    842:        break;
                    843: 
                    844:     /********************************************************************/
                    845: 
                    846:     case IDM_ATTRREDRAW:
                    847:        UPDATE_MENU_BOOL(global.pThrTop->fAttrRedraw, IDM_ATTRREDRAW);
                    848:        break;
                    849:     }
                    850: 
                    851:     if (fRedraw)
                    852:        if (global.pThrTop->fAttrRedraw)
                    853:            return TRUE;
                    854:     return FALSE;
                    855: }
                    856: 
                    857: 
                    858: 
                    859: 
                    860: /************************************************************************
                    861: *
                    862: *   LfEnvironmentMenu
                    863: *
                    864: *   These commands alter the way a thread reacts to system and program
                    865: *   events by toggling certain flags.  Each thread has its own
                    866: *   environment flags.
                    867: *
                    868: ************************************************************************/
                    869: 
                    870: VOID
                    871: LfEnvironmentMenu(hwnd, id)
                    872: HWND hwnd;
                    873: USHORT id;
                    874: {
                    875:     switch (id)
                    876:     {
                    877:     case IDM_AUTORESIZE:
                    878:        UPDATE_MENU_BOOL(global.pThrTop->fAutoSizePS, IDM_AUTORESIZE);
                    879:        break;
                    880: 
                    881:     case IDM_AUTOSELECTDIMS:
                    882:        UPDATE_MENU_BOOL(global.pThrTop->fAutoSelectDims, IDM_AUTOSELECTDIMS);
                    883:        break;
                    884: 
                    885:     case IDM_CLEARONREDRAW:
                    886:        UPDATE_MENU_BOOL(global.pThrTop->fClearOnRedraw, IDM_CLEARONREDRAW);
                    887:        break;
                    888: 
                    889:     case IDM_AUTOSTARTREDRAW:
                    890:        UPDATE_MENU_BOOL(global.pThrTop->fAutoStartRedraw, IDM_AUTOSTARTREDRAW);
                    891:        if (global.pThrTop->fAutoStartRedraw)
                    892:            LfStartRedrawTimer();
                    893:        break;
                    894: 
                    895:     case IDM_COLLECTBOUNDS:
                    896:        UPDATE_MENU_BOOL(global.pThrTop->fCollectBounds, IDM_COLLECTBOUNDS);
                    897:        break;
                    898: 
                    899:     }
                    900: 
                    901:     hwnd;      /* this prevents an "unused variable" warning message */
                    902: }
                    903: 
                    904: 
                    905: 
                    906: 
                    907: /************************************************************************
                    908: *
                    909: *   LfSelectDimension
                    910: *
                    911: *   Set the dimensions of the next fractal by dragging a rectangle
                    912: *   on the screen.
                    913: *
                    914: ************************************************************************/
                    915: 
                    916: VOID
                    917: LfSelectDimension(hwnd, pt)
                    918: HWND hwnd;
                    919: POINTS pt;
                    920: {
                    921:     TRACKINFO ti;
                    922:     LONG lXExt, lYExt;
                    923: 
                    924: 
                    925:     WinSendMsg(global.hwndFrame, WM_QUERYTRACKINFO, (MPARAM)TF_MOVE, (MPARAM)&ti);
                    926: 
                    927:     ti.cxBorder   = 1;
                    928:     ti.cyBorder   = 1;
                    929:     ti.rclTrack.xLeft  = (LONG)pt.x;
                    930:     ti.rclTrack.yBottom = (LONG)pt.y;
                    931:     ti.rclTrack.xRight = (LONG)pt.x;
                    932:     ti.rclTrack.yTop   = (LONG)pt.y;
                    933:     ti.fs = TF_RIGHT | TF_TOP;
                    934:     ti.ptlMinTrackSize.x = 1L;
                    935:     ti.ptlMinTrackSize.y = 1L;
                    936: 
                    937:     if (WinTrackRect(hwnd, NULL, &ti))
                    938:     {
                    939:        lXExt = (global.pThrTop->rcl).xRight - (global.pThrTop->rcl).xLeft;
                    940:        lYExt = (global.pThrTop->rcl).yTop   - (global.pThrTop->rcl).yBottom;
                    941: 
                    942:        global.dblXScale = (double)(ti.rclTrack.xRight - ti.rclTrack.xLeft)   / (double)lXExt;
                    943:        global.dblYScale = (double)(ti.rclTrack.yTop   - ti.rclTrack.yBottom) / (double)lYExt;
                    944:        global.dblXOff   = (double) ti.rclTrack.xLeft   / (double)lXExt;
                    945:        global.dblYOff   = (double) ti.rclTrack.yBottom / (double)lYExt;
                    946: 
                    947:        global.flMiscAttrs |= LFA_XSCALE | LFA_YSCALE | LFA_XOFF | LFA_YOFF;
                    948: 
                    949:        global.pThrTop->fUpdateAttrs = TRUE;
                    950:        global.fUpdateAttrs          = TRUE;
                    951:     }
                    952: }
                    953: 
                    954: 
                    955: 
                    956: 
                    957: /************************************************************************
                    958: *
                    959: *   LfSquareBitmap
                    960: *
                    961: *   Resize the window horizontally to so that the client area is a
                    962: *   square.
                    963: *
                    964: ************************************************************************/
                    965: 
                    966: VOID
                    967: LfSquareBitmap(hwnd)
                    968: HWND hwnd;
                    969: {
                    970:     SWP swp;
                    971:     HWND hwndDesk;
                    972:     RECTL rcl;
                    973: 
                    974:     if (hwnd == global.hwnd)
                    975:        if (hwndDesk = WinQueryDesktopWindow(global.hab, NULL))
                    976:            if (WinQueryWindowPos(global.hwndFrame, (PSWP)&swp))
                    977:            {
                    978:                rcl.xLeft   = 0L;
                    979:                rcl.yBottom = 0L;
                    980:                rcl.xRight  = swp.cx;
                    981:                rcl.yTop    = swp.cy;
                    982:                if (WinCalcFrameRect(global.hwndFrame, &rcl, TRUE))
                    983:                {
                    984:                    rcl.xRight  = (SHORT)((LONG)rcl.yTop   *
                    985:                                  global.pThrTop->AspectRatio.lHorz /
                    986:                                  global.pThrTop->AspectRatio.lVert);
                    987: 
                    988:                    if (WinCalcFrameRect(global.hwndFrame, &rcl, FALSE))
                    989:                        WinSetWindowPos(global.hwndFrame, 0, swp.x, swp.y,
                    990:                            (SHORT)rcl.xRight, (SHORT)rcl.yTop,
                    991:                            SWP_SIZE);
                    992:                }
                    993:            }
                    994: }
                    995: 
                    996: 
                    997: 
                    998: 
                    999: /************************************************************************
                   1000: *
                   1001: *   LfResizeBitmapToWindow
                   1002: *
                   1003: *   Resize the bitmap to match the windows dimensions exactly.
                   1004: *
                   1005: ************************************************************************/
                   1006: 
                   1007: VOID
                   1008: LfResizeBitmapToWindow()
                   1009: {
                   1010:     global.bm.cx = (USHORT) (global.rcl.xRight - global.rcl.xLeft);
                   1011:     global.bm.cy = (USHORT) (global.rcl.yTop   - global.rcl.yBottom);
                   1012:     global.bm.cPlanes  = global.pThrTop->cPlanes;
                   1013:     global.bm.cBitCount = global.pThrTop->cBitCount;
                   1014: 
                   1015:     LfResizePS(global.pThrTop);
                   1016: }
                   1017: 
                   1018: 
                   1019: 
                   1020: 
                   1021: /************************************************************************
                   1022: *
                   1023: *   LfSelect
                   1024: *
                   1025: *   Select a rectangle to cut or copy to the clipboard.
                   1026: *
                   1027: ************************************************************************/
                   1028: 
                   1029: VOID
                   1030: LfSelect(hwnd, pt)
                   1031: HWND hwnd;
                   1032: POINTS pt;
                   1033: {
                   1034:     HPS hps;
                   1035:     TRACKINFO ti;
                   1036:     PRECTL prcl;
                   1037: 
                   1038: 
                   1039:     if (global.fShowSelectRc)
                   1040:     {
                   1041:        global.fShowSelectRc = FALSE;
                   1042:        hps = WinGetPS(hwnd);
                   1043:        if (global.fTempSelect)
                   1044:        {
                   1045:            prcl = &global.rclSelect;
                   1046:            global.fTempSelect = FALSE;
                   1047:        }
                   1048:        else
                   1049:            prcl = &global.rclCutCopy;
                   1050:        LfShowSelectRc(hps, prcl);
                   1051:        WinReleasePS(hps);
                   1052:     }
                   1053: 
                   1054:     WinSendMsg(global.hwndFrame, WM_QUERYTRACKINFO, (MPARAM)TF_MOVE, (MPARAM)&ti);
                   1055: 
                   1056:     ti.cxBorder = 1;
                   1057:     ti.cyBorder = 1;
                   1058:     ti.rclTrack.xLeft  = (LONG)pt.x;
                   1059:     ti.rclTrack.yBottom = (LONG)pt.y;
                   1060:     ti.rclTrack.xRight = (LONG)pt.x;
                   1061:     ti.rclTrack.yTop   = (LONG)pt.y;
                   1062:     ti.fs = TF_RIGHT | TF_TOP;
                   1063:     ti.ptlMinTrackSize.x = 1L;
                   1064:     ti.ptlMinTrackSize.y = 1L;
                   1065: 
                   1066:     if (WinTrackRect(hwnd, NULL, &ti))
                   1067:     {
                   1068:        global.rclSelect.xLeft   = ti.rclTrack.xLeft;
                   1069:        global.rclSelect.yBottom = ti.rclTrack.yBottom;
                   1070:        global.rclSelect.xRight  = ti.rclTrack.xRight;
                   1071:        global.rclSelect.yTop    = ti.rclTrack.yTop;
                   1072: 
                   1073:        global.fShowSelectRc = TRUE;
                   1074:        global.fTempSelect   = TRUE;
                   1075:        hps = WinGetPS(hwnd);
                   1076:        LfShowSelectRc(hps, &global.rclSelect);
                   1077:        WinReleasePS(hps);
                   1078:     }
                   1079: }
                   1080: 
                   1081: 
                   1082: 
                   1083: 
                   1084: /************************************************************************
                   1085: *
                   1086: *   LfSelectAll
                   1087: *
                   1088: *   Select the entire surface to cut or copy to the clipboard.
                   1089: *
                   1090: ************************************************************************/
                   1091: 
                   1092: VOID
                   1093: LfSelectAll(hwnd)
                   1094: HWND hwnd;
                   1095: {
                   1096:     HPS hps;
                   1097: 
                   1098:     global.rclSelect = global.pThrTop->rcl;
                   1099: 
                   1100:     global.fShowSelectRc = TRUE;
                   1101:     global.fTempSelect  = TRUE;
                   1102:     hps = WinGetPS(hwnd);
                   1103:     LfShowSelectRc(hps, &global.rclSelect);
                   1104:     WinReleasePS(hps);
                   1105: }
                   1106: 
                   1107: 
                   1108: 
                   1109: 
                   1110: /************************************************************************
                   1111: *
                   1112: *   LfCut
                   1113: *
                   1114: *   Cuts the selected rectangle from the bitmap and puts it in the
                   1115: *   clipboard.
                   1116: *
                   1117: ************************************************************************/
                   1118: 
                   1119: VOID
                   1120: LfCut(hwnd)
                   1121: HWND hwnd;
                   1122: {
                   1123:     if (LfCopy(hwnd))
                   1124:        LfClearRect(global.pThrTop, &global.rclCutCopy);
                   1125: }
                   1126: 
                   1127: 
                   1128: 
                   1129: 
                   1130: /************************************************************************
                   1131: *
                   1132: *   LfCopy
                   1133: *
                   1134: *   Copies the selected rectangle from the bitmap the clipboard.
                   1135: *
                   1136: ************************************************************************/
                   1137: 
                   1138: BOOL
                   1139: LfCopy(hwnd)
                   1140: HWND hwnd;
                   1141: {
                   1142:     HPS hps;
                   1143:     PRECTL prcl;
                   1144:     SIZEL size;
                   1145:     BITMAPINFOHEADER bminfo;
                   1146:     POINTL  aptl[4];
                   1147: 
                   1148: 
                   1149: 
                   1150:     global.fShowSelectRc = FALSE;
                   1151:     hps = WinGetPS(hwnd);
                   1152:     if (global.fTempSelect)
                   1153:     {
                   1154:        prcl = &global.rclSelect;
                   1155:        global.fTempSelect = FALSE;
                   1156:     }
                   1157:     else
                   1158:        prcl = &global.rclCutCopy;
                   1159:     LfShowSelectRc(hps, prcl);
                   1160:     WinReleasePS(hps);
                   1161: 
                   1162:     if (global.fUseClipbrd)
                   1163:     {
                   1164:        if (WinOpenClipbrd(global.hab))
                   1165:        {
                   1166:            global.fHaveSelectRc = TRUE;
                   1167:            global.rclCutCopy.xLeft   = global.rclSelect.xLeft;
                   1168:            global.rclCutCopy.yBottom = global.rclSelect.yBottom;
                   1169:            global.rclCutCopy.xRight  = global.rclSelect.xRight;
                   1170:            global.rclCutCopy.yTop    = global.rclSelect.yTop;
                   1171: 
                   1172:            /* copy bits here */
                   1173: 
                   1174:            WinCloseClipbrd(global.hab);
                   1175: 
                   1176:            return TRUE;
                   1177:        }
                   1178:     }
                   1179:     else
                   1180:     {
                   1181:        global.fHaveSelectRc = TRUE;
                   1182:        global.rclCutCopy.xLeft   = global.rclSelect.xLeft;
                   1183:        global.rclCutCopy.yBottom = global.rclSelect.yBottom;
                   1184:        global.rclCutCopy.xRight  = global.rclSelect.xRight;
                   1185:        global.rclCutCopy.yTop    = global.rclSelect.yTop;
                   1186: 
                   1187:        if (global.fHaveCutCopyDC)
                   1188:        {
                   1189:            GpiSetBitmap(global.CutCopyPS, NULL);
                   1190:            GpiDeleteBitmap(global.CutCopyBM);
                   1191:            GpiDestroyPS(global.CutCopyPS);
                   1192:            DevCloseDC(global.CutCopyDC);
                   1193:            global.fHaveCutCopyDC = FALSE;
                   1194:        }
                   1195: 
                   1196:        global.CutCopyDC = DevOpenDC(global.hab, OD_MEMORY, "*", 0L, NULL, NULL);
                   1197:        if (!global.CutCopyDC)
                   1198:            return FALSE;
                   1199: 
                   1200:        size.cx = 0L;
                   1201:        size.cy = 0L;
                   1202:        global.CutCopyPS = GpiCreatePS(global.hab, global.CutCopyDC, &size,
                   1203:                                 PU_PELS|GPIT_MICRO|GPIA_ASSOC);
                   1204:        if (!global.CutCopyPS)
                   1205:            goto lfc_error_close_dc;
                   1206: 
                   1207: 
                   1208:        bminfo.cbFix = sizeof(BITMAPINFOHEADER);
                   1209:        bminfo.cx = (USHORT) (global.rclCutCopy.xRight - global.rclCutCopy.xLeft);
                   1210:        bminfo.cy = (USHORT) (global.rclCutCopy.yTop   - global.rclCutCopy.yBottom);
                   1211:        bminfo.cPlanes   = global.pThrTop->cPlanes;
                   1212:        bminfo.cBitCount = global.pThrTop->cBitCount;
                   1213:        global.CutCopyBM = GpiCreateBitmap(global.CutCopyPS, &bminfo, 0L, 0L, 0L);
                   1214:        if (!global.CutCopyBM)
                   1215:            goto lfc_error_destroy_ps;
                   1216:        GpiSetBitmap(global.CutCopyPS, global.CutCopyBM);
                   1217: 
                   1218:        aptl[0].x = 0L;
                   1219:        aptl[0].y = 0L;
                   1220:        aptl[1].x = global.rclCutCopy.xRight - global.rclCutCopy.xLeft;
                   1221:        aptl[1].y = global.rclCutCopy.yTop   - global.rclCutCopy.yBottom;
                   1222:        aptl[2].x = global.rclCutCopy.xLeft;
                   1223:        aptl[2].y = global.rclCutCopy.yBottom;
                   1224: 
                   1225:        GpiBitBlt(global.CutCopyPS, global.pThrTop->hps, 3L, aptl, ROP_SRCCOPY, NULL);
                   1226: 
                   1227:        global.fHaveCutCopyDC = TRUE;
                   1228:        return TRUE;
                   1229: 
                   1230: 
                   1231: lfc_error_destroy_ps:
                   1232:        GpiDestroyPS(global.CutCopyPS);
                   1233: lfc_error_close_dc:
                   1234:        DevCloseDC(global.CutCopyDC);
                   1235:        return FALSE;
                   1236:     }
                   1237: 
                   1238:     return FALSE;
                   1239: }
                   1240: 
                   1241: 
                   1242: 
                   1243: 
                   1244: /************************************************************************
                   1245: *
                   1246: *   LfPaste
                   1247: *
                   1248: *   Pastes the selected rectangle from the clipboard to the bitmap.
                   1249: *   Hides the selection rectangle before calling WinTrackRect.
                   1250: *
                   1251: ************************************************************************/
                   1252: 
                   1253: VOID
                   1254: LfPaste(hwnd)
                   1255: HWND hwnd;
                   1256: {
                   1257:     HPS hps;
                   1258:     PRECTL prcl;
                   1259:     TRACKINFO ti;
                   1260:     POINTL    aptl[4];
                   1261: 
                   1262: 
                   1263:     if (global.fShowSelectRc)
                   1264:     {
                   1265:        global.fShowSelectRc = FALSE;
                   1266:        hps = WinGetPS(hwnd);
                   1267:        if (global.fTempSelect)
                   1268:        {
                   1269:            prcl = &global.rclSelect;
                   1270:            global.fTempSelect = FALSE;
                   1271:        }
                   1272:        else
                   1273:            prcl = &global.rclCutCopy;
                   1274:        LfShowSelectRc(hps, prcl);
                   1275:        WinReleasePS(hps);
                   1276:     }
                   1277: 
                   1278:     WinSendMsg(global.hwndFrame, WM_QUERYTRACKINFO, (MPARAM)TF_MOVE, (MPARAM)&ti);
                   1279: 
                   1280:     ti.cxBorder = 1;
                   1281:     ti.cyBorder = 1;
                   1282:     ti.rclTrack.xLeft  = global.rclCutCopy.xLeft;
                   1283:     ti.rclTrack.yBottom = global.rclCutCopy.yBottom;
                   1284:     ti.rclTrack.xRight = global.rclCutCopy.xRight;
                   1285:     ti.rclTrack.yTop   = global.rclCutCopy.yTop;
                   1286:     ti.fs = TF_MOVE;
                   1287:     ti.ptlMinTrackSize.x = 1L;
                   1288:     ti.ptlMinTrackSize.y = 1L;
                   1289: 
                   1290:     if (WinTrackRect(hwnd, NULL, &ti))
                   1291:     {
                   1292:        if (global.fUseClipbrd)
                   1293:        {
                   1294:            if (WinOpenClipbrd(global.hab))
                   1295:            {
                   1296:                /* copy bits here */
                   1297:                WinCloseClipbrd(global.hab);
                   1298:            }
                   1299:        }
                   1300:        else
                   1301:        {
                   1302:            aptl[0].x = ti.rclTrack.xLeft;
                   1303:            aptl[0].y = ti.rclTrack.yBottom;
                   1304:            aptl[1].x = ti.rclTrack.xLeft   + (global.rclCutCopy.xRight - global.rclCutCopy.xLeft);
                   1305:            aptl[1].y = ti.rclTrack.yBottom + (global.rclCutCopy.yTop   - global.rclCutCopy.yBottom);
                   1306:            aptl[2].x = 0L;
                   1307:            aptl[2].y = 0L;
                   1308: 
                   1309:            GpiBitBlt(global.pThrTop->hps, global.CutCopyPS, 3L, aptl, global.ulPasteROP, NULL);
                   1310:            WinInvalidateRect(global.hwnd, &(ti.rclTrack), FALSE);
                   1311:        }
                   1312:     }
                   1313: }
                   1314: 
                   1315: 
                   1316: 
                   1317: 
                   1318: /************************************************************************
                   1319: *
                   1320: *   LfSelectXform
                   1321: *
                   1322: *   Select a similarity transform.
                   1323: *
                   1324: ************************************************************************/
                   1325: 
                   1326: VOID
                   1327: LfSelectXform(hwnd, pthr, id)
                   1328: HWND hwnd;
                   1329: PTHR pthr;
                   1330: USHORT id;
                   1331: {
                   1332:     BOOL fAlreadySaidIt = FALSE;
                   1333: 
                   1334: 
                   1335:     if ((id != pthr->usCurXform) ||
                   1336:        ((id != global.usCurXform) && global.fUpdateAttrs))
                   1337:     {
                   1338:        if (global.fUpdateAttrs && (global.flMiscAttrs & LFA_CURXFORM))
                   1339:        {
                   1340:            MyMessageBox(hwnd, pszAttrs);
                   1341:            fAlreadySaidIt = TRUE;
                   1342:        }
                   1343: 
                   1344:        global.flMiscAttrs |= LFA_CURXFORM;
                   1345: 
                   1346:        if (LfIsThreadTop(pthr))
                   1347:        {
                   1348:            if (fAlreadySaidIt)
                   1349:                UNCHECK_MENU_ITEM(global.hwndFrame, global.usCurXform);
                   1350:            else
                   1351:                UNCHECK_MENU_ITEM(global.hwndFrame, pthr->usCurXform);
                   1352:            global.usCurXform = id;
                   1353:            CHECK_MENU_ITEM(global.hwndFrame, id);
                   1354:        }
                   1355:        else
                   1356:            global.usCurXform = id;
                   1357: 
                   1358:        pthr->fUpdateAttrs  = TRUE;
                   1359:        global.fUpdateAttrs = TRUE;
                   1360:     }
                   1361: 
                   1362:     if (pthr->fAutoSelectDims)
                   1363:     {
                   1364:        if (global.fUpdateAttrs && (global.flMiscAttrs & (LFA_XSCALE |
                   1365:                 LFA_YSCALE | LFA_XOFF | LFA_YOFF | LFA_POLYGONSIDES)))
                   1366:            if (!fAlreadySaidIt)
                   1367:                MyMessageBox(hwnd, pszAttrs);
                   1368: 
                   1369:        global.dblXScale      = aXform[id - IDM_SHARKTOOTH].xScale;
                   1370:        global.dblYScale      = aXform[id - IDM_SHARKTOOTH].yScale;
                   1371:        global.dblXOff        = aXform[id - IDM_SHARKTOOTH].xOff;
                   1372:        global.dblYOff        = aXform[id - IDM_SHARKTOOTH].yOff;
                   1373:        global.usPolygonSides = aXform[id - IDM_SHARKTOOTH].usSides;
                   1374: 
                   1375:        global.flMiscAttrs |= LFA_XSCALE | LFA_YSCALE | LFA_XOFF | LFA_YOFF |
                   1376:                              LFA_POLYGONSIDES;
                   1377:        pthr->fUpdateAttrs  = TRUE;
                   1378:        global.fUpdateAttrs = TRUE;
                   1379:     }
                   1380: }
                   1381: 
                   1382: 
                   1383: 
                   1384: 
                   1385: /************************************************************************
                   1386: *
                   1387: *   LfSelectPrim
                   1388: *
                   1389: *   Select a drawing primitive.
                   1390: *
                   1391: ************************************************************************/
                   1392: 
                   1393: VOID
                   1394: LfSelectPrim(hwnd, pthr, id)
                   1395: HWND hwnd;
                   1396: PTHR pthr;
                   1397: USHORT id;
                   1398: {
                   1399:     BOOL fAlreadySaidIt = FALSE;
                   1400: 
                   1401: 
                   1402:     if ((id != pthr->usCurPrim) ||
                   1403:        ((id != global.usCurPrim) && global.fUpdateAttrs))
                   1404:     {
                   1405:        if (global.fUpdateAttrs && (global.flMiscAttrs & LFA_CURPRIM))
                   1406:        {
                   1407:            MyMessageBox(hwnd, "Previous attributes not read yet.");
                   1408:            fAlreadySaidIt = TRUE;
                   1409:        }
                   1410: 
                   1411:        if (LfIsThreadTop(pthr))
                   1412:        {
                   1413:            if (fAlreadySaidIt)
                   1414:                UNCHECK_MENU_ITEM(global.hwndFrame, global.usCurPrim);
                   1415:            else
                   1416:                UNCHECK_MENU_ITEM(global.hwndFrame, pthr->usCurPrim);
                   1417:            global.usCurPrim = id;
                   1418:            CHECK_MENU_ITEM(global.hwndFrame, id);
                   1419:        }
                   1420:        else
                   1421:            global.usCurPrim = id;
                   1422: 
                   1423:        global.flMiscAttrs |= LFA_CURPRIM;
                   1424:        pthr->fUpdateAttrs  = TRUE;
                   1425:        global.fUpdateAttrs = TRUE;
                   1426:     }
                   1427: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.