Module Name:    xsrc
Committed By:   macallan
Date:           Tue Feb 25 13:21:24 UTC 2025

Modified Files:
        xsrc/external/mit/xf86-video-ngle/dist/src: summit_accel.c

Log Message:
- properly clip glyphs drawn into off-screen memory
- when drawing glyphs skip pixels with zero alpha


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 \
    xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c
diff -u xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.8 xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.9
--- xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.8	Thu Feb 20 18:53:48 2025
+++ xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c	Tue Feb 25 13:21:24 2025
@@ -21,7 +21,7 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-/* $NetBSD: summit_accel.c,v 1.8 2025/02/20 18:53:48 christos Exp $ */
+/* $NetBSD: summit_accel.c,v 1.9 2025/02/25 13:21:24 macallan Exp $ */
 
 #include <sys/types.h>
 #include <dev/ic/summitreg.h>
@@ -391,16 +391,24 @@ SummitDrawGlyph8(NGLEPtr fPtr, int32_t f
 {
 	uint8_t *gdata = mask->devPrivate.ptr;
 	uint32_t msk;
-	int i, j;
+	int i, j, needs_coords;
 
 	gdata += xm;
 	gdata += (p * ym);
 	for (i = 0; i < h; i++) {
 		SummitWaitFifo(fPtr, w * 2);
-		NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DEST, 
-		    ((yd + i) << 16) | xd);
+		needs_coords = 1;
 		for (j = 0; j < w; j++) {
 			msk = gdata[j];
+			if (msk == 0) {
+				needs_coords = 1;
+				continue;
+			}
+			if (needs_coords) {
+				NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DEST, 
+				    ((yd + i) << 16) | (xd + j));
+				needs_coords = 0;
+			}
 			msk = (msk << 24) | fg;
 			NGLEWrite4(fPtr,
 			    VISFX_VRAM_WRITE_DATA_INCRX, msk);	
@@ -415,18 +423,26 @@ SummitDrawGlyph32(NGLEPtr fPtr, uint32_t
 {
 	uint32_t *gdata = mask->devPrivate.ptr;
 	uint32_t msk;
-	int i, j;
+	int i, j, needs_coords;
 
 	gdata += xm;
 	gdata += (p * ym);
 
 	for (i = 0; i < h; i++) {
 		SummitWaitFifo(fPtr, w * 2);
-		NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DEST, 
-		    ((yd + i) << 16) | xd);
+		needs_coords = 1;
 		for (j = 0; j < w; j++) {
-			msk = gdata[j];
-			msk = (msk & 0xff000000) | fg;
+			msk = gdata[j] & 0xff000000;
+			if (msk == 0) {
+				needs_coords = 1;
+				continue;
+			}
+			if (needs_coords) {
+				NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DEST, 
+				    ((yd + i) << 16) | (xd + j));
+				needs_coords = 0;
+			}
+			msk |= fg;
 			NGLEWrite4(fPtr,
 			    VISFX_VRAM_WRITE_DATA_INCRX, msk);	
 		}
@@ -452,7 +468,8 @@ SummitGlyphs (CARD8	op,
 	PixmapPtr	mask, dst;
 	GlyphPtr	glyph;
 	int		xDst = list->xOff, yDst = list->yOff;
-	int		x = 0, y = 0, i, n, ofs, p, j, wi, he;
+	int		x = 0, y = 0, i, n, ofs, p, j, wi, he, xs, ys;
+	int		dw, dh;
 	uint32_t fg = 0xffffffff, msk;
 
 	if (op != PictOpOver) goto fallback;
@@ -462,6 +479,8 @@ SummitGlyphs (CARD8	op,
 	dst = SummitGetDrawablePixmap(pDst->pDrawable);
 	ofs = exaGetPixmapOffset(dst);
 	ofs = ofs >> 13;
+	dw = pDst->pDrawable->width;
+	dh = pDst->pDrawable->height;
 
 	if (pDst->pDrawable->type == DRAWABLE_WINDOW) {
 		x += pDst->pDrawable->x;
@@ -484,10 +503,8 @@ SummitGlyphs (CARD8	op,
 
 	SummitWaitFifo(fPtr, 4);
 	NGLEWrite4(fPtr, VISFX_FOE, FOE_BLEND_ROP);
-#ifdef notyet
 	NGLEWrite4(fPtr, VISFX_IBO,
 	    IBO_ADD | SRC(IBO_SRC) | DST(IBO_ONE_MINUS_SRC));
-#endif
 
 	while (nlist--)     {
 		x += list->xOff;
@@ -553,10 +570,40 @@ SummitGlyphs (CARD8	op,
 					 * only need to clip to the destination
 					 * pixmap's boundaries
 					 */
-					yd += (ofs - fPtr->fbi.fbi_height);
 
 					fbGetDrawablePixmap(pPicture->pDrawable,
 					    mask, wi, he);
+
+					xs = 0;
+					ys = 0;
+					wi = glyph->info.width;
+					he = glyph->info.height;
+
+					if (xd < 0) {
+						xs -= xd;
+						wi += xd;
+						xd = 0;
+					}
+
+					if (yd < 0) {
+						ys -= yd;
+						he += yd;
+						yd = 0;
+					}
+
+					if ((xd + wi) > dw) {
+						wi -= (xd + wi - dw);
+					}
+
+					if ((yd + he) > dh) {
+						he -= (yd + he - dh);
+					}
+
+					if ((he <= 0) || (wi <= 0))
+						goto skip;
+
+					yd += (ofs - fPtr->fbi.fbi_height);
+
 					exaPrepareAccess(pPicture->pDrawable,
 					    EXA_PREPARE_SRC);
 					p = exaGetPixmapPitch(mask);
@@ -564,17 +611,15 @@ SummitGlyphs (CARD8	op,
 					if (pPicture->format == PICT_a8) {
 						SummitDrawGlyph8(fPtr,
 						    fg, mask, p,
-						    0, 0,
+						    xs, ys,
 						    xd, yd, 
-						    glyph->info.width,
-						    glyph->info.height);
+						    wi, he);
 					} else {
 						SummitDrawGlyph32(fPtr,
 						    fg, mask, p,
-						    0, 0,
+						    xs, ys,
 						    xd, yd, 
-						    glyph->info.width,
-						    glyph->info.height);
+						    wi, he);
 					}
 					exaFinishAccess(pPicture->pDrawable,
 					    EXA_PREPARE_SRC);

Reply via email to