Would you be so kind as to test the attached? (Not submitted, waiting
for confirmation that it actually works.)
Thanks,
Juliusz
P.S. Anybody got clean code to do a 1bpp unaligned blit?
*** /tmp/xc/lib/font/FreeType/ftfuncs.c Sat Jun 8 20:03:07 2002
--- xc/lib/font/FreeType/ftfuncs.c Thu Jun 20 19:05:11 2002
***************
*** 73,78 ****
--- 73,80 ----
static FTFacePtr faceTable[NUMFACEBUCKETS];
+ #define MAX(_x, _y) ((_x)>=(_y)?(_x):(_y))
+
static unsigned
hash(char *string)
{
***************
*** 565,574 ****
char *raster = NULL;
FT_Size_Metrics smetrics;
FT_Glyph_Metrics *metrics;
! int wd, ht, bpr; /* width, height, bytes per row */
int leftSideBearing, rightSideBearing, characterWidth, rawCharacterWidth,
ascent, descent;
! int i = 0;
face = instance->face;
smetrics = instance->size->metrics;
--- 567,577 ----
char *raster = NULL;
FT_Size_Metrics smetrics;
FT_Glyph_Metrics *metrics;
! int wd, ht, bpr; /* width, height, bytes per row */
! int dx, dy;
int leftSideBearing, rightSideBearing, characterWidth, rawCharacterWidth,
ascent, descent;
! int i = 0, j;
face = instance->face;
smetrics = instance->size->metrics;
***************
*** 579,590 ****
bitmap = &face->face->glyph->bitmap;
if(hasMetrics) {
! wd = tgp->metrics.rightSideBearing;
! ht = tgp->metrics.ascent;
} else {
wd = bitmap->width;
ht = bitmap->rows;
!
/* The X convention is to consider a character with an empty
* bounding box as undefined. This convention is broken. */
if(wd <= 0) wd = 1;
--- 582,597 ----
bitmap = &face->face->glyph->bitmap;
if(hasMetrics) {
! wd = tgp->metrics.rightSideBearing - tgp->metrics.leftSideBearing;
! ht = tgp->metrics.ascent + tgp->metrics.descent;
! dx = -tgp->metrics.leftSideBearing +
! TRANSFORM_X(metrics->horiBearingX);
! dy = tgp->metrics.ascent - TRANSFORM_Y(metrics->horiBearingY);
} else {
wd = bitmap->width;
ht = bitmap->rows;
! dx = 0;
! dy = 0;
/* The X convention is to consider a character with an empty
* bounding box as undefined. This convention is broken. */
if(wd <= 0) wd = 1;
***************
*** 601,613 ****
memset(raster, 0, ht * bpr);
}
! if(bpr == bitmap->pitch) {
memcpy(raster, bitmap->buffer, bitmap->rows * bitmap->pitch);
! } else {
! for(i = 0; i < bitmap->rows; i++)
! memcpy(raster + i * bpr,
bitmap->buffer + i * bitmap->pitch,
bitmap->pitch);
}
tgp->bits = raster;
--- 608,635 ----
memset(raster, 0, ht * bpr);
}
! if(dx == 0 && dy == 0 && bpr == bitmap->pitch) {
memcpy(raster, bitmap->buffer, bitmap->rows * bitmap->pitch);
! } else if(dx == 0) {
! for(i = MAX(0, -dy); i < bitmap->rows && i + dy < ht; i++)
! memcpy(raster + (i + dy) * bpr,
bitmap->buffer + i * bitmap->pitch,
bitmap->pitch);
+ } else {
+ int dx8;
+ if(dx % 8 == 0)
+ dx8 = 0;
+ else if(dx >= 0)
+ dx8 = dx % 8;
+ else
+ dx8 = dx % 8 + 8;
+ for(i = MAX(0, -dy); i < bitmap->rows && i + dy < ht; i++)
+ for(j = MAX(0, -dx); j < bitmap->width && j + dx < wd; j++) {
+ raster[(i + dy) * bpr + (j + dx) / 8] |=
+ ((bitmap->buffer[i * bitmap->pitch + j / 8] &
+ (0x80 >> (j % 8)))) >>
+ ((j % 8 + dx8 < 8)?dx8:(8 - dx8));
+ }
}
tgp->bits = raster;