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;

Reply via email to