| |
| /* |
| * 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; |
| } |