Hello community, here is the log from the commit of package freetype2 for openSUSE:Factory checked in at 2016-10-10 16:18:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/freetype2 (Old) and /work/SRC/openSUSE:Factory/.freetype2.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "freetype2" Changes: -------- --- /work/SRC/openSUSE:Factory/freetype2/freetype2.changes 2016-07-20 09:15:33.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.freetype2.new/freetype2.changes 2016-10-10 16:18:09.000000000 +0200 @@ -1,0 +2,46 @@ +Fri Sep 9 16:10:39 UTC 2016 - [email protected] + +- update to version 2.7: + * IMPORTANT CHANGES + + As announced earlier, the 2.7.x series now uses the new subpixel + hinting mode as the default, emulating a modern version of + ClearType. + This change inevitably leads to different rendering results, and + you might change the `TT_CONFIG_OPTION_SUBPIXEL_HINTING' + configuration option to adapt it to your taste (or use the new + `FREETYPE_PROPERTIES' environment variable). See the + corresponding entry below for version 2.6.4, which gives more + information. + - A new option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES' has been + introduced. If set (which is the default), an environment + variable `FREETYPE_PROPERTIES' can be used to control driver + properties. Example: + FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + cff:no-stem-darkening=1 \ + autofitter:warping=1 + This allows to select, say, the subpixel hinting mode at runtime + for a given application. See file `ftoption.h' for more. + * IMPORTANT BUG FIXES + + After loading a named instance of a GX variation font, the + `face_index' value in the returned `FT_Face' structure now + correctly holds the named instance index in the upper 16bits as + documented. + * MISCELLANEOUS + + A new macro `FT_IS_NAMED_INSTANCE' to test whether a given face + is a named instance. + + More fixes to GX font handling. + + Apple's `GETVARIATION' bytecode operator (needed for GX + variation font support) has been implemented. + + Another round of fuzzer fixes, mainly to reject invalid fonts + faster. + + Handling of raw CID fonts was broken (bug introduced in version + 2.6.4). + + The smooth rasterizer has been streamlined to make it faster by + approx. 20%. + + The `ftgrid' demo program now understands command line option + `-d' to give start-up design coordinates. + + The `ftdump' demo program has a new command line option `-p' to + dump TrueType bytecode instructions. +- removed freetype2-subpixel.patch in favor of above + FREETYPE_PROPERTIES environment variable +------------------------------------------------------------------- --- /work/SRC/openSUSE:Factory/freetype2/ft2demos.changes 2016-07-20 09:15:33.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.freetype2.new/ft2demos.changes 2016-10-10 16:18:09.000000000 +0200 @@ -1,0 +2,6 @@ +Fri Sep 9 16:14:34 UTC 2016 - [email protected] + +- update to version 2.7: + + Sync with freetype 2.7 + +------------------------------------------------------------------- Old: ---- freetype-2.6.5.tar.bz2 freetype-doc-2.6.5.tar.bz2 freetype2-subpixel.patch ft2demos-2.6.5.tar.bz2 New: ---- freetype-2.7.tar.bz2 freetype-doc-2.7.tar.bz2 ft2demos-2.7.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ freetype2.spec ++++++ --- /var/tmp/diff_new_pack.HJxG2u/_old 2016-10-10 16:18:11.000000000 +0200 +++ /var/tmp/diff_new_pack.HJxG2u/_new 2016-10-10 16:18:11.000000000 +0200 @@ -17,9 +17,9 @@ # -%define doc_version 2.6.5 +%define doc_version 2.7 Name: freetype2 -Version: 2.6.5 +Version: 2.7 Release: 0 Summary: A TrueType Font Library License: SUSE-Freetype or GPL-2.0+ @@ -29,7 +29,6 @@ Source1: http://download.savannah.gnu.org/releases/freetype/freetype-doc-%{doc_version}.tar.bz2 Source3: baselibs.conf Patch1: freetype2-bitmap-foundry.patch -Patch200: freetype2-subpixel.patch # PATCH-FIX-OPENSUSE don-t-mark-libpng-as-required-library.patch -- it is private in .pc Patch202: don-t-mark-libpng-as-required-library.patch Patch308961: bugzilla-308961-cmex-workaround.patch @@ -81,14 +80,10 @@ %prep -%define enable_subpixel_rendering 0 %setup -q -n freetype-%{version} -a 1 %patch1 -p1 %patch308961 -p 1 %patch202 -p1 -%if %{enable_subpixel_rendering} -%patch200 -p1 -%endif %build export CFLAGS="%{optflags} -std=gnu99 -D_GNU_SOURCE $(getconf LFS_CFLAGS)" ++++++ ft2demos.spec ++++++ --- /var/tmp/diff_new_pack.HJxG2u/_old 2016-10-10 16:18:11.000000000 +0200 +++ /var/tmp/diff_new_pack.HJxG2u/_new 2016-10-10 16:18:11.000000000 +0200 @@ -16,9 +16,9 @@ # -%define freetype_version 2.6.5 +%define freetype_version 2.7 Name: ft2demos -Version: 2.6.5 +Version: 2.7 Release: 0 Summary: Freetype2 Utilities and Demo Programs License: GPL-2.0+ @@ -31,7 +31,6 @@ Source1013: bnc633938_badbdf.0 Source1015: bug-641580_CVE-2010-3311.cff Source1016: bug-647375_tt2.ttf -Patch200: freetype2-subpixel.patch # PATCH-FIX-UPSTREAM overflow.patch -- I: Statement is overflowing a buffer Patch201: overflow.patch # PATCH-FIX-OPENSUSE don-t-mark-libpng-as-required-library.patch -- it is private in .pc @@ -50,16 +49,12 @@ %prep -%define enable_subpixel_rendering 0%{?opensuse_bs} %setup -q -n freetype-%{freetype_version} -b 1 %patch308961 -p 1 pushd ../ft2demos-%{version} %patch201 -p1 popd %patch202 -p1 -%if %{enable_subpixel_rendering} -%patch200 -p 1 -b .subpixel -%endif %build export CFLAGS="%{optflags} -std=gnu99 -D_GNU_SOURCE $(getconf LFS_CFLAGS)" ++++++ freetype-2.6.5.tar.bz2 -> freetype-2.7.tar.bz2 ++++++ ++++ 19661 lines of diff (skipped) ++++++ freetype-doc-2.6.5.tar.bz2 -> freetype-doc-2.7.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freetype-2.6.5/README.freetype-doc new/freetype-2.7/README.freetype-doc --- old/freetype-2.6.5/README.freetype-doc 2016-07-12 07:41:44.000000000 +0200 +++ new/freetype-2.7/README.freetype-doc 2016-09-08 11:06:55.000000000 +0200 @@ -7,10 +7,10 @@ mkdir src cd src - tar xzvf freetype-2.6.5.tar.gz - tar xzvf freetype-doc-2.6.5.tar.gz + tar xzvf freetype-2.7.tar.gz + tar xzvf freetype-doc-2.7.tar.gz -Now you can move the `docs' subdirectory of `freetype-2.6.5' to any place +Now you can move the `docs' subdirectory of `freetype-2.7' to any place you want. The entry point for the documentation is diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freetype-2.6.5/docs/tutorial/example5.cpp new/freetype-2.7/docs/tutorial/example5.cpp --- old/freetype-2.6.5/docs/tutorial/example5.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/freetype-2.7/docs/tutorial/example5.cpp 2016-09-08 11:06:55.000000000 +0200 @@ -0,0 +1,460 @@ +// example5.cpp + +// This program is a simple example that prints a character's outline in the +// SVG format to stdout, demonstrating the usage of FT_Outline_Decompose(). +// +// Developed by Static Jobs LLC and contributed to the FreeType project. +// +// Copyright (c) 2016 Static Jobs LLC +// IT and software engineering jobs in the US, Canada and the UK +// https://www.staticjobs.com +// +// License: MIT (see below) +// +// The source code was reformatted by Werner Lemberg, also including a few +// minor code changes and comments for didactic purposes. +// +// On a Unix box like GNU/Linux or OS X, compile with +// +// g++ -o example5 example5.cpp `freetype-config --cflags --libs` +// +// or +// +// g++ -o example5 example5.cpp `pkg-config freetype2 --cflags --libs` +// +// on the command line. +// +// On other platforms that don't have the `freetype-config' shell script or +// the `pkg-config' tool, you have to pass the necessary compiler flags +// manually. + + +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +// OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +// THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +#include <iostream> +#include <sstream> +#include <stdexcept> +#include <cstring> +#include <cctype> + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_BBOX_H + + +using namespace std; + + +struct FreeTypeLibrary +{ + FreeTypeLibrary(); + ~FreeTypeLibrary(); + + FT_Library m_ftLibrary; +}; + + +inline +FreeTypeLibrary::FreeTypeLibrary() +{ + FT_Error error = FT_Init_FreeType(&m_ftLibrary); + + if (error) + throw runtime_error("Couldn't initialize the library:" + " FT_Init_FreeType() failed"); +} + + +inline +FreeTypeLibrary::~FreeTypeLibrary() +{ + FT_Done_FreeType(m_ftLibrary); +} + + +struct FreeTypeFace +{ + FreeTypeFace(const FreeTypeLibrary &library, + const char *filename); + ~FreeTypeFace(); + + FT_Face m_ftFace; +}; + + +inline +FreeTypeFace::FreeTypeFace(const FreeTypeLibrary &library, + const char *filename) +{ + // For simplicity, always use the first face index. + FT_Error error = FT_New_Face(library.m_ftLibrary, filename, 0, &m_ftFace); + + if (error) + throw runtime_error("Couldn't load the font file:" + " FT_New_Face() failed"); +} + + +inline FreeTypeFace::~FreeTypeFace() +{ + FT_Done_Face(m_ftFace); +} + + +class OutlinePrinter +{ +public: + OutlinePrinter(const char *filename); + int Run(const char *symbol); + +private: + void LoadGlyph(const char *symbol) const; + bool OutlineExists() const; + void FlipOutline() const; + void ExtractOutline(); + void ComputeViewBox(); + void PrintSVG() const; + + static int MoveToFunction(const FT_Vector *to, + void *user); + static int LineToFunction(const FT_Vector *to, + void *user); + static int ConicToFunction(const FT_Vector *control, + const FT_Vector *to, + void *user); + static int CubicToFunction(const FT_Vector *controlOne, + const FT_Vector *controlTwo, + const FT_Vector *to, + void *user); + +private: + // These two lines initialize the library and the face; + // the order is important! + FreeTypeLibrary m_library; + FreeTypeFace m_face; + + ostringstream m_path; + + // These four variables are for the `viewBox' attribute. + FT_Pos m_xMin; + FT_Pos m_yMin; + FT_Pos m_width; + FT_Pos m_height; +}; + + +inline +OutlinePrinter::OutlinePrinter(const char *filename) +: m_face(m_library, filename), + m_xMin(0), + m_yMin(0), + m_width(0), + m_height(0) +{ + // Empty body. +} + + +int +OutlinePrinter::Run(const char *symbol) +{ + LoadGlyph(symbol); + + // Check whether outline exists. + bool outlineExists = OutlineExists(); + + if (!outlineExists) // Outline doesn't exist. + throw runtime_error("Outline check failed.\n" + "Please, inspect your font file or try another one," + " for example LiberationSerif-Bold.ttf"); + + FlipOutline(); + + ExtractOutline(); + + ComputeViewBox(); + + PrintSVG(); + + return 0; +} + + +void +OutlinePrinter::LoadGlyph(const char *symbol) const +{ + FT_ULong code = symbol[0]; + + // For simplicity, use the charmap FreeType provides by default; + // in most cases this means Unicode. + FT_UInt index = FT_Get_Char_Index(m_face.m_ftFace, code); + + FT_Error error = FT_Load_Glyph(m_face.m_ftFace, + index, + FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP); + + if (error) + throw runtime_error("Couldn't load the glyph: FT_Load_Glyph() failed"); +} + + +// While working on this example, we found fonts with no outlines for +// printable characters such as `A', i.e., `outline.n_contours' and +// `outline.n_points' were zero. FT_Outline_Check() returned `true'. +// FT_Outline_Decompose() also returned `true' without walking the outline. +// That is, we had no way of knowing whether the outline existed and could +// be (or was) decomposed. Therefore, we implemented this workaround to +// check whether the outline does exist and can be decomposed. +bool +OutlinePrinter::OutlineExists() const +{ + FT_Face face = m_face.m_ftFace; + FT_GlyphSlot slot = face->glyph; + FT_Outline &outline = slot->outline; + + if (slot->format != FT_GLYPH_FORMAT_OUTLINE) + return false; // Should never happen. Just an extra check. + + if (outline.n_contours <= 0 || outline.n_points <= 0) + return false; // Can happen for some font files. + + FT_Error error = FT_Outline_Check(&outline); + + return error == 0; +} + + +// FreeType and SVG use opposite vertical directions. +void +OutlinePrinter::FlipOutline() const +{ + const FT_Fixed multiplier = 65536L; + + FT_Matrix matrix; + + matrix.xx = 1L * multiplier; + matrix.xy = 0L * multiplier; + matrix.yx = 0L * multiplier; + matrix.yy = -1L * multiplier; + + FT_Face face = m_face.m_ftFace; + FT_GlyphSlot slot = face->glyph; + FT_Outline &outline = slot->outline; + + FT_Outline_Transform(&outline, &matrix); +} + + +void +OutlinePrinter::ExtractOutline() +{ + m_path << " <path d='\n"; + + FT_Outline_Funcs callbacks; + + callbacks.move_to = MoveToFunction; + callbacks.line_to = LineToFunction; + callbacks.conic_to = ConicToFunction; + callbacks.cubic_to = CubicToFunction; + + callbacks.shift = 0; + callbacks.delta = 0; + + FT_Face face = m_face.m_ftFace; + FT_GlyphSlot slot = face->glyph; + FT_Outline &outline = slot->outline; + + FT_Error error = FT_Outline_Decompose(&outline, &callbacks, this); + + if (error) + throw runtime_error("Couldn't extract the outline:" + " FT_Outline_Decompose() failed"); + + m_path << " '\n" + " fill='red'/>\n"; +} + + +void +OutlinePrinter::ComputeViewBox() +{ + FT_Face face = m_face.m_ftFace; + FT_GlyphSlot slot = face->glyph; + FT_Outline &outline = slot->outline; + + FT_BBox boundingBox; + + FT_Outline_Get_BBox(&outline, &boundingBox); + + FT_Pos xMin = boundingBox.xMin; + FT_Pos yMin = boundingBox.yMin; + FT_Pos xMax = boundingBox.xMax; + FT_Pos yMax = boundingBox.yMax; + + m_xMin = xMin; + m_yMin = yMin; + m_width = xMax - xMin; + m_height = yMax - yMin; +} + + +void +OutlinePrinter::PrintSVG() const +{ + cout << "<svg xmlns='http://www.w3.org/2000/svg'\n" + " xmlns:xlink='http://www.w3.org/1999/xlink'\n" + " viewBox='" + << m_xMin << ' ' << m_yMin << ' ' << m_width << ' ' << m_height + << "'>\n" + << m_path.str() + << "</svg>" + << endl; +} + + +int +OutlinePrinter::MoveToFunction(const FT_Vector *to, + void *user) +{ + OutlinePrinter *self = static_cast<OutlinePrinter *>(user); + + FT_Pos x = to->x; + FT_Pos y = to->y; + + self->m_path << " " + "M " << x << ' ' << y << '\n'; + + return 0; +} + + +int +OutlinePrinter::LineToFunction(const FT_Vector *to, + void *user) +{ + OutlinePrinter *self = static_cast<OutlinePrinter *>(user); + + FT_Pos x = to->x; + FT_Pos y = to->y; + + self->m_path << " " + "L " << x << ' ' << y << '\n'; + + return 0; +} + + +int +OutlinePrinter::ConicToFunction(const FT_Vector *control, + const FT_Vector *to, + void *user) +{ + OutlinePrinter *self = static_cast<OutlinePrinter *>(user); + + FT_Pos controlX = control->x; + FT_Pos controlY = control->y; + + FT_Pos x = to->x; + FT_Pos y = to->y; + + self->m_path << " " + "Q " << controlX << ' ' << controlY << ", " + << x << ' ' << y << '\n'; + + return 0; +} + + +int +OutlinePrinter::CubicToFunction(const FT_Vector *controlOne, + const FT_Vector *controlTwo, + const FT_Vector *to, + void *user) +{ + OutlinePrinter *self = static_cast<OutlinePrinter *>(user); + + FT_Pos controlOneX = controlOne->x; + FT_Pos controlOneY = controlOne->y; + + FT_Pos controlTwoX = controlTwo->x; + FT_Pos controlTwoY = controlTwo->y; + + FT_Pos x = to->x; + FT_Pos y = to->y; + + self->m_path << " " + "C " << controlOneX << ' ' << controlOneY << ", " + << controlTwoX << ' ' << controlTwoY << ", " + << x << ' ' << y << '\n'; + + return 0; +} + + +int +main(int argc, + char **argv) +{ + if (argc != 3) + { + const char *program = argv[0]; + + cerr << "This program prints a single character's outline" + " in the SVG format to stdout.\n" + "Usage: " << program << " font symbol\n" + "Example: " << program << " LiberationSerif-Bold.ttf A" << endl; + + return 1; + } + + const char *symbol = argv[2]; + + // For simplicity, only accept single-byte characters like `A'. + if (strlen(symbol) != 1 || isspace(*symbol)) + { + cerr << "Error: '" << symbol + << "' is not a single printable character" << endl; + + return 2; + } + + int status; + + try + { + const char *filename = argv[1]; + + OutlinePrinter printer(filename); + + status = printer.Run(symbol); + } + catch (const exception &e) + { + cerr << "Error: " << e.what() << endl; + + status = 3; + } + + return status; +} + +// EOF diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freetype-2.6.5/docs/tutorial/example5.svg new/freetype-2.7/docs/tutorial/example5.svg --- old/freetype-2.6.5/docs/tutorial/example5.svg 1970-01-01 01:00:00.000000000 +0100 +++ new/freetype-2.7/docs/tutorial/example5.svg 2016-09-08 11:06:55.000000000 +0200 @@ -0,0 +1,100 @@ +<svg xmlns='http://www.w3.org/2000/svg' + xmlns:xlink='http://www.w3.org/1999/xlink' + viewBox='107 -1364 1691 1753'> + <path d=' + M 1798 -752 + Q 1798 -649, 1769 -555 + Q 1741 -461, 1691 -380 + Q 1642 -300, 1574 -234 + Q 1506 -168, 1427 -121 + Q 1348 -75, 1260 -50 + Q 1173 -25, 1085 -25 + Q 1020 -25, 989 -59 + Q 959 -93, 957 -150 + Q 932 -129, 904 -106 + Q 877 -84, 844 -66 + Q 811 -48, 772 -36 + Q 734 -25, 686 -25 + Q 643 -25, 608 -43 + Q 574 -61, 550 -94 + Q 526 -128, 513 -175 + Q 500 -223, 500 -283 + Q 500 -353, 516 -426 + Q 533 -499, 566 -567 + Q 599 -636, 648 -697 + Q 698 -758, 764 -805 + Q 815 -842, 863 -865 + Q 912 -888, 962 -901 + Q 1013 -914, 1067 -919 + Q 1122 -924, 1184 -924 + Q 1232 -924, 1282 -920 + Q 1332 -917, 1367 -913 + L 1246 -372 + Q 1241 -352, 1237 -330 + Q 1233 -308, 1230 -286 + Q 1227 -265, 1225 -246 + Q 1223 -227, 1223 -215 + Q 1223 -192, 1231 -175 + Q 1240 -159, 1273 -159 + Q 1326 -159, 1372 -183 + Q 1418 -208, 1456 -250 + Q 1494 -293, 1523 -350 + Q 1553 -407, 1573 -473 + Q 1593 -539, 1603 -610 + Q 1614 -681, 1614 -751 + Q 1614 -875, 1576 -970 + Q 1539 -1066, 1469 -1131 + Q 1399 -1196, 1300 -1229 + Q 1202 -1263, 1079 -1263 + Q 956 -1263, 850 -1230 + Q 744 -1198, 656 -1138 + Q 568 -1079, 500 -996 + Q 433 -914, 386 -814 + Q 339 -714, 315 -599 + Q 291 -485, 291 -363 + Q 291 -235, 327 -118 + Q 364 -1, 439 88 + Q 514 178, 627 231 + Q 741 284, 895 284 + Q 986 284, 1063 270 + Q 1141 256, 1207 232 + Q 1273 208, 1329 176 + Q 1386 144, 1436 109 + L 1480 173 + Q 1424 218, 1361 257 + Q 1298 296, 1223 325 + Q 1148 355, 1059 372 + Q 970 389, 864 389 + Q 680 389, 538 330 + Q 397 272, 301 170 + Q 205 68, 156 -69 + Q 107 -206, 107 -362 + Q 107 -505, 140 -635 + Q 173 -765, 234 -876 + Q 296 -987, 383 -1077 + Q 470 -1168, 578 -1231 + Q 687 -1295, 814 -1329 + Q 941 -1364, 1083 -1364 + Q 1261 -1364, 1395 -1320 + Q 1529 -1277, 1618 -1197 + Q 1708 -1117, 1753 -1004 + Q 1798 -891, 1798 -752 + M 740 -316 + Q 740 -244, 761 -206 + Q 783 -169, 811 -169 + Q 831 -169, 853 -175 + Q 875 -182, 896 -192 + Q 917 -202, 935 -214 + Q 953 -226, 965 -237 + L 1085 -798 + Q 1078 -800, 1058 -801 + Q 1039 -803, 1024 -803 + Q 975 -803, 931 -789 + Q 888 -776, 852 -733 + Q 832 -709, 812 -666 + Q 792 -623, 776 -567 + Q 760 -512, 750 -447 + Q 740 -383, 740 -316 + ' + fill='red'/> +</svg> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freetype-2.6.5/docs/tutorial/step3.html new/freetype-2.7/docs/tutorial/step3.html --- old/freetype-2.6.5/docs/tutorial/step3.html 2016-07-12 07:41:44.000000000 +0200 +++ new/freetype-2.7/docs/tutorial/step3.html 2016-09-08 11:06:55.000000000 +0200 @@ -82,12 +82,27 @@ that shows both direct rendering with a callback and rendering with a buffer, yielding the same result. You need FreeType 2.4.3 or newer.</p> + + <p><a href="example5.cpp">Here</a> is some simple C++ code + (contributed + by <a href="https://www.staticjobs.com">Static Jobs + LLC</a>) that + uses <a href="../reference/ft2-outline_processing.html#FT_Outline_Decompose"><tt>FT_Outline_Decompose</tt></a> + to convert a glyph outline to the SVG format. As an + example, here is the <a href="example5.svg">resulting + file</a> of the call</p> + + <pre> +example5 LiberationSerif-Bold.ttf @</pre> + + <p>(you can find the Liberation font + family <a href="https://fedorahosted.org/liberation-fonts/">here</a>).</p> </div> <!-- ************************************************** --> <div class="updated"> - <p>Last update: 23-Mar-2016</p> + <p>Last update: 8-Sep-2016</p> </div> </div> </div> ++++++ ft2demos-2.6.5.tar.bz2 -> ft2demos-2.7.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/ChangeLog new/ft2demos-2.7/ChangeLog --- old/ft2demos-2.6.5/ChangeLog 2016-07-12 07:29:24.000000000 +0200 +++ new/ft2demos-2.7/ChangeLog 2016-09-08 10:03:06.000000000 +0200 @@ -1,3 +1,118 @@ +2016-09-08 Werner Lemberg <[email protected]> + + * Version 2.7 released. + ======================= + + + Tag sources with `VER-2-7'. + + * README: Updated. + * src/*.1: Updated. + * src/ftinspect.pro: Updated. + +2016-08-20 Alexei Podtelezhnikov <[email protected]> + + * src/ftdump.c (Print_Programs): Use fewer casts. + +2018-08-19 Werner Lemberg <[email protected]> + + [ftdump] Fix clang compiler warnings. + + * src/ftdump.c (Print_Bytecode): Use cast instead of printf length + modifier – we would need `hh', which only glibc offers. + (Print_Programs): Use proper casts for constant strings and 16bit + integer types. + +2018-08-19 Werner Lemberg <[email protected]> + + [ftgamma] Fix compiler warnings. + + * src/ftgamma.c (bit1, bit2, bit): Make them static. + +2016-08-18 Alexei Podtelezhnikov <[email protected]> + + [ftdump] Hexdump composite glyf instructions too. + + * src/ftdump.c (Print_Programs): Updated. + (Print_Bytecode): Cleaned up. + +2016-08-18 Alexei Podtelezhnikov <[email protected]> + + [ftdump] Implement hexdump of TrueType instructions. + + This is useful when searching for interesting instructions. Pushed + values come with underscore prefix to distinguish them from actual + opcodes. + + * src/ftdump.c (Print_Bytecode, Print_Programs): Implement this. + (usage): New option `-p' described. + (main): Updated. + * src/ftdump.1: Updated. + +2016-08-06 Werner Lemberg <[email protected]> + + Move Mark Leisher's `getopt' implementation to a separate file. + + We need this since `ftbench.c' now includes `unistd.h', which in + turn declares `getopt'. + + * src/common.c, src/common.h: Move `getopt' stuff to... + * src/mlgetopt.c, src/mlgetopt.h: ... these new files. + Update all callers. + + * src/common.c, src/common.h: Use standard C only. + Replace `CONST' with `const'. + + * Makefile (COMMON_OBJ): Add `mlgetopt'. + +2016-08-02 Alexei Podtelezhnikov <[email protected]> + + * src/ftbench.c (get_time, benchmark): Clean up timers. + +2016-08-01 Alexei Podtelezhnikov <[email protected]> + + [ftbench] Use POSIX timers when available. + + * src/ftbench.c (get_time): Use `clock_gettime' instead of obsolete + and less accurate `gettimeofday'. + (benchmark): Updated. + +2016-07-14 Werner Lemberg <[email protected]> + + [ftgrid] New option `-d' to give start-up design coordinates. + + This code is similar to the one from `ftmulti'. + + * src/ftgrid.c: Include `stdlib.h'. + (GridStatusRec): Add `requested_pos' and `reqested_cnt' to hold the + design coordinate data from the command line. + (event_font_change): Handle them. + (parse_cmdline): Handle option `-d'. + (usage): Document `-d'. + (main): Don't load named instances if we have start-up design + coordinates. + + * src/ftgrid.1: Updated. + +2016-07-14 Werner Lemberg <[email protected]> + + Prepare suppression of named instances. + + No functional change. + + * src/ftcommon.c (FTDemo_Install_Font): Add boolean parameter to + avoid loading of instances. + * src/ftcommon.h: Updated. + * src/ftgrid.c (main), src/ftstring.c (main), src/ftview.c (main): + Updated. + +2016-07-14 Werner Lemberg <[email protected]> + + [ftgrid] Properly handle named instances. + + * src/ftgrid.c (event_font_change): Properly initialize the design + positions with the named instance's value, if appropriate. + 2016-07-12 Werner Lemberg <[email protected]> * Version 2.6.5 released. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/Makefile new/ft2demos-2.7/Makefile --- old/ft2demos-2.6.5/Makefile 2016-02-03 19:09:37.000000000 +0100 +++ new/ft2demos-2.7/Makefile 2016-08-26 11:45:49.000000000 +0200 @@ -160,7 +160,7 @@ else LINK_CMD = $(CC) $(subst /,$(COMPILER_SEP),$(LDFLAGS)) ifeq ($(PLATFORM),unixdev) - LINK_LIBS = $(subst /,$(COMPILER_SEP),$(FTLIB) $(EFENCE)) -lm -lz -lbz2 + LINK_LIBS = $(subst /,$(COMPILER_SEP),$(FTLIB) $(EFENCE)) -lm -lrt -lz -lbz2 LINK_LIBS += $(shell pkg-config --libs libpng harfbuzz) else LINK_LIBS = $(subst /,$(COMPILER_SEP),$(FTLIB) $(EFENCE)) @@ -320,8 +320,10 @@ # $(OBJ_DIR_2)/common.$(SO): $(SRC_DIR)/common.c $(OBJ_DIR_2)/output.$(SO): $(SRC_DIR)/output.c + $(OBJ_DIR_2)/mlgetopt.$(SO): $(SRC_DIR)/mlgetopt.c COMMON_OBJ := $(OBJ_DIR_2)/common.$(SO) \ - $(OBJ_DIR_2)/output.$(SO) + $(OBJ_DIR_2)/output.$(SO) \ + $(OBJ_DIR_2)/mlgetopt.$(SO) FTCOMMON_OBJ := $(OBJ_DIR_2)/ftcommon.$(SO) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/README new/ft2demos-2.7/README --- old/ft2demos-2.6.5/README 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/README 2016-09-08 10:06:57.000000000 +0200 @@ -8,8 +8,8 @@ downloaded one of the stable FreeType 2 source packages from our server, you most probably have to rename its directory, for example: - mv freetype-2.6.5 freetype2 on Unix - rename freetype-2.6.5 freetype2 on Windows + mv freetype-2.7 freetype2 on Unix + rename freetype-2.7 freetype2 on Windows WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING @@ -49,6 +49,14 @@ If you don't have X11 at all, fix the definition of the EXES variable as described in the top-level Makefile. + Recent versions of Mac OS X no longer deliver X11 by default; you + have to install XQuartz, see + + https://support.apple.com/en-us/HT201341 + + for more details. + + Using a different build directory --------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/common.c new/ft2demos-2.7/src/common.c --- old/ft2demos-2.6.5/src/common.c 2015-09-25 07:59:28.000000000 +0200 +++ new/ft2demos-2.7/src/common.c 2016-08-26 11:45:49.000000000 +0200 @@ -1,193 +1,17 @@ -/* - * This is a cheap replacement for getopt() because that routine is not - * available on some platforms and behaves differently on other platforms. - * This code was written from scratch without looking at any other - * implementation. - * - * This code is hereby expressly placed in the public domain. - * [email protected] (Mark Leisher) - * 10 October 1997 - * - * Last update 2009-03-11. - */ +/* some utility functions */ #include "common.h" #include <stdio.h> #include <stdarg.h> #include <stdlib.h> -#include <string.h> -#ifdef __STDC__ -#define CONST const -#else -#define CONST -#endif - - /* - * Externals visible to programs. - */ - - int opterr = 1; - int optind = 1; - char* optarg; - - /* - * Internal variables that are used to detect when the global values - * need to be reset. - */ - - static int cmdac; - static CONST char* cmdname; - static char* CONST* cmdav; - - int -#ifdef __STDC__ - getopt( int ac, char* const* av, const char* pat ) -#else - getopt( ac, av, pat ) - int ac; - char** av; - char* pat; -#endif - { - int opt; - CONST char* p; - CONST char* pp; - - /* - * If there is no pattern, indicate the parsing is done. - */ - if ( pat == 0 || *pat == 0 ) - return -1; - - /* - * Always reset the option argument to NULL. - */ - optarg = 0; - - /* - * If the number of arguments or argument list do not match the last - * values seen, reset the internal pointers and the globals. - */ - if ( ac != cmdac || av != cmdav ) - { - optind = 1; - cmdac = ac; - cmdav = av; - - /* - * Determine the command name in case it is needed for warning - * messages. - */ - for ( cmdname = 0, p = av[0]; *p; p++ ) - { - if ( *p == '/' || *p == '\\' ) - cmdname = p; - } - /* - * Skip the path separator if the name was assigned. - */ - if ( cmdname ) - cmdname++; - else - cmdname = av[0]; - } - - /* - * If the next index is greater than or equal to the number of - * arguments, then the command line is done. - */ - if ( optind >= ac ) - return -1; - - /* - * Test the next argument for one of three cases: - * 1. The next argument does not have an initial '-'. - * 2. The next argument is '-'. - * 3. The next argument is '--'. - * - * In either of these cases, command line processing is done. - */ - if ( av[optind][0] != '-' || - strcmp( av[optind], "-" ) == 0 || - strcmp( av[optind], "--" ) == 0 ) - return -1; - - /* - * Point at the next command line argument and increment the - * command line index. - */ - p = av[optind++]; - - /* - * Look for the first character of the command line option. - */ - for ( opt = *(p + 1), pp = pat; *pp && *pp != opt; pp++ ) - ; - - /* - * If nothing in the pattern was recognized, then issue a warning - * and return a '?'. - */ - if ( *pp == 0 ) - { - if ( opterr ) - fprintf( stderr, "%s: invalid option -- %c\n", cmdname, opt ); - return '?'; - } - - /* - * If the option expects an argument, get it. - */ - if ( *(pp + 1) == ':' && (optarg = av[optind]) == 0 ) - { - /* - * If the option argument is NULL, issue a warning and return a '?'. - */ - if ( opterr ) - fprintf( stderr, "%s: option requires an argument -- %c\n", - cmdname, opt ); - opt = '?'; - } - else if ( optarg ) - /* - * Increment the option index past the argument. - */ - optind++; - - /* - * Return the option character. - */ - return opt; - } - - -/****************************************************************************/ -/* */ -/* The FreeType project -- a free and portable quality TrueType renderer. */ -/* */ -/* Copyright 1996-1998 by */ -/* D. Turner, R.Wilhelm, and W. Lemberg */ -/* */ -/* ft_basename(): */ -/* */ -/* a stupid but useful function... */ -/* */ -/* rewritten by DavidT to get rid of GPLed programs in the FreeType demos. */ -/* */ -/****************************************************************************/ char* -#ifdef __STDC__ - ft_basename ( const char* name ) -#else - ft_basename ( name ) - char* name; -#endif + ft_basename( const char* name ) { - CONST char* base; - CONST char* current; + const char* base; + const char* current; char c; base = name; @@ -213,12 +37,8 @@ void -#ifdef __STDC__ - Panic( const char* fmt, ... ) -#else - Panic( fmt ) - char* fmt; -#endif + Panic( const char* fmt, + ... ) { va_list ap; @@ -232,20 +52,14 @@ extern int -#ifdef __STDC__ - utf8_next( const char** pcursor, - const char* end ) -#else - utf8_next( pcursor, end ) - char** pcursor; - char* end; -#endif + utf8_next( const char** pcursor, + const char* end ) { - CONST unsigned char* p = (CONST unsigned char*)*pcursor; + const unsigned char* p = (const unsigned char*)*pcursor; int ch; - if ( (CONST char*)p >= end ) /* end of stream */ + if ( (const char*)p >= end ) /* end of stream */ return -1; ch = *p++; @@ -274,7 +88,7 @@ while ( len > 0 ) { - if ( (CONST char*)p >= end || ( p[0] & 0xc0 ) != 0x80 ) + if ( (const char*)p >= end || ( p[0] & 0xc0 ) != 0x80 ) goto BAD_DATA; ch = ( ch << 6 ) | ( p[0] & 0x3f ); @@ -283,11 +97,13 @@ } } - *pcursor = (CONST char*) p; + *pcursor = (const char*)p; + return ch; BAD_DATA: return -1; } + /* End */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/common.h new/ft2demos-2.7/src/common.h --- old/ft2demos-2.6.5/src/common.h 2016-02-03 19:09:37.000000000 +0100 +++ new/ft2demos-2.7/src/common.h 2016-08-26 11:45:49.000000000 +0200 @@ -1,66 +1,30 @@ -/* - * This is a cheap replacement for getopt() because that routine is not - * available on some platforms and behaves differently on other platforms. - * - * This code is hereby expressly placed in the public domain. - * [email protected] (Mark Leisher) - * 10 October 1997 - */ - #ifndef COMMON_H_ #define COMMON_H_ -/* Note that by default, both functions are implemented in common.c */ - -#ifdef VMS -#define getopt local_getopt -#define optind local_optind -#define opterr local_opterr -#endif #ifdef __cplusplus extern "C" { #endif - extern int opterr; - extern int optind; - extern char* optarg; - - extern int getopt( -#ifdef __STDC__ - int argc, - char* const* argv, - const char* pattern -#endif - ); - - - extern char* ft_basename( -#ifdef __STDC__ - const char* name -#endif - ); + extern char* + ft_basename( const char* name ); /* print a message and exit */ - extern void Panic( -#ifdef __STDC__ - const char* fmt, ... -#endif - ); + extern void + Panic( const char* fmt, + ... ); - /* read the next UTF-8 code from `*pcursor' and + /* + * Read the next UTF-8 code from `*pcursor' and * returns its value. `end' is the limit of the * input string. * - * return -1 if the end of the input string is - * reached, or in case of malformed data + * Return -1 if the end of the input string is + * reached, or in case of malformed data. */ - extern int utf8_next( -#ifdef __STDC__ - const char** pcursor, - const char* end -#endif - ); + extern int + utf8_next( const char** pcursor, + const char* end ); #ifdef __cplusplus } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftbench.1 new/ft2demos-2.7/src/ftbench.1 --- old/ft2demos-2.6.5/src/ftbench.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftbench.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,5 +1,5 @@ '\" t -.TH FTVIEW 1 "July 2016" "Freetype 2.6.5" +.TH FTVIEW 1 "September 2016" "Freetype 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftbench.c new/ft2demos-2.7/src/ftbench.c --- old/ft2demos-2.6.5/src/ftbench.c 2016-05-29 10:21:19.000000000 +0200 +++ new/ft2demos-2.7/src/ftbench.c 2016-08-26 11:45:49.000000000 +0200 @@ -2,7 +2,7 @@ /* */ /* The FreeType project -- a free and portable quality TrueType renderer. */ /* */ -/* Copyright 2002-2006, 2009, 2010, 2013, 2014 by */ +/* Copyright 2002-2016 by */ /* D. Turner, R.Wilhelm, and W. Lemberg */ /* */ /* ftbench: bench some common FreeType call paths */ @@ -31,7 +31,9 @@ #include FT_TRUETYPE_DRIVER_H #ifdef UNIX -#include <sys/time.h> +#include <unistd.h> +#else +#include "mlgetopt.h" #endif #include "common.h" @@ -159,22 +161,27 @@ /* - * timer + * timer in milliseconds */ static double get_time( void ) { -#ifdef UNIX - struct timeval tv; +#if defined _POSIX_TIMERS && _POSIX_TIMERS > 0 + struct timespec tv; - gettimeofday( &tv, NULL ); - return (double)tv.tv_sec + (double)tv.tv_usec / 1E6; +#ifdef _POSIX_CPUTIME + clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &tv ); #else - /* clock() has an awful precision (~10ms) under Linux 2.4 + glibc 2.2 */ - return (double)clock() / (double)CLOCKS_PER_SEC; -#endif + clock_gettime( CLOCK_REALTIME, &tv ); +#endif /* _POSIX_CPUTIME */ + + return 1E6 * (double)tv.tv_sec + 1E-3 * (double)tv.tv_nsec; +#else + /* clock() accuracy has improved since glibc 2.18 */ + return 1E6 * (double)clock() / (double)CLOCKS_PER_SEC; +#endif /* _POSIX_TIMERS */ } #define TIMER_START( timer ) ( timer )->t0 = get_time() @@ -213,11 +220,10 @@ printf( " %-25s ", test->title ); fflush( stdout ); - n = done = 0; TIMER_RESET( &timer ); TIMER_RESET( &elapsed ); - for ( n = 0; !max_iter || n < max_iter; n++ ) + for ( n = 0, done = 0; !max_iter || n < max_iter; n++ ) { TIMER_START( &elapsed ); @@ -225,12 +231,12 @@ TIMER_STOP( &elapsed ); - if ( TIMER_GET( &elapsed ) > max_time ) + if ( TIMER_GET( &elapsed ) > 1E6 * max_time ) break; } if ( done ) - printf( "%5.3f us/op\n", TIMER_GET( &timer ) * 1E6 / (double)done ); + printf( "%5.3f us/op\n", TIMER_GET( &timer ) / (double)done ); else printf( "no error-free calls\n" ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftcommon.c new/ft2demos-2.7/src/ftcommon.c --- old/ft2demos-2.6.5/src/ftcommon.c 2016-05-21 11:29:30.000000000 +0200 +++ new/ft2demos-2.7/src/ftcommon.c 2016-08-26 11:45:49.000000000 +0200 @@ -352,7 +352,8 @@ FT_Error FTDemo_Install_Font( FTDemo_Handle* handle, const char* filepath, - FT_Bool outline_only ) + FT_Bool outline_only, + FT_Bool no_instances ) { static char filename[1024 + 5]; long i, num_faces; @@ -390,7 +391,7 @@ error = FT_New_Face( handle->library, filename, -( i + 1 ), &face ); if ( error ) continue; - instance_count = face->style_flags >> 16; + instance_count = no_instances ? 0 : face->style_flags >> 16; FT_Done_Face( face ); /* load face with and without named instances */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftcommon.h new/ft2demos-2.7/src/ftcommon.h --- old/ft2demos-2.6.5/src/ftcommon.h 2016-02-03 19:09:37.000000000 +0100 +++ new/ft2demos-2.7/src/ftcommon.h 2016-08-26 11:45:49.000000000 +0200 @@ -222,7 +222,8 @@ FT_Error FTDemo_Install_Font( FTDemo_Handle* handle, const char* filepath, - FT_Bool outline_only ); + FT_Bool outline_only, + FT_Bool no_instances ); void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftdiff.1 new/ft2demos-2.7/src/ftdiff.1 --- old/ft2demos-2.6.5/src/ftdiff.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftdiff.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTDIFF 1 "July 2016" "FreeType 2.6.5" +.TH FTDIFF 1 "September 2016" "FreeType 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftdiff.c new/ft2demos-2.7/src/ftdiff.c --- old/ft2demos-2.6.5/src/ftdiff.c 2016-05-21 16:11:53.000000000 +0200 +++ new/ft2demos-2.7/src/ftdiff.c 2016-08-26 11:45:49.000000000 +0200 @@ -15,6 +15,7 @@ #include "ftcommon.h" #include "common.h" +#include "mlgetopt.h" #include FT_OUTLINE_H #include FT_LCD_FILTER_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftdump.1 new/ft2demos-2.7/src/ftdump.1 --- old/ft2demos-2.6.5/src/ftdump.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftdump.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTDUMP 1 "July 2016" "FreeType 2.6.5" +.TH FTDUMP 1 "September 2016" "FreeType 2.7" . . .SH NAME @@ -29,6 +29,10 @@ Print SFNT name tables. . .TP +.B \-p +Print TrueType programs. +. +.TP .B \-u Emit UTF-8. . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftdump.c new/ft2demos-2.7/src/ftdump.c --- old/ft2demos-2.6.5/src/ftdump.c 2016-02-03 19:09:37.000000000 +0100 +++ new/ft2demos-2.7/src/ftdump.c 2016-08-26 11:45:49.000000000 +0200 @@ -13,6 +13,7 @@ #include FT_SFNT_NAMES_H #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H #include FT_MULTIPLE_MASTERS_H /* the following header shouldn't be used in normal programs */ @@ -25,6 +26,7 @@ #include "common.h" #include "output.h" +#include "mlgetopt.h" #include <stdio.h> #include <stdlib.h> @@ -36,6 +38,7 @@ static int comma_flag = 0; static int verbose = 0; static int name_tables = 0; + static int bytecode = 0; static int utf8 = 0; @@ -73,6 +76,7 @@ fprintf( stderr, " -n Print SFNT name tables.\n" + " -p Print TrueType programs.\n" " -u Emit UTF8.\n" " -V Be verbose.\n" "\n" @@ -521,6 +525,188 @@ } + static void + Print_Bytecode( FT_Byte* buffer, + FT_UShort length, + char* tag ) + { + FT_UShort i; + int j = 0; /* status counter */ + + + for ( i = 0; i < length; i++ ) + { + if ( ( i & 15 ) == 0 ) + printf( "\n%s:%04hx ", tag, i ); + + if ( j == 0 ) + { + printf( " %02x", (FT_UInt)buffer[i] ); + + if ( buffer[i] == 0x40 ) + j = -1; + else if ( buffer[i] == 0x41 ) + j = -2; + else if ( 0xB0 <= buffer[i] && buffer[i] <= 0xB7 ) + j = buffer[i] - 0xAF; + else if ( 0xB8 <= buffer[i] && buffer[i] <= 0xBF ) + j = 2 * ( buffer[i] - 0xB7 ); + } + else + { + printf( "_%02x", (FT_UInt)buffer[i] ); + + if ( j == -1 ) + j = buffer[i]; + else if ( j == -2 ) + j = 2 * buffer[i]; + else + j--; + } + } + printf( "\n" ); + } + + + static void + Print_Programs( FT_Face face ) + { + FT_ULong length = 0; + FT_UShort i; + FT_Byte* buffer = NULL; + FT_Byte* offset = NULL; + + TT_Header* head; + TT_MaxProfile* maxp; + + + error = FT_Load_Sfnt_Table( face, TTAG_fpgm, 0, NULL, &length ); + if ( error || length == 0 ) + goto Prep; + + buffer = (FT_Byte*)malloc( length ); + if ( buffer == NULL ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, TTAG_fpgm, 0, buffer, &length ); + if ( error ) + goto Exit; + + printf( "font program" ); + Print_Bytecode( buffer, (FT_UShort)length, (char*)"fpgm" ); + + Prep: + length = 0; + + error = FT_Load_Sfnt_Table( face, TTAG_prep, 0, NULL, &length ); + if ( error || length == 0 ) + goto Glyf; + + buffer = (FT_Byte*)realloc( buffer, length ); + if ( buffer == NULL ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, TTAG_prep, 0, buffer, &length ); + if ( error ) + goto Exit; + + printf( "\ncontrol value program" ); + Print_Bytecode( buffer, (FT_UShort)length, (char*)"prep" ); + + Glyf: + length = 0; + + error = FT_Load_Sfnt_Table( face, TTAG_glyf, 0, NULL, &length ); + if ( error || length == 0 ) + goto Exit; + + buffer = (FT_Byte*)realloc( buffer, length ); + if ( buffer == NULL ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, TTAG_glyf, 0, buffer, &length ); + if ( error ) + goto Exit; + + length = 0; + + error = FT_Load_Sfnt_Table( face, TTAG_loca, 0, NULL, &length ); + if ( error || length == 0 ) + goto Exit; + + offset = (FT_Byte*)malloc( length ); + if ( offset == NULL ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, TTAG_loca, 0, offset, &length ); + if ( error ) + goto Exit; + + head = (TT_Header*)FT_Get_Sfnt_Table( face, FT_SFNT_HEAD ); + maxp = (TT_MaxProfile*)FT_Get_Sfnt_Table( face, FT_SFNT_MAXP ); + + for ( i = 0; i < maxp->numGlyphs; i++ ) + { + FT_UInt32 loc; + FT_UInt16 len; + char tag[5]; + + + if ( head->Index_To_Loc_Format ) + loc = (FT_UInt32)offset[4 * i ] << 24 | + (FT_UInt32)offset[4 * i + 1] << 16 | + (FT_UInt32)offset[4 * i + 2] << 8 | + (FT_UInt32)offset[4 * i + 3]; + else + loc = (FT_UInt32)offset[2 * i ] << 9 | + (FT_UInt32)offset[2 * i + 1] << 1; + + len = (FT_UInt16)( buffer[loc] << 8 | buffer[loc + 1] ); + + loc += 10; + + if ( (FT_Int16)len < 0 ) /* composite */ + { + FT_UShort flags; + + + do + { + flags = (FT_UInt16)( buffer[loc] << 8 | buffer[loc + 1] ); + + loc += 4; + + loc += flags & FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ? 4 : 2; + + loc += flags & FT_SUBGLYPH_FLAG_SCALE ? 2 + : flags & FT_SUBGLYPH_FLAG_XY_SCALE ? 4 + : flags & FT_SUBGLYPH_FLAG_2X2 ? 8 : 0; + } while ( flags & 0x20 ); /* more components */ + + if ( ( flags & 0x100 ) == 0 ) + continue; + } + else + loc += 2 * len; + + len = (FT_UInt16)( buffer[loc] << 8 | buffer[loc + 1] ); + + if ( len == 0 ) + continue; + + loc += 2; + + sprintf( tag, "%04hx", i ); + printf("\nglyf program %hd (%.4s)", i, tag ); + Print_Bytecode( buffer + loc, len, tag ); + } + + Exit: + free( buffer ); + free( offset ); + } + + int main( int argc, char* argv[] ) @@ -545,7 +731,7 @@ while ( 1 ) { - option = getopt( argc, argv, "nuvV" ); + option = getopt( argc, argv, "npuvV" ); if ( option == -1 ) break; @@ -556,6 +742,10 @@ name_tables = 1; break; + case 'p': + bytecode = 1; + break; + case 'u': utf8 = 1; break; @@ -653,6 +843,12 @@ Print_Sfnt_Names( face ); } + if ( bytecode && FT_IS_SFNT( face ) ) + { + printf( "\n" ); + Print_Programs( face ); + } + if ( face->num_fixed_sizes ) { printf( "\n" ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftgamma.1 new/ft2demos-2.7/src/ftgamma.1 --- old/ft2demos-2.6.5/src/ftgamma.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftgamma.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTGAMMA 1 "July 2016" "FreeType 2.6.5" +.TH FTGAMMA 1 "September 2016" "FreeType 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftgamma.c new/ft2demos-2.7/src/ftgamma.c --- old/ft2demos-2.6.5/src/ftgamma.c 2016-05-21 11:38:06.000000000 +0200 +++ new/ft2demos-2.7/src/ftgamma.c 2016-08-26 11:45:49.000000000 +0200 @@ -17,9 +17,9 @@ static FTDemo_Display* display; - grBitmap bit1 = { 300, 600, 600, gr_pixel_mode_gray, 256, NULL }; - grBitmap bit2 = { 300, 600, 600, gr_pixel_mode_gray, 256, NULL }; - grBitmap* bit; + static grBitmap bit1 = { 300, 600, 600, gr_pixel_mode_gray, 256, NULL }; + static grBitmap bit2 = { 300, 600, 600, gr_pixel_mode_gray, 256, NULL }; + static grBitmap* bit; static void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftgrid.1 new/ft2demos-2.7/src/ftgrid.1 --- old/ft2demos-2.6.5/src/ftgrid.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftgrid.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTGRID 1 "July 2016" "Freetype 2.6.5" +.TH FTGRID 1 "September 2016" "Freetype 2.7" . . .SH NAME @@ -64,6 +64,13 @@ Specify first index to display (default: 0). . .TP +.BI "\-d\ \(dq" "axis1\ axis2\ .\|.\|." \(dq +For Multiple Master or GX fonts, specify design coordinates for each axis at +start-up. +If this option is given, no named instances are shown. +Ignored for all other font formats. +. +.TP .B \-v Show version. . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftgrid.c new/ft2demos-2.7/src/ftgrid.c --- old/ft2demos-2.6.5/src/ftgrid.c 2016-05-21 22:39:12.000000000 +0200 +++ new/ft2demos-2.7/src/ftgrid.c 2016-08-26 11:45:49.000000000 +0200 @@ -16,6 +16,8 @@ #include "ftcommon.h" #include "common.h" #include "output.h" +#include "mlgetopt.h" +#include <stdlib.h> /* the following header shouldn't be used in normal programs */ #include FT_INTERNAL_DEBUG_H @@ -146,6 +148,8 @@ FT_MM_Var* mm; char* axis_name[MAX_MM_AXES]; FT_Fixed design_pos[MAX_MM_AXES]; + FT_Fixed requested_pos[MAX_MM_AXES]; + FT_UInt requested_cnt; FT_UInt current_axis; FT_UInt used_num_axis; @@ -203,7 +207,7 @@ FTDemo_Handle* handle ) { FT_Size size; - FT_Error err = FTDemo_Get_Size( handle, &size ); + FT_Error err = FTDemo_Get_Size( handle, &size ); FT_F26Dot6 margin = 4; @@ -1322,6 +1326,7 @@ FT_Error err; FT_Size size; FT_UInt n, num_names; + FT_Int instance_index; FT_Multi_Master dummy; int num_indices, is_GX; @@ -1364,6 +1369,9 @@ num_names = FT_Get_Sfnt_Name_Count( size->face ); + /* in `face_index', the instance index starts with value 1 */ + instance_index = ( size->face->face_index >> 16 ) - 1; + for ( n = 0; n < MAX_MM_AXES; n++ ) { free( status.axis_name[n] ); @@ -1372,7 +1380,21 @@ for ( n = 0; n < status.used_num_axis; n++ ) { - status.design_pos[n] = status.mm->axis[n].def; + if ( status.requested_cnt ) + { + status.design_pos[n] = n < status.requested_cnt + ? status.requested_pos[n] + : status.mm->axis[n].def; + if ( status.design_pos[n] < status.mm->axis[n].minimum ) + status.design_pos[n] = status.mm->axis[n].minimum; + else if ( status.design_pos[n] > status.mm->axis[n].maximum ) + status.design_pos[n] = status.mm->axis[n].maximum; + } + else if ( FT_IS_NAMED_INSTANCE( size->face ) ) + status.design_pos[n] = status.mm->namedstyle[instance_index]. + coords[n]; + else + status.design_pos[n] = status.mm->axis[n].def; if ( is_GX ) { @@ -1796,6 +1818,9 @@ fprintf( stderr, " -r R Use resolution R dpi (default: 72dpi).\n" " -f index Specify first index to display (default: 0).\n" + " -d \"axis1 axis2 ...\"\n" + " Specify the design coordinates for each\n" + " Multiple Master axis at start-up.\n" "\n" " -v Show version." "\n" ); @@ -1816,13 +1841,32 @@ while ( 1 ) { - option = getopt( *argc, *argv, "f:h:r:vw:" ); + option = getopt( *argc, *argv, "d:f:h:r:vw:" ); if ( option == -1 ) break; switch ( option ) { + case 'd': + { + FT_UInt cnt; + FT_Fixed* pos = status.requested_pos; + char* s = optarg; + + + for ( cnt = 0; cnt < MAX_MM_AXES && *s; cnt++ ) + { + pos[cnt] = (FT_Fixed)( strtod( s, &s ) * 65536.0 ); + + while ( *s == ' ' ) + ++s; + } + + status.requested_cnt = cnt; + } + break; + case 'f': status.Num = atoi( optarg ); break; @@ -1944,7 +1988,8 @@ for ( ; argc > 0; argc--, argv++ ) { - error = FTDemo_Install_Font( handle, argv[0], 1 ); + error = FTDemo_Install_Font( handle, argv[0], 1, + status.requested_cnt ? 1 : 0 ); if ( error == FT_Err_Invalid_Argument ) fprintf( stderr, "skipping font `%s' without outlines\n", argv[0] ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftinspect.pro new/ft2demos-2.7/src/ftinspect.pro --- old/ft2demos-2.6.5/src/ftinspect.pro 2016-07-05 18:04:37.000000000 +0200 +++ new/ft2demos-2.7/src/ftinspect.pro 2016-09-08 10:06:57.000000000 +0200 @@ -11,7 +11,7 @@ PKGCONFIG += libpng harfbuzz zlib bzip2 } win32 { - LIBS += ../../freetyp2/objs/vc2010/freetype264.lib + LIBS += ../../freetyp2/objs/vc2010/freetype27.lib LIBS += -lpng -lharfbuzz -lz -lbz2 -lm } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftlint.1 new/ft2demos-2.7/src/ftlint.1 --- old/ft2demos-2.6.5/src/ftlint.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftlint.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTLINT 1 "July 2016" "Freetype 2.6.5" +.TH FTLINT 1 "September 2016" "Freetype 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftmulti.1 new/ft2demos-2.7/src/ftmulti.1 --- old/ft2demos-2.6.5/src/ftmulti.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftmulti.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTMULTI 1 "July 2016" "Freetype 2.6.5" +.TH FTMULTI 1 "September 2016" "Freetype 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftmulti.c new/ft2demos-2.7/src/ftmulti.c --- old/ft2demos-2.6.5/src/ftmulti.c 2016-05-21 12:08:44.000000000 +0200 +++ new/ft2demos-2.7/src/ftmulti.c 2016-08-26 11:45:49.000000000 +0200 @@ -17,6 +17,7 @@ #include FT_MULTIPLE_MASTERS_H #include "common.h" +#include "mlgetopt.h" #include <stdio.h> #include <stdlib.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftstring.1 new/ft2demos-2.7/src/ftstring.1 --- old/ft2demos-2.6.5/src/ftstring.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftstring.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTSTRING 1 "July 2016" "Freetype 2.6.5" +.TH FTSTRING 1 "September 2016" "Freetype 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftstring.c new/ft2demos-2.7/src/ftstring.c --- old/ft2demos-2.6.5/src/ftstring.c 2016-05-21 12:21:27.000000000 +0200 +++ new/ft2demos-2.7/src/ftstring.c 2016-08-26 11:45:49.000000000 +0200 @@ -13,6 +13,7 @@ #include "ftcommon.h" #include "common.h" +#include "mlgetopt.h" #include <stdio.h> #include <stdlib.h> @@ -665,7 +666,7 @@ for ( ; argc > 0; argc--, argv++ ) { - error = FTDemo_Install_Font( handle, argv[0], 0 ); + error = FTDemo_Install_Font( handle, argv[0], 0, 0 ); if ( error ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftvalid.1 new/ft2demos-2.7/src/ftvalid.1 --- old/ft2demos-2.6.5/src/ftvalid.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftvalid.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTVALID 1 "July 2016" "FreeType 2.6.5" +.TH FTVALID 1 "September 2016" "FreeType 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftvalid.c new/ft2demos-2.7/src/ftvalid.c --- old/ft2demos-2.6.5/src/ftvalid.c 2016-05-21 12:28:33.000000000 +0200 +++ new/ft2demos-2.7/src/ftvalid.c 2016-08-26 11:45:49.000000000 +0200 @@ -32,6 +32,7 @@ #include FT_INTERNAL_OBJECTS_H #include "common.h" +#include "mlgetopt.h" #include <stdio.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftview.1 new/ft2demos-2.7/src/ftview.1 --- old/ft2demos-2.6.5/src/ftview.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ftview.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH FTVIEW 1 "July 2016" "FreeType 2.6.5" +.TH FTVIEW 1 "September 2016" "FreeType 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ftview.c new/ft2demos-2.7/src/ftview.c --- old/ft2demos-2.6.5/src/ftview.c 2016-05-21 16:11:22.000000000 +0200 +++ new/ft2demos-2.7/src/ftview.c 2016-08-26 11:45:49.000000000 +0200 @@ -18,6 +18,7 @@ #include "ftcommon.h" #include "common.h" +#include "mlgetopt.h" #include <stdio.h> /* the following header shouldn't be used in normal programs */ @@ -1972,7 +1973,7 @@ FTDemo_Set_Preload( handle, 1 ); for ( ; argc > 0; argc--, argv++ ) - FTDemo_Install_Font( handle, argv[0], 0 ); + FTDemo_Install_Font( handle, argv[0], 0, 0 ); if ( handle->num_fonts == 0 ) Fatal( "could not find/open any font file" ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/mlgetopt.c new/ft2demos-2.7/src/mlgetopt.c --- old/ft2demos-2.6.5/src/mlgetopt.c 1970-01-01 01:00:00.000000000 +0100 +++ new/ft2demos-2.7/src/mlgetopt.c 2016-08-26 11:45:49.000000000 +0200 @@ -0,0 +1,166 @@ +/* + * This is a cheap replacement for getopt() because that routine is not + * available on some platforms and behaves differently on other platforms. + * This code was written from scratch without looking at any other + * implementation. + * + * This code is hereby expressly placed in the public domain. + * [email protected] (Mark Leisher) + * 10 October 1997 + * + * Last update 2009-03-11. + */ + +#include "mlgetopt.h" + +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> + +#ifdef __STDC__ +#define CONST const +#else +#define CONST +#endif + + /* + * Externals visible to programs. + */ + + int opterr = 1; + int optind = 1; + char* optarg; + + /* + * Internal variables that are used to detect when the global values + * need to be reset. + */ + + static int cmdac; + static CONST char* cmdname; + static char* CONST* cmdav; + + int +#ifdef __STDC__ + getopt( int ac, char* const* av, const char* pat ) +#else + getopt( ac, av, pat ) + int ac; + char** av; + char* pat; +#endif + { + int opt; + CONST char* p; + CONST char* pp; + + /* + * If there is no pattern, indicate the parsing is done. + */ + if ( pat == 0 || *pat == 0 ) + return -1; + + /* + * Always reset the option argument to NULL. + */ + optarg = 0; + + /* + * If the number of arguments or argument list do not match the last + * values seen, reset the internal pointers and the globals. + */ + if ( ac != cmdac || av != cmdav ) + { + optind = 1; + cmdac = ac; + cmdav = av; + + /* + * Determine the command name in case it is needed for warning + * messages. + */ + for ( cmdname = 0, p = av[0]; *p; p++ ) + { + if ( *p == '/' || *p == '\\' ) + cmdname = p; + } + /* + * Skip the path separator if the name was assigned. + */ + if ( cmdname ) + cmdname++; + else + cmdname = av[0]; + } + + /* + * If the next index is greater than or equal to the number of + * arguments, then the command line is done. + */ + if ( optind >= ac ) + return -1; + + /* + * Test the next argument for one of three cases: + * 1. The next argument does not have an initial '-'. + * 2. The next argument is '-'. + * 3. The next argument is '--'. + * + * In either of these cases, command line processing is done. + */ + if ( av[optind][0] != '-' || + strcmp( av[optind], "-" ) == 0 || + strcmp( av[optind], "--" ) == 0 ) + return -1; + + /* + * Point at the next command line argument and increment the + * command line index. + */ + p = av[optind++]; + + /* + * Look for the first character of the command line option. + */ + for ( opt = *(p + 1), pp = pat; *pp && *pp != opt; pp++ ) + ; + + /* + * If nothing in the pattern was recognized, then issue a warning + * and return a '?'. + */ + if ( *pp == 0 ) + { + if ( opterr ) + fprintf( stderr, "%s: invalid option -- %c\n", cmdname, opt ); + return '?'; + } + + /* + * If the option expects an argument, get it. + */ + if ( *(pp + 1) == ':' && (optarg = av[optind]) == 0 ) + { + /* + * If the option argument is NULL, issue a warning and return a '?'. + */ + if ( opterr ) + fprintf( stderr, "%s: option requires an argument -- %c\n", + cmdname, opt ); + opt = '?'; + } + else if ( optarg ) + /* + * Increment the option index past the argument. + */ + optind++; + + /* + * Return the option character. + */ + return opt; + } + + +/* End */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/mlgetopt.h new/ft2demos-2.7/src/mlgetopt.h --- old/ft2demos-2.6.5/src/mlgetopt.h 1970-01-01 01:00:00.000000000 +0100 +++ new/ft2demos-2.7/src/mlgetopt.h 2016-08-26 11:45:49.000000000 +0200 @@ -0,0 +1,42 @@ +/* + * This is a cheap replacement for getopt() because that routine is not + * available on some platforms and behaves differently on other platforms. + * + * This code is hereby expressly placed in the public domain. + * [email protected] (Mark Leisher) + * 10 October 1997 + */ + +#ifndef MLGETOPT_H_ +#define MLGETOPT_H_ + +#ifdef VMS +#define getopt local_getopt +#define optind local_optind +#define opterr local_opterr +#endif + +#ifdef __cplusplus + extern "C" { +#endif + + extern int opterr; + extern int optind; + extern char* optarg; + + extern int getopt( +#ifdef __STDC__ + int argc, + char* const* argv, + const char* pattern +#endif + ); + +#ifdef __cplusplus + } +#endif + +#endif /* MLGETOPT_H_ */ + + +/* End */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ttdebug.1 new/ft2demos-2.7/src/ttdebug.1 --- old/ft2demos-2.6.5/src/ttdebug.1 2016-07-12 07:29:55.000000000 +0200 +++ new/ft2demos-2.7/src/ttdebug.1 2016-09-08 10:06:57.000000000 +0200 @@ -1,4 +1,4 @@ -.TH TTDEBUG 1 "July 2016" "FreeType 2.6.5" +.TH TTDEBUG 1 "September 2016" "FreeType 2.7" . . .SH NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2demos-2.6.5/src/ttdebug.c new/ft2demos-2.7/src/ttdebug.c --- old/ft2demos-2.6.5/src/ttdebug.c 2016-05-26 08:12:12.000000000 +0200 +++ new/ft2demos-2.7/src/ttdebug.c 2016-08-26 11:45:49.000000000 +0200 @@ -51,6 +51,7 @@ #include <ft2build.h> #include FT_FREETYPE_H #include "common.h" +#include "mlgetopt.h" #include FT_TRUETYPE_DRIVER_H
