1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "SkRectShape.h"
11#include "SkCanvas.h"
12
13SkPaintShape::SkPaintShape() {
14    fPaint.setAntiAlias(true);
15}
16
17SkRectShape::SkRectShape() {
18    fBounds.setEmpty();
19    fRadii.set(0, 0);
20}
21
22void SkRectShape::setRect(const SkRect& bounds) {
23    fBounds = bounds;
24    fRadii.set(0, 0);
25}
26
27void SkRectShape::setOval(const SkRect& bounds) {
28    fBounds = bounds;
29    fRadii.set(-SK_Scalar1, -SK_Scalar1);
30}
31
32void SkRectShape::setCircle(SkScalar cx, SkScalar cy, SkScalar radius) {
33    fBounds.set(cx - radius, cy - radius, cx + radius, cy + radius);
34    fRadii.set(-SK_Scalar1, -SK_Scalar1);
35}
36
37void SkRectShape::setRRect(const SkRect& bounds, SkScalar rx, SkScalar ry) {
38    if (rx < 0) {
39        rx = 0;
40    }
41    if (ry < 0) {
42        ry = 0;
43    }
44
45    fBounds = bounds;
46    fRadii.set(rx, ry);
47}
48
49///////////////////////////////////////////////////////////////////////////////
50
51void SkRectShape::onDraw(SkCanvas* canvas) {
52    const SkPaint& paint = this->paint();
53
54    if (fRadii.fWidth < 0) {
55        canvas->drawOval(fBounds, paint);
56    } else if (fRadii.isZero()) {
57        canvas->drawRect(fBounds, paint);
58    } else {
59        canvas->drawRoundRect(fBounds, fRadii.fWidth, fRadii.fHeight, paint);
60    }
61}
62
63SkFlattenable::Factory SkRectShape::getFactory() {
64    return CreateProc;
65}
66
67void SkRectShape::flatten(SkFlattenableWriteBuffer& buffer) {
68    this->INHERITED::flatten(buffer);
69
70    buffer.writeRect(fBounds);
71    *(SkSize*)buffer.reserve(sizeof(SkSize)) = fRadii;
72}
73
74SkRectShape::SkRectShape(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
75    buffer.read(&fBounds, sizeof(fBounds));
76    buffer.read(&fRadii, sizeof(fRadii));
77}
78
79SkFlattenable* SkRectShape::CreateProc(SkFlattenableReadBuffer& buffer) {
80    return SkNEW_ARGS(SkRectShape, (buffer));
81}
82
83///////////////////////////////////////////////////////////////////////////////
84
85void SkPaintShape::flatten(SkFlattenableWriteBuffer& buffer) {
86    this->INHERITED::flatten(buffer);
87
88    fPaint.flatten(buffer);
89}
90
91SkPaintShape::SkPaintShape(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
92    fPaint.unflatten(buffer);
93}
94
95SK_DEFINE_FLATTENABLE_REGISTRAR(SkRectShape)
96
97