summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/rendering/RenderDetailsMarker.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-25 19:08:45 +0100
committerSteve Block <steveblock@google.com>2011-06-08 13:51:31 +0100
commit2bde8e466a4451c7319e3a072d118917957d6554 (patch)
tree28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebCore/rendering/RenderDetailsMarker.cpp
parent6939c99b71d9372d14a0c74a772108052e8c48c8 (diff)
downloadexternal_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebCore/rendering/RenderDetailsMarker.cpp')
-rw-r--r--Source/WebCore/rendering/RenderDetailsMarker.cpp177
1 files changed, 174 insertions, 3 deletions
diff --git a/Source/WebCore/rendering/RenderDetailsMarker.cpp b/Source/WebCore/rendering/RenderDetailsMarker.cpp
index 26e49d9..e040eb3 100644
--- a/Source/WebCore/rendering/RenderDetailsMarker.cpp
+++ b/Source/WebCore/rendering/RenderDetailsMarker.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -21,11 +21,182 @@
#include "config.h"
#include "RenderDetailsMarker.h"
+#include "GraphicsContext.h"
+#include "HTMLNames.h"
+#include "PaintInfo.h"
+#include "RenderDetails.h"
+#include "RenderSummary.h"
+
namespace WebCore {
-RenderDetailsMarker::RenderDetailsMarker(Node* element)
- : RenderBlock(element)
+using namespace HTMLNames;
+
+RenderDetailsMarker::RenderDetailsMarker(RenderDetails* item)
+ : RenderBox(item->document())
+ , m_details(item)
+{
+ setInline(true);
+ setReplaced(true);
+}
+
+void RenderDetailsMarker::destroy()
+{
+ if (m_details)
+ m_details->markerDestroyed();
+
+ RenderBox::destroy();
+}
+
+int RenderDetailsMarker::lineHeight(bool firstLine, LineDirectionMode direction, LinePositionMode) const
+{
+ return m_details->lineHeight(firstLine, direction, PositionOfInteriorLineBoxes);
+}
+
+int RenderDetailsMarker::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode direction, LinePositionMode) const
+{
+ return m_details->baselinePosition(baselineType, firstLine, direction, PositionOfInteriorLineBoxes);
+}
+
+void RenderDetailsMarker::computePreferredLogicalWidths()
+{
+ ASSERT(preferredLogicalWidthsDirty());
+
+ m_minPreferredLogicalWidth = 2 * style()->fontMetrics().ascent() / 3;
+ m_maxPreferredLogicalWidth = m_minPreferredLogicalWidth;
+
+ setPreferredLogicalWidthsDirty(false);
+}
+
+void RenderDetailsMarker::layout()
+{
+ ASSERT(needsLayout());
+
+ setLogicalWidth(minPreferredLogicalWidth());
+ setLogicalHeight(style()->fontMetrics().height());
+
+ setMarginStart(0);
+ setMarginEnd(style()->fontMetrics().ascent() - minPreferredLogicalWidth() + 1);
+
+ setNeedsLayout(false);
+}
+
+IntRect RenderDetailsMarker::getRelativeMarkerRect() const
+{
+ IntRect relativeRect;
+
+ int bulletWidth = minPreferredLogicalWidth();
+ relativeRect = IntRect((logicalWidth() - bulletWidth) / 2, (logicalHeight() - bulletWidth) / 2, bulletWidth, bulletWidth);
+
+ if (!style()->isHorizontalWritingMode()) {
+ relativeRect = relativeRect.transposedRect();
+ relativeRect.setX(width() - relativeRect.x() - relativeRect.width());
+ }
+
+ return relativeRect;
+}
+
+bool RenderDetailsMarker::isOpen() const
{
+ return m_details && m_details->isOpen();
+}
+
+static Path createPath(const FloatPoint* path)
+{
+ Path result;
+ result.moveTo(FloatPoint(path[0].x(), path[0].y()));
+ for (int i = 1; i < 4; ++i)
+ result.addLineTo(FloatPoint(path[i].x(), path[i].y()));
+ return result;
+}
+
+static Path createDownArrowPath()
+{
+ FloatPoint points[4] = { FloatPoint(0.0f, 0.07f), FloatPoint(0.5f, 0.93f), FloatPoint(1.0f, 0.07f), FloatPoint(0.0f, 0.07f) };
+ return createPath(points);
+}
+
+static Path createUpArrowPath()
+{
+ FloatPoint points[4] = { FloatPoint(0.0f, 0.93f), FloatPoint(0.5f, 0.07f), FloatPoint(1.0f, 0.93f), FloatPoint(0.0f, 0.93f) };
+ return createPath(points);
+}
+
+static Path createLeftArrowPath()
+{
+ FloatPoint points[4] = { FloatPoint(1.0f, 0.0f), FloatPoint(0.14f, 0.5f), FloatPoint(1.0f, 1.0f), FloatPoint(1.0f, 0.0f) };
+ return createPath(points);
+}
+
+static Path createRightArrowPath()
+{
+ FloatPoint points[4] = { FloatPoint(0.0f, 0.0f), FloatPoint(0.86f, 0.5f), FloatPoint(0.0f, 1.0f), FloatPoint(0.0f, 0.0f) };
+ return createPath(points);
+}
+
+RenderDetailsMarker::Orientation RenderDetailsMarker::orientation() const
+{
+ switch (style()->writingMode()) {
+ case TopToBottomWritingMode:
+ if (style()->isLeftToRightDirection())
+ return isOpen() ? Down : Right;
+ return isOpen() ? Down : Left;
+ case RightToLeftWritingMode:
+ if (style()->isLeftToRightDirection())
+ return isOpen() ? Left : Down;
+ return isOpen() ? Left : Up;
+ case LeftToRightWritingMode:
+ if (style()->isLeftToRightDirection())
+ return isOpen() ? Right : Down;
+ return isOpen() ? Right : Up;
+ case BottomToTopWritingMode:
+ if (style()->isLeftToRightDirection())
+ return isOpen() ? Up : Right;
+ return isOpen() ? Up : Left;
+ }
+ return Right;
+}
+
+Path RenderDetailsMarker::getCanonicalPath() const
+{
+ switch (orientation()) {
+ case Left: return createLeftArrowPath();
+ case Right: return createRightArrowPath();
+ case Up: return createUpArrowPath();
+ case Down: return createDownArrowPath();
+ }
+
+ return Path();
+}
+
+Path RenderDetailsMarker::getPath(const IntPoint& origin) const
+{
+ IntRect rect = getRelativeMarkerRect();
+ Path result = getCanonicalPath();
+ result.transform(AffineTransform().scale(rect.width()));
+ result.translate(FloatSize(origin.x() + rect.x(), origin.y() + rect.y()));
+ return result;
+}
+
+void RenderDetailsMarker::paint(PaintInfo& paintInfo, int tx, int ty)
+{
+ if (paintInfo.phase != PaintPhaseForeground || style()->visibility() != VISIBLE)
+ return;
+
+ IntPoint boxOrigin(tx + x(), ty + y());
+ IntRect overflowRect(visualOverflowRect());
+ overflowRect.move(boxOrigin.x(), boxOrigin.y());
+ overflowRect.inflate(maximalOutlineSize(paintInfo.phase));
+
+ if (!paintInfo.rect.intersects(overflowRect))
+ return;
+
+ const Color color(style()->visitedDependentColor(CSSPropertyColor));
+ paintInfo.context->setStrokeColor(color, style()->colorSpace());
+ paintInfo.context->setStrokeStyle(SolidStroke);
+ paintInfo.context->setStrokeThickness(1.0f);
+ paintInfo.context->setFillColor(color, style()->colorSpace());
+
+ paintInfo.context->fillPath(getPath(boxOrigin));
}
}