Hi,

I'm using microwindows with PCF fonts on my ARM-based board. I've faced
with two problems.

1. Variable "long mwTextCoding" appeared in file "wingdi.c".  It's
default  value  MWTF_UTF8,  so  ASCII -coding  PCF fonts does not  work
correctly.
  I can't found a way, how I change mwTextCoding value from my program.
For my porpose, I've change its' default value to MWTF_ASCII.

2. I've found, microwindows faults, if fields PCF_BYTE_MASK ore
PCF_BIT_MASK in *.pcf file not equivalent to zero.
To solve this problem, I have made patch. It's concerning
mostly /engine/font_pcf.c , but two macros I've added in /include/swap.h.
Patch attached to my mail.



diff -urN ./src/engine/font_pcf.c ./new-src/engine/font_pcf.c
--- ./src/engine/font_pcf.c     2005-06-24 04:26:57.000000000 +0400
+++ ./new-src/engine/font_pcf.c 2008-08-18 14:30:39.000000000 +0400
@@ -1,4 +1,4 @@
-/* 
+/*
  * PCF font engine for Microwindows
  * Copyright (c) 2002, 2003 Greg Haerr <[EMAIL PROTECTED]>
  * Copyright (c) 2001, 2002 by Century Embedded Technologies
@@ -234,6 +234,16 @@
        FREAD(file, &s, sizeof(s));
        return wswap(s);
 }
+/* read a 16-bit integer MSB16 format*/
+static unsigned short
+readMSB16(FILEP file)
+{
+       unsigned char s[2];
+
+       FREAD(file, s, 2);
+       return wreadBE(s);
+}
+#define READ16(file, endian) endian ? readMSB16(file) : readLSB16(file)
 
 /* read a 32-bit integer LSB32 format*/
 static unsigned long
@@ -244,6 +254,16 @@
        FREAD(file, &n, sizeof(n));
        return dwswap(n);
 }
+/* read a 32-bit integer MSB32 format*/
+static unsigned long
+readMSB32(FILEP file)
+{
+       unsigned char n[4];
+
+       FREAD(file, n, 4);
+       return dwreadBE(n);
+}
+#define READ32(file, endian) endian ? readMSB32(file) : readLSB32(file)
 
 /* Get the offset of the given field */
 static int
@@ -329,41 +349,60 @@
        unsigned long num_glyphs;
        unsigned long pad;
        unsigned int i;
-       int endian;
+       int endian, bitorder;
        unsigned long *o;
        unsigned char *b;
        unsigned long bmsize[GLYPHPADOPTIONS];
 
+       DPRINTF("pcf_readbitmaps call pcf_get_offset()\n");
        if ((offset = pcf_get_offset(PCF_BITMAPS)) == -1)
                return -1;
+       DPRINTF("pcf_get_offset() return %ld\n", offset);
        FSEEK(file, offset, SEEK_SET);
 
        format = readLSB32(file);
-       endian = (format & PCF_BIT_MASK)? PCF_LSB_FIRST: PCF_MSB_FIRST;
+       bitorder = (format & PCF_BIT_MASK)? PCF_MSB_FIRST: PCF_LSB_FIRST;
+       endian = (format & PCF_BYTE_MASK)? PCF_MSB_FIRST: PCF_LSB_FIRST;
 
-       num_glyphs = readLSB32(file);
+       DPRINTF("pcf_readbitmaps call readLSB32()\n");
+       num_glyphs = READ32(file,endian);
+       DPRINTF("num_glyphs =  %ld\n", num_glyphs);
 
        o = *offsets = (unsigned long *)malloc(num_glyphs * sizeof(unsigned 
long));
+       if(!o){
+               EPRINTF("pcf_readbitmaps can't allocate memory\n");
+               return -1;
+       }
        for (i=0; i < num_glyphs; ++i)
-               o[i] = readLSB32(file);
+               o[i] = READ32(file,endian);
+       DPRINTF("pcf_readbitmaps have read %ld ints\n", num_glyphs);
 
        for (i=0; i < GLYPHPADOPTIONS; ++i)
-               bmsize[i] = readLSB32(file);
+               bmsize[i] = READ32(file,endian);
 
        pad = format & PCF_GLYPH_PAD_MASK;
        *bits_size = bmsize[pad]? bmsize[pad] : 1;
 
+       DPRINTF("pcf_readbitmaps have read %d ints\n", GLYPHPADOPTIONS);
        /* alloc and read bitmap data*/
        b = *bits = (unsigned char *) malloc(*bits_size);
+       if(!b){
+               EPRINTF("pcf_readbitmaps can't allocate memory for bitmap\n");
+               return -1;
+       }
        FREAD(file, b, *bits_size);
+       DPRINTF("pcf_readbitmaps have read %ld bytes\n", *bits_size);
 
        /* convert bitmaps*/
-       bit_order_invert(b, *bits_size);
+       DPRINTF("pcf_readbitmaps call bit_order_invert()\n");
+       if(bitorder == PCF_LSB_FIRST) bit_order_invert(b, *bits_size);
+
+/* TODO FIXME I'm not sure, next code is right? */
 #if MW_CPU_BIG_ENDIAN
-       if (endian == PCF_LSB_FIRST)
-               two_byte_swap(b, *bits_size);
+//     if (bitorder == PCF_MSB_FIRST)
+//             two_byte_swap(b, *bits_size);
 #else
-       if (endian == PCF_MSB_FIRST)
+//     if (bitorder == PCF_LSB_FIRST)
                two_byte_swap(b, *bits_size);
 #endif
        return num_glyphs;
@@ -376,32 +415,42 @@
        long i, size, offset;
        unsigned long format;
        struct metric_entry *m;
+       int endian;
 
        if ((offset = pcf_get_offset(PCF_METRICS)) == -1)
                return -1;
        FSEEK(file, offset, SEEK_SET);
 
        format = readLSB32(file);
+       endian = (format & PCF_BYTE_MASK)? PCF_MSB_FIRST: PCF_LSB_FIRST;
 
        if ((format & PCF_FORMAT_MASK) == PCF_DEFAULT_FORMAT) {
-               size = readLSB32(file);         /* 32 bits - Number of metrics*/
+               size = READ32(file,endian);             /* 32 bits - Number of 
metrics*/
 
                m = *metrics = (struct metric_entry *) malloc(size *
                        sizeof(struct metric_entry));
+               if(!m){
+                       EPRINTF("pcf_readmetrics can't allocate memory\n");
+                       return -1;
+               }
 
                for (i=0; i < size; i++) {
-                       m[i].leftBearing = readLSB16(file);
-                       m[i].rightBearing = readLSB16(file);
-                       m[i].width = readLSB16(file);
-                       m[i].ascent = readLSB16(file);
-                       m[i].descent = readLSB16(file);
-                       m[i].attributes = readLSB16(file);
+                       m[i].leftBearing = READ16(file,endian);
+                       m[i].rightBearing = READ16(file,endian);
+                       m[i].width = READ16(file,endian);
+                       m[i].ascent = READ16(file,endian);
+                       m[i].descent = READ16(file,endian);
+                       m[i].attributes = READ16(file,endian);
                }
        } else {
-               size = readLSB16(file);         /* 16 bits - Number of metrics*/
+               size = READ16(file,endian);             /* 16 bits - Number of 
metrics*/
 
                m = *metrics = (struct metric_entry *) malloc(size *
                        sizeof(struct metric_entry));
+               if(!m){
+                       EPRINTF("pcf_readmetrics can't allocate memory\n");
+                       return -1;
+               }
 
                for (i = 0; i < size; i++) {
                        m[i].leftBearing = readINT8(file) - 0x80;
@@ -421,30 +470,36 @@
        long offset, n;
        unsigned long format;
        struct encoding_entry *e;
+       int endian;
 
        if ((offset = pcf_get_offset(PCF_BDF_ENCODINGS)) == -1)
                return -1;
        FSEEK(file, offset, SEEK_SET);
 
        format = readLSB32(file);
+       endian = (format & PCF_BYTE_MASK)? PCF_MSB_FIRST: PCF_LSB_FIRST;
 
        e = *encoding = (struct encoding_entry *)
                malloc(sizeof(struct encoding_entry));
-       e->min_byte2 = readLSB16(file);
-       e->max_byte2 = readLSB16(file);
-       e->min_byte1 = readLSB16(file);
-       e->max_byte1 = readLSB16(file);
-       e->defaultchar = readLSB16(file);
+       if(!e){
+               EPRINTF("pcf_readmetrics can't allocate memory\n");
+               return -1;
+       }
+       e->min_byte2 = READ16(file,endian);
+       e->max_byte2 = READ16(file,endian);
+       e->min_byte1 = READ16(file,endian);
+       e->max_byte1 = READ16(file,endian);
+       e->defaultchar = READ16(file,endian);
        e->count = (e->max_byte2 - e->min_byte2 + 1) *
                (e->max_byte1 - e->min_byte1 + 1);
        e->map = (unsigned short *) malloc(e->count * sizeof(unsigned short));
        DPRINTF("def char %d (%x)\n", e->defaultchar, e->defaultchar);
 
        for (n = 0; n < e->count; ++n) {
-               e->map[n] = readLSB16(file);
+               e->map[n] = READ16(file,endian);
                /*DPRINTF("ncode %x (%c) %x\n", n, n, e->map[n]);*/
        }
-       DPRINTF("size %d byte1 %d,%d byte2 %d,%d\n", e->count,
+       DPRINTF("size %ld byte1 %d,%d byte2 %d,%d\n", e->count,
                e->min_byte1, e->max_byte1, e->min_byte2, e->max_byte2);
        return e->count;
 }
@@ -503,14 +558,17 @@
        char fname[256];
 
        /* Try to open the file */
+       DPRINTF("pcf_createfont() call FOPEN(%s)\n",name);
        file = FOPEN(name, "rb");
        if (!file) {
                strcpy(fname, PCF_FONT_DIR "/");
                strcpy(fname + sizeof(PCF_FONT_DIR), name);
                file = FOPEN(fname, "rb");
        }
-       if (!file)
+       if (!file){
+               EPRINTF("can't open font %s",name);
                return NULL;
+       }
 
        if (!(pf = (MWCOREFONT *) malloc(sizeof(MWCOREFONT)))) {
                err = -1;
@@ -524,12 +582,15 @@
 
 
        /* Read the table of contents */
+       DPRINTF("pcf_createfont() call pcf_read_toc()\n");
        if (pcf_read_toc(file, &toc, &toc_size) == -1) {
                err = -1;
+               DPRINTF("pcf_read_toc() return -1\n");
                goto leave_func;
        }
 
        /* Now, read in the bitmaps */
+       DPRINTF("pcf_createfont() call pcf_readbitmaps()\n");
        glyph_count = pcf_readbitmaps(file, &glyphs, &bsize, &glyphs_offsets);
        DPRINTF("glyph_count = %d (%x)\n", glyph_count, glyph_count);
 
@@ -538,7 +599,9 @@
                goto leave_func;
        }
 
+       DPRINTF("pcf_createfont() call pcf_read_encoding()\n");
        if (pcf_read_encoding(file, &encoding) == -1) {
+               DPRINTF("pcf_read_encoding() return -1\n");
                err = -1;
                goto leave_func;
        }
@@ -547,6 +610,7 @@
 
        /* Read in the metrics */
        count = pcf_readmetrics(file, &metrics);
+       DPRINTF("pcf_readmetrics() return %d\n", count);
 
        /* Calculate various maximum values */
        for (i = 0; i < count; i++) {
@@ -562,6 +626,9 @@
        pf->cfont->maxwidth = max_width;
        pf->cfont->height = max_height;
        pf->cfont->ascent = max_ascent;
+       DPRINTF("pf->cfont->maxwidth = %d\n", pf->cfont->maxwidth);
+       DPRINTF("pf->cfont->height = %d\n", pf->cfont->height);
+       DPRINTF("pf->cfont->ascent = %d\n", pf->cfont->ascent);
 
        /* Allocate enough room to hold all of the bits and the offsets */
        bwidth = (max_width + 15) / 16;
@@ -609,7 +676,7 @@
                                if (bearing < 0)        /* negative bearing not 
handled yet*/
                                        bearing = 0;
                                carry_shift = 16 - bearing;
-         
+
                                for (w = 0; w < lwidth; w++) {
                                        *output++ = (val[w] >> bearing) | carry;
                                        carry = val[w] << carry_shift;
@@ -637,7 +704,7 @@
        }
        pf->cfont->size = encoding->count;
 
-       uc16 = pf->cfont->firstchar > 255 || 
+       uc16 = pf->cfont->firstchar > 255 ||
                (pf->cfont->firstchar + pf->cfont->size) > 255;
        pf->fontprocs = uc16? &pcf_fontprocs16: &pcf_fontprocs;
        pf->fontsize = pf->fontrotation = pf->fontattr = 0;
diff -urN ./src/include/swap.h ./new-src/include/swap.h
--- ./src/include/swap.h        2007-11-22 04:01:53.000000000 +0300
+++ ./new-src/include/swap.h    2008-08-15 19:28:38.000000000 +0400
@@ -44,6 +44,20 @@
                         (((unsigned char *)(addr))[2] << 16) | \
                         (((unsigned char *)(addr))[3] << 24)))
 
+/**
+ * Read big endian format 32-bit number from buffer, possibly not
+ * aligned, and convert to the host CPU format.
+ */
+#define dwreadBE(addr) ((((unsigned char *)(addr))[3] | \
+                        (((unsigned char *)(addr))[2] << 8) | \
+                        (((unsigned char *)(addr))[1] << 16) | \
+                        (((unsigned char *)(addr))[0] << 24)))
+/**
+ * Read big endian format 32-bit number from buffer, possibly not
+ * aligned, and convert to the host CPU format.
+ */
+#define wreadBE(addr)  ((((unsigned char *)(addr))[1] | \
+                        (((unsigned char *)(addr))[0] << 8)))
 
 /* ********************************************************************* */
 /* Now, some platform-specific optimized macros.                         */

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to