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 */ 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; 19 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; 25 } 26 27 bool SkColorPalette::onEvent(const SkEvent& evt) { 28 return this->INHERITED::onEvent(evt); 29 } 30 31 void SkColorPalette::onDraw(SkCanvas* canvas) { 32 canvas->drawColor(SK_ColorWHITE); 33 34 SkPaint paint; 35 paint.setAntiAlias(true); 36 37 canvas->translate(PalettePadding, PalettePadding); 38 39 for (int i = 0; i < PaletteSlots; ++i) { 40 if (fSelected == i) { 41 paint.setStrokeWidth(SkIntToScalar(3)); 42 } 43 else { 44 paint.setStrokeWidth(1); 45 } 46 47 paint.setStyle(SkPaint::kStroke_Style); 48 paint.setColor(SK_ColorBLACK); 49 canvas->drawRect(fSlotRect, paint); 50 paint.setStyle(SkPaint::kFill_Style); 51 paint.setColor(fColors[i]); 52 canvas->drawRect(fSlotRect, paint); 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}; 60 61 SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN, 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}; 64 65 66 SkShader* shader1 = SkGradientShader::CreateLinear(pts, colors, colorPositions,7, 67 SkShader::kMirror_TileMode); 68 paint.setShader(shader1)->unref(); 69 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; 130 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) { 146 float h = cursorPosition.fX/fGradientRect.width(); 147 float s = 1.0 - cursorPosition.fY/fGradientRect.height(); 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))); 158 159 if (_i == 0) { 160 r = v; 161 g = _3; 162 b = _1; 163 } 164 else if (_i == 1) { 165 r = _2; 166 g = v; 167 b = _1; 168 } 169 else if (_i == 2) { 170 r = _1; 171 g = v; 172 b = _3; 173 } 174 else if (_i == 3) { 175 r = _1; 176 g = _2; 177 b = v; 178 } 179 else if (_i == 4) { 180 r = _3; 181 g = _1; 182 b = v; 183 } 184 else { 185 r = v; 186 g = _1; 187 b = _2; 188 }; 189 190 SkColor retval = 0xFF000000; 191 retval += ((int)(r * 255) << 16); 192 retval += ((int)(g * 255) << 8); 193 retval += (int)(b * 255); 194 return retval; 195 } 196