Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@flyskywhy/react-native-gcanvas

flyskywhy2.6kApache6.0.23

A C++ native canvas 2D/WebGL component based on gpu opengl glsl shader GCanvas

2d, 3d, android, babylon, babylon.js, babylonjs, canvas, dogz, emoji, font, gcanvas, glsl, gpu, ios, multiple-touches, native, offscreen-canvas, particles-bg, pixel-animation-editor, pixel-art-animation-editor, pixel-art-editor, pixel-gif-editor, pixel-editor, pixi, proton, react-native, shader, opengl, webgl, zdog

readme

@flyskywhy/react-native-gcanvas

npm version npm downloads npm licence Platform

@flyskywhy/react-native-gcanvas is a C++ native canvas 2D/WebGL component based on gpu opengl glsl shader GCanvas which is a lightweight cross-platform graphics rendering engine for mobile devices developed by Alibaba. It is written with C++ based on OpenGL ES, so it can provide high performance 2D/WebGL rendering capabilities for JavaScript runtime. It also has browser-like canvas APIs, so it's very convenient and flexiable for use, especially for web developers.

Supported operating systems are Android 4.1+ (API 16) and iOS 9.0+.

Since Alibaba feat: delete weex bridge & reactive bridge, here comes this @flyskywhy/react-native-gcanvas package.

Performance Test Result

setState vs canvas On react-native-web

With 200 circles backgroundColor generate (1 ms) and render continually, the render ms and final fps with Chrome Performance on Windows:

setState  80 ms        means 12 fps  (stuck for human eyes)
canvas    1.5 ms       means 400 fps (smooth for human eyes)

setNativeProps vs expo-2d-context(with expo-gl@8) vs react-native-gcanvas On react-native

With 800 circles backgroundColor generate and render continually, the final UI fps and JS fps with react-native developer menu Perf Monitor on an old Huawei Honor 6 Play smartphone released in 2017 (Mediatek MT6737T 1.4 GHz, 2 GB RAM, Android 6):

setNativeProps        UI: 20 fps       JS: 1 fps  (stuck for human eyes)
expo-2d-context       UI: 56 fps       JS: 1 fps  (stuck for human eyes)
react-native-gcanvas  UI: 56 fps       JS: 20 fps (smooth for human eyes)

On an old iPhone 7:

With 800 circles backgroundColor generate and render continually

setNativeProps        UI: 60 fps       JS: 15 fps (smooth for human eyes)
react-native-gcanvas  UI: 20 fps       JS: 59 fps (stuck for human eyes)
react-native-gcanvas in release mode              (smooth for human eyes)

With 1400 circles backgroundColor generate and render continually

setNativeProps        UI: 59 fps       JS: 7 fps  (smooth for human eyes)
react-native-gcanvas  UI: 10 fps       JS: 58 fps (stuck for human eyes)
react-native-gcanvas in release mode              (smooth for human eyes)

Convenient With Browser-like canvas APIs

gl-react maybe can deal with the performance problem, but it need developer directly code with GLSL (OpenGL Shading Language), and there is no way to let many React components developed by browser-like canvas APIs be easily ported to React Native.

react-three-fiber maybe can deal with the performance problem, but memory leak when meshes update, Leaking WebGLRenderer and more when unmounting, Suggestion: Dispose of renderer context when canvas is destroyed?, and there is no way to let many React components developed by browser-like canvas APIs be easily ported to React Native.

expo-2d-context can let many React components developed by browser-like canvas APIs be easily ported to React Native, but it need ctx.flush() that not belongs to canvas 2d APIs, and expo-2d-context(with expo-gl@8) performance is too low, maybe expo-2d-context(with JSI expo-gl@11) performance is high enough.

Ref to Experiments with High Performance Animation in React Native, it use many ways include setNativeProps and React Native NanoVG. Maybe nanovg can deal with the performance problem, but for now (2020.12) there is no React Native canvas component using nanovg to let many React components developed by browser-like canvas APIs be easily ported to React Native.

So for now (2020.12), @flyskywhy/react-native-gcanvas is the best choice.

canvas projects ported from React to React Native

Getting Started

react-native

Only support RN >= 0.62 as described in android/gcanvas_library/build.gradle

npm install @flyskywhy/react-native-gcanvas --save

In the New Architecture (with Bridgeless Mode comes from RN 0.74), the texture on 3D webgl has no effect but just black color, maybe you need react-native-webgpu instead.

Android

Add below into /android/settings.gradle

include ':android:gcanvas_library'
project(':android:gcanvas_library').projectDir = new File(rootProject.projectDir, '../node_modules/@flyskywhy/react-native-gcanvas/android/gcanvas_library')
include ':android:bridge_spec'
project(':android:bridge_spec').projectDir = new File(rootProject.projectDir, '../node_modules/@flyskywhy/react-native-gcanvas/android/bridge_spec')
include ':android:adapters:gcanvas_imageloader_fresco'
project(':android:adapters:gcanvas_imageloader_fresco').projectDir = new File(rootProject.projectDir, '../node_modules/@flyskywhy/react-native-gcanvas/android/adapters/gcanvas_imageloader_fresco')
include ':android:adapters:bridge_adapter'
project(':android:adapters:bridge_adapter').projectDir = new File(rootProject.projectDir, '../node_modules/@flyskywhy/react-native-gcanvas/android/adapters/bridge_adapter')

Add below into /react-native.config.js

const path = require('path');

module.exports = {
  dependencies: {
    '@flyskywhy/react-native-gcanvas': {
      platforms: {
        android: {
          packageImportPath: 'import com.taobao.gcanvas.bridges.rn.GReactPackage;',
        },
      },
    },
  },
};

Sometimes will meet compile error java.io.FileNotFoundException: SOME_PATH/.cxx/cmake/SOME_PATH/android_gradle_build.json (The system cannot find the file specified) after upgrade this pacakge by npm install, can solve it by add --rerun-tasks to your gradlew command once like

./android/gradlew assembleDebug --rerun-tasks -p ./android/

If compile error Could not get resource 'https://maven.google.com/com/facebook/react/react-native/maven-metadata.xml', you can remove 'https://maven.google.com/' in react-native-gcanvas/build.gradle .

If compile error Expected output file at .../libpng16d.so for target png but there was none, please not use com.android.tools.build:gradle:7.3.1 in /android/build.gradle, just use com.android.tools.build:gradle:7.4.1 or other version according to https://developer.android.com/studio/releases/gradle-plugin#cmake-imported-targets.

iOS

Add below into /ios/Podfile

  pod "GCanvas", :path => "../node_modules/@flyskywhy/react-native-gcanvas/GCanvas.podspec"
cd YOUR_PROJECT/ios
pod install
About on iOS warning 'Sending GCanvasReady with no listeners registered.'

The root cause is described beside 'GCanvasReady' in components/GCanvasComponent.js, to suppress this warning, you can add below into your APP code:

  require('react-native').LogBox.ignoreLogs([
    '`GCanvasReady` with no listeners',
  ]);

Web

When I use react-native-web, I also use react-app-rewired as described in my blog:

With react-app-rewired, my react-native-web@0.15.0 and RN 0.63+ without expo project works fine, you can try it.

Example As Usage

3D webgl

3D webgl examples recommend https://github.com/flyskywhy/GCanvasRNExamples.

Here is the result of Webgl Cube Maps.

PS: gl.UNPACK_FLIP_Y_WEBGL is not support in webgl_demo/texture.js which is used as example before, and will not be supported ref to y-orientation for texImage2D from HTML elements.

2D canvas

Below code ref to https://github.com/flyskywhy/GCanvasRNExamples/blob/master/app/components/Canvas2dDemo.js.

import React, {Component} from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
} from 'react-native';
import {GCanvasView} from '@flyskywhy/react-native-gcanvas';
import {Loader} from 'resource-loader';
import {Asset} from 'expo-asset';

function sleepMs(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

export default class App extends Component {
  constructor(props) {
    super(props);
    this.canvas = null;
    this.state = {
      debugInfo: 'Click me to draw some on canvas',
    };

    // only useful on Android, because it's always true on iOS
    this.isGReactTextureViewReady = true;
  }

  componentDidMount() {
    if (Platform.OS === 'web') {
      const resizeObserver = new ResizeObserver((entries) => {
        for (let entry of entries) {
          if (entry.target.id === 'canvasExample') {
            let {width, height} = entry.contentRect;
            this.onCanvasResize({width, height, canvas: entry.target});
          }
        }
      });
      resizeObserver.observe(document.getElementById('canvasExample'));
    }
  }

  initCanvas = (canvas) => {
    if (this.canvas) {
      return;
    }

    this.canvas = canvas;
    if (Platform.OS === 'web') {
      // canvas.width not equal canvas.clientWidth but "Defaults to 300" ref
      // to https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas,
      // so have to assign again, unless <canvas width=SOME_NUMBER/> in render()
      this.canvas.width = this.canvas.clientWidth;
      this.canvas.height = this.canvas.clientHeight;
    }
    // should not name this.context because this.context is already be {} here and will
    // be {} again after componentDidUpdate() on react-native or react-native-web, so
    // name this.ctx
    this.ctx = this.canvas.getContext('2d');
  };

  onCanvasResize = ({width, height, canvas}) => {
    canvas.width = width;
    canvas.height = height;

    // if isResetGlViewportAfterSetWidthOrHeight is true, you can use below
    this.drawSome();
  };

  drawSome = async () => {
    // On Android, sometimes this.isGReactTextureViewReady is false e.g.
    // navigate from a canvas page into a drawer item page with
    // react-navigation on Android, the canvas page will be maintain
    // mounted by react-navigation, then if you continually call
    // this drawSome() in some loop, it's wasting CPU and GPU,
    // if you don't care about such wasting, you can delete
    // this.isGReactTextureViewReady and related onIsReady.

    if (this.ctx && this.isGReactTextureViewReady) {
      this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);

      this.ctx.beginPath();

      //rect
      this.ctx.fillStyle = 'red';
      this.ctx.fillRect(0, 0, 50, 50);

      //rect
      this.ctx.fillStyle = 'green';
      this.ctx.fillRect(50, 50, 50, 50);

      this.ctx.fill();

      this.ctx.beginPath();

      //circle
      this.ctx.fillStyle = 'blue';
      this.ctx.moveTo(100, 150);
      this.ctx.arc(125, 125, 25, 0, Math.PI * 2, true);

      this.ctx.fill();

      const imagedata = this.ctx.getImageData(25, 25, 50, 50);
      this.ctx.putImageData(imagedata, 100, 100, 12, 12, 25, 25);

      // const imageHttpSrc =
      //   '//gw.alicdn.com/tfs/TB1KwRTlh6I8KJjy0FgXXXXzVXa-225-75.png';
      // if use `//` above, will be convert to `http:` in `packages/gcanvas/src/env/image.js`,
      // then in Android release mode, will cause error:
      // `CLEARTEXT communication to gw.alicdn.com not permitted by network security policy`,
      // so use `https://` below
      const imageHttpSrc =
        'https://gw.alicdn.com/tfs/TB1KwRTlh6I8KJjy0FgXXXXzVXa-225-75.png';
      // `await Asset.fromModule` needs `expo-file-system`, and `expo-file-system` needs
      // `expo-modules` or old `react-native-unimodules`.
      // https://github.com/expo/expo/tree/sdk-47/packages/expo-asset said it needs
      // https://docs.expo.dev/bare/installing-expo-modules/ which also described how to
      // migrating from `react-native-unimodules`.
      // The installation of old `react-native-unimodules` can ref to
      // [install react-native-unimodules without install expo](https://github.com/flyskywhy/g/blob/master/i%E4%B8%BB%E8%A7%82%E7%9A%84%E4%BD%93%E9%AA%8C%E6%96%B9%E5%BC%8F/t%E5%BF%AB%E4%B9%90%E7%9A%84%E4%BD%93%E9%AA%8C/%E7%94%B5%E4%BF%A1/Tool/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/JavaScript/React%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.md#install-react-native-unimodules-without-install-expo)
      const imageRequireAsset = await Asset.fromModule(
        require('@flyskywhy/react-native-gcanvas/tools/build_website/assets/logo-gcanvas.png'),
      );
      const imageRequireSrc = imageRequireAsset.uri;

      // const loader = new Loader();
      // const setup = (loader, resources) => {
      //   this.ctx.drawImage(resources[imageHttpSrc].data, 70, 0, 112, 37);
      //   this.ctx.drawImage(resources[imageRequireSrc].data, 0, 100, 120, 120);
      // };
      // loader.add(imageHttpSrc); // imageHttpSrc can be simple string url
      // loader
      //   .add({
      //     url: imageRequireAsset.uri,
      //     // imageRequireAsset must set loadType in this object when build release
      //     loadType: Loader.Resource._loadTypeMap[imageRequireAsset.type],
      //   })
      //   .load(setup);

      // you can use Loader() above instead of Image() below, or vice versa

      // because already `import '@flyskywhy/react-native-browser-polyfill';` in GCanvasView, so can `new Image()`
      // not `Platform.OS === 'web' ? new Image() : new GImage()` here
      const imageHttp = new Image();
      imageHttp.crossOrigin = true; // need this to solve `Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.` on Web in production mode
      imageHttp.onload = () => {
        this.ctx.drawImage(imageHttp, 70, 0, 112, 37);
      };
      imageHttp.onerror = (error) => {
        this.setState({
          debugInfo: error.message,
        });
      };
      imageHttp.src = imageHttpSrc;

      // // to [Call drawImage() in loop with only one GImage instance](https://github.com/flyskywhy/react-native-gcanvas/issues/41)
      // for (let i = 0; i < 10; i++) {
      //   await sleepMs(1000);
      //   if (i % 2) {
      //     imageHttp.src =
      //       'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAADklEQVR4AWP4nwZCUAoAKxYFld+CjjoAAAAASUVORK5CYII=';
      //   } else {
      //     imageHttp.src =
      //       'https://gw.alicdn.com/tfs/TB1KwRTlh6I8KJjy0FgXXXXzVXa-225-75.png';
      //   }
      // }

      const imageRequire = new Image();
      imageRequire.onload = () => {
        this.ctx.drawImage(imageRequire, 0, 100, 120, 120);
      };
      imageRequire.onerror = (error) => {
        this.setState({
          debugInfo: error.message,
        });
      };
      imageRequire.src = imageRequireSrc;
    }
  };

  takePicture = () => {
    if (this.canvas) {
      const data = this.canvas.toDataURL();
      console.warn(data);
    }
  };

  render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity onPress={this.drawSome}>
          <Text style={styles.welcome}>{this.state.debugInfo}</Text>
        </TouchableOpacity>
        {Platform.OS === 'web' ? (
          <canvas
            id={'canvasExample'}
            ref={this.initCanvas}
            style={
              {
                flex: 1,
                width: '100%',
                //
                // width: 200,
                // height: 300,
              } /* canvas with react-native-web can't use width and height in styles.gcanvas */
            }
          />
        ) : (
          <GCanvasView
            onCanvasResize={this.onCanvasResize}
            onCanvasCreate={this.initCanvas}
            onIsReady={(value) => (this.isGReactTextureViewReady = value)}
            isGestureResponsible={true /* Here is just for example, you can remove this line because default is true */}
            isAutoClearRectBeforePutImageData={false /* default is false, only for canvas 2d, if you want to be exactly compatible with Web, you can set it to true */}
            isResetGlViewportAfterSetWidthOrHeight={true /* default is true, generally true for canvas 2d and false for webgl 3d */}
            isEnableFboMsaa={false /* default is false, only for Android, only for canvas 2d, if you want anti-aliasing present same behavior on Android and Web, you can set it to true */ }
            devicePixelRatio={undefined /* Here is just for example, you can remove this line because default is undefined and means default is PixelRatio.get(), ref to "About devicePixelRatio" below */}
            style={styles.gcanvas}
          />
        )}
        <TouchableOpacity onPress={this.takePicture}>
          <Text style={styles.welcome}>Click me toDataURL()</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  gcanvas: {
    flex: 1,
    width: '100%',
    // above maybe will cause
    //     WARN     getImageData: not good to be here, should refactor source code somewhere
    // if let this component as a children of another component,
    // you can use below
    // width: 200,
    // height: 300,

    // backgroundColor: '#FF000030', // TextureView doesn't support displaying a background drawable since Android API 24
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    marginVertical: 20,
  },
});

PIXI

You can follow the comments in example https://github.com/flyskywhy/GCanvasRNExamples/blob/master/app/components/Pixi.js which code is similar to 2D canvas above to use pixi.js @4, @5, @6 or @7.

About devicePixelRatio

Take width as example, in Window.devicePixelRatio:

  • "display size (css pixels)" means canvas.clientWidth
  • "actual size in memory" of GPU means canvas._context.drawingBufferWidth

To avoid "blurry canvas" described in Window.devicePixelRatio , @flyskywhy/react-native-gcanvas always set "actual size in memory" of GPU with physical pixels (despite of values into canvas.width = and canvas.height =), so canvas._context.drawingBufferWidth (WebGLRenderingContext's property) always equals canvas.clientWidth * PixelRatio.get() .

with no devicePixelRatio prop, or devicePixelRatio={PixelRatio.get()}

To be here if you want to code with css pixels, in other words, to code like the device full view width is (full physical width)/PixelRatio.get(), and iOS and Android will have the same x y scale with Web against same JS code. FE designer may prefer it.

Replace code in Window.devicePixelRatio with

canvas.width = Math.floor(size * scale);
canvas.height = Math.floor(size * scale);
if (Platform.OS === 'web') {
  ctx.scale(scale, scale);
}

and the rest code will works well.

with devicePixelRatio={1}

To be here if you want to code with physical pixels. Game designer may prefer it.

Without modification, code in Window.devicePixelRatio will works well.

document.createElement('canvas') (as offscreen canvas)

Usage is described in flyskywhy/react-native-browser-polyfill/src/window.js. On iOS, maybe need layout offscreen canvas then layout normal canvas like what this.state.hasOc1 && do in this GCanvasRNExamples APP commit react -> react-native: Zdog and Tests step5 document.createElement('canvas') with offscreenCanvas works well.

Since offscreen canvas is used frequently with ctx.drawImage(), so please pay attention to the quirk of @flyskywhy/react-native-gcanvas:

this.ctx.drawImage(offscreenCanvas, 0, 0, 100, 100, 0, 0, 100, 100);

// if ctx.drawImage(offscreenCanvas) is not follow by some ctx.some(),
// will cause image not display on screen #59, so just ctx.some() here.
this.ctx.fillStyle = '#19491001';

About fonts

Here is the result of Font Picker to fillText on @flyskywhy/react-native-gcanvas by react-native-font-picker.

custom fonts

If want to use custom fonts in @flyskywhy/react-native-gcanvas as well as React <Text/>, please install custom fonts ref to https://mehrankhandev.medium.com/ultimate-guide-to-use-custom-fonts-in-react-native-77fcdf859cf4 and https://github.com/callstack/react-native-paper/blob/291d9a90ea2bf2d9a3416170a9a3a1791cf051b0/docs/docs/guides/04-fonts.md?plain=1#L32, need rename font file name, maybe https://gist.github.com/keighl/5434540 can do the rename work.

Or just see how the simple install steps of react-native-font-sim can install e.g. KaiTi.ttf, and the same steps can also install ttf files in e.g. react-native-vector-icons.

import {getFontNames, registerFont} from '@flyskywhy/react-native-gcanvas';
if (Platform.OS !== 'web') {
  var RNFS = require('react-native-fs');
}

console.log(getFontNames());
// Android print: ['SomeSystemFontFamily', 'some system font family']
// iOS print:     ['SomeCustomFont-Regular', 'SomeCustomFont-Bold', SomeSystemFontFamily', 'some system font family']
...
  copyFileAssets = async () => {
    if (Platform.OS === 'android') {
      const files = await RNFS.readDirAssets('fonts');
      if (files.length) {
        // If >= Android 11 , destFontsPath can only be under
        // RNFS.DocumentDirectoryPath (/data/user/0/com.domain.appname/files/)
        // or
        // RNFS.ExternalDirectoryPath (/storage/emulated/0/Android/data/com.domain.appname/files)
        // If < Android 11 and destFontsPath is e.g. `/sdcard/fonts/`, write code here to request filesystem permission
        // If `adb push` SomeCustomFont-Bold.ttf , also need `adb shell chomd 660` SomeCustomFont-Bold.ttf
        const destFontsPath = `${RNFS.ExternalDirectoryPath}/fonts`;

        if (!(await RNFS.exists(destFontsPath))) {
          await RNFS.mkdir(destFontsPath);
        }

        for (let file of files) {
          const dest = `${destFontsPath}/${file.name}`;
          if (!(await RNFS.exists(dest))) {
            await RNFS.copyFileAssets(`fonts/${file.name}`, dest);
          }

          registerFont(dest);
        }
      }
    }

    console.warn(getFontNames());
    // Android print:   ['SomeCustomFont-Regular', 'SomeCustomFont-Bold', SomeSystemFontFamily', 'some system font family']
    // iOS still print: ['SomeCustomFont-Regular', 'SomeCustomFont-Bold', SomeSystemFontFamily', 'some system font family']
  }

  drawCanvas = async () => {
    if (Platform.OS === 'android') {
      await this.copyFileAssets();
    }
    ...
    // this.ctx.font = '50px SomeSystemFontFamily';
    // this.ctx.font = '50px times new roman';
    this.ctx.font = '50px SomeCustomFont-Regular';
    ...
  }

emoji font on Android

Ref to https://developer.android.com/about/versions/15/behavior-changes-all#png-emoji-font, since Android 15 removed PNG-based emoji font NotoColorEmojiLegacy.ttf, you can

cd android/app/src/main/assets/fonts/
ln -s ../../../../../../node_modules/@flyskywhy/react-native-gcanvas/fonts/NotoColorEmoji.ttf ./
cd -

then use copyFileAssets() in "custom fonts" above.

NotoColorEmoji.ttf here is adb pull before Android 13.

system fonts on Android

Even if some font file in /system/fonts/ on Android is not included in the return of getFontNames(), you can still use it by registerFont()! e.g.

registerFont('/system/fonts/NotoSansThai-Regular.ttf', {family: 'Thai'});
this.ctx.font = '30px Thai'; // or just this.ctx.font = '30px';
this.ctx.fillText('ภาษาไทย泰语Thai', 20, 100);

or just

registerFont('/system/fonts/NotoSansThai-Regular.ttf');
this.ctx.font = '30px NotoSansThai-Regular'; // or just this.ctx.font = '30px';
this.ctx.fillText('ภาษาไทย泰语Thai', 20, 100);

Actually if not registerFont() here, still can fillText 'ภาษาไทย泰语Thai' correctly as NotoSansThai-Regular.ttf is already one of fallback fonts in /etc/fonts.xml on Android, so registerFont() here is just an example:P

Features

  • Cross-platform, support popular iOS and Android.
  • High performance, accelerate graphic draw by OpenGL ES.
  • Provide JavaScript runtime, such as Weex and ReactNative. Convenient to use JavaScript API like HTML canvas.
  • Scalable Architecture, easy to implement a GCanvas bridge by yourself following the guide Custom Native Bridge.
  • Small size.

Introduction

See the Introduction to GCanvas for a detailed introduction to GCanvas.

Weex

Follow Weex Setup Guide to integrate GCanvas on Weex.

JavaScript

GCanvas has browser-like canvas APIs, so almost all of the APIs are exactly same as HTML5 canvas. At this moment, we have already supported 90% of 2D APIs and 99% of WebGL APIs. You can find out those informations in 2D APIs and WebGL APIs.

Documentation

Check Documentation for more information.

Built With

  • Freetype - Used for font rendering on Android

Changelog

New Changelog record in CHANGELOG for details.

Opening Issues

If you encounter a bug with GCanvas we would like to hear about it. Search the existing issues and try to make sure your problem doesn’t already exist before opening a new issue. It’s helpful if you include the version of GCanvas and OS you’re using. Please include a stack trace and reduced repro case when appropriate, too.

Contributing

Please read CONTRIBUTING for details on our code of conduct, and the process for submitting pull requests to us.

Authors

To support my work, please consider donate.

  • ETH: 0xd02fa2738dcbba988904b5a9ef123f7a957dbb3e

License

This project is licensed under the Apache License - see the LICENSE file for details

Star History

Star History Chart

changelog

CHANGES BETWEEN 2.13.2 and 2.13.3 (2024-Aug-11)

I. IMPORTANT CHANGES

  • Some fields in the FT_Outline structure have been changed from signed to unsigned type, which better reflects the actual usage. It is also an additional means to protect against malformed input.

II. IMPORTANT BUG FIXES

  • Rare double-free crashes in the cache subsystem have been fixed.

  • Excessive stack allocation in the autohinter has been fixed.

III. MISCELLANEOUS

  • The B/W rasterizer has received a major upkeep that results in large performance improvements. The rendering speed has increased and even doubled for very complex glyphs.

  • If the new configuration option TT_CONFIG_OPTION_GPOS_KERNING is defined, FT_Get_Kerning understands rudimentary GPOS kerning (for TrueType fonts only). This is not enabled by default since its usage is very limited, mainly for legacy applications that have to support TrueType fonts automatically converted from 'kern' tables to GPOS kerning. If you need proper (GPOS) kerning support please use a higher-level library like HarfBuzz.

    Code contributed by David Saltzman davidbsaltzman@gmail.com.

  • The internal structures PS_DesignMap and PS_Blend related to parsing of old Multiple Masters fonts have been removed from the public header file t1tables.h.

======================================================================

CHANGES BETWEEN 2.13.1 and 2.13.2 (2023-Aug-25)

I. MISCELLANEOUS

  • Better support for CFF2 variation fonts.

  • TrueType interpreter version 38 (also known as 'Infinality') has been removed.

  • Improved OpenVMS support.

======================================================================

CHANGES BETWEEN 2.13.0 and 2.13.1 (2023-Jun-24)

I. MISCELLANEOUS

  • New function FT_Get_Default_Named_Instance to get the index of the default named instance of an OpenType Variation Font.

  • A new load flag FT_LOAD_NO_SVG to make FreeType ignore glyphs in an 'SVG ' table.

  • New function FT_GlyphSlot_AdjustWeight to adjust the glyph weight either horizontally or vertically. This is part of the ftsynth.h header file, which is still considered to be in alpha stage.

  • TrueType interpreter version 38 (also known as 'Infinality') has been deactivated; the value of TT_INTERPRETER_VERSION_38 is now the same as TT_INTERPRETER_VERSION_40.

  • Updated OpenVMS support.

  • The base API documentation has been modularized for easier handling.

  • Switching named instances on and off in Variation Fonts was buggy if the design coordinates didn't change.

  • ftbench has a new command-line option -a to apply design coordinates.

  • ftview can now flip SVG rendering on and off using the 'Z' key.

  • In ftmulti it is now possible to toggle the fill rule and overlap flag used for rendering glyphs using the 'F3' and 'F4' keys, respectively. Toggling the anti-aliased mode has been changed to the 'TAB' key.

======================================================================

CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09)

I. IMPORTANT CHANGES

  • The demo program ftinspect has been completely updated and much enhanced. It now combines the functionality of almost all other graphical FreeType demo programs into a single application based on the Qt framework. This was Charlie Jiang's GSoC 2022 project.

  • The 'COLR' v1 API is now considered as stable.

    https://learn.microsoft.com/en-us/typography/opentype/spec/colr

II. MISCELLANEOUS

  • For OpenType Variable Fonts, avar table format 2.0 is now supported. The code was contributed by Behdad Esfahbod.

    Note that this is an extension supported on recent Apple platforms and by HarfBuzz, but not yet in the OpenType standard! See

    https://github.com/harfbuzz/boring-expansion-spec/blob/main/avar2.md

    for the specification. To deactivate it, define the configuration macro 'TT_CONFIG_OPTION_NO_BORING_EXPANSION'.

  • A new API FT_GlyphSlot_Slant to slant a glyph by a given angle has been added. Note that this function is part of ftsynth.h, which is still considered to be in alpha stage.

  • TrueType interpreter version 38 (also known as 'Infinality') that was first introduced about 10 years ago in FreeType 2.4.11 is now deprecated and slated to be removed in the next version. TrueType interpreter version 40 has been FreeType's default version for six years now and provides an excellent alternative. This is the last FreeType version with TT_INTERPRETER_VERSION_38 and TT_INTERPRETER_VERSION_40 treated differently.

  • The only referenced but never documented configuration macro FT_CONFIG_OPTION_NO_GLYPH_NAMES has been removed.

  • The ftbench demo program got a new command line option -e to set a charmap index.

  • Specifying a point size is now optional for the demo programs ftgrid, ftmulti, ftstring, and ftview. If not given, a default size is used.

  • For ftgrid, ftstring, and ftview, option -e now also accepts a numeric value to set a charmap index.

  • In ftstring, it is now possible to set the displayed text interactively by pressing the 'Enter' key.

  • ftmulti can now handle up to 16 design axes.

  • To avoid reserved identifiers that are globally defined, the auto-hinter debugging macros (which are only available if FT_DEBUG_AUTOFIT is defined)

    _af_debug_disable_horz_hints
    _af_debug_disable_vert_hints
    _af_debug_disable_blue_hints
    _af_debug_hints

    have been renamed to

    af_debug_disable_horz_hints_
    af_debug_disable_vert_hints_
    af_debug_disable_blue_hints_
    af_debug_hints_
  • The internal zlib library was updated to version 1.2.13. Note, however, that FreeType is not affected by CVE-2022-37434 since it doesn't use the inflateGetHeader function.

======================================================================

CHANGES BETWEEN 2.12.0 and 2.12.1 (2022-May-01)

I. IMPORTANT BUG FIXES

  • Loading CFF fonts sometimes made FreeType crash (bug introduced in version 2.12.0)

  • Loading a fully hinted TrueType glyph a second time (without caching) sometimes yielded different rendering results if TrueType hinting was active (bug introduced in version 2.12.0).

  • The generation of the pkg-config file freetype2.pc was broken if the build was done with cmake (bug introduced in version 2.12.0).

II. MISCELLANEOUS

  • New option --with-librsvg for the configure script for better FreeType demo support.

  • The meson build no longer enforces both static and dynamic versions of the library by default.

  • The internal zlib library was updated to version 1.2.12. Note, however, that FreeType is not affected by CVE-2018-25032 since it only does decompression.

======================================================================

CHANGES BETWEEN 2.11.1 and 2.12.0 (2022-Mar-30)

I. IMPORTANT CHANGES

  • FreeType now handles OT-SVG fonts, to be controlled with FT_CONFIG_OPTION_SVG configuration macro. By default, it can only load the 'SVG ' table of an OpenType font. However, by using the svg-hooks property of the new 'ot-svg' module it is possible to register an external SVG rendering engine. The FreeType demo programs have been set up to use 'librsvg' as the rendering library.

    This work was Moazin Khatti's GSoC 2019 project.

II. MISCELLANEOUS

  • The handling of fonts with an 'sbix' table has been improved.

    • Corrected bitmap offsets.

    • A new tag FT_PARAM_TAG_IGNORE_SBIX for FT_Open_Face makes FreeType ignore an 'sbix' table in a font, allowing applications to access the font's outline glyphs.

    • FT_FACE_FLAG_SBIX and FT_FACE_FLAG_SBIX_OVERLAY together with their corresponding preprocessor macros FT_HAS_SBIX and FT_HAS_SBIX_OVERLAY enable applications to treat 'sbix' tables as described in the OpenType specification.

  • The internal 'zlib' code has been updated to be in sync with the current 'zlib' version (1.2.11).

  • The previously internal load flag FT_LOAD_SBITS_ONLY is now public.

  • Some minor improvements of the building systems, in particular handling of the 'zlib' library (internal vs. external).

  • Support for non-desktop Universal Windows Platform.

  • Various other minor bug and documentation fixes.

  • The ftdump demo program shows more information for Type1 fonts if option -n is given.

  • ftgrid can now display embedded bitmap strikes.

======================================================================

CHANGES BETWEEN 2.11.0 and 2.11.1 (2021-Dec-01)

I. IMPORTANT CHANGES

- Some  fields  in  the  `CID_FaceDictRec`, `CID_FaceInfoRec`, and
  `FT_Data` structures  have been changed  from signed to unsigned
  type,  which  better reflects  the actual usage.  It is also  an
  additional means to protect against malformed input.

II. MISCELLANEOUS

- Cmake support  has been  further improved.   To do  that various
  backward-incompatible  changes were  necessary; please  see file
  `CMakeLists.txt` for more details.

- Since version  2.11.0, a  C99 compiler  is necessary  to compile
  FreeType.

- The experimental  'COLR' v1 API  has been updated to  the latest
  OpenType standard 1.9.

- The `apinames` tool got a new  option `-wV` to output an OpenVMS
  Linker Option File.

- VMS support was updated.

- MS Visual Studio support was added to build the demo programs.

======================================================================

CHANGES BETWEEN 2.10.4 and 2.11.0 (2021-Jul-18)

I. IMPORTANT CHANGES

  • A new rendering module has been added to create 8-bit Signed Distance Field (SDF) bitmaps for both outline and bitmap glyphs. The new rendering mode is called FT_RENDER_MODE_SDF, the pixel mode is FT_PIXEL_MODE_GRAY8, and the corresponding raster flag is FT_RASTER_FLAG_SDF.

    This work was Anuj Verma's GSoC 2020 project.

  • A new, experimental API is now available for surfacing properties of 'COLR' v1 color fonts (as the name says, this is an extension to the 'COLR' table for outline color fonts using the SFNT container format). 'COLR' v1 fonts are a recently proposed addition to OFF and OpenType; specification work currently happens in

    https://github.com/googlefonts/colr-gradients-spec/

    'COLR' v1 is expected to be merged to OpenType; the ISO standardisation process for adding 'COLR' v1 as an amendment to OFF is underway.

    Functions similar to the already existing 'COLR' API have been added to access the corresponding data.

    FT_Get_Color_Glyph_Paint

    Retrieve the root paint for a given glyph ID.

    FT_Get_Paint_Layers

    Access the layers of a `PaintColrLayers` table.

    FT_Get_Colorline_Stops

    Retrieve the  'color stops' on a  color line.  As an  input, a
    color stop iterator gets used, which in turn is retrieved from
    a paint.

    FT_Get_Paint

    Dereference  an  `FT_OpaquePaint`   object  and  retrieve  the
    corresponding `FT_COLR_Paint`  object, which  contains details
    on how to draw the respective 'COLR' v1 `Paint` table.

II. MISCELLANEOUS

  • FreeType has moved its infrastructure to

    https://gitlab.freedesktop.org/freetype

    A side effect is that the git repositories are now called freetype.git and freetype-demos.git, which by default expand to the directories freetype and freetype-demos, respectively. The documentation has been updated accordingly.

    FreeType's Savannah repositories will stay; they are now mirrors of the 'freedesktop.org' repositories.

  • A new function FT_Get_Transform returns the values set by FT_Set_Transform.

  • A new configuration macro FT_DEBUG_LOGGING is available. It provides extended debugging capabilities for FreeType, for example showing a time stamp or displaying the component a tracing message comes from. See file docs/DEBUG for more information.

    This work was Priyesh Kumar's GSoC 2020 project.

  • The legacy Type 1 and CFF engines are further demoted due to lack of CFF2 charstring support. You now need to use FT_Property_Set to enable them besides the T1_CONFIG_OPTION_OLD_ENGINE and CFF_CONFIG_OPTION_OLD_ENGINE options, respectively.

  • The experimental 'warp' mode (AF_CONFIG_OPTION_USE_WARPER) for the auto-hinter has been removed.

  • The smooth rasterizer performance has been improved by >10%. Note that due to necessary code changes there might be very subtle differences in rendering. They are not visible by the eye, however.

  • PCF bitmap fonts compressed with LZW (these are usually files with the extension .pcf.Z) are now handled correctly.

  • Improved Meson build files, including support to build the FreeType demo programs.

  • A new demo program ftsdf is available to display Signed Distance Fields of glyphs.

  • The ftlint demo program has been extended to do more testing of its input. In particular, it can display horizontal and vertical acutances for quality assessment, together with computing MD5 checksums of rendered glyphs.

    [The acutance measures how sharply the pixel coverage changes at glyph edges. For monochrome bitmaps, it is always 2.0 in either X or Y direction. For anti-aliased bitmaps, it depends on the hinting and the shape of a glyph and might approach or even reach value 2.0 for glyphs like 'I', 'L', '+', '-', or '=', while it might be lower for glyphs like 'O', 'S', or 'W'.]

  • The ttdebug demo program didn't show changed point coordinates (bug introduced in version 2.10.3).

  • It is now possible to adjust the axis increment for variable fonts in the ftmulti demo program.

  • It is now possible to change the hinting engine in the ftstring demo program.

  • The graphical demo programs work better now in native color depth on win32 and x11.

======================================================================

CHANGES BETWEEN 2.10.3 and 2.10.4 (2020-Oct-20)

I. IMPORTANT BUG FIXES

======================================================================

CHANGES BETWEEN 2.10.2 and 2.10.3 (2020-Oct-10)

I. IMPORTANT CHANGES

  • New flag `FT_OUTLINE_OVERLAP'. If set, make the smooth rasterizer do 4x4 oversampling to mitigate artifacts in pixels partially covered by overlapping contours. Note that this at least quadruples the rendering time.

    If a glyph in a TrueType font has the OVERLAP_SIMPLE' orOVERLAP_COMPOUND' bit set, FreeType automatically selects this rendering mode.

II. MISCELLANEOUS

  • Using the arcane method of including FreeType header files with macros like `FT_FREETYPE_H' is no longer mandatory (but retained as an optional feature for backward compatibility).

  • Support for building the library with Meson. Building the demo programs with Meson will follow in a forthcoming release.

  • Minor improvements to the B/W rasterizer.

  • Auto-hinter support for Medefaidrin script.

  • Fix various memory leaks (mainly for CFF) and other issues that might cause crashes in rare circumstances.

  • Jam support has been removed.

  • In ftview', custom LCD filter values are now normalized and balanced. Unorthodox filters are still available through the-L' command line option.

  • The GUI demo programs can now be resized.

  • Demo programs that accept command line option `-k' can now handle function keys, too. The corresponding character codes start with 0xF1. As an example, the POSIX shell syntax (accepted by bash, ksh, and zsh)

    -k $'\xF3q'

    emulates the pressing of function key F3' followed by keyq'.

======================================================================

CHANGES BETWEEN 2.10.1 and 2.10.2 (2020-May-09)

I. IMPORTANT CHANGES

  • Support of WOFF2 fonts. This code contribution was Nikhil Ramakrishnan's GSoC 2019 project.

II. MISCELLANEOUS

  • Function `FT_Get_Var_Axis_Flags' returned random data for Type 1 MM fonts.

  • Type 1 fonts with non-integer metrics are now supported by the new (CFF) engine introduced in FreeType 2.9.

  • Drop support for Python 2 in Freetype's API reference generator docwriter' (Python >= 3.5 is required for targetsmake refdoc' and `make refdoc-venv').

  • Auto-hinter support for Hanifi Rohingya.

  • Document the `FT2_KEEP_ALIVE' debugging environment variable.

  • The Visual C++ (and Visual C) project files for Windows builds no longer generate libraries that contain the FreeType version in its filenames. Instead, a resource file gets used to make the libraries contain the corresponding information.

  • The next release will remove Jam build support.

  • The ftbench' demo program has a new test for testing theFT_Glyph_Stroke' functionality.

======================================================================

CHANGES BETWEEN 2.10.0 and 2.10.1 (2019-Jul-01)

I. IMPORTANT BUG FIXES

  • The bytecode hinting of OpenType variation fonts was flawed, since the data in the `CVAR' table wasn't correctly applied.

II. MISCELLANEOUS

  • Auto-hinter support for Mongolian.

  • For distribution, .tar.bz2' packages are replaced with.tar.xz' bundles.

  • The handling of the default character in PCF fonts as introduced in version 2.10.0 was partially broken, causing premature abortion of charmap iteration for many fonts.

  • If `FT_Set_Named_Instance' was called with the same arguments twice in a row, the function returned an incorrect error code the second time.

  • Direct rendering using FT_RASTER_FLAG_DIRECT crashed (bug introduced in version 2.10.0).

  • Increased precision while computing OpenType font variation instances.

  • The flattening algorithm of cubic Bezier curves was slightly changed to make it faster. This can cause very subtle rendering changes, which aren't noticeable by the eye, however.

  • The auto-hinter now disables hinting if there are blue zones defined for a `style' (i.e., a certain combination of a script and its related typographic features) but the font doesn't contain any characters needed to set up at least one blue zone.

  • The `ftmulti' demo program now supports multiple hidden axes with the same name tag.

  • ftview',ftstring', and ftgrid' got a-k' command line option to emulate a sequence of keystrokes at start-up.

  • ftview',ftstring', and `ftgrid' now support screen dumping to a PNG file.

  • The bytecode debugger, ttdebug', now supports variation TrueType fonts; a variation font instance can be selected with the new-d' command line option.

======================================================================

CHANGES BETWEEN 2.9.1 and 2.10.0 (2019-Mar-15)

I. IMPORTANT CHANGES

- A bunch  of new functions has  been added to access  and process
  COLR/CPAL data of OpenType fonts with color-layered glyphs.

    FT_Palette_Data_Get
      Retrieve color palette data.
    FT_Palette_Select
      Select and activate a color palette for color-layered
      glyphs.
    FT_Palette_Set_Foreground_Color
      Set text foreground color for palette index 0xFFFF.

    FT_Get_Color_Glyph_Layer
      Get color layers for a given glyph (using an interator
      object).

    FT_Bitmap_Blend
      Blend one bitmap onto another with a given color.

- An   experimental  feature   is   the  new   behaviour  of   the
  `FT_LOAD_COLOR' load  flag for color-layered  glyphs: Internally
  it  sets a  flag so  that  if `FT_Render_Glyph'  is called  with
  `FT_RENDER_MODE_NORMAL'      (or       `FT_Load_Glyph'      with
  `FT_LOAD_RENDER'), a default blending  of the color glyph layers
  will happen automatically for convenience.

- As  a   GSoC  2018   project,  Nikhil   Ramakrishnan  completely
  overhauled and modernized the API reference.

II. MISCELLANEOUS

- The  logic for  computing  the global  ascender, descender,  and
  height  of  OpenType  fonts   has  been  slightly  adjusted  for
  consistency.

  . If the `useTypoMetrics' flag (i.e., bit 7 in the `fsSelection'
    field) in the  `OS/2' table is set, use the  `sTypo' fields in
    `OS/2' unconditionally.
  . Otherwise use  the metrics data from the `hhea'  table (if not
    zero).
  . Otherwise use the `sTypo' fields from the `OS/2' table (if not
    zero).
  . Otherwise use the `usWin' data from the `OS/2' table as a last
    resort.

  Variable fonts will apply the `MVAR' deltas to whichever metrics
  were picked.

- `TT_Set_MM_Blend' could  fail if  call repeatedly with  the same
  arguments.

- The precision  of handling  deltas in  Variation Fonts  has been
  increased.  The  problem did only show  up with multidimensional
  designspaces.

- New function `FT_Library_SetLcdGeometry' to  set up the geometry
  of LCD subpixels.

- FreeType now uses the `defaultChar' property of PCF fonts to set
  the  glyph for  the undefined  character  at glyph  index 0  (as
  FreeType already does for all other supported font formats).  As
  a consequence,  the order of  glyphs of  a PCF font  if accessed
  with  FreeType  can  be   different  now  compared  to  previous
  versions.

  This change doesn't affect PCF font access with cmaps.

- `FT_Select_Charmap' has  been changed  to allow  parameter value
  `FT_ENCODING_NONE', which is valid for BDF, PCF, and Windows FNT
  formats to  access built-in cmaps  that don't have  a predefined
  `FT_Encoding' value.

- A previously  reserved field in the  `FT_GlyphSlotRec' structure
  now holds the glyph index.

- On Win32 platforms,  the use of `_DLL' to build  the library has
  been replaced with `DLL_EXPORT' and `DLL_IMPORT'.

- The usual round  of fuzzer bug fixes to  better reject malformed
  fonts.

- `FT_Outline_New_Internal'  and  `FT_Outline_Done_Internal'  have
  been removed.  These two functions were public by oversight only
  and were never documented.

- A new  function `FT_Error_String' returns descriptions  of error
  codes if  configuration macro  FT_CONFIG_OPTION_ERROR_STRINGS is
  defined.

- `FT_Set_MM_WeightVector'  and  `FT_Get_MM_WeightVector' are  new
  functions limited to Adobe MultiMaster fonts to directly set and
  get the weight vector.

- Support for Position Independent Code as needed by  systems that
  prohibit  automatic  address  fixups,  such  as BREW,  has  been
  removed.  [Compilation with modern compilers that use flags like
  `-fPIC' or `-fPIE' is not affected.]

- The  `ftdump' demo  program has  new  options `-c'  and `-C'  to
  display charmaps  in compact and detailed  format, respectively.
  Option `-V' has been removed.

- The `ftview', `ftstring',  and `ftgrid' demo programs  use a new
  command line option `-d' to  specify the program window's width,
  height, and color depth.

- The `ftview' demo program now  displays red boxes for zero-width
  glyphs.

- `ftglyph'   has   limited   support  to   display   fonts   with
  color-layered glyphs.  This will be improved later on.

- `ftgrid' can now display bitmap fonts also.

- The `ttdebug'  demo program has  a new  option `-f' to  select a
  member of a TrueType collection (TTC).

- Other various improvements to the demo programs.

======================================================================

CHANGES BETWEEN 2.9 and 2.9.1 (2019-May-01)

I. IMPORTANT BUG FIXES

- Type  1  fonts  containing   flex  features  were  not  rendered
  correctly (bug introduced in version 2.9).

- CVE-2018-6942: Older  FreeType versions  can crash  with certain
  malformed variation fonts.

    https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6942

II. MISCELLANEOUS

- Bug fix: Multiple calls to `FT_Get_MM_Var' returned garbage.

- The base  extensions `ftlcdfil' and  `ftfntfmt' are now  part of
  the  base  module  (and  thus no  longer  configurable  in  file
  `modules.cfg').

- Emboldening of bitmaps didn't work correctly sometimes,  showing
  various artifacts (bug introduced in version 2.8.1).

- Use  of  the `freetype-config'  script  to  get compilation  and
  linking  options   is  deprecated   since  it   doesn't  support
  cross-compiling, among other  deficiencies.  Instead, you should
  use the `pkg-config' interface.

  The `configure'  script no longer installs  `freetype-config' by
  default.  For  backward  compatibility,  a new  configure option
  `--enable-freetype-config'   is  provided   that  reverts   this
  decision.

- The auto-hinter script ranges have  been updated for Unicode 11.
  No support  for new scripts  have been added, however,  with the
  exception of Georgian Mtavruli.

- Support for cmake has been improved.

- The next  release will  remove support for  Position Independent
  Code  as  needed  by  systems that  prohibit  automatic  address
  fixups, such  as BREW.  [Compilation with  modern compilers that
  use flags like `-fPIC' or `-fPIE' is not affected.]

======================================================================

CHANGES BETWEEN 2.8.1 and 2.9 (2018-Jan-08)

I. IMPORTANT BUG FIXES

- Advance width values of variation fonts were often wrong.

- More fixes for variation font support; you should update to this
  version if you want to support them.

II. IMPORTANT CHANGES

- As a GSoC project, Ewald Hew extended the new (Adobe) CFF engine
  to  handle  Type  1  fonts  also,  thus  greatly  improving  the
  rendering of  this format.   This is the  new default.   The old
  engine   is  still   available   if   the  configuration   macro
  `T1_CONFIG_OPTION_OLD_ENGINE'    gets    defined;   using    the
  `hinting-engine' property  of the `type1' driver  module you can
  then switch between the two engines.

- A new function,  `FT_Set_Named_Instance', can be used  to set or
  change the current named instance.

- Starting  with   this  FreeType  version,   resetting  variation
  coordinates  will   return  to  the  currently   selected  named
  instance.  Previously, FreeType returned to the base font (i.e.,
  no instance set).

III. MISCELLANEOUS

- The `face_flags' field of the `FT_Face' structure has a new bit,
  `FT_FACE_FLAG_VARIATION', which  is set if a  variation font has
  been      altered      with      `FT_Set_MM_Design_Coordinates',
  `FT_Set_Var_Design_Coordinates',                              or
  `FT_Set_Var_Blend_Coordinates'.

- If  the  current  face  is  a  named  instance,  the  new  macro
  `FT_IS_NAMED_INSTANCE' returns true.

- `FT_IS_VARIATION' is  a new macro  that returns true  whenever a
  face object has  been altered by `FT_Set_MM_Design_Coordinates',
  `FT_Set_Var_Design_Coordinates',                              or
  `FT_Set_Var_Blend_Coordinates'.

- Changing  the  design  coordinates  of  a  variation  font  with
  `FT_Set_Var_Design_Coordinates'                               or
  `FT_Set_Var_Blend_Coordinates'  does  not  influence  the  named
  instance index value (only `FT_Set_Named_Instance' does that).

- Special PostScript  names for named instances  are only returned
  if the  named instance is set  with `FT_Set_Named_Instance' (and
  the font  has corresponding  entries in  its `fvar'  table).  If
  `FT_IS_VARIATION'  returns  true,  the  algorithmically  derived
  PostScript name is provided, not  looking up special entries for
  named instances.

- A new function  `FT_Done_MM_Var' is provided to  free the memory
  returned in a call to `FT_Get_MM_Var'.

- On  platforms  using  the   `configure'  script,  the  installed
  `ftoption.h' file  now correctly reflects  configuration options
  like `--with-harfbuzz'.

- Better  support to  build FreeType  as  a DLL  on Windows  using
  Visual C.

- All data specific to driver modules is now collected in a single
  file,      `FT_DRIVER_H'.      Consequently,      the     macros
  `FT_AUTOHINTER_H',   `FT_CFF_DRIVER_H',  `FT_TRUETYPE_DRIVER_H',
  and `FT_PCF_DRIVER_H' still work but are deprecated.

- Some fuzzer fixes to better reject malformed fonts.

- The `ftbench' demo program has a new test for opening a new face
  and loading some glyphs.

- The `ftbench' demo program has a  new option `-j' to specify the
  last glyph index to be used in the tests.

- The  `ftgrid' demo  program has  a new  option `-n'  to suppress
  display of named instances of variation fonts.

- The `ttdebug' demo program can now  show a stack trace (key `K')
  and switch  between hexadecimal and decimal  display of integers
  (key `I').

======================================================================

CHANGES BETWEEN 2.8 and 2.8.1 (2017-Sep-16)

I. IMPORTANT BUG FIXES

- B/W  hinting   of  TrueType   fonts  didn't  work   properly  if
  interpreter version 38 or 40 was selected.

- Some severe  problems within the handling  of TrueType Variation
  Fonts were found and fixed.

- Function `FT_Set_Var_Design_Coordinates' didn't correctly handle
  the case with less input coordinates than axes.

II. IMPORTANT CHANGES

- By  default,  FreeType  now offers  high  quality  LCD-optimized
  output without  resorting to ClearType techniques  of resolution
  tripling and  filtering.  In  this method, called  Harmony, each
  color channel  is generated separately after  shifting the glyph
  outline, capitalizing  on the fact  that the color grids  on LCD
  panels  are shifted  by  a third  of a  pixel.   This output  is
  indistinguishable from ClearType with a light 3-tap filter.

III. MISCELLANEOUS

- Using the  new function `FT_Get_Var_Axis_Flags',  an application
  can access the `flags' field  of a variation axis (introduced in
  OpenType version 1.8.2)

- More sanity checks.

- The  internal representation  of buffers  for LCD  rendering has
  changed (to be more precise, the amount of padding gets computed
  differently).  Applications  that use  the FreeType API  are not
  affected.

- To  reset all  design axis  values of  a variation  font to  its
  default values you can now say

    error = FT_Set_Var_Design_Coordinates( face, 0, NULL );

  This  also works  with functions  `FT_Set_MM_Design_Coordinates'
  and `FT_Set_MM_Blend_Coordinates'.

- FreeType  now synthesizes  a  missing Unicode  cmap for  (older)
  TrueType fonts also if glyph names are available.

- FreeType  has  improved  handling   of  BDF  fonts  without  the
  `POINT_SIZE', `RESOLUTION_X', or  `RESOLUTION_Y' properties; the
  library now  uses the values of  the `SIZE' keyword if  they are
  missing.   Previously,   `SIZE'  was  completely   ignored,  and
  FreeType used heuristic values instead.

- Multiple calls to `FT_Bitmap_Convert' do work now as advertised.
  Previously,  they failed with an assertion error if there was an
  empty bitmap between non-empty ones.

- The warping option  has moved  from `light'  to `normal' hinting
  where  it replaces  the original hinting algorithm.  The `light'
  mode is now always void of any hinting in x-direction.

- 16bit  compiler  support is  now  officially  ended.  We  didn't
  provide any maintenance  since many years,  and given that there
  were no error  or problem reports either it seems  that it is no
  longer needed.

- The `ftgrid'  demo program  can now toggle  the display  of grid
  lines with the `G' key.

- The `ftgrid' demo  program can toggle a different  set of colors
  (suitable to color-blind people) with the `C' key.

- The `ftgrid'  demo program  now supports  the `-e'  command line
  option to select a cmap.

- The `ftdump' demo program has a  new command line option `-t' to
  output the SFNT table list.

======================================================================

CHANGES BETWEEN 2.7.1 and 2.8 (2017-May-13)

I. IMPORTANT CHANGES

- Support for OpenType Variation Fonts is now complete.   The last
  missing part was handling the `VVAR' and `MVAR' tables, which is
  available with this release.

- A new  function `FT_Face_Properties' allows the  control of some
  module  and   library  properties  per  font.    Currently,  the
  following properties can be  handled: stem darkening, LCD filter
  weights, and the random seed for the `random' CFF operator.

- The PCF change to show more `colorful'  family names (introduced
  in version 2.7.1) was too radical; it can now be configured with
  PCF_CONFIG_OPTION_LONG_FAMILY_NAMES   at   compile   time.    If
  activated, it can  be switched off at run time  with the new pcf
  property  `no-long-family-names'.  If  the `FREETYPE_PROPERTIES'
  environment variable is available, you can say

    FREETYPE_PROPERTIES=pcf:no-long-family-names=1

- Support  for  the  following  scripts  has  been  added  to  the
  auto-hinter.

    Adlam, Avestan, Bamum, Buhid, Carian, Chakma, Coptic, Cypriot,
    Deseret, Glagolitic, Gothic, Kayah, Lisu, N'Ko, Ol Chiki, Old
    Turkic, Osage, Osmanya, Saurashtra, Shavian, Sundanese, Tai
    Viet, Tifinagh, Unified Canadian Syllabics, Vai

II. IMPORTANT BUG FIXES

- `Light' auto-hinting  mode no  longer uses TrueType  metrics for
  TrueType  fonts.   This bug  was  introduced  in version  2.4.6,
  causing   horizontal  scaling   also.    Almost  all   GNU/Linux
  distributions (with Fedora as  a notable exception) disabled the
  corresponding patch for good reasons; chances are thus high that
  you won't notice a difference.

  If  optical backward  compatibility for  legacy applications  is
  necessary, you might enable the AF_CONFIG_OPTION_TT_SIZE_METRICS
  configuration option.   However, it  is strongly  recommended to
  avoid that, adjusting font sizes instead.

- Global size  metrics values  in the  `FT_Size_Metrics' structure
  can be  different for TrueType  fonts.  Reason is that  in older
  FreeType  versions  the  metrics  were  rounded  differently  to
  integer pixels compared  to all other font  formats, yielding an
  inconsistent behaviour if you used non-native hinting.  Starting
  with this  version, global size  metrics for TrueType  fonts are
  handled the same as other  font formats: `ascender' gets rounded
  up,  `descender'  gets  rounded  down,  `height'  gets  normally
  rounded, and `max_advance' gets normally rounded, too.

  If you need more precise values of (global) ascender, descender,
  height, or  `max_advance', please take the  corresponding values
  from the `FT_Face' structure and scale them manually.

- If a TrueType font gets loaded with FT_LOAD_NO_HINTING, FreeType
  now scales  the font linearly  again (bug introduced  in version
  2.4.6).

- CVE-2017-8105,  CVE-2017-8287:  Older   FreeType  versions  have
  out-of-bounds  writes  caused  by  heap-based  buffer  overflows
  related to Type 1 fonts.

    https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8105
    https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8287

III. MISCELLANEOUS

- A  new function  `FT_Set_Default_Properties' has  been added  to
  parse    the    `FREETYPE_PROPERTIES'    environment    variable
  (previously, it  was internal only).   `FT_Init_FreeType' always
  call this  function, but  `FT_New_Library' does not  (similar to
  `FT_Add_Default_Modules').

- To be in sync with OpenType version 1.7 and newer, macros

    FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
    FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY,
    TT_NAME_ID_PREFERRED_FAMILY
    TT_NAME_ID_PREFERRED_SUBFAMILY

  are renamed to

    FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
    FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY,
    TT_NAME_ID_TYPOGRAPHIC_FAMILY
    TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY

  The old macro names are deprecated (but still available).

- Support for SFNT `name' tables has been improved.

  . Format  1 `name' tables  are now supported.  Use  new function
    `FT_Get_Sfnt_LangTag' to access associated language tags.

  . Language, encoding, and name IDs have been updated to OpenType
    version 1.8.1.

- The new CFF  engine now handles the `random'  operator.  All CFF
  opcodes are now supported.

- The CFF module  has a new property `random-seed'  to control the
  pseudo-random number generation for the `random' operator.

- The `freetype-config' script is now a wrapper of `pkg-config' if
  this program is available in the path.

- FT_LOAD_TARGET_LCD  is now  a  variant of  FT_LOAD_TARGET_LIGHT;
  this should provide better rendering results.

- A mode to display  light auto-hinting with  subpixel positioning
  has been added to `ftdiff'.

======================================================================

CHANGES BETWEEN 2.7 and 2.7.1 (2016-Dec-30)

I. IMPORTANT CHANGES

- Support for the new CFF2 font format as introduced with OpenType
  1.8 has been contributed by Dave Arnolds from Adobe.

- Preliminary support for variation fonts as specified in OpenType
  1.8 (in addition to the  already existing support for Adobe's MM
  and Apple's  GX formats).  Dave Arnolds  contributed handling of
  advance  width change  variation;  more will  come  in the  next
  version.

II. IMPORTANT BUG FIXES

- Handling of  raw CID fonts was partially  broken (bug introduced
  in 2.6.4).

- CVE-2016-10328:  Older  FreeType versions had  an  out-of-bounds
  write caused by a heap-based  buffer overflow related to the CFF
  fonts.

    https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10328

III. MISCELLANEOUS

- Some limits for TrueType  bytecode execution have been tightened
  to  speed   up  FreeType's  handling  of   malformed  fonts,  in
  particular to quickly abort endless loops.

  - The  number of  twilight points  can no  longer be  set to  an
    arbitrarily large value.

  - The total number of jump  opcode instructions (like JMPR) with
    negative arguments  is dynamically restricted; the  same holds
    for the total number of iterations in LOOPCALL opcodes.

  The dynamic limits are based on  the number of points in a glyph
  and the number of CVT entries.  Please report if you encounter a
  font where the selected values are not adequate.

- PCF family names are made more `colorful';  they now include the
  foundry  and information  whether they contain  wide characters.
  For example,  you no longer get `Fixed' but  rather `Sony Fixed'
  or `Misc Fixed Wide'.

- A new  function `FT_Get_Var_Blend_Coordinates'  (with its  alias
  name  `FT_Get_MM_Blend_Coordinates') to retrieve the  normalized
  blend  coordinates of the currently  selected variation instance
  has been added to the Multiple Masters interface.

- A new  function `FT_Get_Var_Design_Coordinates' to  retrieve the
  design coordinates of the  currently selected variation instance
  has been added to the Multiple Masters interface.

- A new load flag `FT_LOAD_BITMAP_METRICS_ONLY' to retrieve bitmap
  information without loading the (embedded) bitmap itself.

- Retrieving   advance   widths   from   bitmap   strikes   (using
  `FT_Get_Advance' and `FT_Get_Advances') have been sped up.

- The  usual round  of  fuzzer fixes  to  better reject  malformed
  fonts.

- The `ftmulti' demo program can now switch engines with key `H'.

- The  `ftstring'  demo  program   can  now  show  some  built-in,
  non-latin sample strings (to be selected with the TAB key).

- The  `ftview'  demo program  can  now  switch between  a  font's
  charmaps using the TAB key.

======================================================================

CHANGES BETWEEN 2.6.5 and 2.7 (2016-Sep-08)

I. 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.

II. 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.

III. 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.

======================================================================

CHANGES BETWEEN 2.6.4 and 2.6.5 (2016-Jul-12)

I. IMPORTANT BUG FIXES

- Compilation works again  on Mac OS X (bug introduced  in version
  2.6.4).

II. IMPORTANT CHANGES

- The new  subpixel hinting  mode is now  disabled by  default; it
  will  be enabled  by default  in the  forthcoming 2.7.x  series.
  Main reason for reverting this feature is the principle of least
  surprise: a  sudden change in  appearance of all fonts  (even if
  the rendering improves  for almost all recent  fonts) should not
  be expected in a new micro version of a series.

======================================================================

CHANGES BETWEEN 2.6.3 and 2.6.4 (2016-Jul-05)

I. IMPORTANT CHANGES

- A new  subpixel hinting  mode has  been contributed  by Nikolaus
  Waxweiler, which is now the  default rendering mode for TrueType
  fonts.  It implements  (almost everything of) version  40 of the
  bytecode engine.

  The existing code  base in FreeType (the  `Infinality code') was
  stripped to the bare minimum  and all configurability removed in
  the  name  of speed  and  simplicity.   The configurability  was
  mainly aimed  at legacy  fonts like Arial,  Times New  Roman, or
  Courier.  [Legacy fonts are fonts  that modify vertical stems to
  achieve clean black-and-white bitmaps.]  The new mode focuses on
  applying a minimal set of rules to all fonts indiscriminately so
  that modern and web fonts  render well while legacy fonts render
  okay.

  Activation  of the  subpixel hinting  support can  be controlled
  with   the   `TT_CONFIG_OPTION_SUBPIXEL_HINTING'   configuration
  option  at compile  time: If  set to  value 1,  you get  the old
  Infinality  mode  (which  was  never  the  default  due  to  its
  slowness).  Value 2 activates the new subpixel hinting mode, and
  value 3 activates both.  The default is value 2.

  At run time,  you can select the subpixel hinting  mode with the
  `interpreter-version'  property (provided  you have  compiled in
  the corresponding hinting mode); see `ftttdrv.h' for more.

- Support  for  the  following  scripts  has  been  added  to  the
  auto-hinter.

    Armenian, Cherokee, Ethiopic, Georgian, Gujarati, Gurmukhi,
    Malayalam, Sinhala, Tamil

II. MISCELLANEOUS

- Type 42 fonts as created by LilyPond are now supported.

- Minor rendering improvements in the auto-hinter.

- For experimental  reasons, the old  CFF engine now  supports all
  CFF operators except `random', including the deprecated Multiple
  Masters  instructions.  This  allows the  display of  fonts like
  `ITCGaramondMM-It.otf' (without font variations, though).

- Another round of fixes to improve handling of invalid fonts.

- The `ftgrid' demo program now displays the rendered pixels also;
  this can be switched off with the `b' key.  Selection of various
  LCD filtering modes can be done with the `L' key.

- The demo programs  have been extended to allow  selection of all
  available TrueType bytecode engines.

- A very early beta version of a new, Qt based demo program called
  `ftinspect'  is  part  of  the   source  code  bundle;  it  will
  eventually supersede  the other  demo programs.   Currently, you
  have to compile  it manually with `qmake; make';  note that many
  features are still missing.

======================================================================

CHANGES BETWEEN 2.6.2 and 2.6.3 (2016-Feb-08)

I. IMPORTANT CHANGES

- Khmer,  Myanmar, Bengali,  and Kannada  script support  has been
  added to the auto-hinter.

II. MISCELLANEOUS

- Better  support of  Indic  scripts like  Devanagari  by using  a
  top-to-bottom hinting flow.

- All  FreeType macros  starting  with two  underscores have  been
  renamed to  avoid a violation of  both the C and  C++ standards.
  Example: Header  macros of the  form `__FOO_H__' are  now called
  `FOO_H_'.  In most cases,  this should be completely transparent
  to the user.   The exception to this  is `__FTERRORS_H__', which
  must be  sometimes undefined by  the user to get  FreeType error
  strings:  Both this  form and  the new  `FTERRORS_H_' macro  are
  accepted for backward compatibility.

- Minor improvements mainly to the Type 1 driver.

- The  new CFF  engine now  supports all  Type 2  operators except
  `random'.

- The macro `_STANDALONE_', used for  compiling the B/W and smooth
  rasterizers  as   stand-alone  modules,  has  been   renamed  to
  `STANDALONE_', since macro names starting with an underscore and
  followed by an uppercase letter are reserved in both C and C++.

- Function  `FT_Library_SetLcdFilterWeights'  now  also  activates
  custom LCD filter weights (instead of just adjusting them).

- Support for  `unpatented hinting'  has been  completely removed:
  Consequently,  the two  functions `FT_Face_CheckTrueTypePatents'
  and  `FT_Face_SetUnpatentedHinting'  now  return  always  false,
  doing nothing.

- The `ftgamma' demo  program has been modernized;  the gamma grid
  display has been moved from `ftview' to this program.

- In `ftview',  it is now possible to cycle through  the available
  LCD filtering modes.

======================================================================

CHANGES BETWEEN 2.6.1 and 2.6.2 (2015-Nov-28)

I. IMPORTANT CHANGES

- The auto-hinter now supports stem darkening, to be controlled by
  the    new   `no-stem-darkening'    and   `darkening-parameters'
  properties.   This is  an  experimental  feature contributed  by
  Nikolaus Waxweiler, and  the interface might change  in a future
  release.

- By default, stem darkening is now switched off (for both the CFF
  engine and the  auto-hinter).  The main reason is  that you need
  linear  alpha  blending  and  gamma correction  to  get  correct
  rendering results, and  the latter is not yet  available in most
  freely  available  rendering  stacks like  X11.   Applying  stem
  darkening without proper gamma correction  leads to far too dark
  rendering results.

- The   meaning  of   `FT_RENDER_MODE_LIGHT'  has   been  slightly
  modified.   It  now  essentially  means `no  hinting  along  the
  horizontal  axis'; in  particular,  no change  of glyph  advance
  widths.  Consequently, the auto-hinter  is used for all scalable
  font  formats  except  for  CFF.    It  is  planned  that  other
  font-specific rendering engines (TrueType, Type 1) will follow.

II. MISCELLANEOUS

- The default  LCD filter  has been changed  to be  normalized and
  color-balanced.

- For    better    compatibility   with    FontConfig,    function
  `FT_Library_SetLcdFilter'  accepts   a  new   enumeration  value
  `FT_LCD_FILTER_LEGACY1'   (which  has   the   same  meaning   as
  `FT_LCD_FILTER_LEGACY').

- A large number of bugs have been detected by using the libFuzzer
  framework,  which should  further  improve  handling of  invalid
  fonts.  Thanks again to Kostya Serebryany and Bungeman!

- `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES',  a   new  configuration
  option, controls the maximum number of executed opcodes within a
  bytecode program.  You don't want to change this except for very
  special  situations (e.g.,  making a  library fuzzer  spend less
  time to handle broken fonts).

- The smooth renderer has been made faster.

- The `ftstring' demo program now supports subpixel rendering; use
  key `l' to cycle through the LCD modes.

- The `ftstring'  demo program now supports  color rendering;  use
  the `space' key to cycle through various color combinations.

- The graphical demo programs now use a default gamma value of 1.8
  (instead of 1.2).

======================================================================

CHANGES BETWEEN 2.6 and 2.6.1 (2015-Oct-04)

I. IMPORTANT BUG FIXES

- It turned  out that for CFFs  only the advance widths  should be
  taken from the  `htmx' table, not the side  bearings.  This bug,
  introduced in  version 2.6.0, makes  it necessary to  upgrade if
  you are using  CFFs; otherwise, you get cropped  glyphs with GUI
  interfaces like GTK or Qt.

- Accessing Type 42 fonts returned  incorrect results if the glyph
  order of the embedded TrueType font differs from the glyph order
  of the Type 42 charstrings table.

II. IMPORTANT CHANGES

- The header  file layout  has been  changed (again),  moving  all
  header files except `ft2build.h' into a subdirectory tree.

  Doing so  reduces the  possibility of  header file  name clashes
  (e.g., FTGL's  `FTGlyph.h' with FreeType's `ftglyph.h')  on case
  insensitive file systems like Mac OS X or Windows.

  Applications  that  use  (a)  the  `freetype-config'  script  or
  FreeType's `freetype2.pc' file for pkg-config to get the include
  directory  for the  compiler,  and (b)  the  documented way  for
  header inclusion like

    #include <ft2build.h>
    #include FT_FREETYPE_H
    ...

  don't need any change to the source code.

- Simple access  to named instances  in GX variation fonts  is now
  available (in addition to the  previous method via FreeType's MM
  interface).   In  the `FT_Face'  structure,  bits  16-30 of  the
  `face_index' field hold the current named instance index for the
  given face  index, and bits  16-30 of `style_flags'  contain the
  number of  instances for  the given face  index.  `FT_Open_Face'
  and friends also understand the  extended bits of the face index
  parameter.

  You need to enable  TT_CONFIG_OPTION_GX_VAR_SUPPORT for this new
  feature.  Otherwise, bits  16-30 of the two fields  are zero (or
  are ignored).

- Lao script support has been added to the auto-hinter.

III. MISCELLANEOUS

- The auto-hinter's Arabic script support has been enhanced.

- Superscript-like and  subscript-like glyphs  as used  by various
  phonetic alphabets like the IPA  are now better supported by the
  auto-hinter.

- The TrueType bytecode interpreter now runs slightly faster.

- Improved support for builds with cmake.

- The  function  `FT_CeilFix'  now   always  rounds  towards  plus
  infinity.

- The  function  `FT_FloorFix'  now always  rounds  towards  minus
  infinity.

- A  new load  flag `FT_LOAD_COMPUTE_METRICS'  has been  added; it
  makes FreeType  ignore pre-computed  metrics, as needed  by font
  validating  or  font  editing  programs.  Right  now,  only  the
  TrueType  module supports  it  to ignore  data  from the  `hdmx'
  table.

- Another round of bug fixes  to better handle broken fonts, found
  by Kostya Serebryany <kcc@google.com>.

======================================================================

CHANGES BETWEEN 2.5.5 and 2.6 (2015-Jun-07)

I. IMPORTANT CHANGES

- Behdad  Esfahbod contributed  code  for improved  thread-safety,
  which results in the following model.

  * An `FT_Face' object can only be safely used from one thread at
    a time.

  * An `FT_Library'  object can  now be used  without modification
    from multiple threads at the same time.

  * `FT_Face' creation and destruction  with the same `FT_Library'
    object can only be done from one thread at a time.

  One can use a single  `FT_Library' object across threads as long
  as a mutex lock is used around `FT_New_Face' and `FT_Done_Face'.
  Any calls to `FT_Load_Glyph' and similar API are safe and do not
  need the lock  to be held as  long as the same  `FT_Face' is not
  used from multiple threads at the same time.

- Thai script support has been added to the auto-hinter.

- Arabic script support has been added to the auto-hinter.

- Following OpenType version 1.7,  advance widths and side bearing
  values in  CFFs (wrapped  in an SFNT  structure) are  now always
  taken from the `hmtx' table.

- Following OpenType  version 1.7, the  PostScript font name  of a
  CFF font (wrapped in an SFNT structure) is now always taken from
  the `name'  table.  This is  also true for  OpenType Collections
  (i.e., TTCs using  CFFs subfonts instead of TTFs),  where it may
  have a significant difference.

- Fonts natively hinted for  ClearType are now supported, properly
  handling selector index 3 of the INSTCTRL bytecode instruction.

- Major improvements to the GX TrueType variation font handling.

II. MISCELLANEOUS

- A new auto-hinter  property `warping' can switch on  and off the
  warping code  if this  experimental feature  is compiled  in (by
  defining  the AF_CONFIG_OPTION_USE_WARPER  configuration option;
  by default  this option is  now enabled but warping  is switched
  off).

  The AF_CONFIG_OPTION_USE_WARPER option itself is an old feature,
  available   since  2006.    Warping   only   works  in   `light'
  auto-hinting mode.   The idea of  the code is to  slightly scale
  and  shift a  glyph  along the  non-hinted  dimension (which  is
  usually the horizontal axis) so that as much of its segments are
  aligned  (more or  less) to  the grid.   To find  out a  glyph's
  optimal   scaling   and   shifting  value,   various   parameter
  combinations are tried and scored.

  See  file  `ftautoh.h' for  more;  the  demo programs  `ftdiff',
  `ftview', and `ftgrid' can toggle warping with key `w'.

- Some  fields  in  the  `FTC_ImageTypeRec'  structure  have  been
  changed from signed to unsigned  type, which better reflects the
  actual usage.  It is also an additional means to protect against
  malformed input.

  This  change doesn't  break  the ABI;  however,  it might  cause
  compiler warnings.

- Function `FT_Bitmap_New'  has been renamed  to `FT_Bitmap_Init',
  since  this name  better reflects  its  function.   For backward
  compatibility, the old function name is still available.

- Function   `FT_Get_X11_Font_Format'   has    been   renamed   to
  `FT_Get_Font_Format',  since  this   name  better  reflects  its
  function.  For backward compatibility,  the old function name is
  still available.

  Additionally, the header  file macro for this  function has been
  renamed to  `FT_FONT_FORMATS_H' (the old name  `FT_XFREE86_H' is
  retained for backward compatibility).

- Various improvements to the `ftgrid' demo program.

  . It  can  now  display  GX and  MM  fonts  while  interactively
    manipulating the axes (with keys F2, F3, and F4).

  . Anti-aliasing rendering  modes can now be  selected (with keys
    F5 and F6).

  . The display of point numbers can be toggled with key `D'.

- Various improvements to the `ftdump' demo program.

  . It now displays information on MM and GX variation axes.

  . New  command line option  `-u' makes  it output data  in utf-8
    encoding.

- The `ftmulti'  demo program can  now handle up  to six MM  or GX
  axes.

======================================================================

CHANGES BETWEEN 2.5.4 and 2.5.5 (2014-Dec-30)

I. IMPORTANT BUG FIXES

- Handling of  uncompressed PCF files works again (bug  introduced
  in version 2.5.4).

======================================================================

CHANGES BETWEEN 2.5.3 and 2.5.4 (2014-Dec-06)

I. IMPORTANT BUG FIXES

- A   variant  of   vulnerability  CVE-2014-2240   was  identified
  (cf.  https://savannah.nongnu.org/bugs/?43661) and  fixed in the
  new CFF driver.  All users should upgrade.

- The new auto-hinter code using HarfBuzz crashed for some invalid
  fonts.

- Many fixes to better protect against malformed input.

II. IMPORTANT CHANGES

- Full auto-hinter support of the Devanagari script.

- Experimental auto-hinter support of the Telugu script.

- CFF stem darkening behaviour can now be controlled at build time
  using the eight macros

    CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}    .

- Some fields in the `FT_Bitmap'  structure have been changed from
  signed to unsigned type, which better reflects the actual usage.
  It  is also  an additional  means to  protect against  malformed
  input.

  This  change doesn't  break  the ABI;  however,  it might  cause
  compiler warnings.

III. MISCELLANEOUS

- Improvements to  the auto-hinter's algorithm to  recognize stems
  and local extrema.

- Function `FT_Get_SubGlyph_Info' always returned an error even in
  case of success.

- Version  2.5.1 introduced  major bugs  in  the cjk  part of  the
  auto-hinter, which are now fixed.

- The  `FT_Sfnt_Tag'  enumeration  values  have  been  changed  to
  uppercase,  e.g.  `FT_SFNT_HEAD'.   The lowercase  variants  are
  deprecated.    This  is   for  orthogonality   with  all   other
  enumeration (and enumeration-like) values in FreeType.

- `cmake' now supports builds of FreeType as an OS X framework and
  for iOS.

- Improved project files for vc2010, introducing a property file.

- The  documentation generator  for  the API  reference  has  been
  updated to produce  better HTML code (with proper  CSS).  At the
  same time, the documentation got a better structure.

- The FT_LOAD_BITMAP_CROP flag is obsolete;  it is not used by any
  driver.

- The  TrueType  DELTAP[123]  bytecode instructions  now  work  in
  subpixel hinting  mode as described in  the ClearType whitepaper
  (i.e., for touched points in the non-subpixel direction).

- Many small improvements to the internal arithmetic routines.

======================================================================

CHANGES BETWEEN 2.5.2 and 2.5.3 (2014-Mar-06)

I. IMPORTANT BUG FIXES

- A vulnerability (CVE-2014-2240) was  identified and fixed in the
  new  CFF driver  (cf.  https://savannah.nongnu.org/bugs/?41697).
  All users should upgrade.

- More  bug  fixes related  to  correct  positioning of  composite
  glyphs.

- Many fixes to better protect against malformed input.

II. IMPORTANT CHANGES

- FreeType can now use the HarfBuzz library to greatly improve the
  auto-hinting of  fonts that  use OpenType features:  Many glyphs
  that are part  of such features but don't have  cmap entries are
  now handled  properly, for  example small caps  or superscripts.
  Define the configuration  macro FT_CONFIG_OPTION_USE_HARFBUZZ to
  activate HarfBuzz support.

  You need HarfBuzz version 0.9.19 or newer.

  Note that HarfBuzz depends on  FreeType; this currently causes a
  chicken-and-egg problem  that can be  solved as follows  in case
  HarfBuzz is not yet installed on your system.

    1. Compile  and  install  FreeType without  the  configuration
       macro FT_CONFIG_OPTION_USE_HARFBUZZ.

    2. Compile and install HarfBuzz.

    3. Define  macro  FT_CONFIG_OPTION_USE_HARFBUZZ, then  compile
       and install FreeType again.

  With FreeType's  `configure' script the procedure  boils down to
  configure, build, and install FreeType, then configure, compile,
  and  install  HarfBuzz,  then configure,  compile,  and  install
  FreeType again (after executing `make distclean').

- All  libraries FreeType  depends on  are now  checked using  the
  `pkg-config' configuration files  first, followed by alternative
  methods.

- The  new  value  `auto'  for the  various  `--with-XXX'  library
  options   (for   example   `--with-harfbuzz=auto')   makes   the
  `configure' script automatically link to the libraries it finds.
  This is now the default.

- In case FreeType's `configure' script  can't find a library, you
  can  pass environment  variables to  circumvent pkg-config,  and
  those variables  have been  harmonized as  a consequence  of the
  changes mentioned above:

    LIBZ           -> removed; use LIBZ_CFLAGS and LIBZ_LIBS
    LIBBZ2         -> removed; use BZIP2_CFLAGS and BZIP2_LIBS
    LIBPNG_LDFLAGS -> LIBPNG_LIBS

  `./configure --help' shows all available environment variables.

- The `freetype-config'  script now understands  option `--static'
  to emit static linking information.

======================================================================

CHANGES BETWEEN 2.5.1 and 2.5.2 (2013-Dec-08)

I. IMPORTANT BUG FIXES

- Improving the display of some broken TrueType fonts introduced a
  bug  that made  FreeType crash  on some  popular (but  not fully
  conformant) fonts like `ahronbd.ttf'.

- Another round of improvements to correct positioning and hinting
  of composite glyphs in TrueType fonts.

II. MISCELLANEOUS

- Version  2.5.1  introduced a  bug  in  handling embedded  bitmap
  strikes of  TrueType fonts,  causing garbage display  under some
  circumstances.

- The   `ftgrid'   demo   program    couldn't   be   compiled   in
  non-development builds.

======================================================================

CHANGES BETWEEN 2.5 and 2.5.1 (2013-Nov-25)

I. IMPORTANT BUG FIXES

- For  some WinFNT  files,  the last  glyph  wasn't displayed  but
  incorrectly marked as invalid.

- The vertical size of glyphs was  incorrectly set after a call to
  `FT_GlyphSlot_Embolden', resulting in clipped glyphs.

- Many fields of the `PCLT' table in SFNT based fonts (if accessed
  with `FT_Get_Sfnt_Table') were computed incorrectly.

- In TrueType fonts,  hinting of composite glyphs  could sometimes
  deliver  incorrect positions  of  components or  even  distorted
  shapes.

II. IMPORTANT CHANGES

- WOFF font format support has been added.

- The auto-hinter now supports Hebrew.  Greek and Cyrillic support
  has been improved.

- Support for the forthcoming `OS/2'  SFNT table version 5, as can
  be found e.g. in the `Sitka' font family for Windows 8.1.

- The header  file layout  has been changed.   After installation,
  all files are now located in `<prefix>/include/freetype2'.

  Applications  that  use   (a)  `freetype-config'  or  FreeType's
  `pkg-config' file to get the include directory for the compiler,
  and (b) the documented way for header inclusion like

    #include <ft2build.h>
    #include FT_FREETYPE_H
    ...

  don't need any change to the source code.

III. MISCELLANEOUS

- The stem  darkening feature  of the  new CFF  engine can  now be
  fine-tuned with the new `darkening-parameters' property.

- `ftgrid' has been updated to toggle various engines with the `H'
  key, similar to `ftview' and `ftdiff'.

- The functionality of `ttdebug' has been greatly enhanced.

  . It now displays twilight, storage, and control value data; key
    `T' shows the twilight point  table, key `S' the storage data,
    and key `C' the control value table.

  . Some  keys  have  been  reassigned  from  lowercase  to  their
    uppercase equivalents; for example `q'  to quit the program is
    now `Q'.

  . Key `f' finishes the current function.

  . Key `R' restarts the debugger.

  . Keys `b' and `p' set a breakpoint.

  . Key `B' provides a function call backtrace.

- Better support of ARMv7 and x86_64 processors.

- Apple's `sbix' color bitmap format is now supported.

- Improved   auto-hinter  rendering   for  many   TrueType  fonts,
  especially in the range 20-40ppem.

- A  new face  flag  `FT_FACE_FLAG_COLOR' has  been  added (to  be
  accessed with the macro `FT_HAS_COLOR').

- `FT_Gzip_Uncompress'   (modeled    after   zlib's   `uncompress'
  function)  has been  added; this  is a  by-product of  the newly
  added WOFF support.

- Support for  a build with  `cmake' has been contributed  by John
  Cary <cary@txcorp.com>.

- Support for x64  builds with Visual C++ has  been contributed by
  Kenneth Miller <kennethadammiller@yahoo.com>

- Manual pages for most demo programs have been added.

- The GETINFO bytecode instruction for TrueType fonts was buggy if
  used to retrieve subpixel hinting information.  It was necessary
  to set  selector bit 6  to get  results for selector  bits 7-10,
  which is wrong.

- Improved computation  of emulated vertical metrics  for TrueType
  fonts.

- Fixed horizontal start-up position of vertical phantom points in
  TrueType bytecode.

======================================================================

CHANGES BETWEEN 2.4.12 and 2.5 (2013-Jun-19)

I. IMPORTANT BUG FIXES

- The cache manager function `FTC_Manager_Reset'  didn't flush the
  cache.

II. IMPORTANT CHANGES

- Behdad Esfahbod  (on behalf  of Google) contributed  support for
  color embedded bitmaps (eg. color emoji).

  A  new  load  flag,  FT_LOAD_COLOR, makes  FreeType  load  color
  embedded-bitmaps, following this draft specification

    https://color-emoji.googlecode.com/git/specification/v1.html

  which defines two new SFNT  tables, `CBDT' and `CBLC' (named and
  modeled  after  `EBDT'  and `EBLC',  respectively).   The  color
  bitmaps  are  stored in  the  new  FT_PIXEL_MODE_BGRA format  to
  represent BGRA  pre-multiplied sRGB  images.  If PNG  support is
  available,  PNG color  images as  defined in  the same  proposed
  specification are supported also.

  Note that  color bitmaps  are converted  to grayscale  if client
  didn't ask for color.

- As  announced in  the  previous release,  the  old FreeType  CFF
  engine  is now  disabled by  default.  It  can be  conditionally
  compiled     by     defining     the     configuration     macro
  CFF_CONFIG_OPTION_OLD_ENGINE.

- As announced in the previous release,  all code related to macro
  FT_CONFIG_OPTION_OLD_INTERNALS  has been removed,  thus becoming
  obsolete.

III. MISCELLANEOUS

- The  property API  (`FT_Property_Get' and  `FT_Property_Set') is
  now declared as stable.

  The  exception,   however,  are  the   experimental  auto-hinter
  properties `glyph-to-script-map' and `fallback-script' which are
  subject to change in a forthcoming release.

- `ftview' has been updated to  support color embedded bitmaps; it
  can be toggled on and off  with key `c'.  The small cache toggle
  is now key `K'.

- It  is now  possible  to  control the  version  of the  TrueType
  hinting engine  using the new `interpreter-version'  property of
  the  `truetype' module:  Versions 35  and 38  (the default)  are
  supported,  which  roughly  corresponds to  disable  and  enable
  subpixel hinting support, respectively.

  In  both  `ftview'  and  `ftdiff',  switching  between  the  two
  versions  can be  done  with  key `H'.   In  the `ftbench'  demo
  program, command line option `-H'  has been extended to activate
  the non-default interpreter version.

- The `ttdebug' program has been further improved.  In particular,
  it accepts a new command line  option `-H' to select the hinting
  engine.

- `ftdump's verbose option has been renamed to `-V'.  For all demo
  programs, `-v' now shows version information.

- Another round of TrueType subpixel hinting fixes.

- The `apinames' tool can now create an import file for NetWare.

- 64bit compilation of the new CFF engine was buggy.

- Some fixes to improve robustness in memory-tight situations.

======================================================================

CHANGES BETWEEN 2.4.11 and 2.4.12 (2013-May-08)

- We have another CFF parsing and hinting engine!  Written by Dave
  Arnold <darnold@adobe.com>,  this work  has been  contributed by
  Adobe in  collaboration with Google.   It is vastly  superior to
  the old CFF engine, and it  will replace it in the next release.
  Right  now,  it  is  still  off by  default,  and  you  have  to
  explicitly select it using  the new `hinting-engine' property of
  the cff driver:

    ...
    #include FT_MODULE_H
    #include FT_CFF_DRIVER_H

    FT_Library  library;
    int         engine = FT_CFF_HINTING_ADOBE;


    ...
    FT_Property_Set( library, "cff", "hinting-engine", &engine );

  The code has  a (mature) beta status; we encourage  all users to
  test it and report any problems.

  In case you want to activate the new CFF engine unconditionally,
  apply this patch:

--- snip --- diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c index ebcf189..3f2ce6b 100644 --- a/src/cff/cffobjs.c +++ b/src/cff/cffobjs.c @@ -1056,7 +1056,7 @@

 /* set default property values */
  • driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
  • driver->hinting_engine = FT_CFF_HINTING_ADOBE; driver->no_stem_darkening = FALSE;

    return FT_Err_Ok; --- snip ---

    • The macro FT_CONFIG_OPTION_OLD_INTERNALS is no longer set by default. In the next release, we will completely remove the associated code. Please update your programs in case you are still using this macro.

II. MISCELLANEOUS

- The  (top-level)  `configure'  script   now  respects  the  MAKE
  environment variable  to specify a `make' binary.   For backward
  compatibility, GNUMAKE still overrides MAKE, though.

- The `ftview'  and `ftdiff'  demo programs have  been redesigned,
  showing  more options  permanently  on the  screen, among  other
  minor improvements.

- Using the `H'  key, it is now possible to  select the CFF engine
  in both `ftview' and `ftdiff'.

- The new command line option `-H' for `ftbench' selects the Adobe
  CFF engine.

- It is  now possible  to directly select  the LCD  rendering mode
  with the keys `A'-`F' in  `ftview'.  The key mapping for cycling
  through LCD modes  has been changed from `K' and  `L' to `k' and
  `l', and  toggling custom LCD  filtering is no longer  mapped to
  key `F' but to key `L'.

- In `ftdiff',  key `x' toggles  between layout modes:  Either use
  the  advance width  (this is  new and  now the  default) or  the
  bounding box information to determine line breaks.

- For all demo  tools, the new command line option  `-v' shows the
  version.

- For the demo tools with a GUI, the new command line options `-w'
  and `-h' select  the width and the height of  the output window,
  respectively.

- The `ttdebug' program was broken and has been reactivated.  Note
  that this program is not compiled by default.

======================================================================

CHANGES BETWEEN 2.4.10 and 2.4.11 (2012-Dec-20)

I. IMPORTANT BUG FIXES

- Some vulnerabilities in the  BDF implementation have been fixed.
  Users of this font format should upgrade.

II. IMPORTANT CHANGES

- Subpixel  hinting support  has been  contributed by  Infinality,
  based on Greg Hitchcock's whitepaper at

    https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx

  Originally, it was a separate patch available from

    https://web.archive.org/web/20150710073951/http://www.infinality.net:80/blog/

  and which has been integrated.

  Note that  ClearType support is not  completely implemented!  In
  particular,  full support  for the  options `compatible_widths',
  `symmetrical_smoothing,  and  `bgr'  (via the  GETINFO  bytecode
  instruction) is missing.

  Activation of  subpixel hinting  support can be  controlled with
  the `TT_CONFIG_OPTION_SUBPIXEL_HINTING' configuration option; it
  is switched off by default.  This feature is still experimental;
  we welcome test reports!

- Support for OpenType collections (OTC) has been added.

- Pure CFF fonts within an SFNT wrapper are now supported.

III. MISCELLANEOUS

- Minor rendering improvements to the auto-hinter.

- `FT_GlyphSlot_Oblique' now uses a shear angle of 12°.

- Experimental support  to handle `property modules',  for example
  to control the  behaviour of the auto-hinter.   The API consists
  of two new functions, `FT_Property_Set' and `FT_Property_Get'.

  The code is  still subject to change and should  not be used for
  production.

- The `ftdiff' demo program now supports UTF-8 encoded input files
  for option `-f'.

- Using keys `r' and `R', you can now adjust the stroker radius in
  the `ftview' demo program.

- Other, minor fixes and improvements.

======================================================================

CHANGES BETWEEN 2.4.9 and 2.4.10 (2012-Jun-15)

I. IMPORTANT BUG FIXES

- Incremental glyph loading as needed by ghostscript was broken.

II. MISCELLANEOUS

- A new  function `FT_Outline_EmboldenXY',  contributed by  Alexei
  Podtelezhnikov.

- In the `ftview' demo program, key `e' has been replaced with `x'
  and `y' to  embolden in  the horizontal and  vertical direction,
  respectively.

- The glyph  spacing computation  in `FT_GlyphSlot_Embolden'  (and
  similar code in `ftview') has been improved.

- Minor  improvements to  the TrueType  bytecode  interpreter  and
  glyph loader, the auto-hinter, and the B/W rasterizer.

======================================================================

CHANGES BETWEEN 2.4.8 and 2.4.9 (2012-Mar-08)

I. IMPORTANT BUG FIXES

- Another round of fixes to better handle invalid fonts.   Many of
  them are vulnerabilities  (see CVE-2012-1126 up to CVE-2012-1144
  and SA48320) so all users should upgrade.

II. MISCELLANEOUS

- The `ENCODING -1 <n>' format of BDF fonts is now supported.

- For BDF fonts,  support for the whole Unicode encoding range has
  been added.

- Better TTF support for x_ppem != y_ppem.

- `FT_Get_Advances' sometimes returned bogus values.

- The  demo  programs  no  longer  recognize  and  handle  default
  suffixes; you now have to always specify the complete font name.

- Better rendering and LCD mode cycling added to `ftview'.

======================================================================

CHANGES BETWEEN 2.4.7 and 2.4.8 (2011-Nov-14)

I. IMPORTANT BUG FIXES

- Some vulnerabilities in handling CID-keyed PostScript fonts have
  been fixed; see CVE-2011-3439.

II. MISCELLANEOUS

- Chris Liddell contributed a new API, `FT_Get_PS_Font_Value',  to
  retrieve most of the dictionary keys in Type 1 fonts.

======================================================================

CHANGES BETWEEN 2.4.6 and 2.4.7 (2011-Oct-18)

I. IMPORTANT BUG FIXES

- Some  vulnerabilities in handling Type 1 fonts  have been fixed;
  see CVE-2011-3256.

II. MISCELLANEOUS

- FreeType  now properly  handles ZapfDingbats  glyph names  while
  constructing a Unicode character map (for fonts which don't have
  one).

======================================================================

CHANGES BETWEEN 2.4.5 and 2.4.6 (2011-Jul-29)

I. IMPORTANT BUG FIXES

- For TrueType based fonts, the ascender and descender values were
  incorrect sometimes  (off by a pixel if the ppem value was not a
  multiple of 5).   Depending on the use you might now  experience
  a different  layout; the  change should  result in  better, more
  consistent line spacing.

- Fix CVE-2011-0226  which causes a  vulnerability while  handling
  Type 1 fonts.

- BDF fonts  containing  glyphs with negative values  for ENCODING
  were  incorrectly  rejected.  This  bug has  been introduced  in
  FreeType version 2.2.0.

- David Bevan contributed a major revision of the FreeType stroker
  code:

  . The behaviour of FT_STROKER_LINEJOIN_BEVEL has been corrected.

  . A new  line join style,  FT_STROKER_LINEJOIN_MITER_FIXED,  has
    been introduced to support PostScript and PDF miter joins.

  . FT_STROKER_LINEJOIN_MITER_VARIABLE  has been introduced  as an
    alias for FT_STROKER_LINEJOIN_MITER.

  . Various stroking glitches has been fixed.

II. MISCELLANEOUS

  - SFNT bitmap fonts which contain an outline glyph for `.notdef'
    only no longer set the FT_FACE_FLAG_SCALABLE flag.

======================================================================

CHANGES BETWEEN 2.4.4 and 2.4.5 (2011-Jun-25)

I. IMPORTANT BUG FIXES

- A rendering regression  for second-order Bézier curves  has been
  fixed, introduced in 2.4.3.

II. IMPORTANT CHANGES

- If autohinting  is not  explicitly disabled,  FreeType now  uses
  the autohinter if  a TrueType based font doesn't  contain native
  hints.

- The load flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  has been made
  redundant and  is simply ignored;  this means that FreeType  now
  ignores the global advance width value in TrueType fonts.

III. MISCELLANEOUS

- `FT_Sfnt_Table_Info' can now return the number of SFNT tables of
  a font.

- Support for PCF files compressed with bzip2 has been contributed
  by Joel  Klinghed.  To  make this  work, the  OS must  provide a
  bzip2 library.

- Bradley  Grainger  contributed  project  and  solution  files in
  Visual Studio 2010 format.

- Again some fixes to better handle broken fonts.

- Some improvements to the B/W rasterizer.

- Fixes to the cache module to improve robustness.

- Just  Fill Bugs contributed (experimental) code to compute  blue
  zones for CJK Ideographs, improving the alignment of  horizontal
  stems at the top or bottom edges.

- The `ftgrid' demo program  can now display  autohinter segments,
  to be toggled on and off with key `s'.

======================================================================

CHANGES BETWEEN 2.4.3 and 2.4.4 (2010-Nov-28)

I. IMPORTANT BUG FIXES

- UVS support (TrueType/OpenType cmap format 14) support is fixed.
  This regression has been introduced in version 2.4.0.

II. MISCELLANEOUS

- Detect tricky fonts (e.g. MingLiU)  by the lengths and checksums
  of Type42-persistent subtables (`cvt ', `fpgm', and `prep') when
  a TrueType font without family name is given.  The previous fix,
  introduced in 2.4.3,  was too rigorous,  causing many  subsetted
  fonts (mainly  from PDF files) displayed badly  because FreeType
  forced  rendering with  the TrueType bytecode engine  instead of
  the autohinter.

- Better support for 64bit platforms.

- More fixes to improve handling of broken fonts.

======================================================================

CHANGES BETWEEN 2.4.2 and 2.4.3 (2010-Oct-03)

I. IMPORTANT BUG FIXES

- Fix rendering of certain cubic, S-shaped arcs.   This regression
  has been introduced in version 2.4.0.

II. MISCELLANEOUS

- To  fix  the  above  mentioned  rendering  issue,  a  new spline
  flattening algorithm  has been  introduced which  speeds up both
  conic and cubic arcs.

- Handling of broken fonts has been further improved.

======================================================================

CHANGES BETWEEN 2.4.1 and 2.4.2 (2010-Aug-06)

I. IMPORTANT BUG FIXES

- A stack overflow in CFF Type2 CharStrings interpreter is fixed.

- Handling Type 42 font deallocation was broken; additionally, the
  library is now more robust against malformed Type 42 fonts.

II. MISCELLANEOUS

- Two new functions,  `FT_Reference_Library' (in FT_MODULE_H)  and
  `FT_Reference_Face'  (in  FT_FREETYPE_H),  have  been  added  to
  simplify life-cycle management.  A counter gets initialized to 1
  at the  time an  FT_Library (or  FT_Face) structure  is created.
  The  two  new   functions  increment  the  respective   counter.
  `FT_Done_Library' and `FT_Done_Face' then only destroy a library
  or face if the counter is 1, otherwise they simply decrement the
  counter.

======================================================================

CHANGES BETWEEN 2.4.0 and 2.4.1 (2010-Jul-18)

I. IMPORTANT CHANGES

- A serious bug in the  CFF font module prevented  display of many
  glyphs in CFF fonts like `MinionPro-Regular.otf'.

======================================================================

CHANGES BETWEEN 2.3.12 and 2.4.0 (2010-Jul-12)

I. IMPORTANT CHANGES

- Since May  2010, all  patents  regarding  the TrueType  bytecode
  interpreter have expired worldwide.  Consequently, we now define
  TT_CONFIG_OPTION_BYTECODE_INTERPRETER by  default (and  undefine
  TT_CONFIG_OPTION_UNPATENTED_HINTING).

- A new function `FT_Library_SetLcdFilterWeights' is available  to
  adjust the filter weights set by `FT_Library_SetLcdFilter'.

II. MISCELLANEOUS

- Thanks to many reports from Robert Święcki, FreeType's stability
  in handling broken or damaged fonts is much improved.

- Support  for LCD  filter  control has  been  added to  the  demo
  programs `ftdiff' and `ftview'.

======================================================================

CHANGES BETWEEN 2.3.11 and 2.3.12

I. IMPORTANT CHANGES

- For  `FT_Open_Face',  new  parameters  are  available  to ignore
  preferred family names: FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY and
  FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY.

II. MISCELLANEOUS

- Support  for  incremental  font  loading  (controlled  with  the
  FT_CONFIG_OPTION_INCREMENTAL macro) is now active by default.

- Better support for vertical metrics.

- Various minor bug fixes.

======================================================================

CHANGES BETWEEN 2.3.10 and 2.3.11

I. IMPORTANT BUG FIXES

- Version 2.3.10 broke PCF support.

======================================================================

CHANGES BETWEEN 2.3.10 and 2.3.9

I. IMPORTANT BUG FIXES

- If all  ASCII digits in a  font have the  same (unscaled) width,
  the autohinter respects this and won't change it.

- TrueType fonts  are now  rasterized correctly  if the horizontal
  and vertical resolution differ.

- Type 1 fonts are now handled with increased precision internally
  to avoid serious rounding issues if non-integral coordinates are
  encountered.

- Horizontally  condensed CFF  fonts (using the font  matrix) were
  rendered  incorrectly.   This  bug  has  been  introduced  after
  release 2.3.5.

II. IMPORTANT CHANGES

- Support for the SFNT cmap 13 table format (as defined by the new
  OpenType 1.6 specification) has been added.

- B/W rasterization  of well-hinted TrueType  fonts at small sizes
  has been greatly improved.

- Calculation  of  vertical  metrics in  OpenType  fonts has  been
  improved.

III. MISCELLANEOUS

- It  is now  possible to  change  the emboldening  factor in  the
  `ftview' demo program with keys `e' and `E'.

- It is  now possible  to change the  slant value in  the `ftview'
  demo program with keys `s' and `S'.

- The  5-levels  grayscale  mode of  the `ftraster'  module (which
  FreeType doesn't use by default) was broken since version 2.3.0.

- Compilation of the  `ftgrays' and `ftraster' modules  was broken
  in stand-alone mode.

- Various fixes for compilation on 64bit and 16bit architectures.

======================================================================

CHANGES BETWEEN 2.3.9 and 2.3.8

I. IMPORTANT BUG FIXES

- Very unfortunately, FreeType 2.3.8 contained a change that broke
  its  official ABI.  The  end result  is  that programs  compiled
  against previous versions of the library, but dynamically linked
  to  2.3.8 can  experience  memory corruption  if  they call  the
  `FT_Get_PS_Font_Info' function.

  We recommend all users to  upgrade to 2.3.9 as soon as possible,
  or to downgrade to a previous  release of the library if this is
  not an option.

  The  origin of the  bug is  that a  new field  was added  to the
  publicly  defined  `PS_FontInfoRec'  structure.   Unfortunately,
  objects of this  type can be stack or  heap allocated by callers
  of   `FT_Get_PS_Font_Info',  resulting   in   a  memory   buffer
  overwrite with its implementation in 2.3.8.

  If  you want to  know whether  your code  is vulnerable  to this
  issue,  simply  search  for  the  substrings  `PS_FontInfo'  and
  `PS_Font_Info' in your source code.  If none is found, your code
  is safe and is not affected.

  The FreeType team apologizes for the problem.

- The POSIX support  of MacOS resource-fork fonts  (Suitcase fonts
  and LaserWriter Type1 PostScript fonts) was broken in 2.3.8.  If
  FreeType2 is built without Carbon framework, these fonts are not
  handled correctly.  Version 2.3.7 didn't have this bug.

- `FT_Get_Advance' (and `FT_Get_Advances') returned bad values for
  almost all font formats except TrueType fonts.

- Fix a bug  in the SFNT  kerning table  loader/parser which could
  crash the engine if certain malformed tables were encountered.

- Composite SFNT bitmaps are now handled correctly.

II. IMPORTANT CHANGES

- The   new  functions   `FT_Get_CID_Is_Internally_CID_keyed'  and
  `FT_Get_CID_From_Glyph_Index'  can be  used to  access CID-keyed
  CFF fonts  via CID  values.  This code  has been  contributed by
  Michael Toftdal.

III. MISCELLANEOUS

- `FT_Outline_Get_InsideBorder'  returns   FT_STROKER_BORDER_RIGHT
  for empty outlines.  This was incorrectly documented.

- The `ftview' demo program now supports UTF-8 encoded strings.

======================================================================

CHANGES BETWEEN 2.3.8 and 2.3.7

I. IMPORTANT BUG FIXES

- CID-keyed fonts in an SFNT wrapper were not handled correctly.

- The smooth renderer produced truncated images (on the right) for
  outline parts with negative horizontal values.  Most fonts don't
  contain outlines left  to the y coordinate axis, but  the effect
  was very noticeable for outlines processed with FT_Glyph_Stroke,
  using thick strokes.

- `FT_Get_TrueType_Engine_Type'  returned a  wrong  value if  both
  configuration  macros  TT_CONFIG_OPTION_BYTECODE_INTERPRETER and
  TT_CONFIG_OPTION_UNPATENTED_HINTING were defined.

- The  `face_index'  field  in   the  `FT_Face'  structure  wasn't
  initialized properly after calling FT_Open_Face and friends with
  a positive face index for CFFs,  WinFNTs, and, most importantly,
  for TrueType Collections (TTCs).

II. IMPORTANT CHANGES

- Rudimentary support for Type 1  fonts and CID-keyed Type 1 fonts
  in an SFNT wrapper has been  added -- such fonts are used on the
  Mac.  The core  SFNT tables `TYP1' and `CID '  are passed to the
  PS Type 1  and CID-keyed PS font drivers;  other tables (`ALMX',
  `BBOX', etc.) are not supported yet.

- A  new interface  to extract  advance values  of glyphs  without
  loading their outlines has been added.  The functions are called
  `FT_Get_Advance' and `FT_Get_Advances'; they are defined in file
  `ftadvanc.h' (to be accessed as FT_ADVANCES_H).

- A new function `FT_Get_FSType_Flags' (in FT_FREETYPE_H) has been
  contributed  by   David  Bevan  to  access   the  embedding  and
  subsetting restriction information of fonts.

III. MISCELLANEOUS

- FT_MulFix is now an inlined function; by default, assembler code
  is provided for x86 and ARM.  See FT_CONFIG_OPTION_INLINE_MULFIX
  and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more.

- The handling of `tricky' fonts  (that is, fonts which don't work
  with the  autohinter, needing the font  format's hinting engine)
  has been generalized and changed slightly:

  . A new  face flag  FT_FACE_FLAG_TRICKY indicates that  the font
    format's  hinting engine is  necessary for  correct rendering.
    The macro FT_IS_TRICKY can be used to check this flag.

  . FT_LOAD_NO_HINTING is now ignored for tricky fonts.  To really
    force  raw  loading  of  such fonts  (without  hinting),  both
    FT_LOAD_NO_HINTING  and FT_LOAD_NO_AUTOHINT  must  be used  --
    this is something which you probably never want to do.

  . Tricky  TrueType fonts  always use  the  bytecode interpreter,
    either the patented or unpatented version.

- The  function  `FT_GlyphSlot_Own_Bitmap'  has  been  moved  from
  FT_SYNTHESIS_H to FT_BITMAP_H; it  is now part of the `official'
  API.   (The functions  in  FT_SYNTHESIS_H are  still subject  to
  change, however.)

- In the  `ftdiff'  demo  program you  can now  toggle the  use of
  FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH with key `a'.

======================================================================

CHANGES BETWEEN 2.3.7 and 2.3.6

I. IMPORTANT BUG FIXES

- If the library  was compiled on an i386  platform using gcc, and
  compiler  option -O3 was  given, `FT_MulFix'  sometimes returned
  incorrect  results   which  could  have   caused  problems  with
  `FT_Request_Metrics'   and  `FT_Select_Metrics',   returning  an
  incorrect descender size.

- Pure CFFs without  subfonts were scaled incorrectly  if the font
  matrix  was  non-standard.  This  bug  has  been  introduced  in
  version 2.3.6.

- The  `style_name'  field  in  the  `FT_FaceRec'  structure often
  contained  a wrong  value for  Type 1  fonts.  This misbehaviour
  has been  introduced  in  version  2.3.6  while  trying  to  fix
  another   problem.   [Note,  however,   that   this   value   is
  informative only  since  the  used  algorithm to  extract  it is
  very simplistic.]

II. IMPORTANT CHANGES

- Two      new      macros,      FT_OUTLINE_SMART_DROPOUTS     and
  FT_OUTLINE_EXCLUDE_STUBS,  have been introduced.   Together with
  FT_OUTLINE_IGNORE_DROPOUTS (which  was ignored previously) it is
  now possible to control the dropout mode  of the `raster' module
  (for B&W rasterization),   using  the   `flags'  field   in  the
  `FT_Outline' structure.

- The TrueType bytecode interpreter now passes the dropout mode to
  the B&W rasterizer.  This greatly increases the output for small
  ppem values of many fonts like `pala.ttf'.

======================================================================

CHANGES BETWEEN 2.3.6 and 2.3.5

I. IMPORTANT BUG FIXES

- A  bunch of  potential security  problems have  been found.  All
  users should update.

- Microsoft  Unicode  cmaps  in  TrueType  fonts  are  now  always
  preferred over Apple cmaps.  This is not a bug per se, but there
  exist some buggy  fonts created for MS which  have broken  Apple
  cmaps.  This affects  only the automatic  selection of FreeType;
  it's always possible to manually select an Apple Unicode cmap if
  desired.

- Many bug fixes to the TrueType bytecode interpreter.

- Improved Mac support.

- Subsetted CID-keyed CFFs are now supported correctly.

- CID-keyed CFFs with subfonts which are scaled in a  non-standard
  way are now handled correctly.

- A call to FT_Open_Face with `face_index' < 0 crashed FreeType if
  the font was a Windows (bitmap) FNT/FON.

II. IMPORTANT CHANGES

- The new function `FT_Get_CID_Registry_Ordering_Supplement' gives
  access to  those fields in a CID-keyed font.  The code  has been
  contributed by Derek Clegg.

- George Williams  contributed  code  to validate  the new  `MATH'
  OpenType  table (within  the `otvalid'  module).  The  `ftvalid'
  demo program has been extended accordingly.

- An API for cmap 14 support  (for Unicode Variant Selectors, UVS)
  has been contributed by George Williams.

- A new face flag FT_FACE_FLAG_CID_KEYED has been added,  together
  with a macro FT_IS_CID_KEYED which evaluates to 1 if the font is
  CID-keyed.

III. MISCELLANEOUS

- Build support for symbian has been contributed.

- Better WGL4 glyph name support, contributed by Sergey Tolstov.

- Debugging output of the  various FT_TRACEX macros is now sent to
  stderr.

- The `ftview' demo program now provides artificial slanting too.

- The `ftvalid' demo  program has a new  option `-f' to select the
  font index.

======================================================================

CHANGES BETWEEN 2.3.5 and 2.3.4

I. IMPORTANT BUG FIXES

- Some subglyphs in TrueType fonts were handled incorrectly due to
  a missing graphics state reinitialization.

- Large .Z files  (as distributed with some X11  packages) weren't
  handled correctly, making FreeType increase the heap stack in an
  endless loop.

- A large  number of  bugs have  been fixed  to avoid  crashes and
  endless loops with invalid fonts.

II. IMPORTANT CHANGES

- The  two new  cache functions  `FTC_ImageCache_LookupScaler' and
  `FTC_SBit_Cache_LookupScaler' have been added to allow lookup of
  glyphs using an  `FTC_Scaler' object;  this makes it possible to
  use fractional pixel sizes in the cache.  The demo programs have
  been updated accordingly to use this feature.

- A new API  `FT_Get_CMap_Format' has been added to  get the  cmap
  format  of a  TrueType font.   This  is useful  in handling  PDF
  files.  The code has been contributed by Derek Clegg.

- The  auto-hinter  now  produces  better  output  by  default for
  non-Latin scripts  like Indic.   This was done by  using the CJK
  hinting module  as the default instead of the Latin one.  Thanks
  to Rahul Bhalerao for this suggestion.

- A new API `FT_Face_CheckTrueTypePatents'  has been added to find
  out  whether  a  given  TrueType  font  uses  patented  bytecode
  instructions.   The  `ft2demos' bundle  contains a  new  program
  called `ftpatchk' which demonstrates its usage.

- A  new  API  `FT_Face_SetUnpatentedHinting'  has  been  added to
  enable or disable the unpatented hinter.

- Support for Windows FON files in PE format  has been contributed
  by Dmitry Timoshkov.

III. MISCELLANEOUS

- Vincent Richomme contributed Visual C++ project files for Pocket
  PCs.

======================================================================

CHANGES BETWEEN 2.3.4 and 2.3.3

I. IMPORTANT BUG FIXES

- A serious  bug  in  the  handling  of bitmap  fonts (and  bitmap
  strikes of outline fonts) has been introduced in 2.3.3.

======================================================================

CHANGES BETWEEN 2.3.3 and 2.3.2

I. IMPORTANT BUG FIXES

- Remove a serious regression in the TrueType bytecode interpreter
  that was introduced  in version 2.3.2.  Note that  this does not
  disable  the  improvements  introduced  to  the  interpreter  in
  version 2.3.2,  only some ill  cases that occurred  with certain
  fonts (though a few popular ones).

- The auto-hinter now  ignores single-point contours for computing
  blue zones.   This bug  created `wavy' baselines  when rendering
  text  with  various  fonts  that  use these  contours  to  model
  mark-attach points  (these are points that  are never rasterized
  and are placed outside of the glyph's real outline).

- The `rsb_delta' and `lsb_delta' glyph slot fields are now set to
  zero for mono-spaced fonts.  Otherwise code that uses them would
  essentially ruin the fixed-advance property.

- Fix  CVE-2007-1351 which  can  cause an  integer overflow  while
  parsing  BDF fonts,  leading to  a potentially  exploitable heap
  overflow condition.

II. MISCELLANEOUS

- Fixed compilation issues on some 64-bit platforms (see ChangeLog
  for details).

- A new demo  program `ftdiff' has been added  to compare TrueType
  hinting, FreeType's auto  hinting, and rendering without hinting
  in three columns.

======================================================================

CHANGES BETWEEN 2.3.2 and 2.3.1

I. IMPORTANT BUG FIXES

- FreeType  returned incorrect  kerning information  from TrueType
  fonts when the bytecode  interpreter was enabled.  This happened
  due to a typo introduced in version 2.3.0.

- Negative  kerning  values  from   PFM  files  are  now  reported
  correctly  (they were read  as 16-bit  unsigned values  from the
  file).

- Fixed  a small  memory leak  when `FT_Init_FreeType'  failed for
  some reason.

- The Postscript hinter placed and sized very thin and ghost stems
  incorrectly.

- The TrueType bytecode  interpreter has been fixed to  get rid of
  most of the  rare differences seen in comparison  to the Windows
  font loader.

II. IMPORTANT CHANGES

- The auto-hinter  now better deals  with serifs and  corner cases
  (e.g.,  glyph '9'  in Arial  at 9pt,  96dpi).  It  also improves
  spacing  adjustments and doesn't  change widths  for non-spacing
  glyphs.

- Many   Mac-specific   functions   are  deprecated   (but   still
  available);  modern replacements  have been  provided  for them.
  See the documentation in file `ftmac.h'.

======================================================================

CHANGES BETWEEN 2.3.1 and 2.3.0

I. IMPORTANT BUG FIXES

- The TrueType interpreter sometimes returned incorrect horizontal
  metrics due to a bug in the handling of the SHZ instruction.

- A typo  in  a  security  check  introduced  after  version 2.2.1
  prevented FreeType to render some glyphs in CFF fonts.

======================================================================

CHANGES BETWEEN 2.3.0 and 2.2.1

I. IMPORTANT BUG FIXES

- The  PCF font  loader  is  now much  more  robust while  loading
  malformed font files.

- Various memory leaks have been found and fixed.

- The TrueType name loader now deals properly with some fonts that
  encode their  names in UTF-16 (the specification  was vague, and
  the code incorrectly assumed UCS-4).

- Fixed the TrueType bytecode  loader to deal properly with subtle
  monochrome/gray  issues  when   scaling  the  CVT.   Some  fonts
  exhibited bad rendering artifacts otherwise.

- `FT_GlyphSlot_Embolden' now  supports vertical layouts correctly
  (it mangled the vertical advance height).

- Fixed byte  endian issues  of `ftmac.c' to  support Mac OS  X on
  i386.

- The  PFR  font loader  no  longer  erroneously  tags font  files
  without any outlines as FT_FACE_FLAG_SCALABLE.

II. NEW API FUNCTIONS

- `FT_Library_SetLcdFilter' allows you  to select a special filter
  to be  applied to the bitmaps generated  by `FT_Render_Glyph' if
  one of the FT_RENDER_MODE_LCD and FT_RENDER_MODE_LCD_V modes has
  been  selected.  This filter  is used  to reduce  color fringes;
  several  settings are  available  through the  FT_LCD_FILTER_XXX
  enumeration.

  Its  declaration   and  documentation  can  be   found  in  file
  `include/freetype/ftlcdfil.h'   (to  be   accessed   with  macro
  FT_LCD_FILTER_H).

  *IMPORTANT*:     This      function     returns     an     error
  (FT_Err_Unimplemented_Feature) in default  builds of the library
  for patent reasons.  See below.

- `FT_Get_Gasp'  allows you  to query  the flags  of  the TrueType
  `gasp' table for  a given character pixel size.   This is useful
  to duplicate  the text rendering  of MS Windows when  the native
  bytecode  interpreter is  enabled (which  isn't the  default for
  other patent reasons).

  Its  declaration   and  documentation  can  be   found  in  file
  `include/freetype/ftgasp.h'   (to   be   accessed   with   macro
  FT_GASP_H).

III. IMPORTANT CHANGES

- The auto-hinter has been tuned a lot to improve its results with
  serif fonts, resulting in much better font rendering of many web
  pages.

- The unpatented  hinter is now part  of the default  build of the
  library; we  have added  code to automatically  support `tricky'
  fonts that need it.

  This means  that FreeType should `just work'  with certain Asian
  fonts, like  MingLiU, which cannot properly be  loaded without a
  bytecode interpreter,  but which fortunately  do not use  any of
  the patented  bytecode opcodes.  We detect these  fonts by name,
  so please  report any font file  that doesn't seem  to work with
  FreeType, and  we shall do what we  can to support it  in a next
  release.

  Note  that  the API  hasn't  changed,  so  you can  still  force
  unpatented hinting with a special parameter to `FT_Open_Face' as
  well.  This  might be useful in  same cases; for  example, a PDF
  reader might present  a user option to activate  it to deal with
  certain  `tricky'   embedded  fonts  which   cannot  be  clearly
  identified.

  If you are  a developer for embedded systems,  you might want to
  *disable*  the   feature  to  save  code   space  by  undefining
  TT_CONFIG_OPTION_UNPATENTED_HINTING in file `ftoption.h'.

- LCD-optimized rendering is now  *disabled* in all default builds
  of  the  library,  mainly   due  to  patent  issues.   For  more
  information see:

  https://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html

  A  new  configuration macro  FT_CONFIG_OPTION_SUBPIXEL_RENDERING
  has been introduced in  `ftoption.h'; manually define it in this
  file if you want to re-enable the feature.

  The  change only  affects the  implementation, not  the FreeType
  API.  This means that clients don't need to be modified, because
  the library still generates  LCD decimated bitmaps, but with the
  added constraint that R=G=B on each triplet.

  The  displayed result  should  be equal  to normal  anti-aliased
  rendering.

  Additionally,  if   FT_CONFIG_OPTION_SUBPIXEL_RENDERING  is  not
  defined, the new  `FT_Library_SetLcdFilter' function returns the
  FT_Err_Unimplemented_Feature error code.

- Some computation bugs in  the TrueType bytecode interpreter were
  found,  which  allow us  to  get rid  of  very  subtle and  rare
  differences we had experienced with the Windows renderer.

- It is now possible to cross-compile the library easily.  See the
  file `docs/INSTALL.CROSS' for details.

- The file `src/base/ftmac.c' now contains code for Mac OS X only;
  its  deprecated function  `FT_GetFile_From_Mac_Font_Name' always
  returns an  error even if the QuickDraw  framework is available.
  The previous version has been moved to `builds/mac/ftmac.c'.

  Selecting  configure option `--with-quickdraw-carbon'  makes the
  build process use the original `ftmac.c' file instead of the Mac
  OS X-only version.

IV. MISCELLANEOUS

- Various performance and memory footprint optimizations have been
  performed on  the TrueType and CFF font  loaders, sometimes with
  very drastic  benefits (e.g., the  TrueType loader is  now about
  25% faster;  FreeType should use  less heap memory  under nearly
  all conditions).

- The anti-aliased rasterizer has been optimized and is now 15% to
  25%  percent  faster than  in  previous  versions, depending  on
  content.

- The Type 1 loader has been improved; as an example, it now skips
  top-level dictionaries properly.

- Better support for Mac  fonts on POSIX systems, plus compilation
  fixes for Mac OS X on ppc64 where `ftmac.c' cannot be built.

- Configuration  without `--with-old-mac-fonts'  does  not include
  `ftmac.c' (this was the behaviour in FreeType version 2.1.10).

- The TrueTypeGX validator (gxvalid) checks the order of glyph IDs
  in the kern table.

======================================================================

CHANGES BETWEEN 2.2.1 and 2.2

I. IMPORTANT BUG FIXES

- Various integer overflows have been fixed.

- PFB fonts with MacOS resource fork weren't  handled correctly on
  non-MacOS platforms.

======================================================================

CHANGES BETWEEN 2.2 and 2.1.10

(not released officially)

I. IMPORTANT BUG FIXES

- Vertical metrics for SFNT fonts were incorrect sometimes.

- The FT_HAS_KERNING macro always returned 0.

- CFF OpenType  fonts didn't  return correct vertical  metrics for
  glyphs with outlines.

- If FreeType was compiled without hinters, all font formats based
  on PS outlines weren't scaled correctly.

II. IMPORTANT CHANGES

- Version 2.2 no longer exposes its internals, that is, the header
  files  located in  the `include/freetype/internal'  directory of
  the source package are not  copied anymore by the `make install'
  command.  Consequently, a number of rogue clients which directly
  access  FreeType's  internal   functions  and  structures  won't
  compile without modification.

  We provide  patches for  most of those  rogue clients.   See the
  following page for more information:

    https://www.freetype.org/freetype2/patches/rogue-patches.html

  Note that, as  a convenience to our Unix  desktop users, version
  2.2 is *binary* compatible with FreeType 2.1.7, which means that
  installing this  release on  an existing distribution  shall not
  break any working desktop.

- FreeType's build  mechanism has been redesigned.   With GNU make
  it  is  now  sufficient  in   most  cases  to  edit  two  files:
  `modules.cfg',  to  select   the  library  components,  and  the
  configuration  file  `include/freetype/config/ftoption.h' (which
  can be copied to the objects directory).  Removing unused module
  directories   to    prevent   its   compilation    and   editing
  `include/freetype/config/ftmodule.h' is no longer necessary.

- The  LIGHT  hinting algorithm  produces  more pleasant  results.
  Also, using the  FT_LOAD_TARGET_LIGHT flags within FT_Load_Glyph
  always forces auto-hinting, as a special exception.  This allows
  you to experiment with it  even if you have enabled the TrueType
  bytecode interpreter in your build.

- The auto hinter now employs a new algorithm for CJK fonts, based
  on Akito  Hirai's patch.   Note that this  only works  for fonts
  with a Unicode charmap at the moment.

- The following callback function  types have changed slightly (by
  adding the `const' keyword where appropriate):

    FT_Outline_MoveToFunc
    FT_Outline_LineToFunc
    FT_Outline_ConicToFunc
    FT_Outline_CubicToFunc
    FT_SpanFunc
    FT_Raster_RenderFunc

    FT_Glyph_TransformFunc
    FT_Renderer_RenderFunc
    FT_Renderer_TransformFunc

  Note that this doesn't affect binary backward compatibility.

- On MacOS,  new APIs have  been added as replacements  for legacy
  APIs:  `FT_New_Face_From_FSRef'  for  `FT_New_Face_From_FSSpec',
  and              `FT_GetFile_From_Mac_ATS_Name'              for
  `FT_GetFile_From_Mac_Name'.  Legacy APIs are still available, if
  FreeType is built without disabling them.

- A new  API `FT_Select_Size'  has been added  to select  a bitmap
  strike  by its  index.   Code using  other  functions to  select
  bitmap strikes should be updated to use this function.

- A  new API  `FT_Get_SubGlyph_Info'  has been  added to  retrieve
  subglyph data.  This can be  used by rogue clients which used to
  access the internal headers to get the corresponding data.

- In 2.1.10, the behaviour of `FT_Set_Pixel_Sizes' was changed for
  BDF/PCF fonts,  and only  for them.  This  causes inconsistency.
  In this release,  we undo the change.  The  intent of the change
  in 2.1.10  is to allow  size selection through  real dimensions,
  which can now be done through `FT_Request_Size'.

- Some security  issues were discovered  and fixed in the  CFF and
  Type  1 loader, causing  crashes of  FreeType by  malformed font
  files.

III. MISCELLANEOUS

- The documentation  for FT_LOAD_TARGET_XXX and FT_RENDER_MODE_XXX
  values now better reflects its usage and differences: One set is
  used to specify the hinting algorithm, the other to specify  the
  pixel rendering mode.

- `FT_New_Face' and `FT_New_Face_From_FSSpec' in ftmac.c have been
  changed to count supported scalable faces (sfnt, LWFN) only, and
  to  return the  number of  available faces  via face->num_faces.
  Unsupported bitmap faces (fbit, NFNT) are ignored.

- builds/unix/configure  has been  improved for  MacOS X.   It now
  automatically checks available  functions in Carbon library, and
  prepare to use newest  functions by default.  Options to specify
  the  dependencies of  each Carbon  APIs (FSSpec,  FSRef, old/new
  QuickDraw, ATS)  are available too.  By manual  disabling of all
  QuickDraw   functionality,  FreeType   can   be  built   without
  `deprecated   function'   warnings    on   MacOS   10.4.x,   but
  FT_GetFile_Mac_Name  in  ftmac.c  then  is changed  to  a  dummy
  function, and returns an `unimplemented' error.  For details see
  builds/mac/README.

- SFNT cmap handling has been  improved, mainly to run much faster
  with CJK fonts.

- A   new  function   `FT_Get_TrueType_Engine_Type   (declared  in
  `FT_MODULE_H')  is  provided  to  determine the  status  of  the
  TrueType   bytecode  interpreter   compiled  into   the  library
  (patented, unpatented, unimplemented).

- Vertical metrics of glyphs are  synthesized if the font does not
  provide such information.  You can tell whether  the metrics are
  synthesized or not by checking the FT_FACE_FLAG_VERTICAL flag of
  the face.

- The demo programs  `ftview' and  `ftstring' have been  rewritten
  for better readability.   `ftview' has a new switch `-p' to test
  FT_New_Memory_Face (instead of FT_New_Face).

- FreeType now honours bit 1 in the `head' table of TrueType fonts
  (meaning `left sidebearing point at x=0').  This helps with some
  buggy fonts.

- Rudimentary support for Adobe's new `SING Glyphlet' format.  See

    https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf

  for more information.

- The `ftdump'  program from the `ft2demos' bundle  now shows some
  information about charmaps.  It  also supports a new switch `-v'
  to increase verbosity.

- Better AFM support.  This includes track kerning support.

======================================================================

CHANGES BETWEEN 2.1.10 and 2.1.9

I. IMPORTANT BUG FIXES

- The size comparison for BDF and PCF files could fail sometimes.

- Some  CFF files  were still not  loaded  correctly.   Patch from
  Derek Noonburg.

- The stroker still had some serious bugs.

- Boris  Letocha  fixed a  bug in  the  TrueType interpreter:  The
  NPUSHW instruction wasn't skipped correctly in IF clauses.  Some
  fonts like `Helvetica 75 Bold' failed.

- Another  serious  bug  in  handling  TrueType hints  caused many
  distortions.  It has been introduced in version 2.1.8, and it is
  highly recommended to upgrade.

- FreeType didn't properly parse empty Type 1 glyphs.

- An unbound dynamic buffer growth was fixed in the PFR loader.

- Several bugs have been fixed in the cache sub-system.

- FreeType behaved incorrectly when resizing two distinct but very
  close character pixel sizes through `FT_Set_Char_Size' (Savannah
  bug #12263).

- The auto-hinter didn't work properly for fonts without a Unicode
  charmap -- it even refused to load the glyphs.

II. IMPORTANT CHANGES

- Many fixes have been applied to drastically reduce the amount of
  heap   memory   used   by   FreeType,   especially   when  using
  memory-mapped font files  (which is the default on Unix  systems
  which support them).

- The auto-hinter  has been replaced with a new module, called the
  `auto-fitter'.  It consumes  less memory  than its  predecessor,
  and it is  prepared to support non-latin scripts  better in next
  releases.

- George Williams  contributed code to read  kerning data from PFM
  files.

- FreeType   now   uses    the   TT_NAME_ID_PREFERRED_FAMILY   and
  TT_NAME_ID_PREFERRED_SUBFAMILY   strings   (if   available)  for
  setting  family  and  style in SFNT  fonts  (patch from Kornfeld
  Eliyahu Peter).

- A  new  API `FT_Sfnt_Table_Info'  (in FT_TRUETYPE_TABLES_H)  has
  been added to retrieve name and size information of SFNT tables.

- A new API `FT_OpenType_Validate' (in FT_OPENTYPE_VALIDATE_H) has
  been added to validate OpenType tables  (BASE, GDEF, GPOS, GSUB,
  JSTF).   After validation  it is  no longer  necessary to  check
  for errors in those tables while accessing them.

  Note that  this module might  be moved to another library in the
  future  to avoid  a tight  dependency between  FreeType and  the
  OpenType specification.

- A new API in FT_BITMAP_H  (`FT_Bitmap_New', `FT_Bitmap_Convert',
  `FT_Bitmap_Copy',  `FT_Bitmap_Embolden',  `FT_Bitmap_Done')  has
  been added.   Its  use is  to convert an  FT_Bitmap structure in
  1bpp, 2bpp,  4bpp, or 8bpp  format into  another 8bpp FT_Bitmap,
  probably using a different pitch, and to further manipulate it.

- A new  API `FT_Outline_Embolden'  (in FT_OUTLINE_H) gives  finer
  control how outlines are emboldened.

- `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H)  now handles bitmaps
  also (code contributed  by Chia I Wu).  Note that this  function
  is still experimental and may be replaced with a better API.

- The method  how BDF and PCF  bitmap fonts  are accessed has been
  refined.   Formerly,   FT_Set_Pixel_Sizes  and  FT_Set_Char_Size
  were  synonyms in  FreeType's  BDF and PCF interface.  This  has
  changed now.  FT_Set_Pixel_Sizes  should be  used to  select the
  actual  font dimensions  (the `strike',  which is the sum of the
  `FONT_ASCENT'    and    `FONT_DESCENT'    properties),     while
  FT_Set_Char_Size  selects  the  `nominal' size  (the `PIXELSIZE'
  property).  In both functions, the width parameter is ignored.

III. MISCELLANEOUS

- The BDF driver  no longer converts  all returned bitmaps  with a
  depth of 2bpp or 4bpp to a depth of 8bpp.  The documentation has
  not  mentioned  this  explicitly,  but  implementors  might have
  relied on this after looking into the source files.

- A new option `--ftversion' has been  added to freetype-config to
  return the FreeType version.

- The  memory  debugger  has  been  updated   to  dump  allocation
  statistics on  all allocation  sources in the library.   This is
  useful to  spot greedy  allocations when  loading and processing
  fonts.

- We removed a huge array of constant pointers to constant strings
  in the `psnames' module.   The problem was that  compilations in
  PIC mode (i.e.,  when generating a  Unix shared object/dll)  put
  the array  into the non-shared  writable section of  the library
  since absolute pointers are not relocatable by nature.

  This reduces the memory consumption by approximately 16KByte per
  process linked  to FreeType.   We now also store  the array in a
  compressed form (as a trie) which saves about 20KByte of code as
  well.

- Kirill  Smelkov provided  patches to make  src/raster/ftraster.c
  compile stand-alone again.

======================================================================

CHANGES BETWEEN 2.1.9 and 2.1.8

I. IMPORTANT BUG FIXES

- The function  `FT_Get_CharMap_Index' was only declared,  without
  any  real  code.   For  consistency,  it  has  been  renamed  to
  `FT_Get_Charmap_Index'.   (This function is needed  to implement
  cmap caches.)

- `FT_Outline_Get_BBox'  sometimes returned  incorrect values  for
  conic outlines (e.g., for TrueType fonts).

- Handling of `bhed' table has been fixed.

- The TrueType driver with enabled byte code interpreter sometimes
  returned artifacts due to incorrect rounding.  This bug has been
  introduced after version 2.1.4.

- The BDF driver dropped the last glyph in the font.

- The BDF driver now uses the DEFAULT_CHAR property (if available)
  to select a glyph shape for the undefined glyph.

- The stroker failed for closed outlines and single points.

II. IMPORTANT CHANGES

- George  Williams   contributed  code  to   handle  Apple's  font
  distortion technology found in GX fonts (`avar', `cvar', `fvar',
  and `gvar' tables;  the Multiple Masters  API has been  slightly
  extended to cope with the new functionality).

- The `FT_GlyphSlotRec' structure has been extended:  The elements
  `lsb_delta' and  `rsb_delta' give the difference  between hinted
  and  unhinted  left and right  side bearings  if autohinting  is
  active.  Using those values can improve the inter-letter spacing
  considerably.   See the documentation of  `FT_GlyphSlotRec'  and
  the `ftstring' demo program how to use it.

- Loading TrueType and Type 1 fonts has been made much faster.

- The stroker is  no longer experimental (but the  cache subsystem
  still is).

III. MISCELLANEOUS

- A new  documentation file  `formats.txt' describes various  font
  formats supported (and not supported) by FreeType.

======================================================================

CHANGES BETWEEN 2.1.8 and 2.1.7

I. IMPORTANT BUG FIXES

- The native  TrueType hinter contained some  bugs which prevented
  some fonts to be rendered correctly, most notably Legendum.otf.

- The PostScript hinter now produces improved results.

- The  linear advance  width  and height  values were  incorrectly
  rounded,  making  them virtually  unusable  if  not loaded  with
  FT_LOAD_LINEAR_DESIGN.

- Indexing CID-keyed CFF fonts is  now working: The glyph index is
  correctly  treated as a  CID, similar  to FreeType's  CID driver
  module.  Note that CID CMap support is still missing.

- The FT_FACE_FLAG_GLYPH_NAMES flag  is now  set correctly for all
  font formats.

- Some subsetted Type 1  fonts weren't parsed correctly.  This bug
  has been introduced in 2.1.7.  In summary, the Type 1 parser has
  become more robust.

- Non-decimal numbers weren't parsed correctly in PS fonts.

- The WinFNT driver now correctly reports FT_ENCODING_NONE for all
  but one encoding.  Use  the new FT_WinFNT_ID_XXX values together
  with `FT_Get_WinFNT_Header' to get the WinFNT charset ID.

- The descender metrics (face->size->metrics.descender) for WinFNT
  bitmap fonts had the wrong sign.

- The (emulated) `seac' support for CFF fonts was broken.

- The `flex' operator didn't work for CFF fonts.

- PS glyphs  which  use  the   `hintmask'  operator  haven't  been
  rendered correctly in some cases.

- Metrics for BDF and PCF bitmap font formats have been fixed.

- Autohinting  is now  disabled for  glyphs  which  are vertically
  distorted  or mirrored  (using a  transformation matrix).   This
  fixes a bug which produced zero-height glyphs.

- The   `freetype-config'   script   now  handles   --prefix   and
  --exec-prefix correctly; it also  returns the proper --rpath (or
  -R) value if FreeType has been built as a shared library.

II. IMPORTANT CHANGES

- Both  PCF  and BDF  drivers  now  handle  the SETWIDTH_NAME  and
  ADD_STYLE_NAME    properties.     Values    are   appended    to
  face->style_name; example: `Bold SemiCondensed'.

- The PCF driver now handles bitmap  fonts compressed with the LZW
  algorithm (extension .pcf.Z, compressed with `compress').

- A  new  API   function  `FT_Get_CMap_Language_ID'  (declared  in
  `tttables.h')  is  available  to   get  the  language  ID  of  a
  TrueType/SFNT cmap.

- The hexadecimal format of  data after the `StartData' command in
  CID-keyed Type 1 fonts is now supported.  While this can't occur
  in  file-based   fonts,  it  can   happen  in  document-embedded
  resources of PostScript documents.

- Embedded bitmaps in SFNT-based CFF fonts are now supported.

- A simple  API is  now available  to control  FreeType's  tracing
  mechanism if compiled  with FT_DEBUG_LEVEL_TRACE.   See the file
  `ftdebug.h' for more details.

- YAMATO Masatake contributed improved  handling of MacOS resource
  forks on non-MacOS platforms (for example, Linux can mount MacOS
  file systems).

- Support for MacOS has been improved; there is now a new function
  `FT_New_Face_From_FSSpec'  similar to `FT_New_Face'  except that
  it accepts an FSSpec instead of a path.

- The cache sub-system has been rewritten.

  - There is now support for deinstallation of faces.

  - A new  API function `FTC_Manager_RemoveFaceID'  has been added
    to  delete  all  `idle'  nodes  that  correspond  to  a  given
    FTC_FaceID.  All `locked' nodes  (i.e., those with a reference
    count > 0), will be modified to prevent them from appearing in
    further  lookups (they  will  be cleaned  normally when  their
    reference count reaches 0).

  - There  is  now  support  for point  scaling  (i.e.,  providing
    character sizes in points + dpis, instead of pixels).

  - Three abstract cache classes are now available:

      FTC_GCache:  Used to store  one glyph  item per  cache node,
                  with the ability to group common attributes into
                  `families'.      This    replaces     the    old
                  FTC_GlyphCache class.

      FTC_ICache: Used to store one FT_Glyph per cache node.  This
                  extends  FTC_GCache.  Family  definition, family
                  comparison, and  glyph loading are  however left
                  to sub-classes.

      FTC_SCache: Used to  store up to 16 small  bitmaps per cache
                  node.    This    extends   FTC_GCache.    Family
                  definition, family  comparison and glyph loading
                  are however left to sub-classes.

  - The file `src/cache/ftcbasic.c' implements:

      FTC_ImageCache: Extends    FTC_ICache;   implements   family
                      definitions and glyph loading similar to the
                      old API.

      FTC_SBitCache: Extends    FTC_SCache,    implements   family
                     definitions and glyph  loading similar to the
                     old API

    Client  applications  should  be  able to  extend  FTC_GCache,
    FTC_ICache, or FTC_SCache much more easily (i.e., less code to
    write, and  less callbacks).  For example,  one could envision
    caches  that are  capable of  storing  transformed (obliqued),
    stroked,   emboldened,   or   colored   glyph   images.    Use
    `ftcbasic.c' as an example.

  - All public  APIs are now  in `include/freetype/ftcache.h', (to
    be    accessed   as    `FT_CACHE_H').     The   contents    of
    `include/freetype/cache/' is only  needed by applications that
    wish to implement their own caches.

  - There were some major performance improvements through the use
    of  various programming  tricks.   Cache hits  are  up to  70%
    faster than in the old code.

  - The  FTC_CMapCache has  been simplified.  Charmaps can only be
    accessed by  index right now.  There  is also a  new API named
    `FT_Charmap_GetIndex' for this purpose.

  - The  demo programs  have been  updated to  the new  code.  The
    previous versions will not work with the current one.

  - Using  an invalid face  index in FT_Open_Face and friends  now
    causes an error even if the font contains a single face only.

III. MISCELLANEOUS

- Wolfgang Domröse contributed support files for building FreeType
  on the Atari using the PureC compiler.  Note that the Atari is a
  16bit platform.

- Vitaliy Pasternak contributed project files for VS.NET 2003.

======================================================================

CHANGES BETWEEN 2.1.7 and 2.1.6

I. IMPORTANT BUG FIXES

- Updated  to newest  libtool  version, fixing  build problems  on
  various platforms.

- On  Unix  platforms,  `make  install' didn't  copy  the  correct
  `ftconfig.h' file.

Note that version 2.1.7 contains the same library C source code as version 2.1.6.

======================================================================

CHANGES BETWEEN 2.1.6 and 2.1.5

I. IMPORTANT BUG FIXES

- The PFR  font driver didn't  load kerning tables  correctly, and
  the functions in FT_PFR_H didn't work at all.

- Type 1 font  files in  binary format  (PFB) with  an end-of-file
  indicator weren't accepted by the FreeType engine.

- Fonts which contain /PaintType  and /StrokeWidth no longer cause
  a segfault.  This bug has been introduced in version 2.1.5.

- Fonts  loaded  with   FT_LOAD_RENDER  no  longer  cause  strange
  results.  This bug has been introduced in version 2.1.5.

- Some  Windows   (bitmap)  FNT/FON  files   couldn't  be  handled
  correctly.

II. IMPORTANT CHANGES

- The internal  module API  has been heavily  changed in  favor of
  massive simplifications within the font engine.  This also means
  that authors of third-party modules must adapt their code to the
  new scheme.

  NOTE:  THE NEW SCHEME IS NOT COMPLETED YET.  PLEASE WAIT UNTIL A
  FINAL ANNOUNCEMENT!

- The PostScript  parser has been enhanced to  handle comments and
  strings   correctly.   Additionally,   more  syntax   forms  are
  recognized.

- Added the  optional unpatented hinting system  for TrueType.  It
  allows  typefaces which  need hinting  to produce  correct glyph
  forms (e.g., Chinese typefaces  from Dynalab) to work acceptably
  without infringing Apple patents.   This system is compiled only
  if  TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING  is  defined  in
  ftoption.h (activated by default).

III. MISCELLANEOUS

- There  is now  a guard  in the  public header  files  to protect
  against inclusion of freetype.h from FreeType 1.

- Direct inclusion of freetype.h  and other public header files no
  longer works.  You have to use the documented scheme

    #include <ft2build.h>
    #include FT_FREETYPE_H

  to load freetype.h with  a symbolic name.  This protects against
  renaming  of public  header  files (which  shouldn't happen  but
  actually  has, avoiding two  public header  files with  the same
  name).

======================================================================

CHANGES BETWEEN 2.1.5 and 2.1.4

I. IMPORTANT BUG FIXES

- Parsing the /CIDFontName field  now removes the leading slash to
  be in sync with other font drivers.

- gzip support was buggy.  Some fonts could not be read.

- Fonts which  have nested subglyphs  more than one level  deep no
  longer cause a segfault.

- Creation of synthetic  cmaps for fonts in CFF  format was broken
  partially.

- Numeric  font  dictionary entries  for  synthetic  fonts are  no
  longer overwritten.

- The font matrix  wasn't applied to the advance  width for Type1,
  CID, and  CFF fonts.  This caused problems  when loading certain
  synthetic Type 1 fonts like `Helvetica Narrow'.

- The test  for the charset registry  in BDF and PCF  fonts is now
  case-insensitive.

- FT_Vector_Rotate  sometimes  returned   strange  values  due  to
  rounding errors.

- The  PCF  driver  now  returns  the  correct  number  of  glyphs
  (including an artificial `notdef' glyph at index 0).

- FreeType now  supports buggy CMaps  which are contained  in many
  CJK fonts from Dynalab.

- Opening  an invalid  font  on a  Mac  caused a  segfault due  to
  double-freeing memory.

- BDF  fonts  with  more   than  32768  glyphs  weren't  supported
  properly.

II. IMPORTANT CHANGES

- Accessing bitmap font formats has been synchronized.  To do that
  the FT_Bitmap_Size  structure has  been extended to  contain new
  fields `size', `x_ppem', and `y_ppem'.

- The FNT driver now returns multiple faces, not multiple strikes.

- The `psnames'  module has been  updated to the Adobe  Glyph List
  version 2.0.

- The `psnames' module now understands `uXXXX[X[X]]' glyph names.

- The algorithm for guessing the font style has been improved.

- For fonts in SFNT format, root->height is no longer increased if
  the line gap  is zero.  There exist fonts  (containing e.g. form
  drawing  characters) which  intentionally have  a zero  line gap
  value.

- ft_glyph_bbox_xxx  flags   are  now  deprecated   in  favour  of
  FT_GLYPH_BBOX_XXX.

- ft_module_xxx   flags   are   now   deprecated  in   favour   of
  FT_MODULE_XXX.

- FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}      are     now
  deprecated               in               favour              of
  FT_ENCODING_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}  -- those encodings
  are not specific to Microsoft.

III. MISCELLANEOUS

- The  autohinter  has been  further  improved;  for example,  `m'
  glyphs now retain its vertical symmetry.

- Partial support of Mac fonts on non-Mac platforms.

- `make   refdoc'   (after   first   `make')   builds   the   HTML
  documentation.  You need Python for this.

- The make build system should  now work more reliably on DOS-like
  platforms.

- Support for  EMX gcc  and Watson C/C++  compilers on  MS-DOS has
  been added.

- Better VMS build support.

- Support for the pkg-config  package by providing a `freetype.pc'
  file.

- New configure option --with-old-mac-fonts for Darwin.

- Some source files have been  renamed (mainly to fit into the 8.3
  naming scheme).

======================================================================

CHANGES BETWEEN 2.1.4 and 2.1.3

I. IMPORTANT BUG FIXES

- Updated  to newest  libtool  version, fixing  build problems  on
  various platforms.

- A fix  in the Gzip stream  reader: It couldn't  read certain .gz
  files properly due to a  small typo.  In certain cases, FreeType
  could  also loop  endlessly  when trying  to  load tiny  gzipped
  files.

- The configure script now tries  to use the system-wide zlib when
  it  finds one  (instead of  the  copy found  in src/gzip).   And
  `freetype-config' has  been updated to return  relevant flags in
  this case when invoked with `--libs' (e.g. `-lzlib').

- Certain fonts couldn't be loaded  by 2.1.3 because they lacked a
  Unicode   charmap  (e.g.   SYMBOL.TTF).    FreeType  erroneously
  rejected them.

- The CFF loader was modified to accept fonts which only contain a
  subset of  their reference charset.  This  prevented the correct
  use of PDF-embedded fonts.

- The logic to detect Unicode charmaps has been modified.  This is
  required to  support fonts which include both  16-bit and 32-bit
  charmaps (like very  recent asian ones) using the  new 10 and 12
  SFNT formats.

- The TrueType  loader now limits  the depth of  composite glyphs.
  This is necessary to prevent broken fonts to break the engine by
  blowing the stack with recursive glyph definitions.

- The CMap cache is now  capable of managing UCS-4 character codes
  that   are   mapped   through   extended  charmaps   in   recent
  TrueType/OpenType fonts.

- The   cache  sub-system   now  properly   manages  out-of-memory
  conditions  instead of  blindly  reporting them  to the  caller.
  This means that it will try to empty the cache before restarting
  its allocations to see if that can help.

- The  PFR driver  didn't return  the list  of  available embedded
  bitmaps properly.

- There was  a nasty  memory leak when  using embedded  bitmaps in
  certain font formats.

II. IMPORTANT CHANGES

- David Chester  contributed some enhancements  to the auto-hinter
  that  significantly increase  the  quality of  its output.   The
  Postscript hinter was also improved in several ways.

- The FT_RENDER_MODE_LIGHT render mode was implemented.

- A new  API function called `FT_Get_BDF_Property'  has been added
  to FT_BDF_H to  retrieve BDF properties from BDF  _and_ PCF font
  files.   THIS  IS  STILL  EXPERIMENTAL,  since  it  hasn't  been
  properly tested yet.

- A Windows FNT specific API has been added, mostly to access font
  headers.  This is used by Wine.

- TrueType tables  without an `hmtx' table are  now tolerated when
  an  incremental interface  is  used.  This  happens for  certain
  Type42 fonts passed from Ghostscript to FreeType.

- The PFR font driver is  now capable of returning the font family
  and style  names when  they are available  (instead of  the sole
  `FontID').   This  is  performed  by parsing  an  *undocumented*
  portion of the font file!

III. MISCELLANEOUS

- The path stroker in FT_STROKER_H has entered beta stage.  It now
  works very  well, but  its interface might  change a bit  in the
  future.  More on this in later releases.

- The documentation for  FT_Size_Metrics didn't appear properly in
  the API reference.

- The file docs/VERSION.DLL has been updated to explain versioning
  with FreeType  (i.e., comparing release/libtool/so  numbers, and
  how to use them in autoconf scripts).

- The  installation  documentation  has been  seriously  revamped.
  Everything is now in the `docs' directory.

======================================================================

CHANGES BETWEEN 2.1.3 and 2.1.2

I. IMPORTANT BUG FIXES

- FT_Vector_Transform  had  been  incorrectly modified  in  2.1.2,
  resulting  in  incorrect   transformations  being  applied  (for
  example, rotations were processed in opposite angles).

- The format  8 and 12 TrueType charmap  enumeration routines have
  been fixed (FT_Get_Next_Char returned invalid values).

- The  PFR font driver  returned incorrect  advance widths  if the
  outline  and metrics resolution  defined in  the font  file were
  different.

- FT_Glyph_To_Bitmap now returns  successfully when called with an
  FT_BitmapGlyph argument (it previously returned an error).

- A bug  in the Type 1  loader that prevented  valid font bounding
  boxes to be loaded from multiple master fonts.

- The SFNT  validation code has been rewritten.   FreeType can now
  load `broken'  fonts that were  usable on Windows, but  not with
  previous versions of the library.

- The computation of bearings in the BDF driver has been fixed.

- The Postscript hinter crashed when trying to hint certain glyphs
  (more precisely,  when trying to  apply hints to an  empty glyph
  outline).

- The  TrueType glyph  loader  now supports  composites in  `Apple
  format'  (they differ slightly  from Microsoft/OpenType  ones in
  the way transformation offsets are computed).

- FreeType was  very slow at opening certain  asian CID/CFF fonts,
  due to  fixed increment  in dynamic array  re-allocations.  This
  has  been changed  to  exponential behaviour  to get  acceptable
  performance.

II. IMPORTANT CHANGES

- The PCF driver now supports gzip-compressed font files natively.
  This means that  you will be able to use  all these bitmap fonts
  that  come with  XFree86 with  FreeType (and  libXft/libXft2, by
  extension).

- The  automatic and  postscript hinters  have both  been updated.
  This  results in  a relatively  important increase  of rendering
  quality since  many nasty defaults have been suppressed.  Please
  visit the web page:

    https://www.freetype.org/hinting/smooth-hinting.html

  for additional details on this topic.

- The `load_flags' parameter of `FT_Load_Glyph' is now an FT_Int32
  (instead  of just  being  an FT_Int).   This  breaks source  and
  binary  compatibility for  16bit systems  only,  while retaining
  both of them for 32 and 64 bit ones.

  Some new flags have been added consequently:

    FT_LOAD_NO_AUTOHINT   :: Disable the use of the auto-hinter
                             (but not native format hinters).

    FT_LOAD_TARGET_NORMAL :: Hint and render for normal
                             anti-aliased displays.

    FT_LOAD_TARGET_MONO   :: Hint and render for 1-bit displays.

    FT_LOAD_TARGET_LCD    :: Hint and render for horizontal RGB or
                             BGR subpixel displays (like LCD
                             screens).  THIS IS STILL
                             EXPERIMENTAL!

    FT_LOAD_TARGET_LCD_V  :: Same as FT_LOAD_TARGET_LCD, for
                             vertical subpixel displays (like
                             rotated LCD screens).  THIS IS STILL
                             EXPERIMENTAL!

  FT_LOAD_MONOCHROME   is  still   supported,  but   only  affects
  rendering, not the hinting.

  Note that the `ftview'  demo program available in the `ft2demos'
  package  has been  updated to  support LCD-optimized  display on
  non-paletted displays (under Win32 and X11).

- The  PFR  driver  now  supports embedded  bitmaps  (all  formats
  supported), and returns correct kerning metrics for all glyphs.

- The TrueType charmap loader  now supports certain `broken' fonts
  that load under Windows without problems.

- The cache API has been slightly modified (it's still a beta!):

   - The type  FTC_ImageDesc has been removed; it  is now replaced
     by  FTC_ImageTypeRec.   Note that  one  of  its  fields is  a
     `load_flag' parameter for FT_Load_Glyph.

   - The  field  `num_grays' of  FT_SBitRec  has  been changed  to
     `max_grays'  in  order to  fit  within  a  single byte.   Its
     maximum value is thus 255 (instead of 256 as previously).

III. MISCELLANEOUS

- Added support  for the  DESTDIR variable during  `make install'.
  This simplifies packaging of FreeType.

- Included modified  copies of the  ZLib sources in  `src/gzip' in
  order to support  gzip-compressed PCF fonts.  We do  not use the
  system-provided  zlib  for  now,   though  this  is  a  probable
  enhancement for future releases.

- The DocMaker tool used to generate the on-line API reference has
  been   completely    rewritten.    It   is    now   located   in
  `src/tools/docmaker/docmaker.py'.  Features:

    - better cross-referenced output
    - more polished output
    - uses Python regular expressions  (though it didn't speed the
      program)
    - much  more  modular structure,  which  allows for  different
      `backends'  in  order to  generate  HTML,  XML, or  whatever
      format.

  One can regenerate the API reference by calling:

     python src/tools/docmaker/docmaker.py \
            --prefix=ft2 \
            --title=FreeType-2.1.3 \
            --output=<outputdirectory>
            include/freetype/*.h \
            include/freetype/config/*.h \
            include/freetype/cache/*.h

- A new, experimental, support for incremental font loading (i.e.,
  loading  of fonts  where the  glyphs are  not in  the  font file
  itself, but provided by an external component, like a Postscript
  interpreter) has been added by Graham Asher.  This is still work
  in progress, however.

- A new,  EXPERIMENTAL, path stroker  has been added.   It doesn't
  suffer  from  severe  rounding  errors  and  treat  bezier  arcs
  directly.  Still work in progress (i.e. not part of the official
  API).   See  the file  <freetype/ftstroker.h>  for  some of  the
  details.

- The massive  re-formatting of sources and  internal re-design is
  still under-way.  Many  internal functions, constants, and types
  have been renamed.

======================================================================

CHANGES BETWEEN 2.1.2 and 2.1.1

I. IMPORTANT BUG FIXES

- Many  font drivers didn't  select a  Unicode charmap  by default
  when a new face  was opened (with the FT_CONFIG_OPTION_USE_CMAPS
  options enabled),  causing many applications  to not be  able to
  display text correctly with the 2.1.x releases.

- The  PFR driver had  a bug  in its  composite loading  code that
  produces incorrectly placed accents with many fonts.

- The Type42 driver crashed sometimes due to a nasty bug.

- The Type 1 custom encoding  charmap didn't handle the case where
  the first glyph index wasn't 0.

- A  serious  typo  in  the  TrueType  composite  loader  produced
  incorrectly placed  glyphs in fonts  like `Wingdings' and  a few
  others.

II. MISCELLANEOUS

- The Win32  Visual C++ project  file has been updated  to include
  the PFR driver as well.

- `freetype.m4' is  now installed by default by  `make install' on
  Unix systems.

- The function  FT_Get_PS_Font_Info now works with  CID and Type42
  fonts as well.

======================================================================

CHANGES BETWEEN 2.1.1 and 2.1.0

I. IMPORTANT BUG FIXES

- The  `version_info'  returned   by  `freetype-config'  in  2.1.0
  returned an invalid value.  It now returns 9:1:3 (2.0.9 returned
  9:0:3).

- Version 2.1.0  couldn't be linked against  applications on Win32
  and  Amiga systems  due  to  a new  debug  function that  wasn't
  properly   propagated  to   the  system-specific   directory  in
  `builds'.

- Various MacOS and Mac OS X specific fixes.

- Fixed  a bug in  the TrueType  charmap validation  routines that
  made version  2.1.0 too restrictive  -- many popular  fonts have
  been rejected.

- There was  still a very small difference  between the monochrome
  glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the
  bytecode  interpreter enabled.   This was  caused by  an invalid
  flag setting in the TrueType glyph loader, making the rasterizer
  change  its  drop-out   control  mode.   Now  the results should
  _really_ be completely identical.

- The TrueType name table loader has been improved to support many
  popular  though buggy Asian  fonts.  It  now ignores  empty name
  entries,  invalid  pointer offsets  and  a  few other  incorrect
  subtleties.  Moreover,  name strings  are now loaded  on demand,
  which reduces the memory load  of many faces (e.g. the ARIAL.TTF
  font file contains a 10kByte name table with 70 names).

- Fixed a bug in the Postscript hinter that prevented family blues
  substitution to happen correctly.

II. NEW FEATURES

- Three new font drivers in this release:

  * A  BDF  font driver,  contributed  by  Franco Zappa  Nardelli,
    heavily  modified   by  Werner  Lemberg.    It  also  supports
    anti-aliased bitmaps (using a slightly extended BDF format).

  * A Type42  font driver, contributed by Roberto  Alameda.  It is
    still experimental but seems to work relatively well.

  * A PFR  font driver, contributed  by David Turner  himself.  It
    doesn't  support PFR  hinting --  note that  BitStream  has at
    least two patents on this format!

III. MISCELLANEOUS

- The  cache  sub-system has  been  optimized  in important  ways.
  Cache hits are now significantly faster.  For example, using the
  CMap cache is about  twice faster than calling FT_Get_Char_Index
  on most platforms.  Similarly, using an SBit cache is about five
  times faster  than loading the  bitmaps from a bitmap  file, and
  300 to  500 times  faster than generating  them from  a scalable
  format.

  Note that  you should recompile  your sources if you  designed a
  custom  cache  class for  the  FT2  Cache  subsystem, since  the
  changes performed are source, but not binary, compatible.

======================================================================

CHANGES BETWEEN 2.1.0 and 2.0.9

I. IMPORTANT BUG FIXES

- The  TrueType bytecode  interpreter  has been  fixed to  produce
  _exactly_ the same output as FreeType 1.x.  Previous differences
  were due  to slightly distinct  fixed-point computation routines
  used to perform dot products and vector length measurements.

  It seems  that native TrueType hinting  is _extremely_ sensitive
  to  rounding errors.  The  required vector  computation routines
  have been optimized and placed within the `ttinterp.c' file.

- Fixed the parsing of accelerator tables in the PCF font driver.

- Fixed the Type1 glyph loader  routine used to compute the font's
  maximum advance width.

II. NEW FEATURES

- The `configure' script used on Unix systems has been modified to
  check  that  GNU  Make  is  being used  to  build  the  library.
  Otherwise,  it  will display  a  message  proposing  to use  the
  GNUMAKE environment variable to name it.

  The Unix-specific file README.UNX has been modified accordingly.

III. MISCELLANEOUS

- The  FreeType  License in  `docs/FTL.TXT'  has  been updated  to
  include  a  proposed preferred  disclaimer.   If  you are  using
  FreeType in your products, you are encouraged (but not mandated)
  to use the following text in your documentation:

  """
    Portions of this software are copyright © 1996-2002 The
    FreeType Project (www.freetype.org).  All rights reserved.
  """

- The default size of the render pool has been reduced to 16kByte.
  This  shouldn't result  in any  noticeable  performance penalty,
  unless you are  using the engine as-is to  render very large and
  complex glyphs.

- The  FreeType 2  redesign has  begun.  More  information  can be
  found at this URL:

    https://www.freetype.org/freetype2/redesign.html

  The following  internal changes  have been performed  within the
  sources of this release:

    - Many   internal  types   have  been   renamed   to  increase
      consistency.   The  following  should  be true,  except  for
      public types:

        * All structure  types have a name ending  in `Rec' (short
          for `record').

        * A  pointer-to-structure type  has the  same name  as the
          structure, _without_ the `Rec' suffix.

          Example:

            typedef struct FooRec_
            {
              ...

            } FooRec, *Foo;

    - Many   internal  macros  have   been  renamed   to  increase
      consistency.  The following should be true:

        * All  macros  have a  name  beginning  with `FT_'.   This
          required a few changes like

            ALLOC   => FT_ALLOC
            FREE    => FT_FREE
            REALLOC => FT_REALLOC

        * All  macros are completely  UPPERCASE.  This  required a
          few changes like:

            READ_Short  => FT_READ_SHORT
            NEXT_Short  => FT_NEXT_SHORT
            GET_ULongLE => FT_GET_ULONG_LE
            MEM_Set     => FT_MEM_SET
            MEM_Copy    => FT_MEM_COPY
            etc.

        * Whenever   possible,   all   macro  names   follow   the
          FT_<OBJECT>_<METHOD> pattern.  For example

            ACCESS_Frame   => FT_FRAME_ENTER
            FORGET_Frame   => FT_FRAME_EXIT
            EXTRACT_Frame  => FT_FRAME_EXTRACT
            RELEASE_Frame  => FT_FRAME_RELEASE

            FILE_Pos       => FT_STREAM_POS
            FILE_Seek      => FT_STREAM_SEEK
            FILE_Read      => FT_STREAM_READ
            FILE_ReadAt    => FT_STREAM_READ_AT
            READ_Fields    => FT_STREAM_READ_FIELDS

    - Many  internal functions  have  been renamed  to follow  the
      FT_<Object>_<Method> pattern.  For example:

        FT_Seek_Stream       => FT_Stream_Seek
        FT_Read_Stream_At    => FT_Stream_ReadAt
        FT_Done_Stream       => FT_Stream_Close
        FT_New_Stream        => FT_Stream_Open
        FT_New_Memory_Stream => FT_Stream_OpenMemory
        FT_Extract_Frame     => FT_Stream_ExtractFrame

      Note that method names do not contain `_'.

    - The FT_ALLOC_ARRAY  and FT_REALLOC_ARRAY have  been replaced
      with  FT_NEW_ARRAY and  FT_RENEW_ARRAY which  do not  take a
      type  as the  fourth argument.   Instead, the  array element
      type  size is computed  automatically from  the type  of the
      target pointer used.

    - A  new object  class, FT_CMap,  has been  introduced.  These
      internal  objects are  used to  model character  maps.  This
      eases  the support  of additional  charmap types  within the
      engine.

    - A new  configuration file named `ftstdlib.h'  has been added
      to `include/freetype/config'.  It  is used to define aliases
      for  _every_ routine  of the  ISO  C library  that the  font
      engine   uses.    Each    aliases   has   a   `ft_'   prefix
      (e.g. `ft_strlen' is an alias for `strlen').

      This is  used to  ease the porting  of FreeType 2  to exotic
      runtime environments where the ISO C Library isn't available
      (e.g.  XFree86 extension modules).

  More details are available in the `ChangeLog' file.

======================================================================

CHANGES BETWEEN 2.0.9 and 2.0.8

I. IMPORTANT BUG FIXES

- Certain fonts like `foxjump.ttf' contain broken name tables with
  invalid entries and wild offsets.  This caused FreeType to crash
  when trying to load them.

  The  SFNT `name'  table  loader has  been  fixed to  be able  to
  support these strange fonts.

  Moreover, the code  in charge of processing this  table has been
  changed  to always favour  Windows-formatted entries  over other
  ones.  Hence,  a font that works  on Windows but not  on the Mac
  will  load cleanly in  FreeType and  report accurate  values for
  Family & PostScript names.

- The CID font driver has been fixed.  It unfortunately returned a
  Postscript   Font   name   with   a   leading   slash,   as   in
  `/MunhwaGothic-Regular'.

- FreeType  2 should now  compile fine  on AIX  4.3.3 as  a shared
  library.

- A  bug  in the  Postscript  hinter  has  been found  and  fixed,
  removing un-even stem widths at small pixel sizes (like 14-17).

  This  improves the  quality of  a certain  number  of Postscript
  fonts.

II. NEW FEATURES

- A  new function  named  `FT_Library_Version' has  been added  to
  return  the current  library's major,  minor, and  patch version
  numbers.   This is  important since  the  macros FREETYPE_MAJOR,
  FREETYPE_MINOR,  and  FREETYPE_PATCH  cannot  be used  when  the
  library is dynamically linked by a program.

- Two   new  APIs   have  been   added:   `FT_Get_First_Char'  and
  `FT_Get_Next_Char'.

  Together,  these can  be used  to iterate  efficiently  over the
  currently  selected  charmap of  a  given  face.   Read the  API
  reference for more details.

III. MISCELLANEOUS

- The FreeType sources are  under heavy internal re-factoring.  As
  a consequence,  we have created  a branch named `STABLE'  on the
  CVS to hold all future releases/fixes in the 2.0.x family.

  The  HEAD  branch  now  contains  the  re-factored  sources  and
  shouldn't  be used for  testing or  packaging new  releases.  In
  case you  would like  to access the  2.0.9 sources from  our CVS
  repository, use the tag `VER-2-0-9'.

======================================================================

CHANGES BETWEEN 2.0.8 and 2.0.7

I. IMPORTANT BUG FIXES

- There was  a small but  nasty bug in  `freetype-config.in' which
  caused the `freetype-config' script to fail on Unix.

  This didn't prevent the installation  of the library or even its
  execution, but caused problems  when trying to compile many Unix
  packages that depend on it.

- Some TrueType or OpenType fonts embedded in PDF documents do not
  have  a  'cmap',  'post'  and  'name'  as  is  required  by  the
  specification.  FreeType no longer refuses to load such fonts.

- Various fixes to the PCF font driver.

======================================================================

CHANGES BETWEEN 2.0.7 and 2.0.6

I. IMPORTANT BUG FIXES

- Fixed  two  bugs in  the  Type 1  font  driver.   The first  one
  resulted in a memory leak in subtle cases.  The other one caused
  FreeType to crash when  trying to load `.gsf' files (Ghostscript
  so-called Postscript fonts).

  (This  made _many_  KDE applications  crash on  certain systems.
   FreeType _is_ becoming a critical system component on Linux :-)

- Fixed a memory leak in the CFF font driver.

- Fixed a memory leak in the PCF font driver.

- Fixed       the        Visual       C++       project       file
  `builds/win32/visualc/freetype.dsp' since  it didn't include the
  Postscript hinter component, causing errors at build time.

- Fixed a  small rendering bug  in the anti-aliased  renderer that
  only  occurred when  trying to  draw  thin (less  than 1  pixel)
  strokes.

- Fixed  `builds/unix/freetype2.a4' which  is used  to  generate a
  valid `freetype2.m4' for use with autoconf.

- Fixed the OpenVMS Makefiles.

II. MISCELLANEOUS

- Added  `configure'  and   `install'  scripts  to  the  top-level
  directory.  A GNU-style installation is thus now easily possible
  with

    ./configure  <options>
    make
    make install

======================================================================

CHANGES BETWEEN 2.0.6 and 2.0.5

I. IMPORTANT BUG FIXES

- It wasn't possible to load embedded bitmaps when the auto-hinter
  was used.  This is now fixed.

- The TrueType  font driver  didn't load some  composites properly
  (the  sub-glyphs  were  slightly  shifted,  and  this  was  only
  noticeable when using monochrome rendering).

- Various  fixes  to the  auto-hinter.   They  merely improve  the
  output of sans-serif fonts.   Note that there are still problems
  with serifed fonts and composites (accented characters).

- All scalable  font drivers erroneously  returned un-fitted glyph
  advances when hinting was  requested.  This created problems for
  a number  of layout applications.  This  is a very  old bug that
  got  undetected mainly  because most  test/demo  program perform
  rounding explicitly or implicitly (through the cache).

- `FT_Glyph_To_Bitmap' did erroneously  modify the source glyph in
  certain cases.

- `glnames.py'  still contained  a bug  that made  FreeType return
  invalid names for certain glyphs.

- The  library crashed  when  loading certain  Type  1 fonts  like
  `sadn.pfb'  (`Stalingrad  Normal'),   which  appear  to  contain
  pathetic font info dictionaries.

- The TrueType glyph  loader is now much more  paranoid and checks
  everything when loading a given glyph image.  This was necessary
  to avoid problems (crashes and/or memory overwrites) with broken
  fonts that came from a really buggy automatic font converter.

II. IMPORTANT UPDATES AND NEW FEATURES

- Important updates to the Mac-specific parts of the library.

- The caching sub-system has  been completely re-designed, and its
  API has  evolved (the  old one is  still supported  for backward
  compatibility).

  The documentation for it is  not yet completed, sorry.  For now,
  you are encouraged to continue  using the old API.  However, the
  ftview  demo program in  the ft2demos  package has  already been
  updated to use the new caching functions.

- A new charmap cache is provided too.  See `FTC_CMapCache'.  This
  is useful to perform  character code -> glyph index translations
  quickly, without the need for an opened FT_Face.

- A NEW POSTSCRIPT HINTER module  has been added to support native
  hints in  the following  formats: PostScript Type  1, PostScript
  CID, and CFF/CEF.

  Please test!  Note that  the auto-hinter produces better results
  for a number of  badly-hinted fonts (mostly auto-generated ones)
  though.

- A memory debugger is now  part of the standard FreeType sources.
  To      enable      it,      define      FT_DEBUG_MEMORY      in
  <freetype/config/ftoption.h>, and recompile the library.

  Additionally, define  the _environment_ variable FT_DEBUG_MEMORY
  and run any program using FreeType.  When the library is exited,
  a  summary  of memory  footprints  and  possible  leaks will  be
  displayed.

  This works transparently with  _any_ program that uses FreeType.
  However, you  will need a lot  of memory to  use this (allocated
  blocks are never  released to the heap to  detect double deletes
  easily).

III. MISCELLANEOUS

- We  are  aware  of  subtle  differences between  the  output  of
  FreeType  versions   1  and  2  when  it   comes  to  monochrome
  TrueType-hinted glyphs.   These are  most probably due  to small
  differences in the monochrome rasterizers and will be worked out
  in an upcoming release.

- We have decided to fork the sources in a `stable' branch, and an
  `unstable' one, since FreeType  is becoming a critical component
  of many Unix systems.

  The next  bug-fix releases of  the library will be  named 2.0.7,
  2.0.8, etc.,  while the `2.1'  branch will contain a  version of
  the sources where we will start major reworking of the library's
  internals, in order to produce FreeType 2.2.0 (or even 3.0) in a
  more distant future.

  We  also hope  that this  scheme will  allow much  more frequent
  releases than in the past.

======================================================================

CHANGES BETWEEN 2.0.5 and 2.0.4

NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1)

  • Fixed a bug that made certain glyphs, like Cacute',cacute' and `lslash' unavailable from Unicode charmaps of Postscript fonts. This prevented the correct display of Polish text, for example.

  • The kerning table of Type 1 fonts was loaded by FreeType, when its AFM file was attached to its face, but the FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, preventing FT_Get_Kerning to return meaningful values.

  • Improved SFNT (TrueType & OpenType) charmap support. Slightly better performance, as well as support for the new formats defined by the OpenType 1.3 specification (8, 10, and 12)

  • Fixed a serious typo in `src/base/ftcalc.c' which caused invalid computations in certain rare cases, producing ugly artefacts.

  • The size of the EM square is computed with a more accurate algorithm for Postscript fonts. The old one caused slight errors with embedded fonts found in PDF documents.

  • Fixed a bug in the cache manager that prevented normal LRU behaviour within the cache manager, causing unnecessary reloads (for FT_Face and FT_Size objects only).

  • Added a new function named `FT_Get_Name_Index' to retrieve the glyph index of a given glyph name, when found in a face.

  • Added a new function named FT_Get_Postscript_Name' to retrieve theunique' Postscript font name of a given face.

  • Added a new public header size named FT_SIZES_H (or <freetype/ftsizes.h>) providing new FT_Size-management functions: FT_New_Size, FT_Activate_Size, FT_Done_Size.

  • Fixed a reallocation bug that generated a dangling pointer (and possibly memory leaks) with Postscript fonts (in src/psaux/psobjs.c).

  • Many fixes for 16-bit correctness.

  • Removed many pedantic compiler warnings from the sources.

  • Added an Amiga build directory in `builds/amiga'.

======================================================================

CHANGES BETWEEN 2.0.4 and 2.0.3

  • Fixed a rather annoying bug that was introduced in 2.0.3. Namely, the font transformation set through FT_Set_Transform was applied twice to auto-hinted glyphs, resulting in incorrectly rotated text output.

  • Fixed many compiler warnings. FT2 should now compile cleanly with Visual C++'s most pedantic warning level (/W4). It already compiled fine with GCC and a few other compilers.

  • Fixed a bug that prevented the linear advance width of composite TrueType glyphs to be correctly returned.

  • Fixed the Visual C++ project files located in `builds/win32/visualc' (previous versions used older names of the library).

  • Many 32-bit constants have an `L' appended to their value, in order to improve the 16-bitness of the code. Someone is actually trying to use FT2 on an Atari ST machine!

  • Updated the builds/detect.mk' file in order to automatically build FT2 on AIX systems. AIX uses/usr/sbin/init' instead of `/sbin/init' and wasn't previously detected as a Unix platform by the FreeType build system.

  • Updated the Unix-specific portions of the build system (new libtool version, etc.).

  • The SFNT kerning loader now ensures that the table is sorted (since some problem fonts do not meet this requirement).

=======================================================================

CHANGES BETWEEN 2.0.3 and 2.0.2

I. CHANGES TO THE MODULES / FONT DRIVERS

- THE  AUTO-HINTER HAS  BEEN SLIGHTLY  IMPROVED, in  order  to fix
  several annoying artefacts, mainly:

    - Blue  zone alignment  of  horizontal stems  wasn't performed
      correctly, resulting in artefacts  like the `d' being placed
      one pixel below the `b' in some fonts like Time New Roman.

    - Overshoot thresholding  wasn't performed correctly, creating
      unpleasant artefacts at large character pixel sizes.

    - Composite glyph loading has  been simplified.  This gets rid
      of  various artefacts  where the  components of  a composite
      glyphs were not correctly spaced.

  These are  the last changes to the  current auto-hinting module.
  A new  hinting sub-system is currently  in the work  in order to
  support native hints  in Type 1 / CFF /  OpenType fonts, as well
  as globally improve rendering.

- The  PCF  driver has  been  fixed.   It  reported invalid  glyph
  dimensions for the fonts available on Solaris.

- The Type  1, CID and CFF  drivers have been modified  to fix the
  computation of the EM size.

- The Type 1  driver has been fixed to avoid  a dangerous bug that
  crashed the library with non-conforming fonts (i.e. ones that do
  not place the .notdef glyph at position 0).

- The TrueType  driver had a  rather subtle bug  (dangling pointer
  when loading  composite glyphs) that could crash  the library in
  rare occasions!

II. HIGH-LEVEL API CHANGES

- The error  code enumeration values have been  changed.  An error
  value  is decomposed  in  a  generic error  code,  and a  module
  number.  see <freetype/fterrors.h> for details.

- A   new  public   header   file  has   been  introduced,   named
  FT_TRIGONOMETRY_H    (include/freetype/fttrigon.h),    providing
  trigonometric functions to  compute sines, cosines, arctangents,
  etc. with 16.16 fixed precision.  The implementation is based on
  the CORDIC  algorithm and is very fast  while being sufficiently
  accurate.

III. INTERNALS

- Added  BeOS-specific files  in the  old build  sub-system.  Note
  that no changes were required to compile the library with Jam.

- The  configuration  is now  capable  of automatically  detecting
  64-bit integers  on a set  of predefined compilers  (GCC, Visual
  C++, Borland C++) and will use them by default.  This provides a
  small performance boost.

- A  small memory leak  that happened  when opening  0-sized files
  (duh!)  have been fixed.

- Fixed bezier  stack depth  bug in the  routines provided  by the
  FT_BBOX_H  header   file.   Also  fixed  similar   bugs  in  the
  rasterizers.

- The outline bounding  box code has been rewritten  to use direct
  computations,  instead of  bezier sub-division,  to  compute the
  exact bounding box of glyphs.   This is slightly slower but more
  accurate.

- The build system has been  improved and fixed, mainly to support
  `make'  on Windows  2000  correctly, avoid  problems with  `make
  distclean' on non Unix systems, etc.

- Hexadecimal  constants  have been  suffixed  with  `U' to  avoid
  problems with certain compilers on 64-bit platforms.

- A new directory named `src/tools' has been created.  It contains
  Python scripts and simple unit test programs used to develop the
  library.

- The DocMaker tool has been  moved from `docs' to `src/tools' and
  has been updated with the following:

     - Now accepts the `--title=XXXX' or `-t XXXX' option from the
       command line to set the project's name in the generated API
       reference.

     - Now accepts the `--output=DIR'  or `-o DIR' option from the
       command line to set  the output directory for all generated
       HTML files.

     - Now accepts the `--prefix=XXXX' or `-p XXX' option from the
       command  line  to  set  the  file prefix  to  use  for  all
       generated HTML files.

     - Now generates the current  time/data on each generated page
       in order to distinguish between versions.

  DocMaker  can be  used with  other  projects now,  not only  FT2
  (e.g. MLib, FTLayout, etc.).

======================================================================

CHANGES BETWEEN 2.0.2 and 2.0.1

I. CHANGES TO THE MODULES / FONT DRIVERS

- THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to
  avoid legal problems  with the Apple patents.  It  seems that we
  mistakenly  turned this option  on in  previous releases  of the
  build.

  Note that if  you want to use the  bytecode interpreter in order
  to get high-quality TrueType  rendering, you will need to toggle
  by        hand        the        definition        of        the
  TT_CONFIG_OPTION_BYTECODE_INTERPRETER   macro    in   the   file
  `include/freetype/config/ftoption.h'.

- The CFF driver has been improved by Tom Kacvinsky and Sander van
  der Wal:

  * Support for `seac' emulation.
  * Support for `dotsection'.
  * Support for retrieving glyph names through
    `FT_Get_Glyph_Name'.

  The first two items are necessary to correctly a large number of
  Type 1 fonts converted to the CFF formats by Adobe Acrobat.

- The Type 1 driver was also improved by Tom & others:

  * Better EM size computation.
  * Better support for synthetic (transformed) fonts.
  * The  Type 1  driver returns  the charstrings  corresponding to
    each glyph in the  `glyph->control_data' field after a call to
    `FT_Load_Glyph' (thanks Ha Shao).

- Various other bugfixes, including the following:

  * Fixed a nasty memory leak in the Type 1 driver.
  * The autohinter  and the pcf  driver used static  writable data
    when they shouldn't.
  * Many casts were added to  make the code more 64-bits safe.  It
    also now compiles on Windows XP 64-bits without warnings.
  * Some incorrect writable statics were removed in the `autohint'
    and `pcf' drivers.  FreeType 2 now compiles on Epoc again.

II. CHANGES TO THE HIGH-LEVEL API

- The library header files inclusion scheme has been changed.  The
  old scheme looked like:

    #include <freetype/freetype.h>
    #include <freetype/ftglyph.h>
    #include <freetype/ftcache.h>
    #include <freetype/cache/ftimage.h>

  Now you should use:

    #include <ft2build.h>
    #include FT_FREETYPE_H
    #include FT_GLYPH_H
    #include FT_CACHE_H
    #include FT_CACHE_IMAGE_H

  NOTE THAT  THE OLD  INCLUSION SCHEME WILL  STILL WORK  WITH THIS
  RELEASE.  HOWEVER, WE  DO NOT GUARANTEE THAT THIS  WILL STILL BE
  TRUE IN THE NEXT ONE (A.K.A. FREETYPE 2.1).

  The  file <ft2build.h>  is used  to define  the  header filename
  macros.  The complete and  commented list of macros is available
  in the API reference under the section name `Header File Macros'
  in Chapter I.

  For more information, see section I of the following document:

    https://www.freetype.org/freetype2/docs/tutorial/step1.html

- Many, many comments have been added to the public source file in
  order to  automatically generate  the API Reference  through the
  `docmaker.py' Python script.

  The latter has been updated  to support the grouping of sections
  in chapters and better index sort.  See:

    https://www.freetype.org/freetype2/docs/reference/ft2-toc.html

III. CHANGES TO THE BUILD PROCESS

- If you  are not  building FreeType 2  with its own  build system
  (but with your own Makefiles or project files), you will need to
  be  aware that  the  build  process has  changed  a little  bit.

  You don't  need to put the  `src' directory in  the include path
  when  compiling  any FT2  component.   Instead,  simply put  the
  component's directory in the current include path.

  So, if you were doing something like:

    cc -c -Iinclude -Isrc src/base/ftbase.c

  change the line to:

    cc -c -Iinclude -Isrc/base src/base/ftbase.c

  If you were doing something like:

    cd src/base
    cc -c -I../../include -I.. ftbase.c

  change it to:

    cd src/base
    cc -c -I../../include ftbase.c

======================================================================

CHANGES BETWEEN 2.0.1 and 2.0

2.0.1 introduces a few changes:

- Fixed many bugs related to  the support of CFF / OpenType fonts.
  These  formats are  now much  better supported  though  there is
  still work planned to  deal with charset tables and PDF-embedded
  CFF files that use the old `seac' command.

- The  library could not  be compiled  in debug  mode with  a very
  small  number   of  C  compilers   whose  pre-processors  didn't
  implement the `##'  directive correctly (i.e. per se  the ANSI C
  specification!)  An elegant fix was found.

- Added  support for  the  free Borland  command-line C++  Builder
  compiler.   Use `make  setup bcc32'.   Also fixed  a  few source
  lines that generated new warnings with BCC32.

- Fixed a bug in FT_Outline_Get_BBox when computing the extrema of
  a conic Bezier arc.

- Updated the INSTALL file to add IDE compilation.

- Other  minor bug  fixes,  from  invalid Type  1  style flags  to
  correct   support   of  synthetic   (obliqued)   fonts  in   the
  auto-hinter, better support for embedded bitmaps in a SFNT font.

- Fixed some problems with `freetype-config'.

Finally, the `standard' scheme for including FreeType headers is now gradually changing, but this will be explained in a later release (probably 2.0.2).

And very special thanks to Tom Kacvinsky and YAMANO-UCHI Hidetoshi for their contributions!

======================================================================

CHANGES BETWEEN beta8 and 2.0

  • Changed the default installation path for public headers from include/freetype' toinclude/freetype2'.

    Also added a new `freetype-config' that is automatically generated and installed on Unix and Cygwin systems. The script itself is used to retrieve the current install path, C compilation flags as well as linker flags.

  • Fixed several small bugs:

    • Incorrect max advance width for fixed-pitch Type 1 fonts.
    • Incorrect glyph names for certain TrueType fonts.
    • The glyph advance was not copied when FT_Glyph_To_Bitmap was called.
    • The linearHoriAdvance and linearVertAdvance fields were not correctly returned for glyphs processed by the auto-hinter.
    • type1z' renamed back totype1'; the old `type1' module has been removed.
  • Revamped the build system to make it a lot more generic. This will allow us to re-use nearly un-modified in lots of other projects (including FreeType Layout).

  • Changed cid' to usepsaux' too.

  • Added the cache sub-system. See <freetype/ftcache.h> as well as the sources in `src/cache'. Note that it compiles but is still untested for now.

  • Updated `docs/docmaker.py', a draft API reference is available at https://web.archive.org/web/20001215173400/http://www.freetype.org:80/ft2api.html.

  • Changed type1' to usepsaux'.

  • Created a new module named psaux' to hold the Type 1 & Type 2 parsing routines. It should be used bytype1', cid', andcff' in the future.

  • Fixed an important bug in `FT_Glyph_Get_CBox'.

  • Fixed some compiler warnings that happened since the TrueType bytecode decoder was deactivated by default.

  • Fixed two memory leaks:

    • The memory manager (16 bytes) isn't released in FT_Done_FreeType!
    • Using custom input streams, the copy of the original stream was never released.
  • Fixed the auto-hinter by performing automatic computation of the `filling direction' of each glyph. This is done through a simple and fast approximation, and seems to work (problems spotted by Werner though). The Arphic fonts are a lot nicer though there are still a lot of things to do to handle Asian fonts correctly.

======================================================================

BETA-8 (RELEASE CANDIDATE) CHANGES

  • Deactivated the TrueType bytecode interpreter by default.

  • Deactivated the src/type1' font driver. Nowsrc/type1z' is used by default.

  • Updates to the build system. We now compile the library correctly under Unix system through configure' which is automatically called on the firstmake' invocation.

  • Added the auto-hinting module! Fixing some bugs here and there.

  • Found some bugs in the composite loader (seac) of the Type1-based font drivers.

  • Renamed the directory freetype2/config' tofreetype2/builds' and updated all relevant files.

  • Found a memory leak in the `type1' driver.

  • Incorporated Tom's patches to support flex operators correctly in OpenType/CFF fonts. Now all I need is to support pure CFF and CEF fonts to be done with this driver :-)

  • Added the Windows FNT/FON driver in src/winfonts'. For now, it alwayssimulates' a Unicode charmap, so it shouldn't be considered completed right now.

    It is there to be more a proof of concept than anything else anyway. The driver is a single C source file, that compiles to 3 Kb of code.

    I'm still working on the PCF/BDF drivers, but I'm too lazy to finish them now.

  • CHANGES TO THE HIGH-LEVEL API

    • FT_Get_Kerning has a new parameter that allows you to select the coordinates of the kerning vector (font units, scaled, scaled + grid-fitted).
    • The outline functions are now in <freetype/ftoutln.h> and not part of <freetype/freetype.h> anymore.
    • <freetype/ftmodule.h> now contains declarations for FT_New_Library, FT_Done_Library, FT_Add_Default_Modules.
    • The so-called convenience functions have moved from ftoutln.c' toftglyph.c', and are thus available with this optional component of the library. They are declared in <freetype/ftglyph.h> now.
    • Anti-aliased rendering is now the default for FT_Render_Glyph (i.e. corresponds to render_mode == 0 == ft_render_mode_normal). To generate a monochrome bitmap, use ft_render_mode_mono, or the FT_LOAD_MONOCHROME flag in FT_Load_Glyph/FT_Load_Char. FT_LOAD_ANTI_ALIAS is still defined, but values to 0.
    • <freetype/freetype.h> now include <freetype/config/ftconfig.h>, solving a few headaches :-)
    • The type FT_GlyphSlotRec has now a `library' field.
  • CHANGES TO THE `ftglyph.h' API

    This API has been severely modified in order to make it simpler, clearer, and more efficient. It certainly now looks like a real `glyph factory' object, and allows client applications to manage (i.e. transform, bbox and render) glyph images without ever knowing their original format.

  • Added support for CID-keyed fonts to the CFF driver. Maybe support for pure CFF + CEF fonts should come in?

  • Cleaned up source code in order to avoid two functions with the same name. Also changed the names of the files in type1z' fromt1XXXX' to `z1XXXX' in order to avoid any conflicts.

    `make multi' now works well :-)

    Also removed the use of `cidafm' for now, even if the source files are still there. This functionality will certainly go into a specific module.

  • ADDED SUPPORT FOR THE AUTO-HINTER

    It works :-) I have a demo program which simply is a copy of ftview' that does aFT_Add_Module(library, &autohinter_module_class)' after library initialization, and Type 1 & OpenType/CFF fonts are now hinted.

    CID fonts are not hinted, as they include no charmap and the auto-hinter doesn't include `generic' global metrics computations yet.

    Now, I need to release this thing to the FreeType 2 source.

  • CHANGES TO THE RENDERER MODULES

    The monochrome and smooth renderers are now in two distinct directories, namely src/raster1' andsrc/smooth'. Note that the old `src/renderer' is now gone.

    I ditched the 5-gray-levels renderers. Basically, it involved a simple #define toggle in 'src/raster1/ftraster.c'.

    FT_Render_Glyph, FT_Outline_Render & FT_Outline_Get_Bitmap now select the best renderer available, depending on render mode. If the current renderer for a given glyph image format isn't capable of supporting the render mode, another one will be found in the library's list. This means that client applications do not need to switch or set the renderers themselves (as in the latest change), they'll get what they want automatically. At last.

    Changed the demo programs accordingly.

  • MAJOR INTERNAL REDESIGN:

    A lot of internal modifications have been performed lately on the source in order to provide the following enhancements:

    • More generic module support:

      The FT_Module type is now defined to represent a handle to a given module. The file <freetype/ftmodule.h> contains the FT_Module_Class definition, as well as the module-loading public API.

      The FT_Driver type is still defined, and still represents a pointer to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc.

    • Support for generic glyph image types:

      The FT_Renderer type is a pointer to a module used to perform various operations on glyph image.

      Each renderer is capable of handling images in a single format (e.g. ft_glyph_format_outline). Its functions are used to:

      • transform an glyph image
      • render a glyph image into a bitmap
      • return the control box (dimensions) of a given glyph image

      The scan converters ftraster.c' andftgrays.c' have been moved to the new directory `src/renderer', and are used to provide two default renderer modules.

      One corresponds to the standard' scan-converter, the other to thesmooth' one.

      he current renderer can be set through the new function FT_Set_Renderer.

      The old raster-related function FT_Set_Raster, FT_Get_Raster and FT_Set_Raster_Mode have now disappeared, in favor of the new:

      FT_Get_Renderer FT_Set_Renderer

      See the file <freetype/ftrender.h> for more details.

      These changes were necessary to properly support different scalable formats in the future, like bi-color glyphs, etc.

    • Glyph loader object:

      A new internal object, called a 'glyph loader' has been introduced in the base layer. It is used by all scalable format font drivers to load glyphs and composites.

      This object has been created to reduce the code size of each driver, as each one of them basically re-implemented its functionality.

      See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for more information.

    • FT_GlyphSlot has new fields:

      In order to support extended features (see below), the FT_GlyphSlot structure has a few new fields:

      linearHoriAdvance:

      This field gives the linearly scaled (i.e. scaled but unhinted) advance width for the glyph, expressed as a 16.16 fixed pixel value. This is useful to perform WYSIWYG text.

      linearVertAdvance: This field gives the linearly scaled advance height for the glyph (relevant in vertical glyph layouts only). This is useful to perform WYSIWYG text.

      Note that the two above field replace the removed `metrics2' field in the glyph slot.

      advance: This field is a vector that gives the transformed advance for the glyph. By default, it corresponds to the advance width, unless FT_LOAD_VERTICAL_LAYOUT was specified when calling FT_Load_Glyph or FT_Load_Char.

      bitmap_left: This field gives the distance in integer pixels from the current pen position to the left-most pixel of a glyph image IF IT IS A BITMAP. It is only valid when the format' field is set toft_glyph_format_bitmap', for example, after calling the new function FT_Render_Glyph.

      bitmap_top: This field gives the distance in integer pixels from the current pen position (located on the baseline) to the top-most pixel of the glyph image IF IT IS A BITMAP. Positive values correspond to upwards Y.

      loader: This is a new private field for the glyph slot. Client applications should not touch it.

* Support for transforms and direct rendering in FT_Load_Glyph:

  Most of the functionality found in <freetype/ftglyph.h> has been
  moved to the core library.  Hence, the following:

  - A   transform   can   be   specified  for   a   face   through
    FT_Set_Transform.  this transform  is applied by FT_Load_Glyph
    to  scalable glyph  images (i.e.  NOT TO  BITMAPS)  before the
    function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM
    was set in the load flags.

  - Once  a  glyph image  has  been  loaded,  it can  be  directly
    converted  to  a  bitmap  by  using  the  new  FT_Render_Glyph
    function.  Note that this  function takes the glyph image from
    the glyph slot,  and converts it to a  bitmap whose properties
    are returned  in `face.glyph.bitmap', `face.glyph.bitmap_left'
    and `face.glyph.bitmap_top'.  The  original native image might
    be lost after the conversion.

  - When using the new  bit flag FT_LOAD_RENDER, the FT_Load_Glyph
    and   FT_Load_Char   functions   will   call   FT_Render_Glyph
    automatically when needed.
  • Reformatted all modules source code in order to get rid of the basic data types redefinitions (i.e. TT_Int' instead ofFT_Int', T1_Fixed' instead ofFT_Fixed'). Hence the format-specific prefixes like TT_',T1_', T2_' andCID_' are only used for relevant structures.

======================================================================

OLD CHANGES FOR BETA 7

  • bug-fixed the OpenType/CFF parser. It now loads and displays my two fonts nicely, but I'm pretty certain that more testing is needed :-)

  • fixed the crummy Type 1 hinter, it now handles accented characters correctly (well, the accent is not always well placed, but that's another problem..)

  • added the CID-keyed Type 1 driver in `src/cid'. Works pretty well for only 13 Kb of code ;-) Doesn't read AFM files though, nor the really useful CMAP files..

  • fixed two bugs in the smooth renderer (src/base/ftgrays.c). Thanks to Boris Letocha for spotting them and providing a fix.

  • fixed potential `divide by zero' bugs in ftcalc.c.

  • added source code for the OpenType/CFF driver (still incomplete though..)

  • modified the SFNT driver slightly to perform more robust header checks in TT_Load_SFNT_Header. This prevents certain font files (e.g. some Type 1 Multiple Masters) from being incorrectly `recognized' as TrueType font files..

  • moved a lot of stuff from the TrueType driver to the SFNT module, this allows greater code re-use between font drivers (e.g. TrueType, OpenType, Compact-TrueType, etc..)

  • added a tiny segment cache to the SFNT Charmap 4 decoder, in order to minimally speed it up..

  • added support for Multiple Master fonts in `type1z'. There is also a new file named <freetype/ftmm.h> which defines functions to manage them from client applications.

    The new file `src/base/ftmm.c' is also optional to the engine..

  • various formatting changes (e.g. EXPORT_DEF -> FT_EXPORT_DEF) + small bug fixes in FT_Load_Glyph, the `type1' driver, etc..

  • a minor fix to the Type 1 driver to let them apply the font matrix correctly (used for many oblique fonts..)

  • some fixes for 64-bit systems (mainly changing some FT_TRACE calls to use %p instead of %lx). Thanks to Karl Robillard.

  • fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be cropped when loaded from a file (maybe I should move the bitmap cropper to the base layer ??).

  • changed the default number of gray levels of the smooth renderer to 256 (instead of the previous 128). Of course, the human eye can't see any difference ;-)

  • removed TT_MAX_SUBGLYPHS, there is no static limit on the number of subglyphs in a TrueType font now..

======================================================================

OLD CHANGES 16 May 2000

  • tagged `BETA-6' in the CVS tree. This one is a serious release candidate even though it doesn't incorporate the auto-hinter yet..

  • various obsolete files were removed, and copyright header updated

  • finally updated the standard raster to fix the monochrome rendering bug + re-enable support for 5-gray levels anti-aliasing (suck, suck..)

  • created new header files, and modified sources accordingly:

    <freetype/fttypes.h>

    • simple FreeType types, without the API <freetype/internal/ftmemory.h>
    • definition of memory-management macros
  • added the `DSIG' (OpenType Digital Signature) tag to <freetype/tttags.h>

  • light update/cleaning of the build system + changes to the sources in order to get rid of all compiler warnings with three compilers, i.e:

    gcc with -ansi -pedantic -Wall -W', Visual C++ with/W3 /WX' and LCC

    IMPORTANT NOTE FOR WIN32-LCC USERS: | | It seems the C pre-processor that comes with LCC is broken, it | doesn't recognize the ANSI standard directives # and ## | correctly when one of the argument is a macro. Also, | something like: | | #define F(x) print##x | | F(("hello")) | | will get incorrectly translated to: | | print "hello") | | by its pre-processor. For this reason, you simply cannot build | FreeType 2 in debug mode with this compiler..

  • yet another massive grunt work. I've changed the definition of the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These now take an argument, which is the function's return value type.

    This is necessary to compile FreeType as a DLL on Windows and OS/2. Depending on the compiler used, a compiler-specific keyword like __export or __system must be placed before (VisualC++) or after (BorlandC++) the type..

    Of course, this needed a lot of changes throughout the source code to make it compile again... All cleaned up now, apparently..

    Note also that there is a new EXPORT_VAR macro defined to allow the declaration of an exportable public (constant) variable. This is the case of the raster interfaces (see ftraster.h and ftgrays.h), as well as each module's interface (see sfdriver.h, psdriver.h, etc..)

  • new feature: it is now possible to pass extra parameters to font

             drivers  when creating  a new  face object.  For now,
             this capability is unused.  It could however prove to
             be useful in a near future..

    the FT_Open_Args structure was changes, as well as the internal driver interface (the specific `init_face' module function has now a different signature).

  • updated the tutorial (not finished though).

  • updated the top-level BUILD document

  • fixed a potential memory leak that could occur when loading embedded bitmaps.

  • added the declaration of FT_New_Memory_Face in <freetype/freetype.h>, as it was missing from the public header (the implementation was already in `ftobjs.c').

  • the file <freetype/fterrors.h> has been seriously updated in order to allow the automatic generation of error message tables. See the comments within it for more information.

  • major directory hierarchy re-organisation. This was done for two things:

    • first, to ease the `manual' compilation of the library by requiring at lot less include paths :-)

    • second, to allow external programs to effectively access internal data fields. For example, this can be extremely useful if someone wants to write a font producer or a font manager on top of FreeType.

    Basically, you should now use the 'freetype/' prefix for header inclusion, as in:

    #include <freetype/freetype.h>
    #include <freetype/ftglyph.h>

    Some new include sub-directories are available:

    a. the `freetype/config' directory, contains two files used to

    configure  the  build  of  the  library.  Client  applications
    should  not need  to look  at these  normally, but they can if
    they want.
    
    #include <freetype/config/ftoption.h>
    #include <freetype/config/ftconfig.h>

    b. the `freetype/internal' directory, contains header files that

    describes library  internals.  These are the header files that
    were  previously  found  in  the `src/base'  and  `src/shared'
    directories.
As  usual, the build  system and  the demos  have been  updated to
reflect the change..

Here's a layout of the new directory hierarchy:

TOP_DIR
  include/
     freetype/
        freetype.h
        ...
        config/
          ftoption.h
          ftconfig.h
          ftmodule.h

        internal/
          ftobjs.h
          ftstream.h
          ftcalc.h
          ...

  src/
     base/
        ...

     sfnt/
     psnames/
     truetype/
     type1/
     type1z/


Compiling a module is now  much easier, for example, the following
should work when in the TOP_DIR directory on an ANSI build:

   gcc -c -I./include -I./src/base src/base/ftbase.c
   gcc -c -I./include -I./src/sfnt src/sfnt/sfnt.c
   etc..

(of course, using -Iconfig/<system> if you provide system-specific
 configuration files).
  • updated the structure of FT_Outline_Funcs in order to allow direct coordinate scaling within the outline decomposition routine (this is important for virtual `on' points with TrueType outlines) + updates to the rasters to support this..

  • updated the OS/2 table loading code in `src/sfnt/ttload.c' in order to support version 2 of the table (see OpenType 1.2 spec)

  • created include/tttables.h' andinclude/t1tables.h' to allow client applications to access some of the SFNT and T1 tables of a face with a procedural interface (see `FT_Get_Sfnt_Table') + updates to internal source files to reflect the change..

  • some cleanups in the source code to get rid of warnings when compiling with the `-Wall -W -ansi -pedantic' options in gcc.

  • debugged and moved the smooth renderer to src/base/ftgrays.c' and its header toinclude/ftgrays.h'

  • updated TT_MAX_SUBGLYPHS to 96 as some CJK fonts have composites with up to 80 sub-glyphs !! Thanks to Werner

======================================================================

OLD CHANGES - 14-apr-2000

  • fixed a bug in the TrueType glyph loader that prevented the correct loading of some CJK glyphs in mingli.ttf

  • improved the standard Type 1 hinter in `src/type1'

  • fixed two bugs in the experimental Type 1 driver in `src/type1z' to handle the new XFree86 4.0 fonts (and a few other ones..)

  • the smooth renderer is now complete and supports sub-banding to render large glyphs at high speed. However, it is still located in `demos/src/ftgrays.c' and should move to the library itself in the next beta. NOTE: The smooth renderer doesn't compile in stand-alone mode anymore, but this should be fixed RSN..

  • introduced convenience functions to more easily deal with glyph images, see include/ftglyph.h' for more details, as well as the new demo program nameddemos/src/ftstring.c' that demonstrates its use

  • implemented FT_LOAD_NO_RECURSE in both the TrueType and Type 1 drivers (this is required by the auto-hinter to improve its results).

  • changed the raster interface, in order to allow client applications to provide their own span-drawing callbacks. However, only the smooth renderer supports this. See FT_Raster_Params' in the fileinclude/ftimage.h'.

  • fixed a small bug in FT_MulFix that caused incorrect transform computation!

  • Note: The tutorial is out-of-date.

======================================================================

OLD CHANGES - 12-mar-2000

  • changed the layout of configuration files : now, all ANSI configuration files are located in freetype2/config'. System-specific over-rides can be placed infreetype2/config/<system>'.

  • moved all configuration macros to `config/ftoption.h'

  • improvements in the Type 1 driver with AFM support

  • changed the fields in the FT_Outline structure : the old flags' array is re-namedtags', while all ancient flags are encoded into a single unsigned int named `flags'.

  • introduced new flags in FT_Outline.flags (see ft_outline_.... enums in `ftimage.h').

  • changed outline functions to `FT_Outline_<action>' syntax

  • added a smooth anti-alias renderer to the demonstration programs

  • added Mac graphics driver (thanks Just)

  • FT_Open_Face changed in order to received a pointer to a FT_Open_Args descriptor..

  • various cleanups, a few more API functions implemented (see FT_Attach_File)

  • updated some docs

======================================================================

OLD CHANGES - 22-feb-2000

  • introduced the `psnames' module. It is used to:

    o convert a Postscript glyph name into the equivalent Unicode

    character code (used by the  Type 1 driver(s) to synthesize on
    the fly a Unicode charmap).

    o provide an interface to retrieve the Postscript names of the

    Macintosh,  Adobe  Standard &  Adobe  Expert character  codes.
    (the Macintosh  names are  used by the  SFNT-module postscript
    names support routines, while the other two tables are used by
    the Type 1 driver(s)).
  • introduced the type1z' alternate Type 1 driver. This is a (still experimental) driver for the Type 1 format that will ultimately replace the one insrc/type1'. It uses pattern matching to load data from the font, instead of a finite state analyzer. It works much better than the old' driver withbroken' fonts. It is also much smaller (under 15 Kb).

  • the Type 1 drivers (both in src/type1' andsrc/type1z') are nearly complete. They both provide automatic Unicode charmap synthesis through the `psnames' module. No re-encoding vector is needed. (note that they still leak memory due to some code missing, and I'm getting lazy).

    Trivial AFM support has been added to read kerning information but wasn't exactly tested as it should ;-)

  • The TrueType glyph loader has been seriously rewritten (see the file `src/truetype/ttgload.c'. It is now much, much simpler as well as easier to read, maintain and understand :-) Preliminary versions introduced a memory leak that has been reported by Jack Davis, and is now fixed..

  • introduced the new ft_glyph_format_plotter', used to represent stroked outlines like WindowsVector' fonts, and certain Type 1 fonts like `Hershey'. The corresponding raster will be written soon.

  • FT_New_Memory_Face is gone. Likewise, FT_Open_Face has a new interface that uses a structure to describe the input stream, the driver (if required), etc..

TODO

  • Write FT_Get_Glyph_Bitmap and FT_Load_Glyph_Bitmap

  • Add a function like FT_Load_Character(face, char_code, load_flags) that would really embed a call to FT_Get_Char_Index then FT_Load_Glyph to ease developer's work.

  • Update the tutorial!

  • consider adding support for Multiple Master fonts in the Type 1 drivers.

  • Test the AFM routines of the Type 1 drivers to check that kerning information is returned correctly.

  • write a decent auto-gridding component !! We need this to release FreeType 2.0 gold !

less urgent needs:

  • add a CFF/Type2 driver
  • add a BDF driver
  • add a FNT/PCF/HBF driver
  • add a Speedo driver from the X11 sources

======================================================================

OLDER CHANGES - 27-jan-2000

  • updated the `sfnt' module interface to allow several SFNT-based drivers to co-exist peacefully

  • updated the `T1_Face' type to better separate Postscript font content from the rest of the FT_Face structure. Might be used later by the CFF/Type2 driver..

  • added an experimental replacement Type 1 driver featuring advanced (and speedy) pattern matching to retrieve the data from postscript fonts.

  • very minor changes in the implementation of FT_Set_Char_Size and FT_Set_Pixel_Sizes (they now implement default to lighten the font driver's code).

======================================================================

OLD MESSAGE

This file summarizes the changes that occurred since the last `beta' of FreeType 2. Because the list is important, it has been divided into separate sections:

Table Of Contents:

I   High-Level Interface (easier !)

II Directory Structure III Glyph Image Formats IV Build System V Portability VI Font Drivers


High-Level Interface:

The high-level API has been considerably simplified. Here is how:

- resource objects have disappeared.  this means that face objects
  can now be created with  a single function call (see FT_New_Face
  and FT_Open_Face)

- when calling  either FT_New_Face  & FT_Open_Face, a  size object
  and a glyph slot object  are automatically created for the face,
  and can  be accessed  through `face->glyph' and  `face->size' if
  one really  needs to.   In most cases,  there's no need  to call
  FT_New_Size or FT_New_Glyph.

- similarly,  FT_Load_Glyph  now  only  takes  a  `face'  argument
  (instead  of a  glyph  slot  and a  size).  Also,  its  `result'
  parameter is  gone, as the glyph  image type is  returned in the
  field `face->glyph.format'

- the list  of available  charmaps is directly  accessible through
  `face->charmaps', counting `face->num_charmaps'  elements.  Each
  charmap  has an  'encoding'  field which  specifies which  known
  encoding it deals with.  Valid values are, for example:

      ft_encoding_unicode      (for ASCII, Latin-1 and Unicode)
      ft_encoding_apple_roman
      ft_encoding_sjis
      ft_encoding_adobe_standard
      ft_encoding_adobe_expert

  other  values may  be added  in the  future.  Each charmap still
  holds  its `platform_id'  and `encoding_id'  values in  case the
  encoding is too exotic for the current library

Directory Structure:

Should seem obvious to most of you:

 freetype/
     config/        -- configuration sub-makefiles
        ansi/
        unix/       -- platform-specific configuration files
        win32/
        os2/
        msdos/

     include/       -- public header  files, those to  be included
                       directly by client apps

     src/           -- sources of the library
       base/        -- the base layer
       sfnt/        -- the sfnt `driver'  (see the drivers section
                       below)
       truetype/    -- the truetype driver
       type1/       -- the type1 driver
       shared/      -- some header files shared between drivers

     demos/         -- demos/tools

     docs/          -- documentation (a bit empty for now)

Glyph Image Formats:

Drivers are now able to register new glyph image formats within the library. For now, the base layer supports of course bitmaps and vector outlines, but one could imagine something different like colored bitmaps, bi-color vectors or whatever else (Metafonts anyone ??).

See the file `include/ftimage.h'. Note also that the type FT_Raster_Map is gone, and is now replaced by FT_Bitmap, which should encompass all known bitmap types.

Each new image format must provide at least one `raster', i.e. a module capable of transforming the glyph image into a bitmap. It's also possible to change the default raster used for a given glyph image format.

The default outline scan-converter now uses 128 levels of grays by default, which tends to smooth many things. Note that the demo programs have been updated significantly in order to display these..


Build system:

You still need GNU Make to build the library. The build system has been very seriously re-vamped in order to provide things like :

  • automatic host platform detection (reverting to 'config/ansi' if it is not detected, with pseudo-standard compilation flags)

  • the ability to compile from the Makefiles with very different and exotic compilers. Note that linking the library can be difficult for some platforms.

    For example, the file config/win32/lcclib.bat' is invoked by the build system to create the.lib' file with LCC-Win32 because its librarian has too many flaws to be invoked directly from the Makefile.

    Here's how it works:

    • the first time you type make', the build system runs a series of sub-makefiles in order to detect your host platform. It then dumps what it found, and creates a file calledconfig.mk' in the current directory. This is a sub-Makefile used to define many important Make variables used to build the library.

    • the second time, the build system detects the `config.mk' then use it to build the library. All object files go into 'obj' by default, as well as the library file, but this can easily be changed.

    Note that you can run make setup' to force another host platform detection even if aconfig.mk' is present in the current directory. Another solution is simply to delete the file, then re-run make.

    Finally, the default compiler for all platforms is gcc (for now, this will hopefully changed in the future). You can however specify a different compiler by specifying it after the 'setup' target as in:

    gnumake setup lcc on Win32 to use the LCC compiler gnumake setup visualc on Win32 to use Visual C++

    See the file `config/<system>/detect.mk' for a list of supported compilers for your platforms.

    It should be relatively easy to write new detection rules files and config.mk..

    Finally, to build the demo programs, go to demos' and launch GNU Make, it will use theconfig.mk' in the top directory to build the test programs..


Portability:

In the previous beta, a single FT_System object was used to encompass all low-level operations like thread synchronisation, memory management and i/o access. This has been greatly simplified:

- thread synchronisation  has been dropped, for  the simple reason
  that the library  is already re-entrant, and that  if you really
  need  two  threads accessing  the  same  FT_Library, you  should
  really synchronize access to it yourself with a simple mutex.

- memory  management is  performed  through a  very simple  object
  called `FT_Memory',  which really is a table  containing a table
  of pointers to  functions like malloc, realloc and  free as well
  as some user data (closure).

- resources have disappeared (they created more problems than they
  solved), and  i/o management have  been simplified greatly  as a
  result.  Streams are  defined through  FT_Stream objects,  which
  can be either memory-based or disk-based.

  Note that  each face  has its own  stream, which is  closed only
  when  the  face object  is  destroyed.  Hence,  a function  like
  TT_Flush_Face in 1.x cannot be directly  supported.  However, if
  you really need something like  this, you can easily tailor your
  own streams  to achieve the same  feature at a  lower level (and
  use FT_Open_Face instead of FT_New_Face to create the face).

See the file include/ftsystem.h' for more details, as well as the implementations found inconfig/unix' and `config/ansi'.


Font Drivers:

The Font Driver interface has been modified in order to support extensions & versioning.

The list of the font drivers that are statically linked to the library at compile time is managed through a new configuration file called `config/<platform>/ftmodule.h'.

This file is autogenerated when invoking make modules'. This target will parse all sub-directories of 'src', looking for amodule.mk' rules file, used to describe the driver to the build system.

Hence, one should call make modules' each time a font driver is added or removed from thesrc' directory.

Finally, this version provides a pseudo-driver' insrc/sfnt'. This driver doesn't support font files directly, but provides services used by all TrueType-like font drivers. Hence, its code is shared between the TrueType & OpenType font formats, and possibly more formats to come if we're lucky..


Extensions support:

The extensions support is inspired by the one found in 1.x.

Now, each font driver has its own `extension registry', which lists which extensions are available for the font faces managed by the driver.

Extension ids are now strings, rather than 4-byte tags, as this is usually more readable.

Each extension has:

- some data, associated to each face object
- an interface (table of function pointers)

An extension that is format-specific should simply register itself to the correct font driver. Here is some example code:

// Registering an extensions // FT_Error FT_Init_XXXX_Extension( FT_Library library ) { FT_DriverInterface* tt_driver;

 driver = FT_Get_Driver( library, "truetype" );
 if (!driver) return FT_Err_Unimplemented_Feature;

 return FT_Register_Extension( driver, &extension_class );

}

// Implementing the extensions // FT_Error FT_Proceed_Extension_XXX( FT_Face face ) { FT_XXX_Extension ext; FT_XXX_Extension_Interface ext_interface;

 ext = FT_Get_Extension( face, "extensionid", &ext_interface );
 if (!ext) return error;

 return ext_interface->do_it(ext);

}


Copyright (C) 2000-2024 by David Turner, Robert Wilhelm, and Werner Lemberg.

This file is part of the FreeType project, and may only be used, modified, and distributed under the terms of the FreeType project license, LICENSE.TXT. By continuing to use, modify, or distribute this file you indicate that you have read the license and understand and accept it fully.

Local Variables: version-control: never coding: utf-8 End:

--- end of CHANGES ---