Merge "Take shadow bounds into account for quick rejects Bug #8634346" into klp-dev

This commit is contained in:
Romain Guy
2013-08-10 00:12:27 +00:00
committed by Android (Google) Code Review
3 changed files with 28 additions and 3 deletions

View File

@@ -249,11 +249,16 @@ public:
} }
// default empty constructor for bounds, to be overridden in child constructor body // default empty constructor for bounds, to be overridden in child constructor body
DrawBoundedOp(SkPaint* paint) DrawBoundedOp(SkPaint* paint): DrawOp(paint) { }
: DrawOp(paint) {}
bool getLocalBounds(Rect& localBounds) { bool getLocalBounds(Rect& localBounds) {
localBounds.set(mLocalBounds); localBounds.set(mLocalBounds);
if (state.mDrawModifiers.mHasShadow) {
Rect shadow(mLocalBounds);
shadow.translate(state.mDrawModifiers.mShadowDx, state.mDrawModifiers.mShadowDy);
shadow.outset(state.mDrawModifiers.mShadowRadius);
localBounds.unionWith(shadow);
}
return true; return true;
} }
@@ -1442,8 +1447,10 @@ public:
} }
virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) { virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
Rect bounds;
getLocalBounds(bounds);
return renderer.drawText(mText, mBytesCount, mCount, mX, mY, return renderer.drawText(mText, mBytesCount, mCount, mX, mY,
mPositions, getPaint(renderer), mTotalAdvance, mLocalBounds); mPositions, getPaint(renderer), mTotalAdvance, bounds);
} }
virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty, virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty,
@@ -1454,6 +1461,8 @@ public:
renderer.restoreDisplayState(ops[i]->state, true); // restore all but the clip renderer.restoreDisplayState(ops[i]->state, true); // restore all but the clip
DrawTextOp& op = *((DrawTextOp*)ops[i]); DrawTextOp& op = *((DrawTextOp*)ops[i]);
// quickReject() will not occure in drawText() so we can use mLocalBounds
// directly, we do not need to account for shadow by calling getLocalBounds()
status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY, status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY,
op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds, op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds,
drawOpMode); drawOpMode);

View File

@@ -464,10 +464,12 @@ void DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
void DisplayListRenderer::resetShadow() { void DisplayListRenderer::resetShadow() {
addStateOp(new (alloc()) ResetShadowOp()); addStateOp(new (alloc()) ResetShadowOp());
OpenGLRenderer::resetShadow();
} }
void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color)); addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
OpenGLRenderer::setupShadow(radius, dx, dy, color);
} }
void DisplayListRenderer::resetPaintFilter() { void DisplayListRenderer::resetPaintFilter() {
@@ -503,11 +505,17 @@ void DisplayListRenderer::addStateOp(StateOp* op) {
void DisplayListRenderer::addDrawOp(DrawOp* op) { void DisplayListRenderer::addDrawOp(DrawOp* op) {
Rect localBounds; Rect localBounds;
if (mDrawModifiers.mHasShadow) {
op->state.mDrawModifiers = mDrawModifiers;
}
if (op->getLocalBounds(localBounds)) { if (op->getLocalBounds(localBounds)) {
bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top, bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
localBounds.right, localBounds.bottom); localBounds.right, localBounds.bottom);
op->setQuickRejected(rejected); op->setQuickRejected(rejected);
} }
if (mDrawModifiers.mHasShadow) {
op->state.mDrawModifiers.reset();
}
mHasDrawOps = true; mHasDrawOps = true;
addOpInternal(op); addOpInternal(op);
} }

View File

@@ -52,6 +52,14 @@ namespace android {
namespace uirenderer { namespace uirenderer {
struct DrawModifiers { struct DrawModifiers {
DrawModifiers() {
reset();
}
void reset() {
memset(this, 0, sizeof(DrawModifiers));
}
SkiaShader* mShader; SkiaShader* mShader;
SkiaColorFilter* mColorFilter; SkiaColorFilter* mColorFilter;
float mOverrideLayerAlpha; float mOverrideLayerAlpha;