/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkPaintPart.h"
#include "SkDrawPaint.h"
#ifdef SK_DUMP_ENABLED
#include "SkDisplayList.h"
#include "SkDump.h"
#endif

SkPaintPart::SkPaintPart() : fPaint(nullptr) {
}

SkDisplayable* SkPaintPart::getParent() const {
    return fPaint;
}

bool SkPaintPart::setParent(SkDisplayable* parent) {
    SkASSERT(parent != nullptr);
    if (parent->isPaint() == false)
        return true;
    fPaint = (SkDrawPaint*) parent;
    return false;
}


// SkDrawMaskFilter
bool SkDrawMaskFilter::add() {
    if (fPaint->maskFilter != (SkDrawMaskFilter*) -1)
        return true;
    fPaint->maskFilter = this;
    fPaint->fOwnsMaskFilter = true;
    return false;
}

SkMaskFilter* SkDrawMaskFilter::getMaskFilter() {
    return nullptr;
}


// SkDrawPathEffect
bool SkDrawPathEffect::add() {
    if (fPaint->isPaint()) {
        if (fPaint->pathEffect != (SkDrawPathEffect*) -1)
            return true;
        fPaint->pathEffect = this;
        fPaint->fOwnsPathEffect = true;
        return false;
    }
    fPaint->add(nullptr, this);
    return false;
}

SkPathEffect* SkDrawPathEffect::getPathEffect() {
    return nullptr;
}


// SkDrawShader
SkShader* SkDrawShader::getShader() {
    return nullptr;
}


// Typeface
#if SK_USE_CONDENSED_INFO == 0

const SkMemberInfo SkDrawTypeface::fInfo[] = {
    SK_MEMBER(fontName, String),
    SK_MEMBER(style, FontStyle)
};

#endif

DEFINE_GET_MEMBER(SkDrawTypeface);

SkDrawTypeface::SkDrawTypeface() : style (SkTypeface::kNormal){
}

bool SkDrawTypeface::add() {
    if (fPaint->typeface != (SkDrawTypeface*) -1)
        return true;
    fPaint->typeface = this;
    fPaint->fOwnsTypeface = true;
    return false;
}

#ifdef SK_DUMP_ENABLED
void SkDrawTypeface::dump(SkAnimateMaker*) {
    SkDebugf("%*s<typeface fontName=\"%s\" ", SkDisplayList::fIndent, "", fontName.c_str());
    SkString string;
    SkDump::GetEnumString(SkType_FontStyle, style, &string);
    SkDebugf("style=\"%s\" />\n", string.c_str());
}
#endif
