|
|
1.1 ! root 1: /* $Header: mfbtegblt.c,v 1.1 87/09/11 07:48:45 toddb Exp $ */ ! 2: /*********************************************************** ! 3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ! 4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts. ! 5: ! 6: All Rights Reserved ! 7: ! 8: Permission to use, copy, modify, and distribute this software and its ! 9: documentation for any purpose and without fee is hereby granted, ! 10: provided that the above copyright notice appear in all copies and that ! 11: both that copyright notice and this permission notice appear in ! 12: supporting documentation, and that the names of Digital or MIT not be ! 13: used in advertising or publicity pertaining to distribution of the ! 14: software without specific, written prior permission. ! 15: ! 16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 22: SOFTWARE. ! 23: ! 24: ******************************************************************/ ! 25: #include "X.h" ! 26: #include "Xmd.h" ! 27: #include "Xproto.h" ! 28: #include "fontstruct.h" ! 29: #include "dixfontstr.h" ! 30: #include "gcstruct.h" ! 31: #include "windowstr.h" ! 32: #include "scrnintstr.h" ! 33: #include "pixmapstr.h" ! 34: #include "regionstr.h" ! 35: #include "mfb.h" ! 36: #include "maskbits.h" ! 37: ! 38: /* ! 39: this works for fonts with glyphs <= 32 bits wide. ! 40: ! 41: This should be called only with a terminal-emulator font; ! 42: this means that the FIXED_METRICS flag is set, and that ! 43: glyphbounds == charbounds. ! 44: ! 45: in theory, this goes faster; even if it doesn't, it reduces the ! 46: flicker caused by writing a string over itself with image text (since ! 47: the background gets repainted per character instead of per string.) ! 48: this seems to be important for some converted X10 applications. ! 49: ! 50: Image text looks at the bits in the glyph and the fg and bg in the ! 51: GC. it paints a rectangle, as defined in the protocol dcoument, ! 52: and the paints the characters. ! 53: ! 54: to avoid source proliferation, this file is compiled ! 55: two times: ! 56: MFBTEGLYPHBLT OP ! 57: mfbTEGlyphBltWhite (white text, black bg ) ! 58: mfbTEGlyphBltBlack ~ (black text, white bg ) ! 59: ! 60: */ ! 61: ! 62: void ! 63: MFBTEGLYPHBLT(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase) ! 64: DrawablePtr pDrawable; ! 65: GC *pGC; ! 66: int x, y; ! 67: unsigned int nglyph; ! 68: CharInfoPtr *ppci; /* array of character info */ ! 69: unsigned char *pglyphBase; /* start of array of glyphs */ ! 70: { ! 71: CharInfoPtr pci; ! 72: FontInfoPtr pfi = pGC->font->pFI; ! 73: int xorg, yorg; ! 74: int widthDst; ! 75: unsigned int *pdstBase; /* pointer to longword with top row ! 76: of current glyph */ ! 77: ! 78: int w; /* width of glyph and char */ ! 79: int h; /* height of glyph and char */ ! 80: register int xpos; /* current x%32 */ ! 81: int ypos; /* current y%32 */ ! 82: register unsigned char *pglyph; ! 83: int widthGlyph; ! 84: ! 85: register unsigned int *pdst;/* pointer to current longword in dst */ ! 86: int hTmp; /* counter for height */ ! 87: register int startmask, endmask; ! 88: int nfirst; /* used if glyphs spans a longword boundary */ ! 89: register unsigned int tmpSrc; ! 90: BoxRec bbox; /* for clipping */ ! 91: ! 92: if (pDrawable->type == DRAWABLE_WINDOW) ! 93: { ! 94: xorg = ((WindowPtr)pDrawable)->absCorner.x; ! 95: yorg = ((WindowPtr)pDrawable)->absCorner.y; ! 96: pdstBase = (unsigned int *) ! 97: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devPrivate); ! 98: widthDst = (int) ! 99: (((PixmapPtr)(pDrawable->pScreen->devPrivate))->devKind) >> 2; ! 100: } ! 101: else ! 102: { ! 103: xorg = 0; ! 104: yorg = 0; ! 105: pdstBase = (unsigned int *)(((PixmapPtr)pDrawable)->devPrivate); ! 106: widthDst = (int)(((PixmapPtr)pDrawable)->devKind) >> 2; ! 107: } ! 108: ! 109: xpos = x + xorg; ! 110: ypos = y + yorg; ! 111: ! 112: pci = &pfi->maxbounds; ! 113: w = pci->metrics.characterWidth; ! 114: h = pfi->fontAscent + pfi->fontDescent; ! 115: widthGlyph = GLYPHWIDTHBYTESPADDED(pci); ! 116: ! 117: xpos += pci->metrics.leftSideBearing; ! 118: ypos -= pfi->fontAscent; ! 119: ! 120: bbox.x1 = xpos; ! 121: bbox.x2 = xpos + (w * nglyph); ! 122: bbox.y1 = ypos; ! 123: bbox.y2 = ypos + h; ! 124: ! 125: switch ((*pGC->pScreen->RectIn)( ! 126: ((mfbPrivGC *)(pGC->devPriv))->pCompositeClip, &bbox)) ! 127: { ! 128: case rgnOUT: ! 129: break; ! 130: case rgnPART: ! 131: /* this is the WRONG thing to do, but it works. ! 132: calling the non-terminal text is easy, but slow, given ! 133: what we know about the font. ! 134: ! 135: the right thing to do is something like: ! 136: for each clip rectangle ! 137: compute at which row the glyph starts to be in it, ! 138: and at which row the glyph ceases to be in it ! 139: compute which is the first glyph inside the left ! 140: edge, and the last one inside the right edge ! 141: draw a fractional first glyph, using only ! 142: the rows we know are in ! 143: draw all the whole glyphs, using the appropriate rows ! 144: draw any pieces of the last glyph, using the right rows ! 145: ! 146: this way, the code would take advantage of knowing that ! 147: all glyphs are the same height and don't overlap. ! 148: ! 149: one day... ! 150: */ ! 151: CLIPTETEXT(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); ! 152: break; ! 153: case rgnIN: ! 154: pdstBase += ((widthDst * ypos) + (xpos >> 5)); ! 155: xpos &= 0x1f; ! 156: while(nglyph--) ! 157: { ! 158: pglyph = pglyphBase + (*ppci++)->byteOffset; ! 159: hTmp = h; ! 160: pdst = pdstBase; ! 161: ! 162: if ( (xpos+w) < 32) ! 163: { ! 164: maskpartialbits(xpos, w, startmask); ! 165: while(hTmp--) ! 166: { ! 167: getleftbits(pglyph, w, tmpSrc); ! 168: *pdst = (*pdst & ~startmask) | ! 169: (OP(SCRRIGHT(tmpSrc, xpos)) & startmask); ! 170: pdst += widthDst; ! 171: pglyph += widthGlyph; ! 172: } ! 173: xpos += w; ! 174: } ! 175: else ! 176: { ! 177: mask32bits(xpos, w, startmask, endmask); ! 178: nfirst = 32 - xpos; ! 179: while(hTmp--) ! 180: { ! 181: getleftbits(pglyph, w, tmpSrc); ! 182: *pdst = (*pdst & ~startmask) | ! 183: (OP(SCRRIGHT(tmpSrc, xpos)) & startmask); ! 184: *(pdst+1) = (*(pdst+1) & ~endmask) | ! 185: (OP(SCRLEFT(tmpSrc, nfirst)) & endmask); ! 186: pdst += widthDst; ! 187: pglyph += widthGlyph; ! 188: } ! 189: xpos += w; ! 190: xpos &= 0x1f; ! 191: pdstBase++; ! 192: } ! 193: } ! 194: break; ! 195: } ! 196: } ! 197:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.