Commit 83d9cd4e authored by Ulrich Sibiller's avatar Ulrich Sibiller Committed by Mike Gabriel

damage: Don't rewrite Text ops to GlyphBlt ops

This backport of a 2013 Xorg fix changes miext/damage.c so that the text functions (damageText, damage{Poly,Image}Text{8,16}) finally are very similar to the changes that NX introduced in 2007 with nxagent-3.0.0-28. Fun fact: the original freedesktop bug mentioned below is from 2005 and the fix came in 2013... Next commit will be the complete drop of NXdamage.c. commit 0f3f8e4295d4c05f33b93e0ffd2f6f8cd5759bf7 Author: Adam Jackson <ajax@redhat.com> Date: Wed Aug 21 11:13:11 2013 -0400 damage: Don't rewrite Text ops to GlyphBlt ops There's no particularly good reason to, and it breaks Xnest. Bugzilla: http://bugs.freedesktop.org/2454Reviewed-by: 's avatarChris Wilson <chris@chris-wilson.co.uk> Reviewed-by: 's avatarEric Anholt <eric@anholt.net> Signed-off-by: 's avatarAdam Jackson <ajax@redhat.com>
parent ca7c1c86
...@@ -47,187 +47,6 @@ ...@@ -47,187 +47,6 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "regionstr.h"
#include "../../miext/damage/damage.h"
#include <X11/fonts/font.h>
/* prototypes */
static int
damageText (DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
unsigned long count,
char *chars,
FontEncoding fontEncoding,
Bool textType);
static int
damagePolyText8(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
char *chars);
static int
damagePolyText16(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
unsigned short *chars);
static void
damageImageText8(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
char *chars);
static void
damageImageText16(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
unsigned short *chars);
#include "../../miext/damage/damage.c" #include "../../miext/damage/damage.c"
static int
damageText (DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
unsigned long count,
char *chars,
FontEncoding fontEncoding,
Bool textType)
{
CharInfoPtr *charinfo;
CharInfoPtr *info;
unsigned long i;
unsigned int n;
int w;
Bool imageblt;
imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
charinfo = (CharInfoPtr *) malloc(count * sizeof(CharInfoPtr));
if (!charinfo)
return x;
GetGlyphs(pGC->font, count, (unsigned char *)chars,
fontEncoding, &i, charinfo);
n = (unsigned int)i;
w = 0;
if (!imageblt)
for (info = charinfo; i--; info++)
w += (*info)->metrics.characterWidth;
if (n != 0) {
damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n,
charinfo, imageblt, pGC->subWindowMode);
#ifndef NXAGENT_SERVER
if (imageblt)
(*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
FONTGLYPHS(pGC->font));
else
(*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
FONTGLYPHS(pGC->font));
#endif
}
free(charinfo);
return x + w;
}
static int
damagePolyText8(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
char *chars)
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
if (checkGCDamage (pDrawable, pGC))
x = damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
Linear8Bit, TT_POLY8);
#ifndef NXAGENT_SERVER
else
#endif
x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x;
}
static int
damagePolyText16(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
unsigned short *chars)
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
if (checkGCDamage (pDrawable, pGC))
x = damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
TT_POLY16);
#ifndef NXAGENT_SERVER
else
#endif
x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x;
}
static void
damageImageText8(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
char *chars)
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
if (checkGCDamage (pDrawable, pGC))
damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
Linear8Bit, TT_IMAGE8);
#ifndef NXAGENT_SERVER
else
#endif
(*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
static void
damageImageText16(DrawablePtr pDrawable,
GCPtr pGC,
int x,
int y,
int count,
unsigned short *chars)
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
if (checkGCDamage (pDrawable, pGC))
damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
TT_IMAGE16);
#ifndef NXAGENT_SERVER
else
#endif
(*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
...@@ -1335,9 +1335,7 @@ damageDamageChars (DrawablePtr pDrawable, ...@@ -1335,9 +1335,7 @@ damageDamageChars (DrawablePtr pDrawable,
#define TT_POLY16 2 #define TT_POLY16 2
#define TT_IMAGE16 3 #define TT_IMAGE16 3
#ifndef NXAGENT_SERVER static void
static int
damageText (DrawablePtr pDrawable, damageText (DrawablePtr pDrawable,
GCPtr pGC, GCPtr pGC,
int x, int x,
...@@ -1348,38 +1346,28 @@ damageText (DrawablePtr pDrawable, ...@@ -1348,38 +1346,28 @@ damageText (DrawablePtr pDrawable,
Bool textType) Bool textType)
{ {
CharInfoPtr *charinfo; CharInfoPtr *charinfo;
CharInfoPtr *info;
unsigned long i; unsigned long i;
unsigned int n; unsigned int n;
int w;
Bool imageblt; Bool imageblt;
imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16); imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
if (!checkGCDamage(pDrawable, pGC))
return;
charinfo = (CharInfoPtr *) malloc(count * sizeof(CharInfoPtr)); charinfo = (CharInfoPtr *) malloc(count * sizeof(CharInfoPtr));
if (!charinfo) if (!charinfo)
return x; return;
GetGlyphs(pGC->font, count, (unsigned char *)chars, GetGlyphs(pGC->font, count, (unsigned char *)chars,
fontEncoding, &i, charinfo); fontEncoding, &i, charinfo);
n = (unsigned int)i; n = (unsigned int)i;
w = 0;
if (!imageblt)
for (info = charinfo; i--; info++)
w += (*info)->metrics.characterWidth;
if (n != 0) { if (n != 0) {
damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n, damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n,
charinfo, imageblt, pGC->subWindowMode); charinfo, imageblt, pGC->subWindowMode);
if (imageblt)
(*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
FONTGLYPHS(pGC->font));
else
(*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
FONTGLYPHS(pGC->font));
} }
free(charinfo); free(charinfo);
return x + w;
} }
static int static int
...@@ -1391,12 +1379,9 @@ damagePolyText8(DrawablePtr pDrawable, ...@@ -1391,12 +1379,9 @@ damagePolyText8(DrawablePtr pDrawable,
char *chars) char *chars)
{ {
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText(pDrawable, pGC, x, y, (unsigned long) count, chars,
if (checkGCDamage (pDrawable, pGC))
x = damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
Linear8Bit, TT_POLY8); Linear8Bit, TT_POLY8);
else x = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x; return x;
} }
...@@ -1410,13 +1395,10 @@ damagePolyText16(DrawablePtr pDrawable, ...@@ -1410,13 +1395,10 @@ damagePolyText16(DrawablePtr pDrawable,
unsigned short *chars) unsigned short *chars)
{ {
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
if (checkGCDamage (pDrawable, pGC))
x = damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit, FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
TT_POLY16); TT_POLY16);
else x = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x; return x;
} }
...@@ -1430,12 +1412,9 @@ damageImageText8(DrawablePtr pDrawable, ...@@ -1430,12 +1412,9 @@ damageImageText8(DrawablePtr pDrawable,
char *chars) char *chars)
{ {
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText (pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
if (checkGCDamage (pDrawable, pGC)) TT_IMAGE8);
damageText (pDrawable, pGC, x, y, (unsigned long) count, chars, (*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
Linear8Bit, TT_IMAGE8);
else
(*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
} }
...@@ -1448,18 +1427,13 @@ damageImageText16(DrawablePtr pDrawable, ...@@ -1448,18 +1427,13 @@ damageImageText16(DrawablePtr pDrawable,
unsigned short *chars) unsigned short *chars)
{ {
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
if (checkGCDamage (pDrawable, pGC))
damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars, damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit, FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
TT_IMAGE16); TT_IMAGE16);
else (*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
(*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
} }
#endif /* NXAGENT_SERVER */
static void static void
damageImageGlyphBlt(DrawablePtr pDrawable, damageImageGlyphBlt(DrawablePtr pDrawable,
GCPtr pGC, GCPtr pGC,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment