135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */ 835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkRectShape.h" 1140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkCanvas.h" 1240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkPaintShape::SkPaintShape() { 1440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fPaint.setAntiAlias(true); 1540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 1640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkRectShape::SkRectShape() { 1840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fBounds.setEmpty(); 1940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fRadii.set(0, 0); 2040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 2140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::setRect(const SkRect& bounds) { 2340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fBounds = bounds; 2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fRadii.set(0, 0); 2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 2640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::setOval(const SkRect& bounds) { 2840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fBounds = bounds; 2940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fRadii.set(-SK_Scalar1, -SK_Scalar1); 3040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::setCircle(SkScalar cx, SkScalar cy, SkScalar radius) { 3340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fBounds.set(cx - radius, cy - radius, cx + radius, cy + radius); 3440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fRadii.set(-SK_Scalar1, -SK_Scalar1); 3540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::setRRect(const SkRect& bounds, SkScalar rx, SkScalar ry) { 3840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (rx < 0) { 3940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger rx = 0; 4040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 4140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (ry < 0) { 4240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger ry = 0; 4340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 4440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fBounds = bounds; 4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fRadii.set(rx, ry); 4740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 4840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/////////////////////////////////////////////////////////////////////////////// 5040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::onDraw(SkCanvas* canvas) { 5240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkPaint& paint = this->paint(); 5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger if (fRadii.fWidth < 0) { 5540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawOval(fBounds, paint); 5640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } else if (fRadii.isZero()) { 5740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawRect(fBounds, paint); 5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } else { 5940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawRoundRect(fBounds, fRadii.fWidth, fRadii.fHeight, paint); 6040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 6140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 6240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 6340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkFlattenable::Factory SkRectShape::getFactory() { 6440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return CreateProc; 6540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 6640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 6740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkRectShape::flatten(SkFlattenableWriteBuffer& buffer) { 6840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger this->INHERITED::flatten(buffer); 6940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.writeRect(fBounds); 7140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger *(SkSize*)buffer.reserve(sizeof(SkSize)) = fRadii; 7240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 7340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkRectShape::SkRectShape(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 7540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.read(&fBounds, sizeof(fBounds)); 7640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger buffer.read(&fRadii, sizeof(fRadii)); 7740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 7840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkFlattenable* SkRectShape::CreateProc(SkFlattenableReadBuffer& buffer) { 8040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return SkNEW_ARGS(SkRectShape, (buffer)); 8140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 8240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/////////////////////////////////////////////////////////////////////////////// 8440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergervoid SkPaintShape::flatten(SkFlattenableWriteBuffer& buffer) { 8640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger this->INHERITED::flatten(buffer); 8740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fPaint.flatten(buffer); 8940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 9040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 9140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkPaintShape::SkPaintShape(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 9240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger fPaint.unflatten(buffer); 9340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 9440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 951cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSK_DEFINE_FLATTENABLE_REGISTRAR(SkRectShape) 9640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 97