e16efc1882
git-svn-id: http://skia.googlecode.com/svn/trunk@7406 2bbb7eff-a529-9590-31e7-b0007b416f81
196 lines
5.3 KiB
C++
196 lines
5.3 KiB
C++
|
|
/*
|
|
* 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;
|
|
}
|