1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#include "config.h"
#include "FixedLayerAndroid.h"
#include "DumpLayer.h"
#include "TilesManager.h"
#include "GLWebViewState.h"
#if USE(ACCELERATED_COMPOSITING)
#include <wtf/CurrentTime.h>
#include <cutils/log.h>
#include <wtf/text/CString.h>
#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "FixedLayerAndroid", __VA_ARGS__)
namespace WebCore {
FixedLayerAndroid::FixedLayerAndroid(const FixedLayerAndroid& layer)
: LayerAndroid(layer, LayerAndroid::FixedLayer)
, m_fixedLeft(layer.m_fixedLeft)
, m_fixedTop(layer.m_fixedTop)
, m_fixedRight(layer.m_fixedRight)
, m_fixedBottom(layer.m_fixedBottom)
, m_fixedMarginLeft(layer.m_fixedMarginLeft)
, m_fixedMarginTop(layer.m_fixedMarginTop)
, m_fixedMarginRight(layer.m_fixedMarginRight)
, m_fixedMarginBottom(layer.m_fixedMarginBottom)
, m_fixedRect(layer.m_fixedRect)
, m_renderLayerPos(layer.m_renderLayerPos)
{
}
LayerAndroid* FixedLayerAndroid::updateFixedLayerPosition(SkRect viewport,
LayerAndroid* parentIframeLayer)
{
LayerAndroid* iframeLayer = LayerAndroid::updateFixedLayerPosition(viewport, parentIframeLayer);
// So if this is a fixed layer inside a iframe, use the iframe offset
// and the iframe's size as the viewport and pass to the children
if (iframeLayer) {
viewport = SkRect::MakeXYWH(iframeLayer->iframeOffset().x(),
iframeLayer->iframeOffset().y(),
iframeLayer->getSize().width(),
iframeLayer->getSize().height());
}
float w = viewport.width();
float h = viewport.height();
float dx = viewport.fLeft;
float dy = viewport.fTop;
float x = dx;
float y = dy;
// It turns out that when it is 'auto', we should use the webkit value
// from the original render layer's X,Y, that will take care of alignment
// with the parent's layer and fix Margin etc.
if (!(m_fixedLeft.defined() || m_fixedRight.defined()))
x += m_renderLayerPos.x();
else if (m_fixedLeft.defined() || !m_fixedRight.defined())
x += m_fixedMarginLeft.calcFloatValue(w) + m_fixedLeft.calcFloatValue(w) - m_fixedRect.fLeft;
else
x += w - m_fixedMarginRight.calcFloatValue(w) - m_fixedRight.calcFloatValue(w) - m_fixedRect.fRight;
if (!(m_fixedTop.defined() || m_fixedBottom.defined()))
y += m_renderLayerPos.y();
else if (m_fixedTop.defined() || !m_fixedBottom.defined())
y += m_fixedMarginTop.calcFloatValue(h) + m_fixedTop.calcFloatValue(h) - m_fixedRect.fTop;
else
y += h - m_fixedMarginBottom.calcFloatValue(h) - m_fixedBottom.calcFloatValue(h) - m_fixedRect.fBottom;
this->setPosition(x, y);
return iframeLayer;
}
void FixedLayerAndroid::contentDraw(SkCanvas* canvas)
{
LayerAndroid::contentDraw(canvas);
if (TilesManager::instance()->getShowVisualIndicator()) {
SkPaint paint;
paint.setARGB(80, 255, 0, 0);
canvas->drawRect(m_fixedRect, paint);
}
}
void writeLength(FILE* file, int indentLevel, const char* str, SkLength length)
{
if (!length.defined())
return;
writeIndent(file, indentLevel);
fprintf(file, "%s = { type = %d; value = %.2f; };\n", str, length.type, length.value);
}
void FixedLayerAndroid::dumpLayer(FILE* file, int indentLevel) const
{
writeLength(file, indentLevel + 1, "fixedLeft", m_fixedLeft);
writeLength(file, indentLevel + 1, "fixedTop", m_fixedTop);
writeLength(file, indentLevel + 1, "fixedRight", m_fixedRight);
writeLength(file, indentLevel + 1, "fixedBottom", m_fixedBottom);
writeLength(file, indentLevel + 1, "fixedMarginLeft", m_fixedMarginLeft);
writeLength(file, indentLevel + 1, "fixedMarginTop", m_fixedMarginTop);
writeLength(file, indentLevel + 1, "fixedMarginRight", m_fixedMarginRight);
writeLength(file, indentLevel + 1, "fixedMarginBottom", m_fixedMarginBottom);
writeRect(file, indentLevel + 1, "fixedRect", m_fixedRect);
}
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
|