NicosiaPlatformLayer.h [plain text]
#pragma once
#include "Color.h"
#include "FloatPoint.h"
#include "FloatPoint3D.h"
#include "FloatRect.h"
#include "FloatSize.h"
#include "TransformationMatrix.h"
#include <wtf/Lock.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/TypeCasts.h>
namespace Nicosia {
class PlatformLayer : public ThreadSafeRefCounted<PlatformLayer> {
public:
virtual ~PlatformLayer();
virtual bool isCompositionLayer() const { return false; }
uint64_t id() const { return m_id; }
protected:
explicit PlatformLayer(uint64_t);
uint64_t m_id;
struct {
Lock lock;
} m_state;
};
class CompositionLayer : public PlatformLayer {
public:
static Ref<CompositionLayer> create(uint64_t id)
{
return adoptRef(*new CompositionLayer(id));
}
virtual ~CompositionLayer();
bool isCompositionLayer() const override { return true; }
struct LayerState {
struct Delta {
Delta() = default;
union {
struct {
bool positionChanged : 1;
bool anchorPointChanged : 1;
bool sizeChanged : 1;
bool transformChanged : 1;
bool childrenTransformChanged : 1;
bool contentsRectChanged : 1;
bool contentsTilingChanged : 1;
bool opacityChanged : 1;
bool solidColorChanged : 1;
bool childrenChanged : 1;
bool maskChanged : 1;
bool replicaChanged : 1;
bool flagsChanged : 1;
};
uint32_t value { 0 };
};
} delta;
struct Flags {
Flags()
: contentsVisible(true)
, backfaceVisible(true)
{ }
union {
struct {
bool contentsOpaque : 1;
bool drawsContent : 1;
bool contentsVisible : 1;
bool backfaceVisible : 1;
bool masksToBounds : 1;
bool preserves3D : 1;
};
uint32_t value { 0 };
};
} flags;
WebCore::FloatPoint position;
WebCore::FloatPoint3D anchorPoint;
WebCore::FloatSize size;
WebCore::TransformationMatrix transform;
WebCore::TransformationMatrix childrenTransform;
WebCore::FloatRect contentsRect;
WebCore::FloatSize contentsTilePhase;
WebCore::FloatSize contentsTileSize;
float opacity { 0 };
WebCore::Color solidColor;
Vector<RefPtr<CompositionLayer>> children;
RefPtr<CompositionLayer> replica;
RefPtr<CompositionLayer> mask;
};
template<typename T>
void updateState(const T& functor)
{
LockHolder locker(PlatformLayer::m_state.lock);
functor(m_state.pending);
}
private:
explicit CompositionLayer(uint64_t);
struct {
LayerState pending;
} m_state;
};
}
#define SPECIALIZE_TYPE_TRAITS_NICOSIA_PLATFORMLAYER(ToClassName, predicate) \
SPECIALIZE_TYPE_TRAITS_BEGIN(Nicosia::ToClassName) \
static bool isType(const Nicosia::PlatformLayer& layer) { return layer.predicate; } \
SPECIALIZE_TYPE_TRAITS_END()
SPECIALIZE_TYPE_TRAITS_NICOSIA_PLATFORMLAYER(CompositionLayer, isCompositionLayer());