blob: f2776af4ffae75a8cd6c1f85efe7131a3a1ba0b7 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
yangsu@google.comc5aeccd2011-07-17 14:42:08 +00008#include "SkView.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkGradientShader.h"
12#include "SkColorPalette.h"
13
14SkColorPalette::SkColorPalette() {
15 fSlotRect = SkRect::MakeWH(SkIntToScalar(50), SkIntToScalar(20));
16 fGradientRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
17 fSelected = 0;
18 fCurrColor = 0xFF000000;
rmistry@google.comd6176b02012-08-23 18:14:13 +000019
yangsu@google.comf3493f02011-08-08 15:12:05 +000020 fColors[0] = SK_ColorWHITE;
21 fColors[1] = SK_ColorBLACK;
22 fColors[2] = SK_ColorRED;
23 fColors[3] = SK_ColorGREEN;
24 fColors[4] = SK_ColorBLUE;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000025}
26
27bool SkColorPalette::onEvent(const SkEvent& evt) {
28 return this->INHERITED::onEvent(evt);
29}
rmistry@google.comd6176b02012-08-23 18:14:13 +000030
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000031void SkColorPalette::onDraw(SkCanvas* canvas) {
yangsu@google.comf3493f02011-08-08 15:12:05 +000032 canvas->drawColor(SK_ColorWHITE);
rmistry@google.comd6176b02012-08-23 18:14:13 +000033
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000034 SkPaint paint;
35 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +000036
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000037 canvas->translate(PalettePadding, PalettePadding);
rmistry@google.comd6176b02012-08-23 18:14:13 +000038
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000039 for (int i = 0; i < PaletteSlots; ++i) {
40 if (fSelected == i) {
41 paint.setStrokeWidth(SkIntToScalar(3));
42 }
43 else {
yangsu@google.comf3493f02011-08-08 15:12:05 +000044 paint.setStrokeWidth(1);
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000045 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000046
yangsu@google.comf3493f02011-08-08 15:12:05 +000047 paint.setStyle(SkPaint::kStroke_Style);
48 paint.setColor(SK_ColorBLACK);
49 canvas->drawRect(fSlotRect, paint);
50 paint.setStyle(SkPaint::kFill_Style);
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000051 paint.setColor(fColors[i]);
52 canvas->drawRect(fSlotRect, paint);
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000053 canvas->translate(0, fSlotRect.height() + PalettePadding);
54 }
55 paint.setStrokeWidth(0);
56 canvas->translate(0, PalettePadding);
57 SkPoint p = SkPoint::Make(0,0);
58 SkPoint q = SkPoint::Make(this->width(), 0);
59 SkPoint pts[] = {p, q};
rmistry@google.comd6176b02012-08-23 18:14:13 +000060
61 SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN,
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000062 SK_ColorCYAN, SK_ColorBLUE, SK_ColorMAGENTA,SK_ColorRED};
63 SkScalar colorPositions[] = { 0, 0.2, 0.4, 0.5, 0.6, 0.8, 1.0};
rmistry@google.comd6176b02012-08-23 18:14:13 +000064
65
66 SkShader* shader1 = SkGradientShader::CreateLinear(pts, colors, colorPositions,7,
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000067 SkShader::kMirror_TileMode);
68 paint.setShader(shader1)->unref();
rmistry@google.comd6176b02012-08-23 18:14:13 +000069
yangsu@google.comc5aeccd2011-07-17 14:42:08 +000070 canvas->drawRect(fGradientRect, paint);
71
72 //this->INHERITED::onDraw(canvas);
73}
74
75SkView::Click* SkColorPalette::onFindClickHandler(SkScalar x, SkScalar y) {
76 return new Click(this);
77}
78
79bool SkColorPalette::onClick(SkView::Click* click) {
80 SkPoint curr = click->fCurr;
81 //SkDebugf("click %f %f \n", curr.fX, curr.fY);
82 int selected = selectSlot(curr);
83 if (selected >= 0) {
84 switch (click->fState) {
85 case SkView::Click::kDown_State:
86 case SkView::Click::kMoved_State:
87 case SkView::Click::kUp_State:
88 fSelected = selected;
89 fCurrColor = fColors[fSelected];
90 break;
91 default:
92 break;
93 }
94 return true;
95 }
96 else{
97 //account for padding
98 curr.fX -= PalettePadding;
99 curr.fY -= 2 * PalettePadding + (fSlotRect.height() + PalettePadding) * PaletteSlots;
100 if (curr.fX < 0 || curr.fX > fGradientRect.width() ||
101 curr.fY < 0 || curr.fY > fGradientRect.height()) {
102 return false;
103 }
104 else {
105 switch (click->fState) {
106 case SkView::Click::kDown_State:
107 case SkView::Click::kMoved_State:
108 case SkView::Click::kUp_State:
109 fColors[fSelected] = selectColorFromGradient(curr);
110 fCurrColor = fColors[fSelected];
111 break;
112 default:
113 break;
114 }
115 return true;
116 }
117 }
118}
119
120void SkColorPalette::onSizeChange() {
121 fGradientRect = SkRect::MakeWH(this->width() - 2*PalettePadding,
122 this->width() - 2*PalettePadding);
123 this->INHERITED::onSizeChange();
124}
125
126int SkColorPalette::selectSlot(SkPoint& cursorPosition) {
127 //account for padding
128 cursorPosition.fX -= PalettePadding;
129 cursorPosition.fY -= PalettePadding;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000130
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000131 if (cursorPosition.fX < 0 || cursorPosition.fX > fSlotRect.width() ||
132 cursorPosition.fY < 0 || cursorPosition.fY > (fSlotRect.height() + PalettePadding) * PaletteSlots) {
133 return -1;
134 }
135 int index = cursorPosition.fY/(fSlotRect.height() + PalettePadding);
136 int offset = (int)cursorPosition.fY%((int)fSlotRect.height() + PalettePadding);
137 if (offset <= fSlotRect.height()) {
138 return index;
139 }
140 else {
141 return -1;
142 }
143}
144
145SkColor SkColorPalette::selectColorFromGradient(SkPoint& cursorPosition) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000146 float h = cursorPosition.fX/fGradientRect.width();
147 float s = 1.0 - cursorPosition.fY/fGradientRect.height();
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000148 float v = 1.0;
149 float _h,r,g,b;
150 float _1, _2, _3;
151 int _i;
152
153 _h = h * 6;
154 _i = (int)_h;
155 _1 = v * (1 - s);
156 _2 = v * (1 - s * (_h - _i));
157 _3 = v * (1 - s * (1 - (_h - _i)));
rmistry@google.comd6176b02012-08-23 18:14:13 +0000158
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000159 if (_i == 0) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000160 r = v;
161 g = _3;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000162 b = _1;
163 }
164 else if (_i == 1) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000165 r = _2;
166 g = v;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000167 b = _1;
168 }
169 else if (_i == 2) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000170 r = _1;
171 g = v;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000172 b = _3;
173 }
174 else if (_i == 3) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000175 r = _1;
176 g = _2;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000177 b = v;
178 }
179 else if (_i == 4) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000180 r = _3;
181 g = _1;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000182 b = v;
183 }
184 else {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000185 r = v;
186 g = _1;
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000187 b = _2;
188 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000189
yangsu@google.comc5aeccd2011-07-17 14:42:08 +0000190 SkColor retval = 0xFF000000;
191 retval += ((int)(r * 255) << 16);
192 retval += ((int)(g * 255) << 8);
193 retval += (int)(b * 255);
194 return retval;
rmistry@google.combda03db2012-08-14 20:27:54 +0000195}