diff options
author | Chris Craik <ccraik@google.com> | 2014-07-24 12:39:17 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2014-07-25 20:56:50 +0000 |
commit | a753f4c6cb8558795e673df1896532cd148781e2 (patch) | |
tree | ec290b59a9cc91bb71402b8643fbc976f95c82d2 /libs/hwui/RenderProperties.h | |
parent | 543650bb10b1104dd4ebb81e4a9bbebf9fb4c535 (diff) | |
download | frameworks_base-a753f4c6cb8558795e673df1896532cd148781e2.zip frameworks_base-a753f4c6cb8558795e673df1896532cd148781e2.tar.gz frameworks_base-a753f4c6cb8558795e673df1896532cd148781e2.tar.bz2 |
Move ClipBounds to native
bug:15698973
Also simplifies RenderNode LTRB properties
Change-Id: I09263a697b71d325a46b57cd5250a2b165f251c8
Diffstat (limited to 'libs/hwui/RenderProperties.h')
-rw-r--r-- | libs/hwui/RenderProperties.h | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h index 227d56e..f50e514 100644 --- a/libs/hwui/RenderProperties.h +++ b/libs/hwui/RenderProperties.h @@ -58,6 +58,11 @@ enum LayerType { // TODO: LayerTypeSurfaceTexture? Maybe? }; +enum ClippingFlags { + CLIP_TO_BOUNDS = 0x1 << 0, + CLIP_TO_CLIP_BOUNDS = 0x1 << 1, +}; + class ANDROID_API LayerProperties { public: bool setType(LayerType type) { @@ -135,10 +140,35 @@ public: RenderProperties(); virtual ~RenderProperties(); + static bool setFlag(int flag, bool newValue, int* outFlags) { + if (newValue) { + if (!(flag & *outFlags)) { + *outFlags |= flag; + return true; + } + return false; + } else { + if (flag & *outFlags) { + *outFlags &= ~flag; + return true; + } + return false; + } + } + RenderProperties& operator=(const RenderProperties& other); bool setClipToBounds(bool clipToBounds) { - return RP_SET(mPrimitiveFields.mClipToBounds, clipToBounds); + return setFlag(CLIP_TO_BOUNDS, clipToBounds, &mPrimitiveFields.mClippingFlags); + } + + bool setClipBounds(const Rect& clipBounds) { + bool ret = setFlag(CLIP_TO_CLIP_BOUNDS, true, &mPrimitiveFields.mClippingFlags); + return RP_SET(mPrimitiveFields.mClipBounds, clipBounds) || ret; + } + + bool setClipBoundsEmpty() { + return setFlag(CLIP_TO_CLIP_BOUNDS, false, &mPrimitiveFields.mClippingFlags); } bool setProjectBackwards(bool shouldProject) { @@ -433,7 +463,7 @@ public: return false; } - bool offsetLeftRight(float offset) { + bool offsetLeftRight(int offset) { if (offset != 0) { mPrimitiveFields.mLeft += offset; mPrimitiveFields.mRight += offset; @@ -442,7 +472,7 @@ public: return false; } - bool offsetTopBottom(float offset) { + bool offsetTopBottom(int offset) { if (offset != 0) { mPrimitiveFields.mTop += offset; mPrimitiveFields.mBottom += offset; @@ -477,8 +507,23 @@ public: return mComputedFields.mTransformMatrix; } + int getClippingFlags() const { + return mPrimitiveFields.mClippingFlags; + } + bool getClipToBounds() const { - return mPrimitiveFields.mClipToBounds; + return mPrimitiveFields.mClippingFlags & CLIP_TO_BOUNDS; + } + + void getClippingRectForFlags(uint32_t flags, Rect* outRect) const { + if (flags & CLIP_TO_BOUNDS) { + outRect->set(0, 0, getWidth(), getHeight()); + if (flags & CLIP_TO_CLIP_BOUNDS) { + outRect->intersect(mPrimitiveFields.mClipBounds); + } + } else { + outRect->set(mPrimitiveFields.mClipBounds); + } } bool getHasOverlappingRendering() const { @@ -540,14 +585,13 @@ public: } private: - // Rendering properties struct PrimitiveFields { PrimitiveFields(); Outline mOutline; RevealClip mRevealClip; - bool mClipToBounds; + int mClippingFlags; bool mProjectBackwards; bool mProjectionReceiver; float mAlpha; @@ -561,6 +605,7 @@ private: int mWidth, mHeight; bool mPivotExplicitlySet; bool mMatrixOrPivotDirty; + Rect mClipBounds; } mPrimitiveFields; SkMatrix* mStaticMatrix; |