19cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien/* 29cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Copyright (C) 2013 The Android Open Source Project 39cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 49cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Licensed under the Apache License, Version 2.0 (the "License"); 59cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * you may not use this file except in compliance with the License. 69cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * You may obtain a copy of the License at 79cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 89cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * http://www.apache.org/licenses/LICENSE-2.0 99cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * 109cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Unless required by applicable law or agreed to in writing, software 119cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * distributed under the License is distributed on an "AS IS" BASIS, 129cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * See the License for the specific language governing permissions and 149cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * limitations under the License. 159cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien */ 169cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 179cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include <stdlib.h> 189cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include <stdint.h> 199cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 209cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include <minikin/AnalyzeStyle.h> 219cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 229cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Leviennamespace android { 239cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 249cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien// should we have a single FontAnalyzer class this stuff lives in, to avoid dup? 259cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levienstatic int32_t readU16(const uint8_t* data, size_t offset) { 269cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien return data[offset] << 8 | data[offset + 1]; 279cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien} 289cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 299cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levienbool analyzeStyle(const uint8_t* os2_data, size_t os2_size, int* weight, bool* italic) { 309cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien const size_t kUsWeightClassOffset = 4; 319cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien const size_t kFsSelectionOffset = 62; 329cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien const uint16_t kItalicFlag = (1 << 0); 339cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien if (os2_size < kFsSelectionOffset + 2) { 349cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien return false; 359cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien } 369cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien uint16_t weightClass = readU16(os2_data, kUsWeightClassOffset); 379cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *weight = weightClass / 100; 389cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien uint16_t fsSelection = readU16(os2_data, kFsSelectionOffset); 399cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *italic = (fsSelection & kItalicFlag) != 0; 409cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien return true; 419cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien} 429cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien 439cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien} // namespace android 44