1d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis// Copyright 2014 The Chromium Authors. All rights reserved.
264924859b6b09d1cfb62fecf5954ec6c27cb58feTed Kremenek// Use of this source code is governed by a BSD-style license that can be
34af84313df0d2710fd57af89132e680294225cadTed Kremenek// found in the LICENSE file.
4d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek
5d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek#include "config.h"
6d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek#include "core/paint/DetailsMarkerPainter.h"
7d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek
8d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek#include "core/paint/BlockPainter.h"
9d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek#include "core/rendering/PaintInfo.h"
1077349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "core/rendering/RenderDetailsMarker.h"
1177349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "platform/geometry/LayoutPoint.h"
1277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "platform/graphics/Path.h"
13d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremenek
14d27f8169f4b68337a489547a41ac45bf7a5d1ddfTed Kremeneknamespace blink {
15a7af5ea88a6c5bdf87497cca6c20831e8c546751Argyrios Kyrtzidis
169b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenekvoid DetailsMarkerPainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
17ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose{
18199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    if (paintInfo.phase != PaintPhaseForeground || m_renderDetailsMarker.style()->visibility() != VISIBLE) {
1916f0049415ec596504891259e2a83e19871c0d52Chris Lattner        BlockPainter(m_renderDetailsMarker).paint(paintInfo, paintOffset);
20337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek        return;
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    }
221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner
230bed8a12f2878d3cd94fb8bdba55b593d92dd11aTed Kremenek    LayoutPoint boxOrigin(paintOffset + m_renderDetailsMarker.location());
2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    LayoutRect overflowRect(m_renderDetailsMarker.visualOverflowRect());
2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    overflowRect.moveBy(boxOrigin);
2655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth
2755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    if (!paintInfo.rect.intersects(pixelSnappedIntRect(overflowRect)))
2855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth        return;
296cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer
30c2994283aa7538b7420c8e398cde7afa328d7042Anna Zaks    const Color color(m_renderDetailsMarker.resolveColor(CSSPropertyColor));
3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    paintInfo.context->setStrokeColor(color);
324323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek    paintInfo.context->setStrokeStyle(SolidStroke);
330f5f0595d6a038843a7051c5a65fca7bce2915a0Ted Kremenek    paintInfo.context->setStrokeThickness(1.0f);
340f5f0595d6a038843a7051c5a65fca7bce2915a0Ted Kremenek    paintInfo.context->setFillColor(color);
350f5f0595d6a038843a7051c5a65fca7bce2915a0Ted Kremenek
360f5f0595d6a038843a7051c5a65fca7bce2915a0Ted Kremenek    boxOrigin.move(m_renderDetailsMarker.borderLeft() + m_renderDetailsMarker.paddingLeft(), m_renderDetailsMarker.borderTop() + m_renderDetailsMarker.paddingTop());
37b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    paintInfo.context->fillPath(getPath(boxOrigin));
389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek}
39b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
40ab2b8c54bca82866876f91e756788916d3fa20c3Ted Kremenekstatic Path createPath(const FloatPoint* path)
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines{
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Path result;
43c2994283aa7538b7420c8e398cde7afa328d7042Anna Zaks    result.moveTo(FloatPoint(path[0].x(), path[0].y()));
44c2994283aa7538b7420c8e398cde7afa328d7042Anna Zaks    for (int i = 1; i < 4; ++i)
45749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaks        result.addLineTo(FloatPoint(path[i].x(), path[i].y()));
46749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaks    return result;
47749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaks}
48749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaks
49749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaksstatic Path createDownArrowPath()
50749bbe6f5f23676244f12a0d41511c8e73516febAnna Zaks{
515903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks    FloatPoint points[4] = { FloatPoint(0.0f, 0.07f), FloatPoint(0.5f, 0.93f), FloatPoint(1.0f, 0.07f), FloatPoint(0.0f, 0.07f) };
525903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks    return createPath(points);
535903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks}
54e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek
55e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenekstatic Path createUpArrowPath()
56e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek{
57e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek    FloatPoint points[4] = { FloatPoint(0.0f, 0.93f), FloatPoint(0.5f, 0.07f), FloatPoint(1.0f, 0.93f), FloatPoint(0.0f, 0.93f) };
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return createPath(points);
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
603fd5f370a28552976c52e76c3035d79012d78ddaAnna Zaks
61fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaksstatic Path createLeftArrowPath()
6275f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks{
6375f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    FloatPoint points[4] = { FloatPoint(1.0f, 0.0f), FloatPoint(0.14f, 0.5f), FloatPoint(1.0f, 1.0f), FloatPoint(1.0f, 0.0f) };
6425e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu    return createPath(points);
651d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek}
66fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks
67d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidisstatic Path createRightArrowPath()
68c77a55126fcad66fb086f8e100a494caa2496a2dZhongxing Xu{
6932a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek    FloatPoint points[4] = { FloatPoint(0.0f, 0.0f), FloatPoint(0.86f, 0.5f), FloatPoint(0.0f, 1.0f), FloatPoint(0.0f, 0.0f) };
70ca5d78d0bc3010164f2f9682967d64d7e305a167Jordan Rose    return createPath(points);
7150a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek}
72c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesPath DetailsMarkerPainter::getCanonicalPath() const
744ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek{
75fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks    switch (m_renderDetailsMarker.orientation()) {
7675f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    case RenderDetailsMarker::Left: return createLeftArrowPath();
7775f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    case RenderDetailsMarker::Right: return createRightArrowPath();
78255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek    case RenderDetailsMarker::Up: return createUpArrowPath();
794d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    case RenderDetailsMarker::Down: return createDownArrowPath();
804d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    }
814d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
824d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    return Path();
834d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose}
84c80135ba857da48173578b9c528fce6777e18168Ted Kremenek
8550a6d0ce344c02782e0207574005c3b2aaa5077cTed KremenekPath DetailsMarkerPainter::getPath(const LayoutPoint& origin) const
86d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis{
87cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    Path result = getCanonicalPath();
8850a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek    result.transform(AffineTransform().scale(m_renderDetailsMarker.contentWidth().toFloat(), m_renderDetailsMarker.contentHeight().toFloat()));
8950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek    result.translate(FloatSize(origin.x().toFloat(), origin.y().toFloat()));
90e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek    return result;
91e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek}
92e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek
93e695e1cd7d8a579455e8969be36cbaf10a316a64Ted Kremenek} // namespace paint
948bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek