1
/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaGCmisc.c,v 1.14 2000/05/03 00:44:23 tsi Exp $ */
3
#ifdef HAVE_XORG_CONFIG_H
4
#include <xorg-config.h>
9
#include "xf86_ansic.h"
10
#include "xf86_OSproc.h"
13
#include "scrnintstr.h"
14
#include <X11/fonts/fontstruct.h>
15
#include "dixfontstr.h"
22
#include "pixmapstr.h"
27
unsigned long changes,
30
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
32
if(infoRec->CopyArea &&
33
CHECK_PLANEMASK(pGC,infoRec->CopyAreaFlags) &&
34
CHECK_ROP(pGC,infoRec->CopyAreaFlags) &&
35
CHECK_ROPSRC(pGC,infoRec->CopyAreaFlags)
37
pGC->ops->CopyArea = infoRec->CopyArea;
39
pGC->ops->CopyArea = XAAFallbackOps.CopyArea;
45
unsigned long changes,
48
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
50
if(infoRec->PutImage &&
51
CHECK_PLANEMASK(pGC,infoRec->PutImageFlags) &&
52
CHECK_ROP(pGC,infoRec->PutImageFlags) &&
53
CHECK_ROPSRC(pGC,infoRec->PutImageFlags) &&
54
CHECK_COLORS(pGC,infoRec->PutImageFlags)
56
pGC->ops->PutImage = infoRec->PutImage;
58
pGC->ops->PutImage = XAAFallbackOps.PutImage;
64
unsigned long changes,
67
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
69
if(infoRec->CopyPlane &&
70
CHECK_PLANEMASK(pGC,infoRec->CopyPlaneFlags) &&
71
CHECK_ROP(pGC,infoRec->CopyPlaneFlags) &&
72
CHECK_ROPSRC(pGC,infoRec->CopyPlaneFlags) &&
73
CHECK_COLORS(pGC,infoRec->CopyPlaneFlags)
75
pGC->ops->CopyPlane = infoRec->CopyPlane;
77
pGC->ops->CopyPlane = XAAFallbackOps.CopyPlane;
81
XAAValidatePushPixels(
83
unsigned long changes,
86
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
88
if(infoRec->PushPixelsSolid &&
89
(pGC->fillStyle == FillSolid) &&
90
CHECK_PLANEMASK(pGC,infoRec->PushPixelsFlags) &&
91
CHECK_ROP(pGC,infoRec->PushPixelsFlags) &&
92
CHECK_ROPSRC(pGC,infoRec->PushPixelsFlags) &&
93
CHECK_FG(pGC,infoRec->PushPixelsFlags) &&
94
(!(infoRec->PushPixelsFlags & TRANSPARENCY_GXCOPY_ONLY) ||
97
pGC->ops->PushPixels = infoRec->PushPixelsSolid;
99
pGC->ops->PushPixels = XAAFallbackOps.PushPixels;
104
/* We make the assumption that the FillSpans, PolyFillRect, FillPolygon
105
and PolyFillArc functions are linked in a way that they all have
106
the same rop/color/planemask restrictions. If the driver provides
107
a GC level replacement for these, it will need to supply a new
108
Validate functions if it breaks this assumption */
112
XAAValidateFillSpans(
114
unsigned long changes,
117
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
119
if(pGC->fillStyle != FillTiled) changes &= ~GCTile;
120
if((pGC->fillStyle == FillTiled) || (pGC->fillStyle == FillSolid))
121
changes &= ~GCStipple;
125
pGC->ops->FillSpans = XAAFallbackOps.FillSpans;
126
pGC->ops->PolyFillRect = XAAFallbackOps.PolyFillRect;
127
pGC->ops->FillPolygon = XAAFallbackOps.FillPolygon;
128
pGC->ops->PolyFillArc = XAAFallbackOps.PolyFillArc;
130
switch(pGC->fillStyle){
132
if(infoRec->FillSpansSolid &&
133
CHECK_PLANEMASK(pGC,infoRec->FillSpansSolidFlags) &&
134
CHECK_ROP(pGC,infoRec->FillSpansSolidFlags) &&
135
CHECK_ROPSRC(pGC,infoRec->FillSpansSolidFlags) &&
136
CHECK_FG(pGC,infoRec->FillSpansSolidFlags)
138
pGC->ops->FillSpans = infoRec->FillSpansSolid;
139
pGC->ops->PolyFillRect = infoRec->PolyFillRectSolid;
140
pGC->ops->FillPolygon = infoRec->FillPolygonSolid;
141
pGC->ops->PolyFillArc = infoRec->PolyFillArcSolid;
144
/* The [Stippled/OpaqueStippled/Tiled]FillChooser
145
functions do the validating */
147
if(infoRec->FillSpansStippled) {
148
pGC->ops->FillSpans = infoRec->FillSpansStippled;
149
pGC->ops->PolyFillRect = infoRec->PolyFillRectStippled;
150
if(infoRec->FillPolygonStippled)
151
pGC->ops->FillPolygon = infoRec->FillPolygonStippled;
152
else pGC->ops->FillPolygon = miFillPolygon;
153
pGC->ops->PolyFillArc = miPolyFillArc;
156
case FillOpaqueStippled:
157
if(infoRec->FillSpansOpaqueStippled) {
158
pGC->ops->FillSpans = infoRec->FillSpansOpaqueStippled;
159
pGC->ops->PolyFillRect = infoRec->PolyFillRectOpaqueStippled;
160
if(infoRec->FillPolygonOpaqueStippled)
161
pGC->ops->FillPolygon = infoRec->FillPolygonOpaqueStippled;
162
else pGC->ops->FillPolygon = miFillPolygon;
163
pGC->ops->PolyFillArc = miPolyFillArc;
167
if(infoRec->FillSpansTiled) {
168
pGC->ops->FillSpans = infoRec->FillSpansTiled;
169
pGC->ops->PolyFillRect = infoRec->PolyFillRectTiled;
170
if(infoRec->FillPolygonTiled)
171
pGC->ops->FillPolygon = infoRec->FillPolygonTiled;
172
else pGC->ops->FillPolygon = miFillPolygon;
173
pGC->ops->PolyFillArc = miPolyFillArc;
181
/* We make the assumption that these Text8/16 and GlyphBlt functions
182
are linked in a way that they all have the same rop/color/planemask
183
restrictions. If the driver provides a GC level replacement for
184
these, it will need to supply a new Validate functions if it breaks
188
XAAValidatePolyGlyphBlt(
190
unsigned long changes,
193
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
194
Bool BigFont = FALSE;
196
pGC->ops->PolyText8 = XAAFallbackOps.PolyText8;
197
pGC->ops->PolyText16 = XAAFallbackOps.PolyText16;
198
pGC->ops->PolyGlyphBlt = XAAFallbackOps.PolyGlyphBlt;
200
if(!pGC->font) return;
201
if(pGC->fillStyle != FillSolid) return;
203
if((FONTMAXBOUNDS(pGC->font, rightSideBearing) -
204
FONTMINBOUNDS(pGC->font, leftSideBearing) > 32))
207
/* no funny business */
208
if((FONTMINBOUNDS(pGC->font, characterWidth) <= 0) ||
209
((FONTASCENT(pGC->font) + FONTDESCENT(pGC->font)) <= 0))
212
/* Check for TE Fonts */
213
if(!TERMINALFONT(pGC->font) || BigFont) {
214
if(infoRec->PolyGlyphBltNonTE &&
215
CHECK_PLANEMASK(pGC,infoRec->PolyGlyphBltNonTEFlags) &&
216
CHECK_ROP(pGC,infoRec->PolyGlyphBltNonTEFlags) &&
217
CHECK_ROPSRC(pGC,infoRec->PolyGlyphBltNonTEFlags) &&
218
CHECK_FG(pGC,infoRec->PolyGlyphBltNonTEFlags) &&
219
(!(infoRec->PolyGlyphBltNonTEFlags & TRANSPARENCY_GXCOPY_ONLY) ||
220
(pGC->alu == GXcopy))
222
pGC->ops->PolyText8 = infoRec->PolyText8NonTE;
223
pGC->ops->PolyText16 = infoRec->PolyText16NonTE;
224
pGC->ops->PolyGlyphBlt = infoRec->PolyGlyphBltNonTE;
227
if(infoRec->PolyGlyphBltTE &&
228
CHECK_PLANEMASK(pGC,infoRec->PolyGlyphBltTEFlags) &&
229
CHECK_ROP(pGC,infoRec->PolyGlyphBltTEFlags) &&
230
CHECK_ROPSRC(pGC,infoRec->PolyGlyphBltNonTEFlags) &&
231
CHECK_FG(pGC,infoRec->PolyGlyphBltTEFlags) &&
232
(!(infoRec->PolyGlyphBltTEFlags & TRANSPARENCY_GXCOPY_ONLY) ||
233
(pGC->alu == GXcopy))
235
pGC->ops->PolyText8 = infoRec->PolyText8TE;
236
pGC->ops->PolyText16 = infoRec->PolyText16TE;
237
pGC->ops->PolyGlyphBlt = infoRec->PolyGlyphBltTE;
243
XAAValidateImageGlyphBlt(
245
unsigned long changes,
248
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
249
Bool BigFont = FALSE;
251
pGC->ops->ImageText8 = XAAFallbackOps.ImageText8;
252
pGC->ops->ImageText16 = XAAFallbackOps.ImageText16;
253
pGC->ops->ImageGlyphBlt = XAAFallbackOps.ImageGlyphBlt;
255
if(!pGC->font) return;
257
if((FONTMAXBOUNDS(pGC->font, rightSideBearing) -
258
FONTMINBOUNDS(pGC->font, leftSideBearing) > 32))
261
/* no funny business */
262
if((FONTMINBOUNDS(pGC->font, characterWidth) <= 0) ||
263
((FONTASCENT(pGC->font) + FONTDESCENT(pGC->font)) <= 0))
267
/* Check for TE Fonts */
268
if(!TERMINALFONT(pGC->font) || BigFont || (pGC->depth == 32)) {
269
if(infoRec->ImageGlyphBltNonTE &&
270
CHECK_PLANEMASK(pGC,infoRec->ImageGlyphBltNonTEFlags) &&
271
CHECK_FG(pGC,infoRec->ImageGlyphBltNonTEFlags) &&
272
infoRec->SetupForSolidFill &&
273
CHECK_PLANEMASK(pGC,infoRec->SolidFillFlags) &&
274
CHECK_BG(pGC,infoRec->SolidFillFlags))
276
pGC->ops->ImageText8 = infoRec->ImageText8NonTE;
277
pGC->ops->ImageText16 = infoRec->ImageText16NonTE;
278
pGC->ops->ImageGlyphBlt = infoRec->ImageGlyphBltNonTE;
280
} else if(infoRec->ImageGlyphBltTE &&
281
CHECK_PLANEMASK(pGC,infoRec->ImageGlyphBltTEFlags)){
282
if(!(infoRec->ImageGlyphBltTEFlags & TRANSPARENCY_ONLY) &&
283
CHECK_COLORS(pGC,infoRec->ImageGlyphBltTEFlags))
285
pGC->ops->ImageText8 = infoRec->ImageText8TE;
286
pGC->ops->ImageText16 = infoRec->ImageText16TE;
287
pGC->ops->ImageGlyphBlt = infoRec->ImageGlyphBltTE;
289
if(CHECK_FG(pGC,infoRec->ImageGlyphBltTEFlags) &&
290
infoRec->SetupForSolidFill &&
291
CHECK_PLANEMASK(pGC,infoRec->SolidFillFlags) &&
292
CHECK_BG(pGC,infoRec->SolidFillFlags))
294
pGC->ops->ImageText8 = infoRec->ImageText8TE;
295
pGC->ops->ImageText16 = infoRec->ImageText16TE;
296
pGC->ops->ImageGlyphBlt = infoRec->ImageGlyphBltTE;
304
XAAValidatePolylines(
306
unsigned long changes,
309
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
310
XAAGCPtr pGCPriv = (XAAGCPtr) (pGC)->devPrivates[XAAGCIndex].ptr;
312
if(pGC->lineStyle == LineSolid) changes &= ~GCDashList;
315
pGC->ops->PolySegment = XAAFallbackOps.PolySegment;
316
pGC->ops->Polylines = XAAFallbackOps.Polylines;
317
pGC->ops->PolyRectangle = XAAFallbackOps.PolyRectangle;
318
pGC->ops->PolyArc = XAAFallbackOps.PolyArc;
320
if((pGC->ops->FillSpans != XAAFallbackOps.FillSpans) &&
321
(pGC->lineWidth > 0)){
323
pGC->ops->PolyArc = miPolyArc;
324
pGC->ops->PolySegment = miPolySegment;
325
pGC->ops->PolyRectangle = miPolyRectangle;
326
if(pGC->lineStyle == LineSolid)
327
pGC->ops->Polylines = miWideLine;
329
pGC->ops->Polylines = miWideDash;
332
if((pGC->lineWidth == 0) && (pGC->fillStyle == FillSolid)) {
334
if(pGC->lineStyle == LineSolid) {
336
if(infoRec->PolyRectangleThinSolid &&
337
CHECK_PLANEMASK(pGC,infoRec->PolyRectangleThinSolidFlags) &&
338
CHECK_ROP(pGC,infoRec->PolyRectangleThinSolidFlags) &&
339
CHECK_ROPSRC(pGC,infoRec->PolyRectangleThinSolidFlags) &&
340
CHECK_FG(pGC,infoRec->PolyRectangleThinSolidFlags)) {
342
pGC->ops->PolyRectangle = infoRec->PolyRectangleThinSolid;
345
if(infoRec->PolySegmentThinSolid &&
346
CHECK_PLANEMASK(pGC,infoRec->PolySegmentThinSolidFlags) &&
347
CHECK_ROP(pGC,infoRec->PolySegmentThinSolidFlags) &&
348
CHECK_ROPSRC(pGC,infoRec->PolySegmentThinSolidFlags) &&
349
CHECK_FG(pGC,infoRec->PolySegmentThinSolidFlags)) {
351
pGC->ops->PolySegment = infoRec->PolySegmentThinSolid;
354
if(infoRec->PolylinesThinSolid &&
355
CHECK_PLANEMASK(pGC,infoRec->PolylinesThinSolidFlags) &&
356
CHECK_ROP(pGC,infoRec->PolylinesThinSolidFlags) &&
357
CHECK_ROPSRC(pGC,infoRec->PolylinesThinSolidFlags) &&
358
CHECK_FG(pGC,infoRec->PolylinesThinSolidFlags)) {
360
pGC->ops->Polylines = infoRec->PolylinesThinSolid;
362
} else if((pGC->lineStyle == LineOnOffDash) && pGCPriv->DashPattern){
364
if(infoRec->PolySegmentThinDashed &&
365
!(infoRec->PolySegmentThinDashedFlags & NO_TRANSPARENCY) &&
366
((pGC->alu == GXcopy) || !(infoRec->PolySegmentThinDashedFlags &
367
TRANSPARENCY_GXCOPY_ONLY)) &&
368
CHECK_PLANEMASK(pGC,infoRec->PolySegmentThinDashedFlags) &&
369
CHECK_ROP(pGC,infoRec->PolySegmentThinDashedFlags) &&
370
CHECK_ROPSRC(pGC,infoRec->PolySegmentThinDashedFlags) &&
371
CHECK_FG(pGC,infoRec->PolySegmentThinDashedFlags)) {
373
pGC->ops->PolySegment = infoRec->PolySegmentThinDashed;
376
if(infoRec->PolylinesThinDashed &&
377
!(infoRec->PolylinesThinDashedFlags & NO_TRANSPARENCY) &&
378
((pGC->alu == GXcopy) || !(infoRec->PolylinesThinDashedFlags &
379
TRANSPARENCY_GXCOPY_ONLY)) &&
380
CHECK_PLANEMASK(pGC,infoRec->PolylinesThinDashedFlags) &&
381
CHECK_ROP(pGC,infoRec->PolylinesThinDashedFlags) &&
382
CHECK_ROPSRC(pGC,infoRec->PolylinesThinDashedFlags) &&
383
CHECK_FG(pGC,infoRec->PolylinesThinDashedFlags)) {
385
pGC->ops->Polylines = infoRec->PolylinesThinDashed;
388
if(pGC->ops->Polylines != XAAFallbackOps.Polylines)
389
pGC->ops->PolyRectangle = miPolyRectangle;
391
} else if(pGCPriv->DashPattern && (pGC->depth != 32)) {
393
if(infoRec->PolySegmentThinDashed &&
394
!(infoRec->PolySegmentThinDashedFlags & TRANSPARENCY_ONLY) &&
395
CHECK_PLANEMASK(pGC,infoRec->PolySegmentThinDashedFlags) &&
396
CHECK_ROP(pGC,infoRec->PolySegmentThinDashedFlags) &&
397
CHECK_ROPSRC(pGC,infoRec->PolySegmentThinDashedFlags) &&
398
CHECK_COLORS(pGC,infoRec->PolySegmentThinDashedFlags)) {
400
pGC->ops->PolySegment = infoRec->PolySegmentThinDashed;
403
if(infoRec->PolylinesThinDashed &&
404
!(infoRec->PolylinesThinDashedFlags & TRANSPARENCY_ONLY) &&
405
CHECK_PLANEMASK(pGC,infoRec->PolylinesThinDashedFlags) &&
406
CHECK_ROP(pGC,infoRec->PolylinesThinDashedFlags) &&
407
CHECK_ROPSRC(pGC,infoRec->PolylinesThinDashedFlags) &&
408
CHECK_COLORS(pGC,infoRec->PolylinesThinDashedFlags)) {
410
pGC->ops->Polylines = infoRec->PolylinesThinDashed;
413
if(pGC->ops->Polylines != XAAFallbackOps.Polylines)
414
pGC->ops->PolyRectangle = miPolyRectangle;
419
if(infoRec->PolylinesWideSolid &&
420
(pGC->lineWidth > 0) &&
421
(pGC->fillStyle == FillSolid) &&
422
(pGC->lineStyle == LineSolid) &&
423
CHECK_PLANEMASK(pGC,infoRec->PolylinesWideSolidFlags) &&
424
CHECK_ROP(pGC,infoRec->PolylinesWideSolidFlags) &&
425
CHECK_ROPSRC(pGC,infoRec->PolylinesWideSolidFlags) &&
426
CHECK_FG(pGC,infoRec->PolylinesWideSolidFlags)) {
428
pGC->ops->Polylines = infoRec->PolylinesWideSolid;