/* * Copyright 2012, The Android Open Source Project * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FixedPositioning_h #define FixedPositioning_h #if USE(ACCELERATED_COMPOSITING) #include "LayerAndroid.h" namespace WebCore { class IFrameLayerAndroid; struct SkLength { enum SkLengthType { Undefined, Auto, Relative, Percent, Fixed, Static, Intrinsic, MinIntrinsic }; SkLengthType type; SkScalar value; SkLength() { type = Undefined; value = 0; } bool defined() const { if (type == Undefined) return false; return true; } float calcFloatValue(float max) const { switch (type) { case Percent: return (max * value) / 100.0f; case Fixed: return value; default: return value; } } }; class FixedPositioning { public: FixedPositioning(LayerAndroid* layer = 0) : m_layer(layer) {} FixedPositioning(LayerAndroid* layer, const FixedPositioning& position); virtual ~FixedPositioning() {}; void setFixedPosition(SkLength left, // CSS left property SkLength top, // CSS top property SkLength right, // CSS right property SkLength bottom, // CSS bottom property SkLength marginLeft, // CSS margin-left property SkLength marginTop, // CSS margin-top property SkLength marginRight, // CSS margin-right property SkLength marginBottom, // CSS margin-bottom property const IntPoint& renderLayerPos, // For undefined fixed position SkRect viewRect) { // view rect, can be smaller than the layer's m_fixedLeft = left; m_fixedTop = top; m_fixedRight = right; m_fixedBottom = bottom; m_fixedMarginLeft = marginLeft; m_fixedMarginTop = marginTop; m_fixedMarginRight = marginRight; m_fixedMarginBottom = marginBottom; m_fixedRect = viewRect; m_renderLayerPos = renderLayerPos; } IFrameLayerAndroid* updatePosition(SkRect viewPort, IFrameLayerAndroid* parentIframeLayer); void contentDraw(SkCanvas* canvas, Layer::PaintStyle style); void dumpLayer(FILE*, int indentLevel) const; // ViewStateSerializer friends friend void android::serializeLayer(LayerAndroid* layer, SkWStream* stream); friend LayerAndroid* android::deserializeLayer(int version, SkStream* stream); private: LayerAndroid* m_layer; SkLength m_fixedLeft; SkLength m_fixedTop; SkLength m_fixedRight; SkLength m_fixedBottom; SkLength m_fixedMarginLeft; SkLength m_fixedMarginTop; SkLength m_fixedMarginRight; SkLength m_fixedMarginBottom; SkRect m_fixedRect; // When fixed element is undefined or auto, the render layer's position // is needed for offset computation IntPoint m_renderLayerPos; }; } #endif // USE(ACCELERATED_COMPOSITING) #endif // FixedPositioning_h