|  | 
| 7 | 7 | #include <cstdio> | 
| 8 | 8 | #include <iterator> | 
| 9 | 9 | #include <set> | 
| 10 |  | -#include <sstream> | 
| 11 | 10 | #include <stdexcept> | 
| 12 | 11 | #include <string> | 
| 13 | 12 | #include <vector> | 
| @@ -207,32 +206,44 @@ FT2Font::get_path(std::vector<double> &vertices, std::vector<unsigned char> &cod | 
| 207 | 206 |     codes.push_back(CLOSEPOLY); | 
| 208 | 207 | } | 
| 209 | 208 | 
 | 
| 210 |  | -FT2Font::FT2Font(FT_Open_Args &open_args, | 
| 211 |  | -                 long hinting_factor_, | 
| 212 |  | -                 std::vector<FT2Font *> &fallback_list, | 
|  | 209 | +FT2Font::FT2Font(long hinting_factor_, std::vector<FT2Font *> &fallback_list, | 
| 213 | 210 |                  FT2Font::WarnFunc warn, bool warn_if_used) | 
| 214 | 211 |     : ft_glyph_warn(warn), warn_if_used(warn_if_used), image({1, 1}), face(nullptr), | 
| 215 | 212 |       hinting_factor(hinting_factor_), | 
| 216 | 213 |       // set default kerning factor to 0, i.e., no kerning manipulation | 
| 217 | 214 |       kerning_factor(0) | 
| 218 | 215 | { | 
| 219 | 216 |     clear(); | 
|  | 217 | +    // Set fallbacks | 
|  | 218 | +    std::copy(fallback_list.begin(), fallback_list.end(), std::back_inserter(fallbacks)); | 
|  | 219 | +} | 
|  | 220 | + | 
|  | 221 | +FT2Font::~FT2Font() | 
|  | 222 | +{ | 
|  | 223 | +    close(); | 
|  | 224 | +} | 
|  | 225 | + | 
|  | 226 | +void FT2Font::open(FT_Open_Args &open_args) | 
|  | 227 | +{ | 
| 220 | 228 |     FT_CHECK(FT_Open_Face, _ft2Library, &open_args, 0, &face); | 
| 221 | 229 |     if (open_args.stream != nullptr) { | 
| 222 | 230 |         face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; | 
| 223 | 231 |     } | 
| 224 |  | -    // Set fallbacks | 
| 225 |  | -    std::copy(fallback_list.begin(), fallback_list.end(), std::back_inserter(fallbacks)); | 
| 226 | 232 | } | 
| 227 | 233 | 
 | 
| 228 |  | -FT2Font::~FT2Font() | 
|  | 234 | +void FT2Font::close() | 
| 229 | 235 | { | 
|  | 236 | +    // This should be idempotent, in case a user manually calls close before the | 
|  | 237 | +    // destructor does. | 
|  | 238 | + | 
| 230 | 239 |     for (auto & glyph : glyphs) { | 
| 231 | 240 |         FT_Done_Glyph(glyph); | 
| 232 | 241 |     } | 
|  | 242 | +    glyphs.clear(); | 
| 233 | 243 | 
 | 
| 234 | 244 |     if (face) { | 
| 235 | 245 |         FT_Done_Face(face); | 
|  | 246 | +        face = nullptr; | 
| 236 | 247 |     } | 
| 237 | 248 | } | 
| 238 | 249 | 
 | 
|  | 
0 commit comments