summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp')
-rw-r--r--chromium/third_party/skia/experimental/DrawingBoard/SkColorPalette.cpp195
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;
+}