#ifndef PlatformCALayer_h
#define PlatformCALayer_h
#if USE(ACCELERATED_COMPOSITING)
#include "GraphicsContext.h"
#include "PlatformCAAnimation.h"
#include "PlatformCALayerClient.h"
#include "PlatformString.h"
#include <QuartzCore/CABase.h>
#include <wtf/CurrentTime.h>
#include <wtf/HashMap.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RetainPtr.h>
#include <wtf/Vector.h>
#include <wtf/text/StringHash.h>
namespace WebCore {
class PlatformCALayer;
typedef Vector<RefPtr<PlatformCALayer> > PlatformCALayerList;
class PlatformCALayer : public RefCounted<PlatformCALayer> {
public:
static CFTimeInterval currentTimeToMediaTime(double t) { return CACurrentMediaTime() + t - WTF::currentTime(); }
enum LayerType { LayerTypeLayer, LayerTypeWebLayer, LayerTypeTransformLayer, LayerTypeWebTiledLayer, LayerTypeRootLayer, LayerTypeCustom };
enum FilterType { Linear, Nearest, Trilinear };
static PassRefPtr<PlatformCALayer> create(LayerType, PlatformCALayerClient*);
static PassRefPtr<PlatformCALayer> create(void* platformLayer, PlatformCALayerClient*);
~PlatformCALayer();
static PlatformCALayer* platformCALayer(void* platformLayer);
PlatformLayer* platformLayer() const;
PlatformCALayer* rootLayer() const;
static bool isValueFunctionSupported();
PlatformCALayerClient* owner() const { return m_owner; }
void setOwner(PlatformCALayerClient*);
void animationStarted(CFTimeInterval beginTime);
void ensureAnimationsSubmitted();
void setNeedsLayout();
void setNeedsDisplay(const FloatRect* dirtyRect = 0);
void setNeedsCommit();
void setContentsChanged();
LayerType layerType() const { return m_layerType; }
PlatformCALayer* superlayer() const;
void removeFromSuperlayer();
void setSublayers(const PlatformCALayerList&);
void removeAllSublayers();
void appendSublayer(PlatformCALayer*);
void insertSublayer(PlatformCALayer*, size_t index);
void replaceSublayer(PlatformCALayer* reference, PlatformCALayer*);
size_t sublayerCount() const;
void adoptSublayers(PlatformCALayer* source);
void addAnimationForKey(const String& key, PlatformCAAnimation* animation);
void removeAnimationForKey(const String& key);
PassRefPtr<PlatformCAAnimation> animationForKey(const String& key);
PlatformCALayer* mask() const;
void setMask(PlatformCALayer*);
bool isOpaque() const;
void setOpaque(bool);
FloatRect bounds() const;
void setBounds(const FloatRect&);
FloatPoint3D position() const;
void setPosition(const FloatPoint3D&);
void setPosition(const FloatPoint& pos) { setPosition(FloatPoint3D(pos.x(), pos.y(), 0)); }
FloatPoint3D anchorPoint() const;
void setAnchorPoint(const FloatPoint3D&);
TransformationMatrix transform() const;
void setTransform(const TransformationMatrix&);
TransformationMatrix sublayerTransform() const;
void setSublayerTransform(const TransformationMatrix&);
TransformationMatrix contentsTransform() const;
void setContentsTransform(const TransformationMatrix&);
bool isHidden() const;
void setHidden(bool);
bool isGeometryFlipped() const;
void setGeometryFlipped(bool);
bool isDoubleSided() const;
void setDoubleSided(bool);
bool masksToBounds() const;
void setMasksToBounds(bool);
bool acceleratesDrawing() const;
void setAcceleratesDrawing(bool);
CFTypeRef contents() const;
void setContents(CFTypeRef);
FloatRect contentsRect() const;
void setContentsRect(const FloatRect&);
void setMinificationFilter(FilterType);
void setMagnificationFilter(FilterType);
Color backgroundColor() const;
void setBackgroundColor(const Color&);
float borderWidth() const;
void setBorderWidth(float);
Color borderColor() const;
void setBorderColor(const Color&);
float opacity() const;
void setOpacity(float);
String name() const;
void setName(const String&);
FloatRect frame() const;
void setFrame(const FloatRect&);
float speed() const;
void setSpeed(float);
CFTimeInterval timeOffset() const;
void setTimeOffset(CFTimeInterval);
float contentsScale() const;
void setContentsScale(float);
#if PLATFORM(WIN)
HashMap<String, RefPtr<PlatformCAAnimation> >& animations() { return m_animations; }
#endif
#if PLATFORM(WIN) && !defined(NDEBUG)
void printTree() const;
#endif
bool isWebLayer();
void setBoundsOnMainThread(CGRect);
void setPositionOnMainThread(CGPoint);
void setAnchorPointOnMainThread(FloatPoint3D);
void setTileSize(const IntSize&);
protected:
PlatformCALayer(LayerType, PlatformLayer*, PlatformCALayerClient*);
private:
PlatformCALayerClient* m_owner;
LayerType m_layerType;
#if PLATFORM(MAC) || PLATFORM(WIN)
RetainPtr<PlatformLayer> m_layer;
#endif
#if PLATFORM(WIN)
HashMap<String, RefPtr<PlatformCAAnimation> > m_animations;
#endif
#if PLATFORM(MAC)
#ifdef __OBJC__
RetainPtr<NSObject> m_delegate;
#else
RetainPtr<void> m_delegate;
#endif
#endif
};
}
#endif // USE(ACCELERATED_COMPOSITING)
#endif // PlatformCALayer_h