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 +}