freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype-demos][gsoc-2022-chariri-3] 2 commits: [ftinspec


From: Charlie Jiang (@cqjjjzr)
Subject: [Git][freetype/freetype-demos][gsoc-2022-chariri-3] 2 commits: [ftinspect] Fix palette name retrieving.
Date: Wed, 17 Aug 2022 00:33:08 +0000

Charlie Jiang pushed to branch gsoc-2022-chariri-3 at FreeType / FreeType Demo Programs

Commits:

  • 52ced910
    by Charlie Jiang at 2022-08-17T00:10:39+08:00
    [ftinspect] Fix palette name retrieving.
    
    `FT_Palette_Data::palette_name_ids` contains **name** ids, not sfnt name
    indices.
    
    * src/ftinspect/engine/paletteinfo.cpp, src/ftinspect/engine/paletteinfo.hpp:
      As described.
    
    * src/ftinspect/engine/engine.cpp: Pass active SFNT names table to the
      palette constructor.
    
  • 26c36cb7
    by Charlie Jiang at 2022-08-17T08:31:41+08:00
    [ftinspect] Fix palette name retrieving again.
    
    * src/ftinspect/engine/paletteinfo.cpp: Fix.
    
    * src/ftinspect/engine/fontinfo.cpp, src/ftinspect/engine/fontinfo.hpp:
      Add a field to indicate the string is valid or not.
    

5 changed files:

Changes:

  • src/ftinspect/engine/engine.cpp
    ... ... @@ -905,7 +905,8 @@ Engine::loadPaletteInfos()
    905 905
       // size never exceeds max val of ushort.
    
    906 906
       curPaletteInfos_.reserve(paletteData_.num_palettes);
    
    907 907
       for (int i = 0; i < paletteData_.num_palettes; ++i)
    
    908
    -    curPaletteInfos_.emplace_back(ftSize_->face, paletteData_, i);
    
    908
    +    curPaletteInfos_.emplace_back(ftSize_->face, paletteData_, i,
    
    909
    +                                  &curSFNTNames_);
    
    909 910
     }
    
    910 911
     
    
    911 912
     
    

  • src/ftinspect/engine/fontinfo.cpp
    ... ... @@ -44,10 +44,13 @@ SFNTName::get(Engine* engine,
    44 44
         obj.encodingID = sfntName.encoding_id;
    
    45 45
         obj.languageID = sfntName.language_id;
    
    46 46
         obj.nameID = sfntName.name_id;
    
    47
    -    
    
    48
    -    obj.strBuf = QByteArray(reinterpret_cast<const char*>(sfntName.string),
    
    49
    -                            sfntName.string_len);
    
    50
    -    obj.str = sfntNameToQString(sfntName);
    
    47
    +
    
    48
    +    auto len = sfntName.string_len >= INT_MAX
    
    49
    +                 ? INT_MAX - 1
    
    50
    +                 : sfntName.string_len;
    
    51
    +    obj.strBuf = QByteArray(reinterpret_cast<const char*>(sfntName.string), 
    
    52
    +                            len);
    
    53
    +    obj.str = sfntNameToQString(sfntName, &obj.strValid);
    
    51 54
     
    
    52 55
         if (obj.languageID >= 0x8000)
    
    53 56
         {
    
    ... ... @@ -61,19 +64,22 @@ SFNTName::get(Engine* engine,
    61 64
     
    
    62 65
     
    
    63 66
     QString
    
    64
    -SFNTName::sfntNameToQString(FT_SfntName const& sfntName)
    
    67
    +SFNTName::sfntNameToQString(FT_SfntName const& sfntName, 
    
    68
    +                            bool* outSuccess)
    
    65 69
     {
    
    66 70
       return sfntNameToQString(sfntName.platform_id, sfntName.encoding_id,
    
    67 71
                                reinterpret_cast<char const*>(sfntName.string),
    
    68
    -                           sfntName.string_len);
    
    72
    +                           sfntName.string_len,
    
    73
    +                           outSuccess);
    
    69 74
     }
    
    70 75
     
    
    71 76
     
    
    72 77
     QString
    
    73
    -SFNTName::sfntNameToQString(SFNTName const& sfntName)
    
    78
    +SFNTName::sfntNameToQString(SFNTName const& sfntName, bool* outSuccess)
    
    74 79
     {
    
    75 80
       return sfntNameToQString(sfntName.platformID, sfntName.encodingID,
    
    76
    -                           sfntName.strBuf.data(), sfntName.strBuf.size());
    
    81
    +                           sfntName.strBuf.data(), sfntName.strBuf.size(),
    
    82
    +                           outSuccess);
    
    77 83
     }
    
    78 84
     
    
    79 85
     
    
    ... ... @@ -81,11 +87,16 @@ QString
    81 87
     SFNTName::sfntNameToQString(unsigned short platformID,
    
    82 88
                                 unsigned short encodingID,
    
    83 89
                                 char const* str,
    
    84
    -                            size_t size)
    
    90
    +                            size_t size,
    
    91
    +                            bool* outSuccess)
    
    85 92
     {
    
    86 93
       // TODO not complete.
    
    87 94
       if (size >= INT_MAX - 1)
    
    88 95
         return "";
    
    96
    +
    
    97
    +  if (outSuccess)
    
    98
    +    *outSuccess = true;
    
    99
    +
    
    89 100
       switch (platformID)
    
    90 101
       {
    
    91 102
       case TT_PLATFORM_APPLE_UNICODE:
    
    ... ... @@ -94,6 +105,9 @@ SFNTName::sfntNameToQString(unsigned short platformID,
    94 105
       case TT_PLATFORM_MACINTOSH:
    
    95 106
         if (platformID == TT_MAC_ID_ROMAN)
    
    96 107
           return QString::fromLatin1(str, static_cast<int>(size));
    
    108
    +
    
    109
    +    if (outSuccess)
    
    110
    +      *outSuccess = false;
    
    97 111
         return "<encoding unsupported>";
    
    98 112
       case TT_PLATFORM_ISO:
    
    99 113
         switch (encodingID)
    
    ... ... @@ -104,6 +118,8 @@ SFNTName::sfntNameToQString(unsigned short platformID,
    104 118
         case TT_ISO_ID_10646:
    
    105 119
           return utf16BEToQString(str, size);
    
    106 120
         default:
    
    121
    +      if (outSuccess)
    
    122
    +        *outSuccess = false;
    
    107 123
           return "<encoding unsupported>";
    
    108 124
         }
    
    109 125
       case TT_PLATFORM_MICROSOFT:
    
    ... ... @@ -116,9 +132,14 @@ SFNTName::sfntNameToQString(unsigned short platformID,
    116 132
           return utf16BEToQString(str, size);
    
    117 133
     
    
    118 134
         default:
    
    135
    +      if (outSuccess)
    
    136
    +        *outSuccess = false;
    
    119 137
           return "<encoding unsupported>";
    
    120 138
         }
    
    121 139
       }
    
    140
    +
    
    141
    +  if (outSuccess)
    
    142
    +    *outSuccess = false;
    
    122 143
       return "<platform unsupported>";
    
    123 144
     }
    
    124 145
     
    

  • src/ftinspect/engine/fontinfo.hpp
    ... ... @@ -21,14 +21,18 @@ struct SFNTName
    21 21
       QByteArray strBuf;
    
    22 22
       QString str;
    
    23 23
       QString langTag;
    
    24
    +  bool strValid = false;
    
    24 25
     
    
    25 26
       static void get(Engine* engine,
    
    26 27
                       std::vector<SFNTName>& list);
    
    27
    -  static QString sfntNameToQString(FT_SfntName const& sfntName);
    
    28
    -  static QString sfntNameToQString(SFNTName const& sfntName);
    
    28
    +  static QString sfntNameToQString(FT_SfntName const& sfntName,
    
    29
    +                                   bool* outSuccess = NULL);
    
    30
    +  static QString sfntNameToQString(SFNTName const& sfntName,
    
    31
    +                                   bool* outSuccess = NULL);
    
    29 32
       static QString sfntNameToQString(unsigned short platformID,
    
    30 33
                                        unsigned short encodingID, 
    
    31
    -                                   char const* str, size_t size);
    
    34
    +                                   char const* str, size_t size,
    
    35
    +                                   bool* outSuccess = NULL);
    
    32 36
       static QString utf16BEToQString(char const* str, size_t size);
    
    33 37
     
    
    34 38
     
    

  • src/ftinspect/engine/paletteinfo.cpp
    ... ... @@ -8,15 +8,22 @@
    8 8
     
    
    9 9
     PaletteInfo::PaletteInfo(FT_Face face, 
    
    10 10
                              FT_Palette_Data& data, 
    
    11
    -                         int index)
    
    11
    +                         int index,
    
    12
    +                         std::vector<SFNTName> const* sfntNames)
    
    12 13
     : index(index)
    
    13 14
     {
    
    14
    -  if (data.palette_name_ids)
    
    15
    +  if (sfntNames && data.palette_name_ids)
    
    15 16
       {
    
    16 17
         auto id = data.palette_name_ids[index];
    
    17
    -    FT_SfntName sname;
    
    18
    -    FT_Get_Sfnt_Name(face, id, &sname);
    
    19
    -    name = SFNTName::sfntNameToQString(sname);
    
    18
    +    name = "(invalid)";
    
    19
    +    for (auto& obj : *sfntNames)
    
    20
    +    {
    
    21
    +      if (obj.nameID == id && obj.strValid)
    
    22
    +      {
    
    23
    +        name = obj.str;
    
    24
    +        break;
    
    25
    +      }
    
    26
    +    }
    
    20 27
       }
    
    21 28
       else
    
    22 29
         name = "(unnamed)";
    

  • src/ftinspect/engine/paletteinfo.hpp
    ... ... @@ -4,18 +4,21 @@
    4 4
     
    
    5 5
     #pragma once
    
    6 6
     
    
    7
    +#include <vector>
    
    7 8
     #include <QString>
    
    8 9
     
    
    9 10
     #include <freetype/freetype.h>
    
    10 11
     #include <freetype/ftcolor.h>
    
    11 12
     #include <freetype/ftsnames.h>
    
    12 13
     
    
    14
    +struct SFNTName;
    
    13 15
     struct PaletteInfo
    
    14 16
     {
    
    15 17
       int index;
    
    16 18
       QString name;
    
    17 19
     
    
    18
    -  PaletteInfo(FT_Face face, FT_Palette_Data& data, int index);
    
    20
    +  PaletteInfo(FT_Face face, FT_Palette_Data& data, int index, 
    
    21
    +              std::vector<SFNTName> const* sfntNames);
    
    19 22
     };
    
    20 23
     
    
    21 24
     
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]