gfx/skia/trunk/src/views/animated/SkStaticTextView.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/trunk/src/views/animated/SkStaticTextView.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,191 @@
     1.4 +
     1.5 +/*
     1.6 + * Copyright 2011 Google Inc.
     1.7 + *
     1.8 + * Use of this source code is governed by a BSD-style license that can be
     1.9 + * found in the LICENSE file.
    1.10 + */
    1.11 +#include "SkWidgetViews.h"
    1.12 +#include "SkTextBox.h"
    1.13 +
    1.14 +#ifdef SK_DEBUG
    1.15 +static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[])
    1.16 +{
    1.17 +    const char* value = dom.findAttr(node, attr);
    1.18 +    if (value)
    1.19 +        SkDebugf("unknown attribute %s=\"%s\"\n", attr, value);
    1.20 +}
    1.21 +#else
    1.22 +    #define assert_no_attr(dom, node, attr)
    1.23 +#endif
    1.24 +
    1.25 +SkStaticTextView::SkStaticTextView()
    1.26 +{
    1.27 +    fMargin.set(0, 0);
    1.28 +    fMode = kFixedSize_Mode;
    1.29 +    fSpacingAlign = SkTextBox::kStart_SpacingAlign;
    1.30 +
    1.31 +//    init_skin_paint(kStaticText_SkinEnum, &fPaint);
    1.32 +}
    1.33 +
    1.34 +SkStaticTextView::~SkStaticTextView()
    1.35 +{
    1.36 +}
    1.37 +
    1.38 +void SkStaticTextView::computeSize()
    1.39 +{
    1.40 +    if (fMode == kAutoWidth_Mode)
    1.41 +    {
    1.42 +        SkScalar width = fPaint.measureText(fText.c_str(), fText.size());
    1.43 +        this->setWidth(width + fMargin.fX * 2);
    1.44 +    }
    1.45 +    else if (fMode == kAutoHeight_Mode)
    1.46 +    {
    1.47 +        SkScalar width = this->width() - fMargin.fX * 2;
    1.48 +        int lines = width > 0 ? SkTextLineBreaker::CountLines(fText.c_str(), fText.size(), fPaint, width) : 0;
    1.49 +
    1.50 +        this->setHeight(lines * fPaint.getFontSpacing() + fMargin.fY * 2);
    1.51 +    }
    1.52 +}
    1.53 +
    1.54 +void SkStaticTextView::setMode(Mode mode)
    1.55 +{
    1.56 +    SkASSERT((unsigned)mode < kModeCount);
    1.57 +
    1.58 +    if (fMode != mode)
    1.59 +    {
    1.60 +        fMode = SkToU8(mode);
    1.61 +        this->computeSize();
    1.62 +    }
    1.63 +}
    1.64 +
    1.65 +void SkStaticTextView::setSpacingAlign(SkTextBox::SpacingAlign align)
    1.66 +{
    1.67 +    fSpacingAlign = SkToU8(align);
    1.68 +    this->inval(NULL);
    1.69 +}
    1.70 +
    1.71 +void SkStaticTextView::getMargin(SkPoint* margin) const
    1.72 +{
    1.73 +    if (margin)
    1.74 +        *margin = fMargin;
    1.75 +}
    1.76 +
    1.77 +void SkStaticTextView::setMargin(SkScalar dx, SkScalar dy)
    1.78 +{
    1.79 +    if (fMargin.fX != dx || fMargin.fY != dy)
    1.80 +    {
    1.81 +        fMargin.set(dx, dy);
    1.82 +        this->computeSize();
    1.83 +        this->inval(NULL);
    1.84 +    }
    1.85 +}
    1.86 +
    1.87 +size_t SkStaticTextView::getText(SkString* text) const
    1.88 +{
    1.89 +    if (text)
    1.90 +        *text = fText;
    1.91 +    return fText.size();
    1.92 +}
    1.93 +
    1.94 +size_t SkStaticTextView::getText(char text[]) const
    1.95 +{
    1.96 +    if (text)
    1.97 +        memcpy(text, fText.c_str(), fText.size());
    1.98 +    return fText.size();
    1.99 +}
   1.100 +
   1.101 +void SkStaticTextView::setText(const SkString& text)
   1.102 +{
   1.103 +    this->setText(text.c_str(), text.size());
   1.104 +}
   1.105 +
   1.106 +void SkStaticTextView::setText(const char text[])
   1.107 +{
   1.108 +    if (text == NULL)
   1.109 +        text = "";
   1.110 +    this->setText(text, strlen(text));
   1.111 +}
   1.112 +
   1.113 +void SkStaticTextView::setText(const char text[], size_t len)
   1.114 +{
   1.115 +    if (!fText.equals(text, len))
   1.116 +    {
   1.117 +        fText.set(text, len);
   1.118 +        this->computeSize();
   1.119 +        this->inval(NULL);
   1.120 +    }
   1.121 +}
   1.122 +
   1.123 +void SkStaticTextView::getPaint(SkPaint* paint) const
   1.124 +{
   1.125 +    if (paint)
   1.126 +        *paint = fPaint;
   1.127 +}
   1.128 +
   1.129 +void SkStaticTextView::setPaint(const SkPaint& paint)
   1.130 +{
   1.131 +    if (fPaint != paint)
   1.132 +    {
   1.133 +        fPaint = paint;
   1.134 +        this->computeSize();
   1.135 +        this->inval(NULL);
   1.136 +    }
   1.137 +}
   1.138 +
   1.139 +void SkStaticTextView::onDraw(SkCanvas* canvas)
   1.140 +{
   1.141 +    this->INHERITED::onDraw(canvas);
   1.142 +
   1.143 +    if (fText.isEmpty())
   1.144 +        return;
   1.145 +
   1.146 +    SkTextBox    box;
   1.147 +
   1.148 +    box.setMode(fMode == kAutoWidth_Mode ? SkTextBox::kOneLine_Mode : SkTextBox::kLineBreak_Mode);
   1.149 +    box.setSpacingAlign(this->getSpacingAlign());
   1.150 +    box.setBox(fMargin.fX, fMargin.fY, this->width() - fMargin.fX, this->height() - fMargin.fY);
   1.151 +    box.draw(canvas, fText.c_str(), fText.size(), fPaint);
   1.152 +}
   1.153 +
   1.154 +void SkStaticTextView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
   1.155 +{
   1.156 +if (false) { // avoid bit rot, suppress warning
   1.157 +    this->INHERITED::onInflate(dom, node);
   1.158 +
   1.159 +    int    index;
   1.160 +    if ((index = dom.findList(node, "mode", "fixed,auto-width,auto-height")) >= 0) {
   1.161 +        this->setMode((Mode)index);
   1.162 +    } else {
   1.163 +        assert_no_attr(dom, node, "mode");
   1.164 +    }
   1.165 +
   1.166 +    if ((index = dom.findList(node, "spacing-align", "start,center,end")) >= 0) {
   1.167 +        this->setSpacingAlign((SkTextBox::SpacingAlign)index);
   1.168 +    } else {
   1.169 +        assert_no_attr(dom, node, "spacing-align");
   1.170 +    }
   1.171 +
   1.172 +    SkScalar s[2];
   1.173 +    if (dom.findScalars(node, "margin", s, 2)) {
   1.174 +        this->setMargin(s[0], s[1]);
   1.175 +    } else {
   1.176 +        assert_no_attr(dom, node, "margin");
   1.177 +    }
   1.178 +
   1.179 +    const char* text = dom.findAttr(node, "text");
   1.180 +    if (text) {
   1.181 +        this->setText(text);
   1.182 +    }
   1.183 +
   1.184 +    if ((node = dom.getFirstChild(node, "paint")) != NULL &&
   1.185 +        (node = dom.getFirstChild(node, "screenplay")) != NULL)
   1.186 +    {
   1.187 +// FIXME: Including inflate_paint causes Windows build to fail -- it complains
   1.188 +//  that SKListView::SkListView is undefined.
   1.189 +#if 0
   1.190 +        inflate_paint(dom, node, &fPaint);
   1.191 +#endif
   1.192 +    }
   1.193 +}
   1.194 +}

mercurial