#include "SkBenchmark.h"
#include "SkPaint.h"
#include "SkParse.h"

template BenchRegistry* BenchRegistry::gHead;

SkBenchmark::SkBenchmark(void* defineDict) {
    fDict = reinterpret_cast<const SkTDict<const char*>*>(defineDict);
    fForceAlpha = 0xFF;
    fForceAA = true;
    fDither = SkTriState::kDefault;
}

const char* SkBenchmark::getName() {
    return this->onGetName();
}

SkIPoint SkBenchmark::getSize() {
    return this->onGetSize();
}

void SkBenchmark::draw(SkCanvas* canvas) {
    this->onDraw(canvas);
}

void SkBenchmark::setupPaint(SkPaint* paint) {
    paint->setAlpha(fForceAlpha);
    paint->setAntiAlias(fForceAA);
    paint->setFilterBitmap(fForceFilter);

    if (SkTriState::kDefault != fDither) {
        paint->setDither(SkTriState::kTrue == fDither);
    }
}

const char* SkBenchmark::findDefine(const char* key) const {
    if (fDict) {
        const char* value;
        if (fDict->find(key, &value)) {
            return value;
        }
    }
    return NULL;
}

bool SkBenchmark::findDefine32(const char* key, int32_t* value) const {
    const char* valueStr = this->findDefine(key);
    if (valueStr) {
        SkParse::FindS32(valueStr, value);
        return true;
    }
    return false;
}

bool SkBenchmark::findDefineScalar(const char* key, SkScalar* value) const {
    const char* valueStr = this->findDefine(key);
    if (valueStr) {
        SkParse::FindScalar(valueStr, value);
        return true;
    }
    return false;
}

///////////////////////////////////////////////////////////////////////////////

SkIPoint SkBenchmark::onGetSize() {
    return SkIPoint::Make(640, 480);
}
