diff options
Diffstat (limited to 'chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp')
-rw-r--r-- | chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp b/chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp new file mode 100644 index 00000000000..f2776af4ffa --- /dev/null +++ b/chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp @@ -0,0 +1,195 @@ + +/* + * 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; +} |