Despite common practice, type-punning integer types out of buffers is undefined in C and C++. It's both a strict aliasing violation on access, and if the pointer isn't aligned, an alignment violation on cast. Being undefined, the compiler is allowed to arbitrarily miscompile the code when we rely on it. Instead, the two legal ways to pull a uint32_t out of a buffer are to either use memcpy, or load byte by byte and use shifts. In both cases, a good compiler should be smart enough to recognize what we're doing and generate reasonable code. Since there was already fallback code for the latter (for a middle-endian architecture?), I went ahead and switched to that. This change is needed to fix UBSan violations in Chromium.
This is a README for the font compression reference code. There are several compression related modules in this repository.
brotli/ contains reference code for the Brotli byte-level compression algorithm. Note that it is licensed under the MIT license.
src/ contains the C++ code for compressing and decompressing fonts.
Build & Run
This document documents how to run the compression reference code. At this writing, the code, while it is intended to produce a bytestream that can be reconstructed into a working font, the reference decompression code is not done, and the exact format of that bytestream is subject to change.
The build process depends on the g++ compiler.
Build
On a standard Unix-style environment:
git clone --recursive https://github.com/google/woff2.git
cd woff2
make clean all
Alternatively, if Brotli is already installed on your system you can use CMake to build executables and libraries:
git clone https://github.com/google/woff2.git
cd woff2
mkdir out
cd out
cmake ..
make
make install
By default, shared libraries are built. To use static linkage, do:
cd woff2
mkdir out-static
cmake -DBUILD_SHARED_LIBS=OFF ..
make
make install
Run
Ensure the binaries from the build process are in your $PATH, then:
woff2_compress myfont.ttf
woff2_decompress myfont.woff2
References
http://www.w3.org/TR/WOFF2/ http://www.w3.org/Submission/MTX/
Also please refer to documents (currently Google Docs):
WOFF Ultra Condensed file format: proposals and discussion of wire format issues (PDF is in docs/ directory)
WIFF Ultra Condensed: more discussion of results and compression techniques. This tool was used to prepare the data in that document.