1d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Use of this source code is governed by a BSD-style license that can be 3d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// found in the LICENSE file. 4d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 5d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "fpgm.h" 6d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 7d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// fpgm - Font Program 8d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// http://www.microsoft.com/opentype/otspec/fpgm.htm 9d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 10d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgnamespace ots { 11d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 12d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgbool ots_fpgm_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { 13d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org Buffer table(data, length); 14d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 15d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org OpenTypeFPGM *fpgm = new OpenTypeFPGM; 16d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org file->fpgm = fpgm; 17d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 18d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (length >= 128 * 1024u) { 19d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); // almost all fpgm tables are less than 5k bytes. 20d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 21d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 22d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (!table.Skip(length)) { 23d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 24d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 25d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 26d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org fpgm->data = data; 27d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org fpgm->length = length; 28d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 29d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} 30d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 31d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgbool ots_fpgm_should_serialise(OpenTypeFile *file) { 32d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (!file->glyf) return false; // this table is not for CFF fonts. 33d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return g_transcode_hints && file->fpgm; 34d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} 35d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 36d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgbool ots_fpgm_serialise(OTSStream *out, OpenTypeFile *file) { 37d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org const OpenTypeFPGM *fpgm = file->fpgm; 38d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 39d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (!out->Write(fpgm->data, fpgm->length)) { 40d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 41d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 42d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 43d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 44d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} 45d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 46d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgvoid ots_fpgm_free(OpenTypeFile *file) { 47d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org delete file->fpgm; 48d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} 49d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 50d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} // namespace ots 51