Index: src/views/SkWidgets.cpp |
diff --git a/src/views/SkWidgets.cpp b/src/views/SkWidgets.cpp |
deleted file mode 100644 |
index fc0ffb82b6dc34bfe9da7dd385ad8c4760bf59d8..0000000000000000000000000000000000000000 |
--- a/src/views/SkWidgets.cpp |
+++ /dev/null |
@@ -1,562 +0,0 @@ |
- |
-/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
-#include "SkWidget.h" |
-#include "SkCanvas.h" |
-#include "SkKey.h" |
-#include "SkParsePaint.h" |
-#include "SkSystemEventTypes.h" |
-#include "SkTextBox.h" |
- |
-#if 0 |
- |
-#ifdef SK_DEBUG |
- static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[]) |
- { |
- const char* value = dom.findAttr(node, attr); |
- if (value) |
- SkDebugf("unknown attribute %s=\"%s\"\n", attr, value); |
- } |
-#else |
- #define assert_no_attr(dom, node, attr) |
-#endif |
- |
-#include "SkAnimator.h" |
-#include "SkTime.h" |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-enum SkinType { |
- kPushButton_SkinType, |
- kStaticText_SkinType, |
- |
- kSkinTypeCount |
-}; |
- |
-struct SkinSuite { |
- SkinSuite(); |
- ~SkinSuite() |
- { |
- for (int i = 0; i < kSkinTypeCount; i++) |
- delete fAnimators[i]; |
- } |
- |
- SkAnimator* get(SkinType); |
- |
-private: |
- SkAnimator* fAnimators[kSkinTypeCount]; |
-}; |
- |
-SkinSuite::SkinSuite() |
-{ |
- static const char kSkinPath[] = "skins/"; |
- |
- static const char* gSkinNames[] = { |
- "pushbutton_skin.xml", |
- "statictext_skin.xml" |
- }; |
- |
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gSkinNames); i++) |
- { |
- size_t len = strlen(gSkinNames[i]); |
- SkString path(sizeof(kSkinPath) - 1 + len); |
- |
- memcpy(path.writable_str(), kSkinPath, sizeof(kSkinPath) - 1); |
- memcpy(path.writable_str() + sizeof(kSkinPath) - 1, gSkinNames[i], len); |
- |
- fAnimators[i] = new SkAnimator; |
- if (!fAnimators[i]->decodeURI(path.c_str())) |
- { |
- delete fAnimators[i]; |
- fAnimators[i] = nullptr; |
- } |
- } |
-} |
- |
-SkAnimator* SkinSuite::get(SkinType st) |
-{ |
- SkASSERT((unsigned)st < kSkinTypeCount); |
- return fAnimators[st]; |
-} |
- |
-static SkinSuite* gSkinSuite; |
- |
-static SkAnimator* get_skin_animator(SkinType st) |
-{ |
-#if 0 |
- if (gSkinSuite == nullptr) |
- gSkinSuite = new SkinSuite; |
- return gSkinSuite->get(st); |
-#else |
- return nullptr; |
-#endif |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-void SkWidget::Init() |
-{ |
-} |
- |
-void SkWidget::Term() |
-{ |
- delete gSkinSuite; |
-} |
- |
-void SkWidget::onEnabledChange() |
-{ |
- this->inval(nullptr); |
-} |
- |
-void SkWidget::postWidgetEvent() |
-{ |
- if (!fEvent.isType("") && this->hasListeners()) |
- { |
- this->prepareWidgetEvent(&fEvent); |
- this->postToListeners(fEvent); |
- } |
-} |
- |
-void SkWidget::prepareWidgetEvent(SkEvent*) |
-{ |
- // override in subclass to add any additional fields before posting |
-} |
- |
-void SkWidget::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- |
- if ((node = dom.getFirstChild(node, "event")) != nullptr) |
- fEvent.inflate(dom, node); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-size_t SkHasLabelWidget::getLabel(SkString* str) const |
-{ |
- if (str) |
- *str = fLabel; |
- return fLabel.size(); |
-} |
- |
-size_t SkHasLabelWidget::getLabel(char buffer[]) const |
-{ |
- if (buffer) |
- memcpy(buffer, fLabel.c_str(), fLabel.size()); |
- return fLabel.size(); |
-} |
- |
-void SkHasLabelWidget::setLabel(const SkString& str) |
-{ |
- this->setLabel(str.c_str(), str.size()); |
-} |
- |
-void SkHasLabelWidget::setLabel(const char label[]) |
-{ |
- this->setLabel(label, strlen(label)); |
-} |
- |
-void SkHasLabelWidget::setLabel(const char label[], size_t len) |
-{ |
- if (!fLabel.equals(label, len)) |
- { |
- fLabel.set(label, len); |
- this->onLabelChange(); |
- } |
-} |
- |
-void SkHasLabelWidget::onLabelChange() |
-{ |
- // override in subclass |
-} |
- |
-void SkHasLabelWidget::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- |
- const char* text = dom.findAttr(node, "label"); |
- if (text) |
- this->setLabel(text); |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////// |
- |
-void SkButtonWidget::setButtonState(State state) |
-{ |
- if (fState != state) |
- { |
- fState = state; |
- this->onButtonStateChange(); |
- } |
-} |
- |
-void SkButtonWidget::onButtonStateChange() |
-{ |
- this->inval(nullptr); |
-} |
- |
-void SkButtonWidget::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- |
- int index; |
- if ((index = dom.findList(node, "buttonState", "off,on,unknown")) >= 0) |
- this->setButtonState((State)index); |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////// |
- |
-bool SkPushButtonWidget::onEvent(const SkEvent& evt) |
-{ |
- if (evt.isType(SK_EventType_Key) && evt.getFast32() == kOK_SkKey) |
- { |
- this->postWidgetEvent(); |
- return true; |
- } |
- return this->INHERITED::onEvent(evt); |
-} |
- |
-static const char* computeAnimatorState(int enabled, int focused, SkButtonWidget::State state) |
-{ |
- if (!enabled) |
- return "disabled"; |
- if (state == SkButtonWidget::kOn_State) |
- { |
- SkASSERT(focused); |
- return "enabled-pressed"; |
- } |
- if (focused) |
- return "enabled-focused"; |
- return "enabled"; |
-} |
- |
-#include "SkBlurMask.h" |
-#include "SkBlurMaskFilter.h" |
-#include "SkEmbossMaskFilter.h" |
- |
-static void create_emboss(SkPaint* paint, SkScalar radius, bool focus, bool pressed) |
-{ |
- SkEmbossMaskFilter::Light light; |
- |
- light.fDirection[0] = SK_Scalar1/2; |
- light.fDirection[1] = SK_Scalar1/2; |
- light.fDirection[2] = SK_Scalar1/3; |
- light.fAmbient = 0x48; |
- light.fSpecular = 0x80; |
- |
- if (pressed) |
- { |
- light.fDirection[0] = -light.fDirection[0]; |
- light.fDirection[1] = -light.fDirection[1]; |
- } |
- if (focus) |
- light.fDirection[2] += SK_Scalar1/4; |
- |
- SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius); |
- paint->setMaskFilter(new SkEmbossMaskFilter(sigma, light))->unref(); |
-} |
- |
-void SkPushButtonWidget::onDraw(SkCanvas* canvas) |
-{ |
- this->INHERITED::onDraw(canvas); |
- |
- SkString label; |
- this->getLabel(&label); |
- |
- SkAnimator* anim = get_skin_animator(kPushButton_SkinType); |
- |
- if (anim) |
- { |
- SkEvent evt("user"); |
- |
- evt.setString("id", "prime"); |
- evt.setScalar("prime-width", this->width()); |
- evt.setScalar("prime-height", this->height()); |
- evt.setString("prime-text", label); |
- evt.setString("prime-state", computeAnimatorState(this->isEnabled(), this->hasFocus(), this->getButtonState())); |
- |
- (void)anim->doUserEvent(evt); |
- SkPaint paint; |
- anim->draw(canvas, &paint, SkTime::GetMSecs()); |
- } |
- else |
- { |
- SkRect r; |
- SkPaint p; |
- |
- r.set(0, 0, this->width(), this->height()); |
- p.setAntiAliasOn(true); |
- p.setColor(SK_ColorBLUE); |
- create_emboss(&p, SkIntToScalar(12)/5, this->hasFocus(), this->getButtonState() == kOn_State); |
- canvas->drawRoundRect(r, SkScalarHalf(this->height()), SkScalarHalf(this->height()), p); |
- p.setMaskFilter(nullptr); |
- |
- p.setTextAlign(SkPaint::kCenter_Align); |
- |
- SkTextBox box; |
- box.setMode(SkTextBox::kOneLine_Mode); |
- box.setSpacingAlign(SkTextBox::kCenter_SpacingAlign); |
- box.setBox(0, 0, this->width(), this->height()); |
- |
-// if (this->getButtonState() == kOn_State) |
-// p.setColor(SK_ColorRED); |
-// else |
- p.setColor(SK_ColorWHITE); |
- |
- box.draw(canvas, label.c_str(), label.size(), p); |
- } |
-} |
- |
-SkView::Click* SkPushButtonWidget::onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) |
-{ |
- this->acceptFocus(); |
- return new Click(this); |
-} |
- |
-bool SkPushButtonWidget::onClick(Click* click) |
-{ |
- SkRect r; |
- State state = kOff_State; |
- |
- this->getLocalBounds(&r); |
- if (r.contains(click->fCurr)) |
- { |
- if (click->fState == Click::kUp_State) |
- this->postWidgetEvent(); |
- else |
- state = kOn_State; |
- } |
- this->setButtonState(state); |
- return true; |
-} |
- |
-////////////////////////////////////////////////////////////////////////////////////////// |
- |
-SkStaticTextView::SkStaticTextView(U32 flags) : SkView(flags) |
-{ |
- fMargin.set(0, 0); |
- fMode = kFixedSize_Mode; |
- fSpacingAlign = SkTextBox::kStart_SpacingAlign; |
-} |
- |
-SkStaticTextView::~SkStaticTextView() |
-{ |
-} |
- |
-void SkStaticTextView::computeSize() |
-{ |
- if (fMode == kAutoWidth_Mode) |
- { |
- SkScalar width = fPaint.measureText(fText.c_str(), fText.size(), nullptr, nullptr); |
- this->setWidth(width + fMargin.fX * 2); |
- } |
- else if (fMode == kAutoHeight_Mode) |
- { |
- SkScalar width = this->width() - fMargin.fX * 2; |
- int lines = width > 0 ? SkTextLineBreaker::CountLines(fText.c_str(), fText.size(), fPaint, width) : 0; |
- |
- SkScalar before, after; |
- (void)fPaint.measureText(0, nullptr, &before, &after); |
- |
- this->setHeight(lines * (after - before) + fMargin.fY * 2); |
- } |
-} |
- |
-void SkStaticTextView::setMode(Mode mode) |
-{ |
- SkASSERT((unsigned)mode < kModeCount); |
- |
- if (fMode != mode) |
- { |
- fMode = SkToU8(mode); |
- this->computeSize(); |
- } |
-} |
- |
-void SkStaticTextView::setSpacingAlign(SkTextBox::SpacingAlign align) |
-{ |
- fSpacingAlign = SkToU8(align); |
- this->inval(nullptr); |
-} |
- |
-void SkStaticTextView::getMargin(SkPoint* margin) const |
-{ |
- if (margin) |
- *margin = fMargin; |
-} |
- |
-void SkStaticTextView::setMargin(SkScalar dx, SkScalar dy) |
-{ |
- if (fMargin.fX != dx || fMargin.fY != dy) |
- { |
- fMargin.set(dx, dy); |
- this->computeSize(); |
- this->inval(nullptr); |
- } |
-} |
- |
-size_t SkStaticTextView::getText(SkString* text) const |
-{ |
- if (text) |
- *text = fText; |
- return fText.size(); |
-} |
- |
-size_t SkStaticTextView::getText(char text[]) const |
-{ |
- if (text) |
- memcpy(text, fText.c_str(), fText.size()); |
- return fText.size(); |
-} |
- |
-void SkStaticTextView::setText(const SkString& text) |
-{ |
- this->setText(text.c_str(), text.size()); |
-} |
- |
-void SkStaticTextView::setText(const char text[]) |
-{ |
- this->setText(text, strlen(text)); |
-} |
- |
-void SkStaticTextView::setText(const char text[], size_t len) |
-{ |
- if (!fText.equals(text, len)) |
- { |
- fText.set(text, len); |
- this->computeSize(); |
- this->inval(nullptr); |
- } |
-} |
- |
-void SkStaticTextView::getPaint(SkPaint* paint) const |
-{ |
- if (paint) |
- *paint = fPaint; |
-} |
- |
-void SkStaticTextView::setPaint(const SkPaint& paint) |
-{ |
- if (fPaint != paint) |
- { |
- fPaint = paint; |
- this->computeSize(); |
- this->inval(nullptr); |
- } |
-} |
- |
-void SkStaticTextView::onDraw(SkCanvas* canvas) |
-{ |
- this->INHERITED::onDraw(canvas); |
- |
- if (fText.isEmpty()) |
- return; |
- |
- SkTextBox box; |
- |
- box.setMode(fMode == kAutoWidth_Mode ? SkTextBox::kOneLine_Mode : SkTextBox::kLineBreak_Mode); |
- box.setSpacingAlign(this->getSpacingAlign()); |
- box.setBox(fMargin.fX, fMargin.fY, this->width() - fMargin.fX, this->height() - fMargin.fY); |
- box.draw(canvas, fText.c_str(), fText.size(), fPaint); |
-} |
- |
-void SkStaticTextView::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- |
- int index; |
- if ((index = dom.findList(node, "mode", "fixed,auto-width,auto-height")) >= 0) |
- this->setMode((Mode)index); |
- else |
- assert_no_attr(dom, node, "mode"); |
- |
- if ((index = dom.findList(node, "spacing-align", "start,center,end")) >= 0) |
- this->setSpacingAlign((SkTextBox::SpacingAlign)index); |
- else |
- assert_no_attr(dom, node, "mode"); |
- |
- SkScalar s[2]; |
- if (dom.findScalars(node, "margin", s, 2)) |
- this->setMargin(s[0], s[1]); |
- else |
- assert_no_attr(dom, node, "margin"); |
- |
- const char* text = dom.findAttr(node, "text"); |
- if (text) |
- this->setText(text); |
- |
- if ((node = dom.getFirstChild(node, "paint")) != nullptr) |
- SkPaint_Inflate(&fPaint, dom, node); |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-#include "SkImageDecoder.h" |
- |
-SkBitmapView::SkBitmapView(U32 flags) : SkView(flags) |
-{ |
-} |
- |
-SkBitmapView::~SkBitmapView() |
-{ |
-} |
- |
-bool SkBitmapView::getBitmap(SkBitmap* bitmap) const |
-{ |
- if (bitmap) |
- *bitmap = fBitmap; |
- return fBitmap.colorType() != kUnknown_SkColorType; |
-} |
- |
-void SkBitmapView::setBitmap(const SkBitmap* bitmap, bool viewOwnsPixels) |
-{ |
- if (bitmap) |
- { |
- fBitmap = *bitmap; |
- fBitmap.setOwnsPixels(viewOwnsPixels); |
- } |
-} |
- |
-bool SkBitmapView::loadBitmapFromFile(const char path[]) |
-{ |
- SkBitmap bitmap; |
- |
- if (SkImageDecoder::DecodeFile(path, &bitmap)) |
- { |
- this->setBitmap(&bitmap, true); |
- bitmap.setOwnsPixels(false); |
- return true; |
- } |
- return false; |
-} |
- |
-void SkBitmapView::onDraw(SkCanvas* canvas) |
-{ |
- if (fBitmap.colorType() != kUnknown_SkColorType && |
- fBitmap.width() && fBitmap.height()) |
- { |
- SkAutoCanvasRestore restore(canvas, true); |
- SkPaint p; |
- |
- p.setFilterType(SkPaint::kBilinear_FilterType); |
- canvas->scale( this->width() / fBitmap.width(), |
- this->height() / fBitmap.height(), |
- 0, 0); |
- canvas->drawBitmap(fBitmap, 0, 0, p); |
- } |
-} |
- |
-void SkBitmapView::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- |
- const char* src = dom.findAttr(node, "src"); |
- if (src) |
- (void)this->loadBitmapFromFile(src); |
-} |
- |
-#endif |