Annotation of researchv9/X11/src/X.V11R1/server/ddx/sun/sunBW2.c, revision 1.1

1.1     ! root        1: /*-
        !             2:  * sunBW2.c --
        !             3:  *     Functions for handling the sun BWTWO board.
        !             4:  *
        !             5:  * Copyright (c) 1987 by the Regents of the University of California
        !             6:  * Copyright (c) 1987 by Adam de Boor, UC Berkeley
        !             7:  *
        !             8:  * Permission to use, copy, modify, and distribute this
        !             9:  * software and its documentation for any purpose and without
        !            10:  * fee is hereby granted, provided that the above copyright
        !            11:  * notice appear in all copies.  The University of California
        !            12:  * makes no representations about the suitability of this
        !            13:  * software for any purpose.  It is provided "as is" without
        !            14:  * express or implied warranty.
        !            15:  *
        !            16:  *
        !            17:  */
        !            18: 
        !            19: /************************************************************
        !            20: Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
        !            21: 
        !            22:                     All Rights Reserved
        !            23: 
        !            24: Permission  to  use,  copy,  modify,  and  distribute   this
        !            25: software  and  its documentation for any purpose and without
        !            26: fee is hereby granted, provided that the above copyright no-
        !            27: tice  appear  in all copies and that both that copyright no-
        !            28: tice and this permission notice appear in  supporting  docu-
        !            29: mentation,  and  that the names of Sun or MIT not be used in
        !            30: advertising or publicity pertaining to distribution  of  the
        !            31: software  without specific prior written permission. Sun and
        !            32: M.I.T. make no representations about the suitability of this
        !            33: software for any purpose. It is provided "as is" without any
        !            34: express or implied warranty.
        !            35: 
        !            36: SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
        !            37: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
        !            38: NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
        !            39: ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            40: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
        !            41: PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
        !            42: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
        !            43: THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            44: 
        !            45: ********************************************************/
        !            46: 
        !            47: 
        !            48: #ifndef        lint
        !            49: static char sccsid[] = "%W %G Copyright 1987 Sun Micro";
        !            50: #endif
        !            51: 
        !            52: /*-
        !            53:  * Copyright (c) 1987 by Sun Microsystems,  Inc.
        !            54:  */
        !            55: 
        !            56: #include    "sun.h"
        !            57: #include    "resource.h"
        !            58: 
        !            59: #include    <sys/mman.h>
        !            60: #include    <sundev/bw2reg.h>
        !            61: 
        !            62: extern caddr_t mmap();
        !            63: 
        !            64: typedef struct bw2 {
        !            65:     u_char     image[BW2_FBSIZE];          /* Pixel buffer */
        !            66: } BW2, BW2Rec, *BW2Ptr;
        !            67: 
        !            68: typedef struct bw2hr {
        !            69:     u_char     image[BW2_FBSIZE_HIRES];          /* Pixel buffer */
        !            70: } BW2HR, BW2HRRec, *BW2HRPtr;
        !            71: 
        !            72: 
        !            73: /*-
        !            74:  *-----------------------------------------------------------------------
        !            75:  * sunBW2SaveScreen --
        !            76:  *     Disable the video on the frame buffer to save the screen.
        !            77:  *
        !            78:  * Results:
        !            79:  *     None.
        !            80:  *
        !            81:  * Side Effects:
        !            82:  *     Video enable state changes.
        !            83:  *
        !            84:  *-----------------------------------------------------------------------
        !            85:  */
        !            86: static Bool
        !            87: sunBW2SaveScreen (pScreen, on)
        !            88:     ScreenPtr    pScreen;
        !            89:     Bool         on;
        !            90: {
        !            91:     int         state = on;
        !            92: 
        !            93:     switch (on) {
        !            94:     case SCREEN_SAVER_FORCER:
        !            95:        SetTimeSinceLastInputEvent();
        !            96:        screenSaved = FALSE;
        !            97:        state = FBVIDEO_ON;
        !            98:        break;
        !            99:     case SCREEN_SAVER_OFF:
        !           100:        screenSaved = FALSE;
        !           101:        state = FBVIDEO_ON;
        !           102:        break;
        !           103:     case SCREEN_SAVER_ON:
        !           104:     default:
        !           105:        screenSaved = TRUE;
        !           106:        state = FBVIDEO_OFF;
        !           107:        break;
        !           108:     }
        !           109:     (void) ioctl(sunFbs[pScreen->myNum].fd, FBIOSVIDEO, &state);
        !           110:     return TRUE;
        !           111: }
        !           112: 
        !           113: /*-
        !           114:  *-----------------------------------------------------------------------
        !           115:  * sunBW2CloseScreen --
        !           116:  *     called to ensure video is enabled when server exits.
        !           117:  *
        !           118:  * Results:
        !           119:  *     Screen is unsaved.
        !           120:  *
        !           121:  * Side Effects:
        !           122:  *     None
        !           123:  *
        !           124:  *-----------------------------------------------------------------------
        !           125:  */
        !           126: /*ARGSUSED*/
        !           127: static Bool
        !           128: sunBW2CloseScreen(i, pScreen)
        !           129:     int                i;
        !           130:     ScreenPtr  pScreen;
        !           131: {
        !           132:     return (pScreen->SaveScreen(pScreen, SCREEN_SAVER_OFF));
        !           133: }
        !           134: 
        !           135: /*-
        !           136:  *-----------------------------------------------------------------------
        !           137:  * sunBW2ResolveColor --
        !           138:  *     Resolve an RGB value into some sort of thing we can handle.
        !           139:  *     Just looks to see if the intensity of the color is greater than
        !           140:  *     1/2 and sets it to 'white' (all ones) if so and 'black' (all zeroes)
        !           141:  *     if not.
        !           142:  *
        !           143:  * Results:
        !           144:  *     *pred, *pgreen and *pblue are overwritten with the resolved color.
        !           145:  *
        !           146:  * Side Effects:
        !           147:  *     see above.
        !           148:  *
        !           149:  *-----------------------------------------------------------------------
        !           150:  */
        !           151: /*ARGSUSED*/
        !           152: static void
        !           153: sunBW2ResolveColor(pred, pgreen, pblue, pVisual)
        !           154:     unsigned short     *pred;
        !           155:     unsigned short     *pgreen;
        !           156:     unsigned short     *pblue;
        !           157:     VisualPtr          pVisual;
        !           158: {
        !           159:     /* 
        !           160:      * Gets intensity from RGB.  If intensity is >= half, pick white, else
        !           161:      * pick black.  This may well be more trouble than it's worth.
        !           162:      */
        !           163:     *pred = *pgreen = *pblue = 
        !           164:         (((39L * *pred +
        !           165:            50L * *pgreen +
        !           166:            11L * *pblue) >> 8) >= (((1<<8)-1)*50)) ? ~0 : 0;
        !           167: }
        !           168: 
        !           169: /*-
        !           170:  *-----------------------------------------------------------------------
        !           171:  * sunBW2CreateColormap --
        !           172:  *     create a bw colormap
        !           173:  *
        !           174:  * Results:
        !           175:  *     None
        !           176:  *
        !           177:  * Side Effects:
        !           178:  *     allocate two pixels
        !           179:  *
        !           180:  *-----------------------------------------------------------------------
        !           181:  */
        !           182: void
        !           183: sunBW2CreateColormap(pmap)
        !           184:     ColormapPtr        pmap;
        !           185: {
        !           186:     int        red, green, blue, pix;
        !           187: 
        !           188:     /* this is a monochrome colormap, it only has two entries, just fill
        !           189:      * them in by hand.  If it were a more complex static map, it would be
        !           190:      * worth writing a for loop or three to initialize it */
        !           191: 
        !           192:     /* this will be pixel 0 */
        !           193:     red = green = blue = ~0;
        !           194:     AllocColor(pmap, &red, &green, &blue, &pix, 0);
        !           195: 
        !           196:     /* this will be pixel 1 */
        !           197:     red = green = blue = 0;
        !           198:     AllocColor(pmap, &red, &green, &blue, &pix, 0);
        !           199: 
        !           200: }
        !           201: 
        !           202: /*-
        !           203:  *-----------------------------------------------------------------------
        !           204:  * sunBW2DestroyColormap --
        !           205:  *     destroy a bw colormap
        !           206:  *
        !           207:  * Results:
        !           208:  *     None
        !           209:  *
        !           210:  * Side Effects:
        !           211:  *     None
        !           212:  *
        !           213:  *-----------------------------------------------------------------------
        !           214:  */
        !           215: /*ARGSUSED*/
        !           216: void
        !           217: sunBW2DestroyColormap(pmap)
        !           218:     ColormapPtr        pmap;
        !           219: {
        !           220: }
        !           221: 
        !           222: /*-
        !           223:  *-----------------------------------------------------------------------
        !           224:  * sunBW2Init --
        !           225:  *     Attempt to find and initialize a bw2 framebuffer
        !           226:  *
        !           227:  * Results:
        !           228:  *     None
        !           229:  *
        !           230:  * Side Effects:
        !           231:  *     Most of the elements of the ScreenRec are filled in.  The
        !           232:  *     video is enabled for the frame buffer...
        !           233:  *
        !           234:  *-----------------------------------------------------------------------
        !           235:  */
        !           236: /*ARGSUSED*/
        !           237: static Bool
        !           238: sunBW2Init (index, pScreen, argc, argv)
        !           239:     int                  index;        /* The index of pScreen in the ScreenInfo */
        !           240:     ScreenPtr    pScreen;      /* The Screen to initialize */
        !           241:     int                  argc;         /* The number of the Server's arguments. */
        !           242:     char         **argv;       /* The arguments themselves. Don't change! */
        !           243: {
        !           244:     ColormapPtr pColormap;
        !           245: 
        !           246:     if (!mfbScreenInit(index, pScreen,
        !           247:                           sunFbs[index].fb,
        !           248:                           sunFbs[index].info.fb_width,
        !           249:                           sunFbs[index].info.fb_height, 90, 90))
        !           250:        return (FALSE);
        !           251: 
        !           252:     pScreen->SaveScreen = sunBW2SaveScreen;
        !           253:     pScreen->RealizeCursor = sunRealizeCursor;
        !           254:     pScreen->UnrealizeCursor = sunUnrealizeCursor;
        !           255:     pScreen->DisplayCursor = sunDisplayCursor;
        !           256:     pScreen->SetCursorPosition = sunSetCursorPosition;
        !           257:     pScreen->CursorLimits = sunCursorLimits;
        !           258:     pScreen->PointerNonInterestBox = sunPointerNonInterestBox;
        !           259:     pScreen->ConstrainCursor = sunConstrainCursor;
        !           260:     pScreen->RecolorCursor = sunRecolorCursor;
        !           261:     pScreen->ResolveColor = sunBW2ResolveColor;
        !           262:     pScreen->CreateColormap = sunBW2CreateColormap;
        !           263:     pScreen->DestroyColormap = sunBW2DestroyColormap;
        !           264:     pScreen->RegionCreate = miRegionCreate;
        !           265:     pScreen->RegionCopy = miRegionCopy;
        !           266:     pScreen->RegionDestroy = miRegionDestroy;
        !           267:     pScreen->Intersect = miIntersect;
        !           268:     pScreen->Inverse = miInverse;
        !           269:     pScreen->Union = miUnion;
        !           270:     pScreen->Subtract = miSubtract;
        !           271:     pScreen->RegionReset = miRegionReset;
        !           272:     pScreen->TranslateRegion = miTranslateRegion;
        !           273:     pScreen->RectIn = miRectIn;
        !           274:     pScreen->PointInRegion = miPointInRegion;
        !           275:     pScreen->whitePixel = 0;
        !           276:     pScreen->blackPixel = 1;
        !           277: 
        !           278: /*
        !           279:  * ZOIDS should only ever be defined if SUN_WINDOWS is also defined.
        !           280:  */
        !           281: #ifdef ZOIDS
        !           282:     {
        !           283:        GCPtr   pGC = CreateScratchGC(pScreen, 1);
        !           284: 
        !           285:        if (pGC) {
        !           286:            RegisterProc("PolySolidXAlignedTrapezoid", pGC,
        !           287:                          sunBW2SolidXZoids);
        !           288:            RegisterProc("PolySolidYAlignedTrapezoid", pGC,
        !           289:                          sunBW2SolidYZoids);
        !           290:            RegisterProc("PolyTiledXAlignedTrapezoid", pGC,
        !           291:                          sunBW2TiledXZoids);
        !           292:            RegisterProc("PolyTiledYAlignedTrapezoid", pGC,
        !           293:                          sunBW2TiledYZoids);
        !           294:            RegisterProc("PolyStipXAlignedTrapezoid", pGC,
        !           295:                          sunBW2StipXZoids);
        !           296:            RegisterProc("PolyStipYAlignedTrapezoid", pGC,
        !           297:                          sunBW2StipYZoids);
        !           298:            FreeScratchGC(pGC);
        !           299:        }
        !           300:     }
        !           301: #endif ZOIDS
        !           302: 
        !           303:     if (CreateColormap(pScreen->defColormap, pScreen,
        !           304:                   LookupID(pScreen->rootVisual, RT_VISUALID, RC_CORE),
        !           305:                   &pColormap, AllocNone, 0) != Success
        !           306:        || pColormap == NULL)
        !           307:            FatalError("Can't create colormap in sunBW2Init()\n");
        !           308:     mfbInstallColormap(pColormap);
        !           309: 
        !           310:     /*
        !           311:      * Enable video output...? 
        !           312:      */
        !           313:     (void) sunBW2SaveScreen(pScreen, SCREEN_SAVER_FORCER);
        !           314: 
        !           315:     sunScreenInit(pScreen);
        !           316:     return (TRUE);
        !           317: 
        !           318: }
        !           319: 
        !           320: /*-
        !           321:  *-----------------------------------------------------------------------
        !           322:  * sunBW2Probe --
        !           323:  *     Attempt to find and initialize a bw2 framebuffer
        !           324:  *
        !           325:  * Results:
        !           326:  *     None
        !           327:  *
        !           328:  * Side Effects:
        !           329:  *     Memory is allocated for the frame buffer and the buffer is mapped. 
        !           330:  *
        !           331:  *-----------------------------------------------------------------------
        !           332:  */
        !           333: 
        !           334: Bool
        !           335: sunBW2Probe(pScreenInfo, index, fbNum, argc, argv)
        !           336:     ScreenInfo   *pScreenInfo; /* The screenInfo struct */
        !           337:     int                  index;        /* The index of pScreen in the ScreenInfo */
        !           338:     int                  fbNum;        /* Index into the sunFbData array */
        !           339:     int                  argc;         /* The number of the Server's arguments. */
        !           340:     char         **argv;       /* The arguments themselves. Don't change! */
        !           341: {
        !           342:     int         i, oldNumScreens;
        !           343: 
        !           344:     if (sunFbData[fbNum].probeStatus == probedAndFailed) {
        !           345:        return FALSE;
        !           346:     }
        !           347: 
        !           348:     if (sunFbData[fbNum].probeStatus == neverProbed) {
        !           349:        int         fd;
        !           350:        struct fbtype fbType;
        !           351:        BW2Ptr      BW2fb = NULL;       /* Place to map the thing */
        !           352:        BW2HRPtr    BW2HRfb = NULL;     /* Place to map the thing */
        !           353:        int         isHiRes = 0;
        !           354: 
        !           355:        if ((fd = sunOpenFrameBuffer(FBTYPE_SUN2BW, &fbType, index, fbNum,
        !           356:                                     argc, argv)) < 0) {
        !           357:            sunFbData[fbNum].probeStatus = probedAndFailed;
        !           358:            return FALSE;
        !           359:        }
        !           360: 
        !           361:        isHiRes = (fbType.fb_width > 1152);
        !           362: #ifdef _MAP_NEW
        !           363:        if (isHiRes) {
        !           364:            BW2HRfb = (BW2HRPtr) mmap((caddr_t) 0, sizeof(BW2HRRec),
        !           365:                           PROT_READ | PROT_WRITE,
        !           366:                           MAP_SHARED | _MAP_NEW,
        !           367:                           fd, (off_t) 0);
        !           368:            if ((int)BW2HRfb == -1) {
        !           369:                Error("mapping BW2 (hires)");
        !           370:                sunFbData[fbNum].probeStatus = probedAndFailed;
        !           371:                (void) close(fd);
        !           372:                return FALSE;
        !           373:            }
        !           374:        }
        !           375:        else {
        !           376:            BW2fb = (BW2Ptr) mmap((caddr_t) 0, sizeof(BW2Rec),
        !           377:                         PROT_READ | PROT_WRITE,
        !           378:                         MAP_SHARED | _MAP_NEW,
        !           379:                         fd, (off_t) 0);
        !           380:            if ((int)BW2fb == -1) {
        !           381:                Error("mapping BW2");
        !           382:                sunFbData[fbNum].probeStatus = probedAndFailed;
        !           383:                (void) close(fd);
        !           384:                return FALSE;
        !           385:            }
        !           386:        }
        !           387: #else
        !           388:        if (isHiRes) {
        !           389:            BW2HRfb = (BW2HRPtr) valloc(sizeof(BW2HRRec));
        !           390:        }
        !           391:        else {
        !           392:            BW2fb = (BW2Ptr) valloc(sizeof(BW2Rec));
        !           393:        }
        !           394:        if ((BW2fb == (BW2Ptr) NULL) && (BW2HRfb == (BW2HRPtr) NULL)) {
        !           395:            ErrorF("Could not allocate room for frame buffer.\n");
        !           396:            sunFbData[fbNum].probeStatus = probedAndFailed;
        !           397:            (void) close(fd);
        !           398:            return FALSE;
        !           399:        }
        !           400:        if (mmap((isHiRes ? (pointer) BW2HRfb : (pointer) BW2fb),
        !           401:                 (isHiRes ? sizeof(BW2HRRec) : sizeof(BW2Rec)),
        !           402:                 PROT_READ | PROT_WRITE, MAP_SHARED,
        !           403:                 fd, (off_t) 0) < 0) {
        !           404:            ErrorF("Mapping bw2");
        !           405:            sunFbData[fbNum].probeStatus = probedAndFailed;
        !           406:            (void) close(fd);
        !           407:            return FALSE;
        !           408:        }
        !           409: #endif _MAP_NEW
        !           410: 
        !           411:        /*
        !           412:         * ZOIDS should only ever be defined if SUN_WINDOWS is also
        !           413:         * defined.
        !           414:         */
        !           415: #ifdef ZOIDS
        !           416:        if ((sunFbData[fbNum].pr = pr_open(sunFbData[fbNum].devName)) == 0) {
        !           417:            ErrorF("Opening bw2 pixrect");
        !           418:            sunFbData[fbNum].probeStatus = probedAndFailed;
        !           419:            /* do we need to free BW2fb or BW2HRfb? */
        !           420:            (void) close(fd);
        !           421:            return FALSE;
        !           422:        }
        !           423: 
        !           424:        if ((sunFbData[fbNum].scratch_pr = mem_create(
        !           425:                           fbType.fb_width, fbType.fb_height, 1)) == 0) {
        !           426:            ErrorF("Opening bw2 scratch pixrect");
        !           427:            sunFbData[fbNum].probeStatus = probedAndFailed;
        !           428:            /* do we need to free BW2fb or BW2HRfb? */
        !           429:            pr_destroy(sunFbData[fbNum].pr);
        !           430:            (void) close(fd);
        !           431:            return FALSE;
        !           432:        }
        !           433: #endif ZOIDS
        !           434:        sunFbs[index].fb = (isHiRes ? (pointer) BW2HRfb : (pointer) BW2fb);
        !           435:        sunFbs[index].fd = fd;
        !           436:        sunFbs[index].info = fbType;
        !           437:         sunFbs[index].EnterLeave = NoopDDA;
        !           438:        sunFbData[fbNum].probeStatus = probedAndSucceeded;
        !           439: 
        !           440:     }
        !           441: 
        !           442:     /*
        !           443:      * If we've ever successfully probed this device, do the following.
        !           444:      */
        !           445:     oldNumScreens = pScreenInfo->numScreens;
        !           446:     i = AddScreen(sunBW2Init, argc, argv);
        !           447:     pScreenInfo->screen[index].CloseScreen = sunBW2CloseScreen;
        !           448:     return (i > oldNumScreens);
        !           449: }
        !           450: 

unix.superglobalmegacorp.com

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