mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
a848ce8efd
Summary: Currently we have race conditions in DrawView related to isViewGroupClipped, where we create a copy of the DrawView before we update the clipping state, and think the view is unclipped in the next iteration. Also we are sometimes creating a DrawView with a reactTag of 0. This fixes both, and is part of the upcoming DrawView bounds change, but is a separate issue that is live in current source. Reviewed By: ahmedre Differential Revision: D3598499
64 lines
2.0 KiB
Java
64 lines
2.0 KiB
Java
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
package com.facebook.react.flat;
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
/* package */ final class DrawView extends AbstractClippingDrawCommand {
|
|
|
|
/* package */ final int reactTag;
|
|
// Indicates if the DrawView is frozen. If it is frozen then any setting of the clip bounds
|
|
// should create a new DrawView.
|
|
private boolean mFrozen;
|
|
// Indicates whether this DrawView has been previously drawn. If it has been drawn, then we know
|
|
// that the bounds haven't changed, as a bounds change would trigger a new DrawView, which will
|
|
// set this to false for the new DrawView. Leaving this as package for direct access, but this
|
|
// should only be set from draw in DrawView, to avoid race conditions.
|
|
/* package */ boolean mPreviouslyDrawn;
|
|
|
|
public DrawView(int reactTag) {
|
|
this.reactTag = reactTag;
|
|
}
|
|
|
|
public DrawView collectDrawView(
|
|
float clipLeft,
|
|
float clipTop,
|
|
float clipRight,
|
|
float clipBottom) {
|
|
if (mFrozen) {
|
|
return clipBoundsMatch(clipLeft, clipTop, clipRight, clipBottom) ?
|
|
this :
|
|
new DrawView(reactTag).collectDrawView(clipLeft, clipTop, clipRight, clipBottom);
|
|
} else {
|
|
mFrozen = true;
|
|
setClipBounds(clipLeft, clipTop, clipRight, clipBottom);
|
|
return this;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void draw(FlatViewGroup parent, Canvas canvas) {
|
|
mPreviouslyDrawn = true;
|
|
if (mNeedsClipping) {
|
|
canvas.save(Canvas.CLIP_SAVE_FLAG);
|
|
applyClipping(canvas);
|
|
parent.drawNextChild(canvas);
|
|
canvas.restore();
|
|
} else {
|
|
parent.drawNextChild(canvas);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void debugDraw(FlatViewGroup parent, Canvas canvas) {
|
|
parent.debugDrawNextChild(canvas);
|
|
}
|
|
}
|