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