Merge changes I244b5469,I32044e91 into gingerbread

* changes:
  [3253328, 3171580] Treat GONE and INVISIBLE views the same when calculating transparent regions
  [3171580] Fix two typos related to fixed-size buffers
This commit is contained in:
Mathias Agopian
2010-12-07 14:18:21 -08:00
committed by Android (Google) Code Review
5 changed files with 20 additions and 22 deletions

View File

@@ -3304,7 +3304,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
boolean noneOfTheChildrenAreTransparent = true;
for (int i = 0; i < count; i++) {
final View child = children[i];
if ((child.mViewFlags & VISIBILITY_MASK) != GONE || child.getAnimation() != null) {
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
if (!child.gatherTransparentRegion(region)) {
noneOfTheChildrenAreTransparent = false;
}

View File

@@ -57,7 +57,7 @@ Layer::Layer(SurfaceFlinger* flinger,
mSecure(false),
mTextureManager(),
mBufferManager(mTextureManager),
mWidth(0), mHeight(0), mFixedSize(false)
mWidth(0), mHeight(0), mNeedsScaling(false), mFixedSize(false)
{
}
@@ -216,13 +216,10 @@ slowpath:
void Layer::drawForSreenShot() const
{
bool currentFixedSize = mFixedSize;
bool currentBlending = mNeedsBlending;
const_cast<Layer*>(this)->mFixedSize = false;
const_cast<Layer*>(this)->mFixedSize = true;
const bool currentFiltering = mNeedsFiltering;
const_cast<Layer*>(this)->mNeedsFiltering = true;
LayerBase::drawForSreenShot();
const_cast<Layer*>(this)->mFixedSize = currentFixedSize;
const_cast<Layer*>(this)->mNeedsBlending = currentBlending;
const_cast<Layer*>(this)->mNeedsFiltering = currentFiltering;
}
void Layer::onDraw(const Region& clip) const
@@ -260,11 +257,10 @@ void Layer::onDraw(const Region& clip) const
bool Layer::needsFiltering() const
{
if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
// NOTE: there is a race here, because mFixedSize is updated in a
// binder transaction. however, it doesn't really matter since it is
// evaluated each time we draw. To be perfectly correct, this flag
// would have to be associated with a buffer.
if (mFixedSize)
// if our buffer is not the same size than ourselves,
// we need filtering.
Mutex::Autolock _l(mLock);
if (mNeedsScaling)
return true;
}
return LayerBase::needsFiltering();
@@ -321,6 +317,7 @@ sp<GraphicBuffer> Layer::requestBuffer(int index,
Mutex::Autolock _l(mLock);
// zero means default
mFixedSize = reqWidth && reqHeight;
if (!reqFormat) reqFormat = mFormat;
if (!reqWidth) reqWidth = mWidth;
if (!reqHeight) reqHeight = mHeight;
@@ -334,6 +331,7 @@ sp<GraphicBuffer> Layer::requestBuffer(int index,
mReqWidth = reqWidth;
mReqHeight = reqHeight;
mReqFormat = reqFormat;
mNeedsScaling = mWidth != mReqWidth || mHeight != mReqHeight;
lcblk->reallocateAllExcept(index);
}
@@ -457,6 +455,7 @@ void Layer::setBufferSize(uint32_t w, uint32_t h) {
Mutex::Autolock _l(mLock);
mWidth = w;
mHeight = h;
mNeedsScaling = mWidth != mReqWidth || mHeight != mReqHeight;
}
bool Layer::isFixedSize() const {

View File

@@ -230,6 +230,7 @@ private:
uint32_t mReqWidth;
uint32_t mReqHeight;
uint32_t mReqFormat;
bool mNeedsScaling;
bool mFixedSize;
};

View File

@@ -216,14 +216,10 @@ uint32_t LayerBase::doTransaction(uint32_t flags)
flags |= eVisibleRegion;
this->contentDirty = true;
mNeedsFiltering = false;
if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
// we may use linear filtering, if the matrix scales us
const uint8_t type = temp.transform.getType();
if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
mNeedsFiltering = true;
}
}
// we may use linear filtering, if the matrix scales us
const uint8_t type = temp.transform.getType();
mNeedsFiltering = (!temp.transform.preserveRects() ||
(type >= Transform::SCALE));
}
// Commit the transaction

View File

@@ -185,7 +185,9 @@ public:
/**
* needsLinearFiltering - true if this surface needs filtering
*/
virtual bool needsFiltering() const { return mNeedsFiltering; }
virtual bool needsFiltering() const {
return (!(mFlags & DisplayHardware::SLOW_CONFIG)) && mNeedsFiltering;
}
/**
* isSecure - true if this surface is secure, that is if it prevents