Bug 860613 - Add an API to bind an APZC instance to a Layer. r=BenWa

This commit is contained in:
Kartikaya Gupta 2013-04-17 17:39:13 -04:00
parent 57ae4c29c2
commit 3c3e318554
3 changed files with 41 additions and 22 deletions

View File

@ -398,6 +398,38 @@ Layer::SetAnimations(const AnimationArray& aAnimations)
Mutated();
}
static uint8_t sPanZoomUserDataKey;
struct PanZoomUserData : public LayerUserData {
PanZoomUserData(AsyncPanZoomController* aController)
: mController(aController)
{ }
// We don't keep a strong ref here because PanZoomUserData is only
// set transiently, and APZC is thread-safe refcounted so
// AddRef/Release is expensive.
AsyncPanZoomController* mController;
};
void
Layer::SetAsyncPanZoomController(AsyncPanZoomController *controller)
{
if (controller) {
SetUserData(&sPanZoomUserDataKey, new PanZoomUserData(controller));
} else {
RemoveUserData(&sPanZoomUserDataKey);
}
}
AsyncPanZoomController*
Layer::GetAsyncPanZoomController()
{
LayerUserData* data = GetUserData(&sPanZoomUserDataKey);
if (!data) {
return nullptr;
}
return static_cast<PanZoomUserData*>(data)->mController;
}
void
Layer::ApplyPendingUpdatesToSubtree()
{

View File

@ -48,6 +48,7 @@ namespace layers {
class Animation;
class AnimationData;
class AsyncPanZoomController;
class CommonLayerAttributes;
class Layer;
class ThebesLayer;
@ -896,6 +897,11 @@ public:
const gfx::Margin& GetFixedPositionMargins() { return mMargins; }
Layer* GetMaskLayer() { return mMaskLayer; }
// These functions allow attaching an AsyncPanZoomController to this layer,
// and can be used anytime.
void SetAsyncPanZoomController(AsyncPanZoomController *controller);
AsyncPanZoomController* GetAsyncPanZoomController();
// Note that all lengths in animation data are either in CSS pixels or app
// units and must be converted to device pixels by the compositor.
AnimationArray& GetAnimations() { return mAnimations; }

View File

@ -67,18 +67,6 @@ struct LayerTreeState {
TargetConfig mTargetConfig;
};
static uint8_t sPanZoomUserDataKey;
struct PanZoomUserData : public LayerUserData {
PanZoomUserData(AsyncPanZoomController* aController)
: mController(aController)
{ }
// We don't keep a strong ref here because PanZoomUserData is only
// set transiently, and APZC is thread-safe refcounted so
// AddRef/Release is expensive.
AsyncPanZoomController* mController;
};
/**
* Lookup the indirect shadow tree for |aId| and return it if it
* exists. Otherwise null is returned. This must only be called on
@ -504,12 +492,11 @@ private:
if (OP == Resolve) {
ref->ConnectReferentLayer(referent);
if (AsyncPanZoomController* apzc = state->mController) {
referent->SetUserData(&sPanZoomUserDataKey,
new PanZoomUserData(apzc));
referent->SetAsyncPanZoomController(apzc);
}
} else {
ref->DetachReferentLayer(referent);
referent->RemoveUserData(&sPanZoomUserDataKey);
referent->SetAsyncPanZoomController(nullptr);
}
}
}
@ -855,13 +842,7 @@ CompositorParent::ApplyAsyncContentTransformToTree(TimeStamp aCurrentFrame,
return appliedTransform;
}
AsyncPanZoomController* controller = nullptr;
// Check if an AsyncPanZoomController is attached to this layer.
if (LayerUserData* data = aLayer->GetUserData(&sPanZoomUserDataKey)) {
controller = static_cast<PanZoomUserData*>(data)->mController;
}
if (controller) {
if (AsyncPanZoomController* controller = aLayer->GetAsyncPanZoomController()) {
ShadowLayer* shadow = aLayer->AsShadowLayer();
ViewTransform treeTransform;