--- ./nx-X11/programs/Xserver/hw/nxagent/X/NXmiglyph.c.X.original 2015-02-13 14:03:44.744441510 +0100 +++ ./nx-X11/programs/Xserver/hw/nxagent/X/NXmiglyph.c 2015-02-10 19:13:13.804685886 +0100 @@ -1,3 +1,20 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */ +/* */ +/* NXAGENT, NX protocol compression and NX extensions to this software */ +/* are copyright of NoMachine. Redistribution and use of the present */ +/* software is allowed according to terms specified in the file LICENSE */ +/* which comes in the source distribution. */ +/* */ +/* Check http://www.nomachine.com/licensing.html for applicability. */ +/* */ +/* NX and NoMachine are trademarks of Medialogic S.p.A. */ +/* */ +/* All rights reserved. */ +/* */ +/**************************************************************************/ + /* * $XFree86: xc/programs/Xserver/render/miglyph.c,v 1.4 2000/11/20 07:13:13 keithp Exp $ * @@ -35,6 +52,12 @@ #include "picturestr.h" #include "mipict.h" +#ifdef NXAGENT_SERVER + +#include "Render.h" + +#endif + void miGlyphExtents (int nlist, GlyphListPtr list, @@ -45,7 +68,7 @@ int n; GlyphPtr glyph; int x, y; - + x = 0; y = 0; extents->x1 = MAXSHORT; @@ -113,25 +136,58 @@ int error; BoxRec extents; CARD32 component_alpha; - + + #ifdef NXAGENT_SERVER + + /* + * Get rid of the warning. + */ + + extents.x1 = 0; + extents.y1 = 0; + + #endif + if (maskFormat) { GCPtr pGC; xRectangle rect; - - miGlyphExtents (nlist, list, glyphs, &extents); - + + #ifdef NXAGENT_SERVER + + if (nxagentGlyphsExtents != NullBox) + { + memcpy(&extents, nxagentGlyphsExtents, sizeof(BoxRec)); + } + else + { + nxagentGlyphsExtents = (BoxPtr) xalloc(sizeof(BoxRec)); + + miGlyphExtents (nlist, list, glyphs, &extents); + + memcpy(nxagentGlyphsExtents, &extents, sizeof(BoxRec)); + } + + #else + + miGlyphExtents (nlist, list, glyphs, &extents); + + #endif + if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1) return; width = extents.x2 - extents.x1; height = extents.y2 - extents.y1; pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, maskFormat->depth); + if (!pMaskPixmap) return; + component_alpha = NeedsComponent(maskFormat->format); pMask = CreatePicture (0, &pMaskPixmap->drawable, maskFormat, CPComponentAlpha, &component_alpha, serverClient, &error); + if (!pMask) { (*pScreen->DestroyPixmap) (pMaskPixmap); @@ -160,6 +216,7 @@ x += list->xOff; y += list->yOff; n = list->len; + while (n--) { glyph = *glyphs++; @@ -184,6 +241,21 @@ (*pScreen->ModifyPixmapHeader) (pPixmap, glyph->info.width, glyph->info.height, 0, 0, -1, (pointer) (glyph + 1)); + + #ifdef NXAGENT_SERVER + + /* + * The following line fixes a problem with glyphs that appeared + * as clipped. It was a side effect due the validate function + * "ValidatePicture" that makes a check on the Drawable serial + * number instead of the picture serial number, failing thus + * the clip mask update. + */ + + pPicture->pDrawable->serialNumber = NEXT_SERIAL_NUMBER; + + #endif + pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; if (maskFormat) { @@ -215,6 +287,7 @@ x += glyph->info.xOff; y += glyph->info.yOff; } + list++; if (pPicture) { @@ -237,7 +310,9 @@ 0, 0, x, y, width, height); + FreePicture ((pointer) pMask, (XID) 0); (*pScreen->DestroyPixmap) (pMaskPixmap); } + }