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