RenderGeometryMap.h [plain text]
#ifndef RenderGeometryMap_h
#define RenderGeometryMap_h
#include "FloatPoint.h"
#include "FloatQuad.h"
#include "IntSize.h"
#include "RenderObject.h"
#include "TransformationMatrix.h"
#include <wtf/OwnPtr.h>
namespace WebCore {
class RenderLayer;
struct RenderGeometryMapStep {
RenderGeometryMapStep(const RenderGeometryMapStep& o)
: m_renderer(o.m_renderer)
, m_offset(o.m_offset)
, m_accumulatingTransform(o.m_accumulatingTransform)
, m_isNonUniform(o.m_isNonUniform)
, m_isFixedPosition(o.m_isFixedPosition)
, m_hasTransform(o.m_hasTransform)
{
ASSERT(!o.m_transform);
}
RenderGeometryMapStep(const RenderObject* renderer, bool accumulatingTransform, bool isNonUniform, bool isFixedPosition, bool hasTransform)
: m_renderer(renderer)
, m_accumulatingTransform(accumulatingTransform)
, m_isNonUniform(isNonUniform)
, m_isFixedPosition(isFixedPosition)
, m_hasTransform(hasTransform)
{
}
const RenderObject* m_renderer;
LayoutSize m_offset;
OwnPtr<TransformationMatrix> m_transform; bool m_accumulatingTransform;
bool m_isNonUniform; bool m_isFixedPosition;
bool m_hasTransform;
};
class RenderGeometryMap {
WTF_MAKE_NONCOPYABLE(RenderGeometryMap);
public:
RenderGeometryMap();
~RenderGeometryMap();
FloatPoint absolutePoint(const FloatPoint&) const;
FloatRect absoluteRect(const FloatRect&) const;
void pushMappingsToAncestor(const RenderLayer*, const RenderLayer* ancestorLayer);
void popMappingsToAncestor(const RenderLayer*);
void pushMappingsToAncestor(const RenderObject*, const RenderBoxModelObject* ancestorRenderer);
void popMappingsToAncestor(const RenderBoxModelObject*);
void push(const RenderObject*, const LayoutSize&, bool accumulatingTransform = false, bool isNonUniform = false, bool isFixedPosition = false, bool hasTransform = false);
void push(const RenderObject*, const TransformationMatrix&, bool accumulatingTransform = false, bool isNonUniform = false, bool isFixedPosition = false, bool hasTransform = false);
void pushView(const RenderView*, const LayoutSize& scrollOffset, const TransformationMatrix* = 0);
private:
void mapToAbsolute(TransformState&) const;
void stepInserted(const RenderGeometryMapStep&);
void stepRemoved(const RenderGeometryMapStep&);
bool hasNonUniformStep() const { return m_nonUniformStepsCount; }
bool hasTransformStep() const { return m_transformedStepsCount; }
bool hasFixedPositionStep() const { return m_fixedStepsCount; }
typedef Vector<RenderGeometryMapStep, 32> RenderGeometryMapSteps;
size_t m_insertionPosition;
int m_nonUniformStepsCount;
int m_transformedStepsCount;
int m_fixedStepsCount;
RenderGeometryMapSteps m_mapping;
LayoutSize m_accumulatedOffset;
};
}
namespace WTF {
template<> struct VectorTraits<WebCore::RenderGeometryMapStep> : SimpleClassVectorTraits { };
}
#endif // RenderGeometryMap_h