Home | History | Annotate | Download | only in utils
      1 #include "SkEndian.h"
      2 #include "SkSfntUtils.h"
      3 
      4 static uint16_t parse_be16(const uint8_t*& p) {
      5     uint16_t value = (p[0] << 8) | p[1];
      6     p += 2;
      7     return value;
      8 }
      9 
     10 static uint32_t parse_be32(const uint8_t*& p) {
     11     uint32_t value = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
     12     p += 4;
     13     return value;
     14 }
     15 
     16 static Sk64 parse_be64(const uint8_t*& p) {
     17     Sk64 value;
     18     value.fHi = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
     19     value.fLo = (p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7];
     20     p += 8;
     21     return value;
     22 }
     23 
     24 ///////////////////////////////////////////////////////////////////////////////
     25 
     26 bool SkSfntUtils::ReadTable_head(SkFontID fontID, SkSfntTable_head* head) {
     27     static const uint32_t gTag = SkSetFourByteTag('h', 'e', 'a', 'd');
     28     static const size_t gSize = 54;
     29 
     30     uint8_t storage[gSize];
     31     size_t size = SkFontHost::GetTableData(fontID, gTag, 0, gSize, storage);
     32     if (size != gSize) {
     33         return false;
     34     }
     35 
     36     const uint8_t* p = storage;
     37     head->fVersion = parse_be32(p);
     38     head->fRevision = parse_be32(p);
     39     head->fCheckSumAdjustment = parse_be32(p);
     40     head->fMagicNumber = parse_be32(p);
     41     head->fFlags = parse_be16(p);
     42     head->fUnitsPerEm = parse_be16(p);
     43     head->fDateCreated = parse_be64(p);
     44     head->fDateModified = parse_be64(p);
     45     head->fXMin = parse_be16(p);
     46     head->fXMin = parse_be16(p);
     47     head->fXMin = parse_be16(p);
     48     head->fXMin = parse_be16(p);
     49     head->fMacStyle = parse_be16(p);
     50     head->fLowestPPEM = parse_be16(p);
     51     head->fFontDirectionHint = parse_be16(p);
     52     head->fIndexToLocFormat = parse_be16(p);
     53     head->fGlyphDataFormat = parse_be16(p);
     54     SkASSERT(p - storage == (long)size);
     55     return true;
     56 }
     57 
     58 bool SkSfntUtils::ReadTable_maxp(SkFontID fontID, SkSfntTable_maxp* maxp) {
     59     static const uint32_t gTag = SkSetFourByteTag('m', 'a', 'x', 'p');
     60     static const size_t gSize = 32;
     61 
     62     uint8_t storage[gSize];
     63     size_t size = SkFontHost::GetTableData(fontID, gTag, 0, gSize, storage);
     64     if (size != gSize) {
     65         return false;
     66     }
     67 
     68     const uint8_t* p = storage;
     69     maxp->fVersion = parse_be32(p);
     70     maxp->fNumGlyphs = parse_be16(p);
     71     maxp->fMaxPoints = parse_be16(p);
     72     maxp->fMaxContours = parse_be16(p);
     73     maxp->fMaxComponentPoints = parse_be16(p);
     74     maxp->fMaxComponentContours = parse_be16(p);
     75     maxp->fMaxZones = parse_be16(p);
     76     maxp->fMaxTwilightPoints = parse_be16(p);
     77     maxp->fMaxStorage = parse_be16(p);
     78     maxp->fMaxFunctionDefs = parse_be16(p);
     79     maxp->fMaxInstructionDefs = parse_be16(p);
     80     maxp->fMaxStackElements = parse_be16(p);
     81     maxp->fMaxSizeOfInstructions = parse_be16(p);
     82     maxp->fMaxComponentElements = parse_be16(p);
     83     maxp->fMaxComponentDepth = parse_be16(p);
     84     SkASSERT(p - storage == (long)size);
     85     return true;
     86 }
     87 
     88