LCOV - code coverage report
Current view: top level - gfx/ots/src - metrics.cc (source / functions) Hit Total Coverage
Test: output.info Lines: 0 83 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2011 The Chromium Authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "metrics.h"
       6             : 
       7             : #include "head.h"
       8             : #include "maxp.h"
       9             : 
      10             : // OpenType horizontal and vertical common header format
      11             : // http://www.microsoft.com/typography/otspec/hhea.htm
      12             : // http://www.microsoft.com/typography/otspec/vhea.htm
      13             : 
      14             : #define TABLE_NAME "metrics" // XXX: use individual table names
      15             : 
      16             : namespace ots {
      17             : 
      18           0 : bool ParseMetricsHeader(Font *font, Buffer *table,
      19             :                         OpenTypeMetricsHeader *header) {
      20           0 :   if (!table->ReadS16(&header->ascent) ||
      21           0 :       !table->ReadS16(&header->descent) ||
      22           0 :       !table->ReadS16(&header->linegap) ||
      23           0 :       !table->ReadU16(&header->adv_width_max) ||
      24           0 :       !table->ReadS16(&header->min_sb1) ||
      25           0 :       !table->ReadS16(&header->min_sb2) ||
      26           0 :       !table->ReadS16(&header->max_extent) ||
      27           0 :       !table->ReadS16(&header->caret_slope_rise) ||
      28           0 :       !table->ReadS16(&header->caret_slope_run) ||
      29           0 :       !table->ReadS16(&header->caret_offset)) {
      30           0 :     return OTS_FAILURE_MSG("Failed to read metrics header");
      31             :   }
      32             : 
      33           0 :   if (header->ascent < 0) {
      34           0 :     OTS_WARNING("bad ascent: %d", header->ascent);
      35           0 :     header->ascent = 0;
      36             :   }
      37           0 :   if (header->linegap < 0) {
      38           0 :     OTS_WARNING("bad linegap: %d", header->linegap);
      39           0 :     header->linegap = 0;
      40             :   }
      41             : 
      42           0 :   if (!font->head) {
      43           0 :     return OTS_FAILURE_MSG("Missing head font table");
      44             :   }
      45             : 
      46             :   // if the font is non-slanted, caret_offset should be zero.
      47           0 :   if (!(font->head->mac_style & 2) &&
      48           0 :       (header->caret_offset != 0)) {
      49           0 :     OTS_WARNING("bad caret offset: %d", header->caret_offset);
      50           0 :     header->caret_offset = 0;
      51             :   }
      52             : 
      53             :   // skip the reserved bytes
      54           0 :   if (!table->Skip(8)) {
      55           0 :     return OTS_FAILURE_MSG("Failed to skip reserverd bytes");
      56             :   }
      57             : 
      58             :   int16_t data_format;
      59           0 :   if (!table->ReadS16(&data_format)) {
      60           0 :     return OTS_FAILURE_MSG("Failed to read data format");
      61             :   }
      62           0 :   if (data_format) {
      63           0 :     return OTS_FAILURE_MSG("Bad data format %d", data_format);
      64             :   }
      65             : 
      66           0 :   if (!table->ReadU16(&header->num_metrics)) {
      67           0 :     return OTS_FAILURE_MSG("Failed to read number of metrics");
      68             :   }
      69             : 
      70           0 :   if (!font->maxp) {
      71           0 :     return OTS_FAILURE_MSG("Missing maxp font table");
      72             :   }
      73             : 
      74           0 :   if (header->num_metrics > font->maxp->num_glyphs) {
      75           0 :     return OTS_FAILURE_MSG("Bad number of metrics %d", header->num_metrics);
      76             :   }
      77             : 
      78           0 :   return true;
      79             : }
      80             : 
      81           0 : bool SerialiseMetricsHeader(const ots::Font *font,
      82             :                             OTSStream *out,
      83             :                             const OpenTypeMetricsHeader *header) {
      84           0 :   if (!out->WriteU32(header->version) ||
      85           0 :       !out->WriteS16(header->ascent) ||
      86           0 :       !out->WriteS16(header->descent) ||
      87           0 :       !out->WriteS16(header->linegap) ||
      88           0 :       !out->WriteU16(header->adv_width_max) ||
      89           0 :       !out->WriteS16(header->min_sb1) ||
      90           0 :       !out->WriteS16(header->min_sb2) ||
      91           0 :       !out->WriteS16(header->max_extent) ||
      92           0 :       !out->WriteS16(header->caret_slope_rise) ||
      93           0 :       !out->WriteS16(header->caret_slope_run) ||
      94           0 :       !out->WriteS16(header->caret_offset) ||
      95           0 :       !out->WriteR64(0) ||  // reserved
      96           0 :       !out->WriteS16(0) ||  // metric data format
      97           0 :       !out->WriteU16(header->num_metrics)) {
      98           0 :     return OTS_FAILURE_MSG("Failed to write metrics");
      99             :   }
     100             : 
     101           0 :   return true;
     102             : }
     103             : 
     104           0 : bool ParseMetricsTable(const ots::Font *font,
     105             :                        Buffer *table,
     106             :                        const uint16_t num_glyphs,
     107             :                        const OpenTypeMetricsHeader *header,
     108             :                        OpenTypeMetricsTable *metrics) {
     109             :   // |num_metrics| is a uint16_t, so it's bounded < 65536. This limits that
     110             :   // amount of memory that we'll allocate for this to a sane amount.
     111           0 :   const unsigned num_metrics = header->num_metrics;
     112             : 
     113           0 :   if (num_metrics > num_glyphs) {
     114           0 :     return OTS_FAILURE_MSG("Bad number of metrics %d", num_metrics);
     115             :   }
     116           0 :   if (!num_metrics) {
     117           0 :     return OTS_FAILURE_MSG("No metrics!");
     118             :   }
     119           0 :   const unsigned num_sbs = num_glyphs - num_metrics;
     120             : 
     121           0 :   metrics->entries.reserve(num_metrics);
     122           0 :   for (unsigned i = 0; i < num_metrics; ++i) {
     123           0 :     uint16_t adv = 0;
     124           0 :     int16_t sb = 0;
     125           0 :     if (!table->ReadU16(&adv) || !table->ReadS16(&sb)) {
     126           0 :       return OTS_FAILURE_MSG("Failed to read metric %d", i);
     127             :     }
     128           0 :     metrics->entries.push_back(std::make_pair(adv, sb));
     129             :   }
     130             : 
     131           0 :   metrics->sbs.reserve(num_sbs);
     132           0 :   for (unsigned i = 0; i < num_sbs; ++i) {
     133             :     int16_t sb;
     134           0 :     if (!table->ReadS16(&sb)) {
     135             :       // Some Japanese fonts (e.g., mona.ttf) fail this test.
     136           0 :       return OTS_FAILURE_MSG("Failed to read side bearing %d", i + num_metrics);
     137             :     }
     138           0 :     metrics->sbs.push_back(sb);
     139             :   }
     140             : 
     141           0 :   return true;
     142             : }
     143             : 
     144           0 : bool SerialiseMetricsTable(const ots::Font *font,
     145             :                            OTSStream *out,
     146             :                            const OpenTypeMetricsTable *metrics) {
     147           0 :   for (unsigned i = 0; i < metrics->entries.size(); ++i) {
     148           0 :     if (!out->WriteU16(metrics->entries[i].first) ||
     149           0 :         !out->WriteS16(metrics->entries[i].second)) {
     150           0 :       return OTS_FAILURE_MSG("Failed to write metric %d", i);
     151             :     }
     152             :   }
     153             : 
     154           0 :   for (unsigned i = 0; i < metrics->sbs.size(); ++i) {
     155           0 :     if (!out->WriteS16(metrics->sbs[i])) {
     156           0 :       return OTS_FAILURE_MSG("Failed to write side bearing %ld", i + metrics->entries.size());
     157             :     }
     158             :   }
     159             : 
     160           0 :   return true;
     161             : }
     162             : 
     163             : }  // namespace ots
     164             : 
     165             : #undef TABLE_NAME

Generated by: LCOV version 1.13