Hello,

Following the objections to my previous patch, here's a version that
sports three build-time and two runtime mechanisms for configuring the
bitmap scaling code in or out.  Say wow.

By default, bitmap scaling is compiled in; naked FPEs do not scale
bitmaps, the ``:scaled'' attribute can be used to enable bitmap
scaling.  I understand this is the behaviour that Keith and Mike
condone.

The bitmap scaler can be compiled out with -DNO_BITMAP_SCALER; in
order to remove the ``:foo'' parsing code, don't -DFONTDIRATTRIB.
Both flags are controlled by the NoBitmapScaler Imake flag.

At runtime, the default for naked FPEs is controlled by the global
variable ``defaultScaleBitmaps''.  This variable is initialised to
DEFAULT_SCALE_BITMAPS, which defaults to false.  There is currently no
way to change its value at runtime other than by using a debugger.  If
defaultScaleBitmaps is true, it can be overridden by using
``:unscaled''.

(Somebody could write an extension to control the value of
defaultScaleBitmaps at runtime.  After all, that's no more ridiculous
than the FontCache extension.)

                                        Juliusz
? xc/lib/font/fontfile/DONE
? xc/lib/font/fontfile/Makefile
Index: xc/lib/font/fontfile/Imakefile
===================================================================
RCS file: /cvs/xc/lib/font/fontfile/Imakefile,v
retrieving revision 3.21
diff -c -r3.21 Imakefile
*** xc/lib/font/fontfile/Imakefile      2002/02/13 21:32:48     3.21
--- xc/lib/font/fontfile/Imakefile      2002/06/03 06:32:02
***************
*** 49,58 ****
    GZIP_DEFS = -DX_GZIP_FONT_COMPRESSION
  #endif
  
   ATTRIBDEFS = -DFONTDIRATTRIB
  FONTENCDEFS = -DFONT_ENCODINGS_DIRECTORY=\"$(FONTDIR)/encodings/encodings.dir\"
  
!     DEFINES = StrcasecmpDefines $(ATTRIBDEFS) \
              $(SPEEDO_DEFINES) $(TYPE1_DEFINES) $(CID_DEFINES) \
              $(FREETYPE_DEFINES) $(XTRUETYPE_DEFINES) $(FONTENCDEFS) \
                $(GZIP_DEFS)
--- 49,69 ----
    GZIP_DEFS = -DX_GZIP_FONT_COMPRESSION
  #endif
  
+ #if NoBitmapScaler
+ #if ForceFontDirAttrib
   ATTRIBDEFS = -DFONTDIRATTRIB
+ #endif
+ #else
+  ATTRIBDEFS = -DFONTDIRATTRIB
+ #endif
+ 
+ #if NoBitmapScaler
+  BITSCALE_DEFS = -DNO_BITMAP_SCALER
+ #endif
+ 
  FONTENCDEFS = -DFONT_ENCODINGS_DIRECTORY=\"$(FONTDIR)/encodings/encodings.dir\"
  
!     DEFINES = StrcasecmpDefines $(ATTRIBDEFS) $(BITSCALE_DEFS)\
              $(SPEEDO_DEFINES) $(TYPE1_DEFINES) $(CID_DEFINES) \
              $(FREETYPE_DEFINES) $(XTRUETYPE_DEFINES) $(FONTENCDEFS) \
                $(GZIP_DEFS)
Index: xc/lib/font/fontfile/fontdir.c
===================================================================
RCS file: /cvs/xc/lib/font/fontfile/fontdir.c,v
retrieving revision 3.18
diff -c -r3.18 fontdir.c
*** xc/lib/font/fontfile/fontdir.c      2001/12/14 19:56:51     3.18
--- xc/lib/font/fontfile/fontdir.c      2002/06/03 06:32:02
***************
*** 34,39 ****
--- 34,49 ----
  #include    "fntfilst.h"
  #include    <X11/keysym.h>
  
+ /* Whether to scale bitmap fonts when neither :unscaled nor :scaled
+  * are present.  If a different default is desired, the command-line
+  * parsing code should set this. */
+ 
+ #ifndef DEFAULT_SCALE_BITMAPS
+ #define DEFAULT_SCALE_BITMAPS 0
+ #endif
+ 
+ int defaultScaleBitmaps = DEFAULT_SCALE_BITMAPS;
+ 
  Bool
  FontFileInitTable (FontTablePtr table, int size)
  {
***************
*** 654,681 ****
              (vals.values_supplied & PIXELSIZE_MASK) != PIXELSIZE_ARRAY &&
              (vals.values_supplied & POINTSIZE_MASK) != POINTSIZE_ARRAY &&
              !(vals.values_supplied & ENHANCEMENT_SPECIFY_MASK);
  #ifdef FONTDIRATTRIB
  #define UNSCALED_ATTRIB "unscaled"
!     /* For scalable fonts, check if the "unscaled" attribute is present */
!     if (isscale && dir->attributes && dir->attributes[0] == ':') {
!       char *ptr1 = dir->attributes + 1;
!       char *ptr2;
!       int length;
!       int uslength = strlen(UNSCALED_ATTRIB);
! 
!       do {
!           ptr2 = strchr(ptr1, ':');
!           if (ptr2)
!               length = ptr2 - ptr1;
!           else
!               length = dir->attributes + strlen(dir->attributes) - ptr1;
!           if (length == uslength && !strncmp(ptr1, UNSCALED_ATTRIB, uslength))
!               isscale = FALSE;
!           if (ptr2)
!               ptr1 = ptr2 + 1;
!       } while (ptr2);
!     }
  #endif
      if (!isscale || (vals.values_supplied & SIZE_SPECIFY_MASK))
      {
        /* If the fontname says it is nonScalable, make sure that the
--- 664,710 ----
              (vals.values_supplied & PIXELSIZE_MASK) != PIXELSIZE_ARRAY &&
              (vals.values_supplied & POINTSIZE_MASK) != POINTSIZE_ARRAY &&
              !(vals.values_supplied & ENHANCEMENT_SPECIFY_MASK);
+ 
+     if (isscale) {
+         int surelyScale = FALSE;
+ 
  #ifdef FONTDIRATTRIB
  #define UNSCALED_ATTRIB "unscaled"
! #define SCALED_ATTRIB "scaled"
!         /* For scalable fonts, check if the "unscaled" or "scaled" attribute 
!          * is present */
! 
!         if(dir->attributes && dir->attributes[0] == ':') {
!             char *ptr1 = dir->attributes + 1;
!             char *ptr2;
!             int length;
!             int uslength = strlen(UNSCALED_ATTRIB);
!             int slength = strlen(SCALED_ATTRIB);
!             
!             /* Yuck. */
!             do {
!                 ptr2 = strchr(ptr1, ':');
!                 if (ptr2)
!                     length = ptr2 - ptr1;
!                 else
!                     length = dir->attributes + strlen(dir->attributes) - ptr1;
!                 if (length == uslength && 
!                     strncmp(ptr1, UNSCALED_ATTRIB, uslength) == 0)
!                     isscale = FALSE;
!                 else if (length == slength &&
!                          strncmp(ptr1, SCALED_ATTRIB, slength) == 0)
!                     surelyScale = TRUE;
!                 if (ptr2)
!                     ptr1 = ptr2 + 1;
!             } while (ptr2);
!         }
  #endif
+ 
+         if(!surelyScale)
+             if(!defaultScaleBitmaps)
+                 isscale = FALSE;
+     }
+ 
      if (!isscale || (vals.values_supplied & SIZE_SPECIFY_MASK))
      {
        /* If the fontname says it is nonScalable, make sure that the
Index: xc/lib/font/fontfile/fontfile.c
===================================================================
RCS file: /cvs/xc/lib/font/fontfile/fontfile.c,v
retrieving revision 3.15
diff -c -r3.15 fontfile.c
*** xc/lib/font/fontfile/fontfile.c     2001/12/14 19:56:51     3.15
--- xc/lib/font/fontfile/fontfile.c     2002/06/03 06:32:03
***************
*** 381,386 ****
--- 381,387 ----
                    (*pFont)->fpe = fpe;
                    ret = Successful;
                }
+ #ifndef NO_BITMAP_SCALER
                else if (scaled->bitmap)
                {
                    entry = scaled->bitmap;
***************
*** 400,405 ****
--- 401,407 ----
                            (*pFont)->fpe = fpe;
                    }
                }
+ #endif
                else /* "cannot" happen */
                {
                    ret = BadFontName;
***************
*** 407,413 ****
            }
            else
            {
!               ret = FontFileMatchBitmapSource (fpe, pFont, flags, entry, &tmpName, 
&vals, format, fmask, noSpecificSize);
                if (ret != Successful)
                {
                    char origName[MAXFONTNAMELEN];
--- 409,418 ----
            }
            else
            {
!               ret = 
!                     FontFileMatchBitmapSource (fpe, pFont, flags, entry,
!                                                &tmpName, &vals,
!                                                format, fmask, noSpecificSize);
                if (ret != Successful)
                {
                    char origName[MAXFONTNAMELEN];
? xc/lib/font/bitmap/DONE
? xc/lib/font/bitmap/Makefile
Index: xc/lib/font/bitmap/Imakefile
===================================================================
RCS file: /cvs/xc/lib/font/bitmap/Imakefile,v
retrieving revision 1.13
diff -c -r1.13 Imakefile
*** xc/lib/font/bitmap/Imakefile        2002/01/18 16:27:19     1.13
--- xc/lib/font/bitmap/Imakefile        2002/06/03 06:32:10
***************
*** 35,41 ****
  #if GzipFontCompression
         GZIP_DEFS = -DX_GZIP_FONT_COMPRESSION
  #endif
!          DEFINES = $(BDFDEFS) $(PCFDEFS) $(SNFDEFS)
  
              SRCS = $(BDFSRCS) bitmap.c bitmaputil.c bitscale.c \
                   bitmapfunc.c $(PCFSRCS) $(SNFSRCS) \
--- 35,44 ----
  #if GzipFontCompression
         GZIP_DEFS = -DX_GZIP_FONT_COMPRESSION
  #endif
! #if NoBitmapScaler
!    BITSCALE_DEFS = -DNO_BITMAP_SCALER
! #endif
!          DEFINES = $(BDFDEFS) $(PCFDEFS) $(SNFDEFS) $(BITSCALE_DEFS)
  
              SRCS = $(BDFSRCS) bitmap.c bitmaputil.c bitscale.c \
                   bitmapfunc.c $(PCFSRCS) $(SNFSRCS) \
Index: xc/lib/font/bitmap/bitscale.c
===================================================================
RCS file: /cvs/xc/lib/font/bitmap/bitscale.c,v
retrieving revision 3.22
diff -c -r3.22 bitscale.c
*** xc/lib/font/bitmap/bitscale.c       2001/12/14 19:56:46     3.22
--- xc/lib/font/bitmap/bitscale.c       2002/06/03 06:32:11
***************
*** 49,54 ****
--- 49,80 ----
  #define   MAX(a,b)    (((a)>(b)) ? a : b)
  #endif
  
+ #ifdef NO_BITMAP_SCALER
+ 
+ /* ARGSUSED */
+ int
+ BitmapOpenScalable (FontPathElementPtr fpe, 
+                   FontPtr *pFont, 
+                   int flags, 
+                   FontEntryPtr entry, 
+                   char *fileName,
+                   FontScalablePtr vals, 
+                   fsBitmapFormat format, 
+                   fsBitmapFormatMask fmask,
+                   FontPtr non_cachable_font)
+ {
+     return BadFontName;
+ }
+ 
+ /* ARGSUSED */
+ static void
+ bitmapUnloadScalable (FontPtr pFont)
+ {
+     return BadFontName;
+ }
+ 
+ #else
+ 
  /* Should get this from elsewhere */
  extern int serverGeneration;
  
***************
*** 1952,1954 ****
--- 1978,1982 ----
      xfree (pFont->fontPrivate);
      DestroyFontRec (pFont);
  }
+ 
+ #endif

Reply via email to