epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 1 | |
| 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.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 8 | #include "SkView.h" |
| 9 | #include "SkCanvas.h" |
| 10 | #include "SkPaint.h" |
| 11 | #include "SkGradientShader.h" |
| 12 | #include "SkColorPalette.h" |
| 13 | |
| 14 | SkColorPalette::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.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 19 | |
yangsu@google.com | f3493f0 | 2011-08-08 15:12:05 +0000 | [diff] [blame] | 20 | 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.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | bool SkColorPalette::onEvent(const SkEvent& evt) { |
| 28 | return this->INHERITED::onEvent(evt); |
| 29 | } |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 30 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 31 | void SkColorPalette::onDraw(SkCanvas* canvas) { |
yangsu@google.com | f3493f0 | 2011-08-08 15:12:05 +0000 | [diff] [blame] | 32 | canvas->drawColor(SK_ColorWHITE); |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 33 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 34 | SkPaint paint; |
| 35 | paint.setAntiAlias(true); |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 36 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 37 | canvas->translate(PalettePadding, PalettePadding); |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 38 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 39 | for (int i = 0; i < PaletteSlots; ++i) { |
| 40 | if (fSelected == i) { |
| 41 | paint.setStrokeWidth(SkIntToScalar(3)); |
| 42 | } |
| 43 | else { |
yangsu@google.com | f3493f0 | 2011-08-08 15:12:05 +0000 | [diff] [blame] | 44 | paint.setStrokeWidth(1); |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 45 | } |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 46 | |
yangsu@google.com | f3493f0 | 2011-08-08 15:12:05 +0000 | [diff] [blame] | 47 | paint.setStyle(SkPaint::kStroke_Style); |
| 48 | paint.setColor(SK_ColorBLACK); |
| 49 | canvas->drawRect(fSlotRect, paint); |
| 50 | paint.setStyle(SkPaint::kFill_Style); |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 51 | paint.setColor(fColors[i]); |
| 52 | canvas->drawRect(fSlotRect, paint); |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 53 | 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.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 60 | |
| 61 | SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN, |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 62 | 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.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 64 | |
| 65 | |
| 66 | SkShader* shader1 = SkGradientShader::CreateLinear(pts, colors, colorPositions,7, |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 67 | SkShader::kMirror_TileMode); |
| 68 | paint.setShader(shader1)->unref(); |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 69 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 70 | canvas->drawRect(fGradientRect, paint); |
| 71 | |
| 72 | //this->INHERITED::onDraw(canvas); |
| 73 | } |
| 74 | |
| 75 | SkView::Click* SkColorPalette::onFindClickHandler(SkScalar x, SkScalar y) { |
| 76 | return new Click(this); |
| 77 | } |
| 78 | |
| 79 | bool 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 | |
| 120 | void SkColorPalette::onSizeChange() { |
| 121 | fGradientRect = SkRect::MakeWH(this->width() - 2*PalettePadding, |
| 122 | this->width() - 2*PalettePadding); |
| 123 | this->INHERITED::onSizeChange(); |
| 124 | } |
| 125 | |
| 126 | int SkColorPalette::selectSlot(SkPoint& cursorPosition) { |
| 127 | //account for padding |
| 128 | cursorPosition.fX -= PalettePadding; |
| 129 | cursorPosition.fY -= PalettePadding; |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 130 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 131 | 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 | |
| 145 | SkColor SkColorPalette::selectColorFromGradient(SkPoint& cursorPosition) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 146 | float h = cursorPosition.fX/fGradientRect.width(); |
| 147 | float s = 1.0 - cursorPosition.fY/fGradientRect.height(); |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 148 | 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.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 158 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 159 | if (_i == 0) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 160 | r = v; |
| 161 | g = _3; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 162 | b = _1; |
| 163 | } |
| 164 | else if (_i == 1) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 165 | r = _2; |
| 166 | g = v; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 167 | b = _1; |
| 168 | } |
| 169 | else if (_i == 2) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 170 | r = _1; |
| 171 | g = v; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 172 | b = _3; |
| 173 | } |
| 174 | else if (_i == 3) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 175 | r = _1; |
| 176 | g = _2; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 177 | b = v; |
| 178 | } |
| 179 | else if (_i == 4) { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 180 | r = _3; |
| 181 | g = _1; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 182 | b = v; |
| 183 | } |
| 184 | else { |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 185 | r = v; |
| 186 | g = _1; |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 187 | b = _2; |
| 188 | }; |
rmistry@google.com | d6176b0 | 2012-08-23 18:14:13 +0000 | [diff] [blame] | 189 | |
yangsu@google.com | c5aeccd | 2011-07-17 14:42:08 +0000 | [diff] [blame] | 190 | 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.com | bda03db | 2012-08-14 20:27:54 +0000 | [diff] [blame] | 195 | } |