rtoss - Diff between revs 324 and 327

Subversion Repositories:
Rev:
Show entire file - Ignore whitespace
Rev 324 Rev 327
Line 4... Line 4...
4  * 4  *
5  * Written By:  MURAOKA Taro <koron@tka.att.ne.jp> 5  * Written By:  MURAOKA Taro <koron@tka.att.ne.jp>
6  * Last Change: 12-Aug-2005. 6  * Last Change: 12-Aug-2005.
7  */ 7  */
8 8
9 //#define USE_CMAP_3RD_TABLE 1 -  
-   9 #define USE_CMAP_3RD_TABLE 1
10 #define USE_GLYPH_OFFSET 1 10 #define USE_GLYPH_OFFSET 1
11 11
12 #include "version.h" 12 #include "version.h"
13 13
14 #include <stdio.h> 14 #include <stdio.h>
Line 101... Line 101...
101 char *g_version         = VERSION; 101 char *g_version         = VERSION;
102 char *g_version_cp      = NULL; 102 char *g_version_cp      = NULL;
103 char *g_trademark       = TRADEMARK; 103 char *g_trademark       = TRADEMARK;
104 char *g_trademark_cp    = NULL; 104 char *g_trademark_cp    = NULL;
105 int g_flag_glyph_offset = 0; 105 int g_flag_glyph_offset = 0;
-   106 int g_flag_unicode_full = 0;
106 107
107     int 108     int
108 emCalc(int pix, int base) 109 emCalc(int pix, int base)
109 { 110 {
110     return (EMMAX * pix + base / 2) / base; 111     return (EMMAX * pix + base / 2) / base;
Line 655... Line 656...
655     loca->calcSum(); 656     loca->calcSum();
656     // Reserve 657     // Reserve
657     loca->commitLen(); 658     loca->commitLen();
658 } 659 }
659 660
660     static void -  
-   661         static void
661 generate_CMAP(bdf2_t* font) 662 generate_CMAP(bdf2_t* font)
662 { 663 {
663     bigfirst fmat0, fmat4; -  
-   664         bigfirst fmat0, fmat4, fmat12;
664 665
665     // Make format 0 -  
666     { -  
667         int i; -  
668 -  
669         fmat0.addShort(0);                      /* format */ -  
670         fmat0.addShort(sizeof(short) * 3 + 256); -  
671         /* len */ -  
672         fmat0.addShort(0);                      /* Revision */ -  
673         for (i = 0; i < 0x100; ++i) -  
-   666         // Make format 0
674         { 667         {
675             int gid = bdf2_is_glyph_available(font, i) ? -  
676                 bdf2_get_glyph_id(font, i) + 1 : 0; -  
677             fmat0.addByte(gid); -  
678             //printf("GLYPH_ID: %02x -> %d\n", i, bdf2_get_glyph_id(font, i)); -  
-   668                 int i;
-   669
-   670                 fmat0.addShort(0);                                              /* format */
-   671                 fmat0.addShort(sizeof(short) * 3 + 256);
-   672                 /* len */
-   673                 fmat0.addShort(0);                                              /* Revision */
-   674                 for (i = 0; i < 0x100; ++i)
-   675                 {
-   676                         int gid = bdf2_is_glyph_available(font, i) ?
-   677                                 bdf2_get_glyph_id(font, i) + 1 : 0;
-   678                         fmat0.addByte(gid);
-   679                         //printf("GLYPH_ID: %02x -> %d\n", i, bdf2_get_glyph_id(font, i));
-   680                 }
679         } 681         }
680     } -  
681 682
682     // Make format 4 -  
683     { -  
684         bigfirst endCount, startCount, idDeleta, idRangeOffset; -  
685         int segCount = 0; -  
686 -  
687         for (int i = 0; i < BDF_MAX_GLYPH; ++i) -  
-   683         // Make format 4 (UCS-2 BMP-only)
688         { 684         {
689             if (!bdf2_is_glyph_available(font, i)) -  
690             { -  
691                 if (i == BDF_MAX_GLYPH - 1) -  
-   685                 bigfirst endCount, startCount, idDeleta, idRangeOffset;
-   686                 int segCount = 0;
-   687
-   688                 for (int i = 0; i < 0x10000; ++i)
692                 { 689                 {
693                     ++segCount; -  
694                     endCount.addShort(BDF_MAX_GLYPH - 1); -  
695                     startCount.addShort(BDF_MAX_GLYPH - 1); -  
696                     idDeleta.addShort(1); -  
697                     idRangeOffset.addShort(0); -  
-   690                         if (!bdf2_is_glyph_available(font, i))
-   691                         {
-   692                                 if (i == 0x10000 - 1)
-   693                                 {
-   694                                         ++segCount;
-   695                                         endCount.addShort(0x10000 - 1);
-   696                                         startCount.addShort(0x10000 - 1);
-   697                                         idDeleta.addShort(1);
-   698                                         idRangeOffset.addShort(0);
-   699                                 }
-   700                                 continue;
-   701                         }
-   702                         int j = i + 1;
-   703                         while (bdf2_is_glyph_available(font, j))
-   704                                 ++j;
-   705                         j -= 1;
-   706                         endCount.addShort(j);
-   707                         startCount.addShort(i);
-   708                         idDeleta.addShort(bdf2_get_glyph_id(font, i) - i + 1);
-   709                         idRangeOffset.addShort(0);
-   710                         ++segCount;
-   711                         i = j + 1;
698                 } 712                 }
699                 continue; -  
700             } -  
701             int j = i + 1; -  
702             while (bdf2_is_glyph_available(font, j)) -  
703                 ++j; -  
704             j -= 1; -  
705             endCount.addShort(j); -  
706             startCount.addShort(i); -  
707             idDeleta.addShort(bdf2_get_glyph_id(font, i) - i + 1); -  
708             idRangeOffset.addShort(0); -  
709             ++segCount; -  
710             i = j + 1; -  
711         } -  
712 713
713         unsigned short segCountX2       = segCount * 2; -  
714         unsigned short entrySelector    = search_topbit(segCount); -  
715         unsigned short searchRange      = 1 << (entrySelector + 1); -  
-   714                 unsigned short segCountX2               = segCount * 2;
-   715                 unsigned short entrySelector            = search_topbit(segCount);
-   716                 unsigned short searchRange              = 1 << (entrySelector + 1);
716 717
717         fmat4.addShort(4);              // format -  
718         fmat4.addShort(sizeof(short) * 8 + segCount * sizeof(short) * 4); -  
719                                         // length -  
720         fmat4.addShort(0);              // language -  
721         fmat4.addShort(segCountX2);     // segCountX2 -  
722         fmat4.addShort(searchRange);    // searchRange -  
723         fmat4.addShort(entrySelector);  // entrySelector -  
724         fmat4.addShort(segCountX2 - searchRange); -  
725                                         // rangeShift -  
726         fmat4.addArray(endCount); -  
727         fmat4.addShort(0);              // reservedPad -  
728         fmat4.addArray(startCount); -  
729         fmat4.addArray(idDeleta); -  
730         fmat4.addArray(idRangeOffset); -  
731     } -  
-   718                 fmat4.addShort(4);                              // format
-   719                 fmat4.addShort(sizeof(short) * 8 + segCount * sizeof(short) * 4);
-   720                                                                                 // length
-   721                 fmat4.addShort(0);                              // language
-   722                 fmat4.addShort(segCountX2);             // segCountX2
-   723                 fmat4.addShort(searchRange);            // searchRange
-   724                 fmat4.addShort(entrySelector);          // entrySelector
-   725                 fmat4.addShort(segCountX2 - searchRange);
-   726                                                                                 // rangeShift
-   727                 fmat4.addArray(endCount);
-   728                 fmat4.addShort(0);                              // reservedPad
-   729                 fmat4.addArray(startCount);
-   730                 fmat4.addArray(idDeleta);
-   731                 fmat4.addArray(idRangeOffset);
-   732         }
732 733
733     /* follow make cmap */ -  
-   734         /* follow make cmap */
734 #ifdef USE_CMAP_3RD_TABLE 735 #ifdef USE_CMAP_3RD_TABLE
735     /* for 3rd table */ -  
736     int numtbl = 3; -  
-   736         int numtbl = 2;
-   737         if (g_flag_unicode_full) {
-   738                 /* for 3rd table */
-   739                 numtbl = 3;
-   740
-   741                 // Make format 12
-   742                 {
-   743                         bigfirst segment12;
-   744                         int segCount12 = 0;
-   745
-   746                         for (int i = 0; i < BDF_MAX_GLYPH; ++i)
-   747                         {
-   748                                 if (!bdf2_is_glyph_available(font, i))
-   749                                 {
-   750                                         /*if (i == BDF_MAX_GLYPH - 1)
-   751                                         {
-   752                                                 ++segCount12;
-   753                                                 segment12.addLong(BDF_MAX_GLYPH - 1);
-   754                                                 segment12.addLong(BDF_MAX_GLYPH - 1);
-   755                                                 segment12.addLong(1);
-   756                                         }*/
-   757                                         continue;
-   758                                 }
-   759                                 int j = i + 1;
-   760                                 while (bdf2_is_glyph_available(font, j))
-   761                                         ++j;
-   762                                 j -= 1;
-   763                                 segment12.addLong(i);
-   764                                 segment12.addLong(j);
-   765                                 segment12.addLong(bdf2_get_glyph_id(font, i)+1); // first glyph is blank non-bitmap defauly glyph
-   766                                 ++segCount12;
-   767                                 i = j + 1;
-   768                         }
-   769
-   770                         fmat12.addShort(12);                    // format
-   771                         fmat12.addShort(0);                             // reserved
-   772                         fmat12.addLong(sizeof(short) * 2 + sizeof(long) * 3 + segCount12 * sizeof(long) * 3);
-   773                                                                                         // length
-   774                         fmat12.addLong(0);                              // language
-   775                         fmat12.addLong(segCount12);             // nGroups
-   776                         fmat12.addArray(segment12);
-   777                 }
-   778         }
737 #else 779 #else
738     int numtbl = 2; -  
-   780         int numtbl = 2;
739 #endif 781 #endif
740     int offset = sizeof(short) * 2 -  
741         + (sizeof(short) * 2 + sizeof(long)) * numtbl; -  
-   782         int offset = sizeof(short) * 2
-   783                 + (sizeof(short) * 2 + sizeof(long)) * numtbl;
742 784
743     table *cmap = &ttfTbl[CMAP]; -  
744     cmap->addShort(0);          /* Version */ -  
745     cmap->addShort(numtbl);     /* #tbl */ -  
746     /* Table 1 (format 0) */ -  
747     cmap->addShort(1);          /* Platform ID = 1 -> Macintosh */ -  
748     cmap->addShort(0);          /* Encoding ID = 0 -> Roman */ -  
749     cmap->addLong(offset); -  
750     /* Table 2 (format 4) */ -  
751     cmap->addShort(3);          /* Platform ID = 3 -> Microsoft */ -  
752     cmap->addShort(1);          /* Encoding ID = 1 -> Unicode */ -  
753     cmap->addLong(offset + fmat0.getLen()); -  
-   785         table *cmap = &ttfTbl[CMAP];
-   786         cmap->addShort(0);                              /* Version */
-   787         cmap->addShort(numtbl);         /* #tbl */
-   788         /* Table 1 (format 0) */
-   789         cmap->addShort(1);                              /* Platform ID = 1 -> Macintosh */
-   790         cmap->addShort(0);                              /* Encoding ID = 0 -> Roman */
-   791         cmap->addLong(offset);
-   792         /* Table 2 (format 4) */
-   793         cmap->addShort(3);                              /* Platform ID = 3 -> Microsoft */
-   794         cmap->addShort(1);                              /* Encoding ID = 1 -> Unicode */
-   795         cmap->addLong(offset + fmat0.getLen());
754 #if USE_CMAP_3RD_TABLE 796 #if USE_CMAP_3RD_TABLE
755     /* Table 3 (format X) */ -  
756     cmap->addShort(0);          /* Platform ID = X -> Unknown */ -  
757     cmap->addShort(0);          /* Encoding ID = X -> Unknown */ -  
758     cmap->addLong(offset + fmat0.getLen()); -  
759     //cmap->addLong(offset + fmat0.getLen()); -  
-   797         if (g_flag_unicode_full) {
-   798                 /* Table 3 (format 12) */
-   799                 cmap->addShort(3);                      /* Platform ID = 3 -> Microsoft */
-   800                 cmap->addShort(10);                     /* Encoding ID = 10 -> Unicode UCS-4 */
-   801                 cmap->addLong(offset + fmat0.getLen() + fmat4.getLen());
-   802         }
760 #endif 803 #endif
761 804
762     /* Add table main data stream */ -  
763     cmap->addArray(fmat0); -  
764     cmap->addArray(fmat4); -  
-   805         /* Add table main data stream */
-   806         cmap->addArray(fmat0);
-   807         cmap->addArray(fmat4);
-   808 #if USE_CMAP_3RD_TABLE
-   809         if (g_flag_unicode_full)
-   810                 cmap->addArray(fmat12);
-   811 #endif
765 812
766     cmap->calcSum(); -  
767     cmap->commitLen(); -  
-   813         cmap->calcSum();
-   814         cmap->commitLen();
768 } 815 }
769 816
770     static void 817     static void
771 generate_OS2_PREP(bdf2_t* font) 818 generate_OS2_PREP(bdf2_t* font)
772 { 819 {