/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "Minikin"

#include "MinikinFontForTest.h"

#include <minikin/MinikinFont.h>

#include <SkTypeface.h>

#include <log/log.h>

MinikinFontForTest::MinikinFontForTest(const std::string& font_path) :
    MinikinFontForTest(font_path, SkTypeface::CreateFromFile(font_path.c_str())) {
}

MinikinFontForTest::MinikinFontForTest(const std::string& font_path, SkTypeface* typeface) :
    MinikinFont(typeface->uniqueID()),
    mTypeface(typeface),
    mFontPath(font_path) {
}

MinikinFontForTest::~MinikinFontForTest() {
}

float MinikinFontForTest::GetHorizontalAdvance(uint32_t /* glyph_id */,
        const android::MinikinPaint& /* paint */) const {
    LOG_ALWAYS_FATAL("MinikinFontForTest::GetHorizontalAdvance is not yet implemented");
    return 0.0f;
}

void MinikinFontForTest::GetBounds(android::MinikinRect* /* bounds */, uint32_t /* glyph_id */,
        const android::MinikinPaint& /* paint */) const {
    LOG_ALWAYS_FATAL("MinikinFontForTest::GetBounds is not yet implemented");
}

const void* MinikinFontForTest::GetTable(uint32_t tag, size_t* size,
        android::MinikinDestroyFunc* destroy) {
    const size_t tableSize = mTypeface->getTableSize(tag);
    *size = tableSize;
    if (tableSize == 0) {
        return nullptr;
    }
    void* buf = malloc(tableSize);
    if (buf == nullptr) {
        return nullptr;
    }
    mTypeface->getTableData(tag, 0, tableSize, buf);
    *destroy = free;
    return buf;
}
