1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2011 Google Inc. 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkWidget.h" 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkCanvas.h" 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkInterpolator.h" 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkTime.h" 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkParsePaint.h" 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if 0 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkWidgetView::SkWidgetView(U32 flags) : SkView(flags) 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkWidgetView::~SkWidgetView() 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerconst char* SkWidgetView::GetEventType() 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return "SkWidgetView"; 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger///////////////////////////////////////////////////////////////////////////// 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger///////////////////////////////////////////////////////////////////////////// 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkTextView::Interp { 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Interp(const SkString& old, SkMSec now, SkMSec dur, AnimaDir dir) : fOldText(old), fInterp(1, 2) 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar x = 0; 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fInterp.setKeyFrame(0, now, &x, 0); 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger x = SK_Scalar1; 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (dir == kBackward_AnimDir) 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger x = -x; 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fInterp.setKeyFrame(1, now + dur, &x); 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool draw(SkCanvas* canvas, const SkString& newText, SkScalar x, SkScalar y, SkPaint& paint) 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar scale; 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fInterp.timeToValues(SkTime::GetMSecs(), &scale) == SkInterpolator::kFreezeEnd_Result) 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawText(newText.c_str(), newText.size(), x, y, paint); 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return false; 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger else 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger U8 alpha = paint.getAlpha(); 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar above, below; 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (void)paint.measureText(NULL, 0, &above, &below); 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar height = below - above; 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar dy = SkScalarMul(height, scale); 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (scale < 0) 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger height = -height; 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // draw the old 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger paint.setAlpha((U8)SkScalarMul(alpha, SK_Scalar1 - SkScalarAbs(scale))); 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawText(fOldText.c_str(), fOldText.size(), x, y - dy, paint); 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // draw the new 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger paint.setAlpha((U8)SkScalarMul(alpha, SkScalarAbs(scale))); 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawText(newText.c_str(), newText.size(), x, y + height - dy, paint); 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // restore the paint 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger paint.setAlpha(alpha); 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return true; 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkString fOldText; 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkInterpolator fInterp; 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkTextView::SkTextView(U32 flags) : SkView(flags), fInterp(NULL), fDoInterp(false) 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fMargin.set(0, 0); 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkTextView::~SkTextView() 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger delete fInterp; 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::getText(SkString* str) const 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (str) 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger str->set(fText); 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::setText(const char text[], AnimaDir dir) 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (!fText.equals(text)) 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkString tmp(text); 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->privSetText(tmp, dir); 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::setText(const char text[], size_t len, AnimaDir dir) 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (!fText.equals(text)) 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkString tmp(text, len); 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->privSetText(tmp, dir); 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::setText(const SkString& src, AnimaDir dir) 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fText != src) 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->privSetText(src, dir); 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::privSetText(const SkString& src, AnimaDir dir) 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fText != src); 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fDoInterp) 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fInterp) 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger delete fInterp; 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fInterp = new Interp(fText, SkTime::GetMSecs(), 500, dir); 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fText = src; 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->inval(NULL); 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger///////////////////////////////////////////////////////////////// 133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::getMargin(SkPoint* margin) const 135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (margin) 137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *margin = fMargin; 138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::setMargin(const SkPoint& margin) 141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fMargin != margin) 143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fMargin = margin; 145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->inval(NULL); 146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::onDraw(SkCanvas* canvas) 150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->INHERITED::onDraw(canvas); 152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fText.size() == 0) 154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return; 155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint::Align align = fPaint.getTextAlign(); 157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar x, y; 158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger switch (align) { 160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger case SkPaint::kLeft_Align: 161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger x = fMargin.fX; 162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger break; 163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger case SkPaint::kCenter_Align: 164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger x = SkScalarHalf(this->width()); 165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger break; 166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger default: 167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(align == SkPaint::kRight_Align); 168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger x = this->width() - fMargin.fX; 169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger break; 170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fPaint.measureText(NULL, 0, &y, NULL); 173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger y = fMargin.fY - y; 174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fInterp) 176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fInterp->draw(canvas, fText, x, y, fPaint)) 178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->inval(NULL); 179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger else 180f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 181f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger delete fInterp; 182f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fInterp = NULL; 183f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 184f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 185f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger else 186f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawText(fText.c_str(), fText.size(), x, y, fPaint); 187f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 188f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 189f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger////////////////////////////////////////////////////////////////////////////////////// 190f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 191f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkTextView::onInflate(const SkDOM& dom, const SkDOM::Node* node) 192f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 193f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->INHERITED::onInflate(dom, node); 194f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 195f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const char* text = dom.findAttr(node, "text"); 196f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (text) 197f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->setText(text); 198f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 199f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPoint margin; 200f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (dom.findScalars(node, "margin", (SkScalar*)&margin, 2)) 201f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->setMargin(margin); 202f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (void)dom.findBool(node, "do-interp", &fDoInterp); 203f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 204f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint_Inflate(&fPaint, dom, node); 205f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 206f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 207f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger////////////////////////////////////////////////////////////////////////////////////// 208f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 209f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkSliderView::SkSliderView(U32 flags) : SkWidgetView(flags) 210f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 211f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fValue = 0; 212f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fMax = 0; 213f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 214f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 215f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerstatic U16 actual_value(U16CPU value, U16CPU max) 216f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 217f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return SkToU16(SkMax32(0, SkMin32(value, max))); 218f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 219f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 220f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkSliderView::setMax(U16CPU max) 221f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 222f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fMax != max) 223f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 224f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fMax = SkToU16(max); 225f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fValue > 0) 226f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->inval(NULL); 227f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 228f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 229f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 230f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkSliderView::setValue(U16CPU value) 231f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 232f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fValue != value) 233f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 234f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger U16 prev = actual_value(fValue, fMax); 235f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger U16 next = actual_value(value, fMax); 236f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 237f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fValue = SkToU16(value); 238f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (prev != next) 239f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 240f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->inval(NULL); 241f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 242f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (this->hasListeners()) 243f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 244f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent evt; 245f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 246f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger evt.setType(SkWidgetView::GetEventType()); 247f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger evt.setFast32(this->getSinkID()); 248f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger evt.setS32("sliderValue", next); 249f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->postToListeners(evt); 250f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 251f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 252f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 253f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 254f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 255f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkGradientShader.h" 256f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 257f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerstatic void setgrad(SkPaint* paint, const SkRect& r) 258f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 259f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPoint pts[2]; 260f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkColor colors[2]; 261f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 262f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if 0 263f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger pts[0].set(r.fLeft, r.fTop); 264f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger pts[1].set(r.fLeft + r.height(), r.fBottom); 265f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else 266f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger pts[0].set(r.fRight, r.fBottom); 267f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger pts[1].set(r.fRight - r.height(), r.fTop); 268f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 269f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger colors[0] = SK_ColorBLUE; 270f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger colors[1] = SK_ColorWHITE; 271f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 272f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger paint->setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kMirror_TileMode))->unref(); 273f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 274f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 275f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkSliderView::onDraw(SkCanvas* canvas) 276f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 277f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->INHERITED::onDraw(canvas); 278f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 279f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger U16CPU value = SkMax32(0, SkMin32(fValue, fMax)); 280f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 281f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRect r; 282f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint p; 283f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 284f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.set(0, 0, this->width(), this->height()); 285f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 286f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger p.setAntiAliasOn(true); 287f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger p.setStyle(SkPaint::kStroke_Style); 288f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger p.setStrokeWidth(SK_Scalar1); 289f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.inset(SK_Scalar1/2, SK_Scalar1/2); 290f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawRect(r, p); 291f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 292f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fMax) 293f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 294f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkFixed percent = SkFixedDiv(value, fMax); 295f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 296f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.inset(SK_Scalar1/2, SK_Scalar1/2); 297f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.fRight = r.fLeft + SkScalarMul(r.width(), SkFixedToScalar(percent)); 298f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger p.setStyle(SkPaint::kFill_Style); 299f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger setgrad(&p, r); 300f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawRect(r, p); 301f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 302f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 303f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if 0 304f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.set(0, 0, this->width(), this->height()); 305f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.inset(SK_Scalar1, SK_Scalar1); 306f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger r.inset(r.width()/2, 0); 307f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger p.setColor(SK_ColorBLACK); 308f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger canvas->drawLine(*(SkPoint*)&r.fLeft, *(SkPoint*)&r.fRight, p); 309f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 310f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 311f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 312f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkView::Click* SkSliderView::onFindClickHandler(SkScalar x, SkScalar y) 313f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 314f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return new Click(this); 315f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 316f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 317f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkSliderView::onClick(Click* click) 318f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 319f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fMax) 320f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 321f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar percent = SkScalarDiv(click->fCurr.fX + SK_Scalar1, this->width() - SK_Scalar1*2); 322f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger percent = SkMaxScalar(0, SkMinScalar(percent, SK_Scalar1)); 323f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->setValue(SkScalarRound(percent * fMax)); 324f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return true; 325f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 326f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return false; 327f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 328f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 329f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 330f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 331