/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkView.h"
#include "SkCanvas.h"
#include "SkPaint.h"
#include "SkGradientShader.h"
#include "SkColorPalette.h"
SkColorPalette::SkColorPalette() {
fSlotRect = SkRect::MakeWH(SkIntToScalar(50), SkIntToScalar(20));
fGradientRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
fSelected = 0;
fCurrColor = 0xFF000000;
fColors[0] = SK_ColorWHITE;
fColors[1] = SK_ColorBLACK;
fColors[2] = SK_ColorRED;
fColors[3] = SK_ColorGREEN;
fColors[4] = SK_ColorBLUE;
}
bool SkColorPalette::onEvent(const SkEvent& evt) {
return this->INHERITED::onEvent(evt);
}
void SkColorPalette::onDraw(SkCanvas* canvas) {
canvas->drawColor(SK_ColorWHITE);
SkPaint paint;
paint.setAntiAlias(true);
canvas->translate(PalettePadding, PalettePadding);
for (int i = 0; i < PaletteSlots; ++i) {
if (fSelected == i) {
paint.setStrokeWidth(SkIntToScalar(3));
}
else {
paint.setStrokeWidth(1);
}
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(SK_ColorBLACK);
canvas->drawRect(fSlotRect, paint);
paint.setStyle(SkPaint::kFill_Style);
paint.setColor(fColors[i]);
canvas->drawRect(fSlotRect, paint);
canvas->translate(0, fSlotRect.height() + PalettePadding);
}
paint.setStrokeWidth(0);
canvas->translate(0, PalettePadding);
SkPoint p = SkPoint::Make(0,0);
SkPoint q = SkPoint::Make(this->width(), 0);
SkPoint pts[] = {p, q};
SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN,
SK_ColorCYAN, SK_ColorBLUE, SK_ColorMAGENTA,SK_ColorRED};
SkScalar colorPositions[] = { 0, 0.2, 0.4, 0.5, 0.6, 0.8, 1.0};
SkShader* shader1 = SkGradientShader::CreateLinear(pts, colors, colorPositions,7,
SkShader::kMirror_TileMode);
paint.setShader(shader1)->unref();
canvas->drawRect(fGradientRect, paint);
//this->INHERITED::onDraw(canvas);
}
SkView::Click* SkColorPalette::onFindClickHandler(SkScalar x, SkScalar y) {
return new Click(this);
}
bool SkColorPalette::onClick(SkView::Click* click) {
SkPoint curr = click->fCurr;
//SkDebugf("click %f %f \n", curr.fX, curr.fY);
int selected = selectSlot(curr);
if (selected >= 0) {
switch (click->fState) {
case SkView::Click::kDown_State:
case SkView::Click::kMoved_State:
case SkView::Click::kUp_State:
fSelected = selected;
fCurrColor = fColors[fSelected];
break;
default:
break;
}
return true;
}
else{
//account for padding
curr.fX -= PalettePadding;
curr.fY -= 2 * PalettePadding + (fSlotRect.height() + PalettePadding) * PaletteSlots;
if (curr.fX < 0 || curr.fX > fGradientRect.width() ||
curr.fY < 0 || curr.fY > fGradientRect.height()) {
return false;
}
else {
switch (click->fState) {
case SkView::Click::kDown_State:
case SkView::Click::kMoved_State:
case SkView::Click::kUp_State:
fColors[fSelected] = selectColorFromGradient(curr);
fCurrColor = fColors[fSelected];
break;
default:
break;
}
return true;
}
}
}
void SkColorPalette::onSizeChange() {
fGradientRect = SkRect::MakeWH(this->width() - 2*PalettePadding,
this->width() - 2*PalettePadding);
this->INHERITED::onSizeChange();
}
int SkColorPalette::selectSlot(SkPoint& cursorPosition) {
//account for padding
cursorPosition.fX -= PalettePadding;
cursorPosition.fY -= PalettePadding;
if (cursorPosition.fX < 0 || cursorPosition.fX > fSlotRect.width() ||
cursorPosition.fY < 0 || cursorPosition.fY > (fSlotRect.height() + PalettePadding) * PaletteSlots) {
return -1;
}
int index = cursorPosition.fY/(fSlotRect.height() + PalettePadding);
int offset = (int)cursorPosition.fY%((int)fSlotRect.height() + PalettePadding);
if (offset <= fSlotRect.height()) {
return index;
}
else {
return -1;
}
}
SkColor SkColorPalette::selectColorFromGradient(SkPoint& cursorPosition) {
float h = cursorPosition.fX/fGradientRect.width();
float s = 1.0 - cursorPosition.fY/fGradientRect.height();
float v = 1.0;
float _h,r,g,b;
float _1, _2, _3;
int _i;
_h = h * 6;
_i = (int)_h;
_1 = v * (1 - s);
_2 = v * (1 - s * (_h - _i));
_3 = v * (1 - s * (1 - (_h - _i)));
if (_i == 0) {
r = v;
g = _3;
b = _1;
}
else if (_i == 1) {
r = _2;
g = v;
b = _1;
}
else if (_i == 2) {
r = _1;
g = v;
b = _3;
}
else if (_i == 3) {
r = _1;
g = _2;
b = v;
}
else if (_i == 4) {
r = _3;
g = _1;
b = v;
}
else {
r = v;
g = _1;
b = _2;
};
SkColor retval = 0xFF000000;
retval += ((int)(r * 255) << 16);
retval += ((int)(g * 255) << 8);
retval += (int)(b * 255);
return retval;
}