Outline.h revision deeda3d337aed1eee218b89a7aba5992ced371f0
1b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik/*
2b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * Copyright (C) 2014 The Android Open Source Project
3b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik *
4b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * you may not use this file except in compliance with the License.
6b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * You may obtain a copy of the License at
7b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik *
8b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik *
10b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * Unless required by applicable law or agreed to in writing, software
11b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * See the License for the specific language governing permissions and
14b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * limitations under the License.
15b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik */
16b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#ifndef OUTLINE_H
17b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#define OUTLINE_H
18b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
19b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include <SkPath.h>
20b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
21b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h"
22b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
23b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craiknamespace android {
24b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craiknamespace uirenderer {
25b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
26b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikclass Outline {
27b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikpublic:
28b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    Outline()
29b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            : mShouldClip(false)
30b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            , mType(kOutlineType_None)
31b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            , mRadius(0) {}
32b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
33b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    void setRoundRect(int left, int top, int right, int bottom, int radius) {
34b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mType = kOutlineType_RoundRect;
35b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mBounds.set(left, top, right, bottom);
36b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mRadius = radius;
37b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mPath.reset();
38b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom),
39b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik                radius, radius);
40b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
41b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
42b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    void setConvexPath(const SkPath* outline) {
43b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        if (!outline) {
44b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            setEmpty();
45b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik            return;
46b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        }
47b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mType = kOutlineType_ConvexPath;
48b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mPath = *outline;
49b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mBounds.set(outline->getBounds());
50b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
51b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
52b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    void setEmpty() {
53b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mType = kOutlineType_None;
54b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mPath.reset();
55b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
56b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
57b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    void setShouldClip(bool clip) {
58b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        mShouldClip = clip;
59b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
60b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
61deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    bool getShouldClip() const {
62deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        return mShouldClip;
63deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
64deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
65b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    bool willClip() const {
66b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        // only round rect outlines can be used for clipping
67b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        return mShouldClip && (mType == kOutlineType_RoundRect);
68b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
69b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
70deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    bool getAsRoundRect(Rect* outRect, float* outRadius) const {
71deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        if (mType == kOutlineType_RoundRect) {
72deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            outRect->set(mBounds);
73deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            *outRadius = mRadius;
74deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            return true;
75deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        }
76deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        return false;
77deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    }
78deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
79d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkPath* getPath() const {
80b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        if (mType == kOutlineType_None) return NULL;
81b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
82b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        return &mPath;
83b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
84b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
85b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikprivate:
86b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    enum OutlineType {
87b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        kOutlineType_None = 0,
88b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        kOutlineType_ConvexPath = 1,
89b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        kOutlineType_RoundRect = 2
90b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    };
91b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
92b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    bool mShouldClip;
93b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    OutlineType mType;
94b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    Rect mBounds;
95b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    float mRadius;
96b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    SkPath mPath;
97b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik};
98b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
99b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik} /* namespace uirenderer */
100b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik} /* namespace android */
101b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
102b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* OUTLINE_H */
103