|
|
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: miglblt.c,v 1.16 87/09/08 10:10:10 toddb Exp $ */
26:
27: #include "X.h"
28: #include "Xmd.h"
29: #include "Xproto.h"
30: #include "fontstruct.h"
31: #include "dixfontstr.h"
32: #include "gcstruct.h"
33: #include "windowstr.h"
34: #include "scrnintstr.h"
35: #include "pixmap.h"
36: #include "servermd.h"
37:
38:
39: /*
40: machine-independent glyph blt.
41: assumes that glyph bits in snf are written in bytes,
42: have same bit order as the server's bitmap format,
43: and are byte padded. this corresponds to the snf distributed
44: with the sample server.
45:
46: get a scratch GC.
47: in the scratch GC set alu = GXcopy, fg = 1, bg = 0
48: allocate a bitmap big enough to hold the largest glyph in the font
49: validate the scratch gc with the bitmap
50: for each glyph
51: carefully put the bits of the glyph in a buffer,
52: padded to the server pixmap scanline padding rules
53: fake a call to PutImage from the buffer into the bitmap
54: use the bitmap in a call to PushPixels
55: */
56:
57: void
58: miPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
59: DrawablePtr pDrawable;
60: GC *pGC;
61: int x, y;
62: unsigned int nglyph;
63: CharInfoPtr *ppci; /* array of character info */
64: unsigned char *pglyphBase; /* start of array of glyphs */
65: {
66: int width, height;
67: PixmapPtr pPixmap;
68: int nbyLine; /* bytes per line of padded pixmap */
69: FontRec *pfont;
70: GCPtr pGCtmp;
71: register int i;
72: register int j;
73: unsigned char *pbits; /* buffer for PutImage */
74: register unsigned char *pb; /* temp pointer into buffer */
75: register CharInfoPtr pci; /* currect char info */
76: register unsigned char *pglyph; /* pointer bits in glyph */
77: int gWidth, gHeight; /* width and height of glyph */
78: register int nbyGlyphWidth; /* bytes per scanline of glyph */
79: int nbyPadGlyph; /* server padded line of glyph */
80:
81: int gcvals[3];
82:
83: if ((pDrawable->type == DRAWABLE_WINDOW) &&
84: (pGC->miTranslate))
85: {
86: x += ((WindowPtr)pDrawable)->absCorner.x;
87: y += ((WindowPtr)pDrawable)->absCorner.y;
88: }
89:
90: pfont = pGC->font;
91: width = pfont->pFI->maxbounds.metrics.rightSideBearing -
92: pfont->pFI->minbounds.metrics.leftSideBearing;
93: height = pfont->pFI->maxbounds.metrics.ascent +
94: pfont->pFI->maxbounds.metrics.descent;
95:
96: pPixmap = (PixmapPtr)(*pDrawable->pScreen->CreatePixmap)
97: (pDrawable->pScreen, width, height, 1, XYBitmap);
98:
99: pGCtmp = GetScratchGC(1, pDrawable->pScreen);
100:
101: gcvals[0] = GXcopy;
102: gcvals[1] = 1;
103: gcvals[2] = 0;
104:
105: DoChangeGC(pGCtmp, GCFunction|GCForeground|GCBackground, gcvals, 0);
106:
107: nbyLine = PixmapBytePad(width, 1);
108: pbits = (unsigned char *)ALLOCATE_LOCAL(height*nbyLine);
109: if (!pbits)
110: return ;
111:
112: while(nglyph--)
113: {
114: pci = *ppci++;
115: pglyph = pglyphBase + pci->byteOffset;
116: gWidth = GLYPHWIDTHPIXELS(pci);
117: gHeight = GLYPHHEIGHTPIXELS(pci);
118: nbyGlyphWidth = GLYPHWIDTHBYTESPADDED(pci);
119: nbyPadGlyph = PixmapBytePad(gWidth, 1);
120:
121: for (i=0, pb = pbits; i<gHeight; i++, pb = pbits+(i*nbyPadGlyph))
122: for (j = 0; j < nbyGlyphWidth; j++)
123: *pb++ = *pglyph++;
124:
125:
126: if ((pGCtmp->serialNumber) != (pPixmap->drawable.serialNumber))
127: ValidateGC(pPixmap, pGCtmp);
128: (*pGCtmp->PutImage)(pPixmap, pGCtmp, pPixmap->drawable.depth,
129: 0, 0, gWidth, gHeight,
130: 0, XYBitmap, pbits);
131:
132: if ((pGC->serialNumber) != (pDrawable->serialNumber))
133: ValidateGC(pDrawable, pGC);
134: (*pGC->PushPixels)(pGC, pPixmap, pDrawable,
135: gWidth, gHeight,
136: x + pci->metrics.leftSideBearing,
137: y - pci->metrics.ascent);
138: x += pci->metrics.characterWidth;
139: }
140: (*pDrawable->pScreen->DestroyPixmap)(pPixmap);
141: DEALLOCATE_LOCAL(pbits);
142: FreeScratchGC(pGCtmp);
143: }
144:
145:
146: void
147: miImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
148: DrawablePtr pDrawable;
149: GC *pGC;
150: int x, y;
151: unsigned int nglyph;
152: CharInfoPtr *ppci; /* array of character info */
153: unsigned char *pglyphBase; /* start of array of glyphs */
154: {
155: ExtentInfoRec info; /* used by QueryGlyphExtents() */
156: long gcvals[3];
157: int oldAlu, oldFS;
158: unsigned long oldFG;
159: xRectangle backrect;
160:
161: QueryGlyphExtents(pGC->font, ppci, nglyph, &info);
162:
163: backrect.x = x;
164: backrect.y = y - pGC->font->pFI->fontAscent;
165: backrect.width = info.overallWidth;
166: backrect.height = pGC->font->pFI->fontAscent +
167: pGC->font->pFI->fontDescent;
168:
169: oldAlu = pGC->alu;
170: oldFG = pGC->fgPixel;
171: oldFS = pGC->fillStyle;
172:
173: /* fill in the background */
174: gcvals[0] = (long) GXcopy;
175: gcvals[1] = (long) pGC->bgPixel;
176: gcvals[2] = (long) FillSolid;
177: DoChangeGC(pGC, GCFunction|GCForeground|GCFillStyle, gcvals, 0);
178: ValidateGC(pDrawable, pGC);
179: (*pGC->PolyFillRect)(pDrawable, pGC, 1, &backrect);
180:
181: /* put down the glyphs */
182: gcvals[0] = (long) oldFG;
183: DoChangeGC(pGC, GCForeground, gcvals, 0);
184: ValidateGC(pDrawable, pGC);
185: (*pGC->PolyGlyphBlt)(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
186:
187: /* put all the toys away when done playing */
188: gcvals[0] = (long) oldAlu;
189: gcvals[1] = (long) oldFG;
190: gcvals[2] = (long) oldFS;
191: DoChangeGC(pGC, GCFunction|GCForeground|GCFillStyle, gcvals, 0);
192: /*
193: ???
194: should we cal ValidateGC now, to leave everything exactly as we
195: found it
196: ???
197: */
198:
199: }
200:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.