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