Annotation of researchv9/X11/src/X.V11R1/server/dix/glyphcurs.c, revision 1.1.1.1

1.1       root        1: /************************************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ************************************************************************/
                     24: 
                     25: /* $Header: glyphcurs.c,v 1.8 87/09/07 18:54:49 rws Exp $ */
                     26: 
                     27: #include "X.h"
                     28: #include "Xmd.h"
                     29: #include "Xproto.h"
                     30: #include "dixfontstr.h"
                     31: #include "fontstruct.h"
                     32: #include "scrnintstr.h"
                     33: #include "gcstruct.h"
                     34: #include "resource.h"
                     35: #include "dix.h"
                     36: #include "cursorstr.h"
                     37: #include "misc.h"
                     38: #include "opaque.h"
                     39: #include "servermd.h"
                     40: 
                     41: 
                     42: /*
                     43:     get the bits out of the font in a portable way.  to avoid
                     44: dealing with padding and such-like, we draw the glyph into
                     45: a bitmap, then read the bits out with GetImage, which
                     46: uses server-natural format.
                     47:     since all screens return the same bitmap format, we'll just use
                     48: the first one we find.
                     49:     if the font isn't there, it's probably been sent from
                     50: the mask part of CreateGlyphCursor, so we return a bitmap
                     51: filled with 1s.
                     52:     the character origin lines up with the hotspot in the
                     53: cursor metrics.
                     54: */
                     55: 
                     56: int
                     57: ServerBitsFromGlyph(fontID, pfont, ch, cm, ppbits)
                     58:     XID                fontID;
                     59:     FontPtr    pfont;
                     60:     unsigned short ch;
                     61:     register CursorMetricPtr cm;
                     62:     unsigned char **ppbits;
                     63: {
                     64:     register ScreenPtr pScreen;
                     65:     register GCPtr pGC;
                     66:     xRectangle rect;
                     67:     PixmapPtr ppix;
                     68:     int nby;
                     69:     unsigned char *pbits;
                     70:     int gcval[3];
                     71:     unsigned char char2b[2];
                     72: 
                     73:     /* this takes in a short, which needs to be made into a char2b 
                     74:        the msb of the short is byte1, the lsb is byte2
                     75:        this is the way a short is on the 68000 anyway.  not a whole lot
                     76:     of time here, so just do it always to cut down on extra flags in the
                     77:     compilation.  the glyph access code might turn this all back into
                     78:     a short; this routine takes a short for the beneffit of application
                     79:     writers using a linear cursor font, so they don't have to think
                     80:     about 2-byte characters.
                     81:        sigh.
                     82:     */
                     83:     char2b[0] = (unsigned char)(ch >> 8);
                     84:     char2b[1] = (unsigned char)(ch & 0xff);
                     85: 
                     86:     pScreen = &screenInfo.screen[0];
                     87:     nby = PixmapBytePad(cm->width, 1) * cm->height;
                     88:     pbits = (unsigned char *)Xalloc(nby);
                     89:     if (!pbits)
                     90:        return BadAlloc;
                     91: 
                     92:     ppix = (PixmapPtr)(*pScreen->CreatePixmap)(pScreen, cm->width,
                     93:                                               cm->height, 1);
                     94:     if (!ppix)
                     95:     {
                     96:        Xfree(pbits);
                     97:        return BadAlloc;
                     98:     }
                     99:     pGC = GetScratchGC(1, pScreen);
                    100: 
                    101:     rect.x = 0;
                    102:     rect.y = 0;
                    103:     rect.width = cm->width;
                    104:     rect.height = cm->height;
                    105: 
                    106:     if (!pfont)
                    107:     {
                    108:        /* fill the pixmap with 1 */
                    109:        gcval[0] = GXcopy;
                    110:        gcval[1] = 1;
                    111:        DoChangeGC(pGC, GCFunction | GCForeground, gcval, 0);
                    112:        ValidateGC(ppix, pGC);
                    113:        (*pGC->PolyFillRect)(ppix, pGC, 1, &rect);
                    114:     }
                    115:     else
                    116:     {
                    117:        /* fill the pixmap with 0 */
                    118:        gcval[0] = GXcopy;
                    119:        gcval[1] = 0;
                    120:        gcval[2] = fontID;
                    121:        DoChangeGC(pGC, GCFunction | GCForeground | GCFont, gcval, 0);
                    122:        ValidateGC(ppix, pGC);
                    123:        (*pGC->PolyFillRect)(ppix, pGC, 1, &rect);
                    124: 
                    125:        /* draw the glyph */
                    126:        gcval[0] = 1;
                    127:        DoChangeGC(pGC, GCForeground, gcval, 0);
                    128:        ValidateGC(ppix, pGC);
                    129:        (*pGC->PolyText16)(ppix, pGC, cm->xhot, cm->yhot, 1, char2b);
                    130:     }
                    131:     (*pScreen->GetImage)(ppix, 0, 0, cm->width, cm->height,
                    132:                         ZPixmap, 0xffffffff, pbits);
                    133:     *ppbits = pbits;
                    134:     FreeScratchGC(pGC);
                    135:     (*pScreen->DestroyPixmap)(ppix);
                    136:     return Success;
                    137: }
                    138: 
                    139: 
                    140: Bool
                    141: CursorMetricsFromGlyph( pfont, ch, cm)
                    142:     register FontPtr   pfont;
                    143:     int                ch;
                    144:     register CursorMetricPtr cm;
                    145: {
                    146:     register CharInfoPtr       pci = ADDRXTHISCHARINFO(pfont, ch);
                    147: 
                    148:     if (   ch < pfont->pFI->chFirst
                    149:        || ch >= pfont->pFI->chFirst + n1dChars(pfont->pFI))
                    150:     {
                    151:        cm->width = 0;
                    152:        cm->height = 0;
                    153:        cm->xhot = 0;
                    154:        cm->yhot = 0;
                    155:        return FALSE;
                    156:     }
                    157:     cm->xhot = - pci->metrics.leftSideBearing;
                    158:     cm->yhot =   pci->metrics.ascent;
                    159:     cm->width = pci->metrics.rightSideBearing + cm->xhot;
                    160:     cm->height = pci->metrics.descent + cm->yhot;
                    161: 
                    162:     return TRUE;
                    163: }
                    164: 
                    165: 
                    166: 

unix.superglobalmegacorp.com

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