
/*
 * 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 "SkDrawTextBox.h"
#include "SkAnimateMaker.h"
#include "SkCanvas.h"
#include "SkPaint.h"

enum SkDrawTextBox_Properties {
    foo = 100,
    SK_PROPERTY(spacingAlign),
    SK_PROPERTY(mode)
};


#if SK_USE_CONDENSED_INFO == 0

const SkMemberInfo SkDrawTextBox::fInfo[] = {
    SK_MEMBER_INHERITED,
    SK_MEMBER(mode, TextBoxMode),
    SK_MEMBER_ALIAS(spacingAdd, fSpacingAdd, Float),
    SK_MEMBER(spacingAlign, TextBoxAlign),
    SK_MEMBER_ALIAS(spacingMul, fSpacingMul, Float),
    SK_MEMBER_ALIAS(text, fText, String)
};

#endif

DEFINE_GET_MEMBER(SkDrawTextBox);

SkDrawTextBox::SkDrawTextBox()
{
    fSpacingMul     = SK_Scalar1;
    fSpacingAdd     = 0;
    spacingAlign    = SkTextBox::kStart_SpacingAlign;
    mode            = SkTextBox::kLineBreak_Mode;
}

#ifdef SK_DUMP_ENABLED
void SkDrawTextBox::dump(SkAnimateMaker* maker)
{
    dumpBase(maker);
    dumpAttrs(maker);
    if (mode == 0)
        SkDebugf("mode=\"oneLine\" ");
    if (spacingAlign == 1)
        SkDebugf("spacingAlign=\"center\" ");
    else if (spacingAlign == 2)
        SkDebugf("spacingAlign=\"end\" ");
    SkDebugf("/>\n");
}
#endif

bool SkDrawTextBox::getProperty(int index, SkScriptValue* value) const
{
    return this->INHERITED::getProperty(index, value);
}

bool SkDrawTextBox::setProperty(int index, SkScriptValue& scriptValue)
{
    return this->INHERITED::setProperty(index, scriptValue);
}

bool SkDrawTextBox::draw(SkAnimateMaker& maker)
{
    SkTextBox   box;
    box.setMode((SkTextBox::Mode) mode);
    box.setSpacingAlign((SkTextBox::SpacingAlign) spacingAlign);
    box.setBox(fRect);
    box.setSpacing(fSpacingMul, fSpacingAdd);
    SkBoundableAuto boundable(this, maker);
    box.draw(maker.fCanvas, fText.c_str(), fText.size(), *maker.fPaint);
    return false;
}
