11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
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.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawRectangle.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrixParts.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkRectangle_Properties {
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(height),
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(needsRedraw),
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(width)
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawRect::fInfo[] = {
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_ALIAS(bottom, fRect.fBottom, Float),
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(height, Float),
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_ALIAS(left, fRect.fLeft, Float),
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(needsRedraw, Boolean),
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_ALIAS(right, fRect.fRight, Float),
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_ALIAS(top, fRect.fTop, Float),
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(width, Float)
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawRect);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawRect::SkDrawRect() : fParent(NULL) {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRect.setEmpty();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawRect::dirty() {
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fParent)
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fParent->dirty();
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawRect::draw(SkAnimateMaker& maker) {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBoundableAuto boundable(this, maker);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    maker.fCanvas->drawRect(fRect, *maker.fPaint);
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawRect::dump(SkAnimateMaker* maker) {
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("left=\"%g\" top=\"%g\" right=\"%g\" bottom=\"%g\" />\n",
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalarToFloat(fRect.fLeft), SkScalarToFloat(fRect.fTop), SkScalarToFloat(fRect.fRight),
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalarToFloat(fRect.fBottom));
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDrawRect::getParent() const {
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fParent;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawRect::getProperty(int index, SkScriptValue* value) const {
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar result;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(height):
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = fRect.height();
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(needsRedraw):
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_Boolean;
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fS32 = fBounds.isEmpty() == false;
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(width):
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = fRect.width();
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value->fType = SkType_Float;
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value->fOperand.fScalar = result;
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawRect::setParent(SkDisplayable* parent) {
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fParent = parent;
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawRect::setProperty(int index, SkScriptValue& value) {
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar scalar = value.fOperand.fScalar;
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(height):
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(value.fType == SkType_Float);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fRect.fBottom = scalar + fRect.fTop;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(needsRedraw):
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(width):
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(value.fType == SkType_Float);
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fRect.fRight = scalar + fRect.fLeft;
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkRoundRect::fInfo[] = {
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_INHERITED,
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(rx, Float),
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(ry, Float),
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkRoundRect);
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkRoundRect::SkRoundRect() : rx(0), ry(0) {
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkRoundRect::draw(SkAnimateMaker& maker) {
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBoundableAuto boundable(this, maker);
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    maker.fCanvas->drawRoundRect(fRect, rx, ry, *maker.fPaint);
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkRoundRect::dump(SkAnimateMaker* maker) {
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("left=\"%g\" top=\"%g\" right=\"%g\" bottom=\"%g\" rx=\"%g\" ry=\"%g\" />\n",
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalarToFloat(fRect.fLeft), SkScalarToFloat(fRect.fTop), SkScalarToFloat(fRect.fRight),
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalarToFloat(fRect.fBottom), SkScalarToFloat(rx), SkScalarToFloat(ry));
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
146