summaryrefslogtreecommitdiffstats
path: root/libs/hwui/RenderProperties.h
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2014-07-24 12:39:17 -0700
committerChris Craik <ccraik@google.com>2014-07-25 20:56:50 +0000
commita753f4c6cb8558795e673df1896532cd148781e2 (patch)
treeec290b59a9cc91bb71402b8643fbc976f95c82d2 /libs/hwui/RenderProperties.h
parent543650bb10b1104dd4ebb81e4a9bbebf9fb4c535 (diff)
downloadframeworks_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.h57
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;