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