Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(775)

Side by Side Diff: Source/core/rendering/RenderTableCell.cpp

Issue 724483002: Move painting code from RenderTableCell to TableCellPainter. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderTableCell.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 10 matching lines...) Expand all
21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA. 22 * Boston, MA 02110-1301, USA.
23 */ 23 */
24 24
25 #include "config.h" 25 #include "config.h"
26 #include "core/rendering/RenderTableCell.h" 26 #include "core/rendering/RenderTableCell.h"
27 27
28 #include "core/HTMLNames.h" 28 #include "core/HTMLNames.h"
29 #include "core/css/StylePropertySet.h" 29 #include "core/css/StylePropertySet.h"
30 #include "core/html/HTMLTableCellElement.h" 30 #include "core/html/HTMLTableCellElement.h"
31 #include "core/paint/BoxPainter.h" 31 #include "core/paint/TableCellPainter.h"
32 #include "core/paint/DrawingRecorder.h"
33 #include "core/rendering/PaintInfo.h" 32 #include "core/rendering/PaintInfo.h"
34 #include "core/rendering/RenderTableCol.h" 33 #include "core/rendering/RenderTableCol.h"
35 #include "core/rendering/RenderView.h" 34 #include "core/rendering/RenderView.h"
36 #include "core/rendering/SubtreeLayoutScope.h" 35 #include "core/rendering/SubtreeLayoutScope.h"
37 #include "core/rendering/style/CollapsedBorderValue.h" 36 #include "core/rendering/style/CollapsedBorderValue.h"
38 #include "platform/geometry/FloatQuad.h" 37 #include "platform/geometry/FloatQuad.h"
39 #include "platform/geometry/TransformState.h" 38 #include "platform/geometry/TransformState.h"
40 #include "platform/graphics/GraphicsContextStateSaver.h" 39 #include "platform/graphics/GraphicsContextStateSaver.h"
41 40
42 namespace blink { 41 namespace blink {
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 846
848 // (9) The table's after border. 847 // (9) The table's after border.
849 result = chooseBorder(result, CollapsedBorderValue(table->style()->borde rAfter(), includeColor ? table->resolveColor(afterColorProperty) : Color(), BTAB LE)); 848 result = chooseBorder(result, CollapsedBorderValue(table->style()->borde rAfter(), includeColor ? table->resolveColor(afterColorProperty) : Color(), BTAB LE));
850 if (!result.exists()) 849 if (!result.exists())
851 return result; 850 return result;
852 } 851 }
853 852
854 return result; 853 return result;
855 } 854 }
856 855
857 inline CollapsedBorderValue RenderTableCell::cachedCollapsedLeftBorder(const Ren derStyle* styleForCellFlow) const
858 {
859 if (styleForCellFlow->isHorizontalWritingMode())
860 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCol lapsedBorder(this, CBSStart) : section()->cachedCollapsedBorder(this, CBSEnd);
861 return styleForCellFlow->slowIsFlippedBlocksWritingMode() ? section()->cache dCollapsedBorder(this, CBSAfter) : section()->cachedCollapsedBorder(this, CBSBef ore);
862 }
863
864 inline CollapsedBorderValue RenderTableCell::cachedCollapsedRightBorder(const Re nderStyle* styleForCellFlow) const
865 {
866 if (styleForCellFlow->isHorizontalWritingMode())
867 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCol lapsedBorder(this, CBSEnd) : section()->cachedCollapsedBorder(this, CBSStart);
868 return styleForCellFlow->slowIsFlippedBlocksWritingMode() ? section()->cache dCollapsedBorder(this, CBSBefore) : section()->cachedCollapsedBorder(this, CBSAf ter);
869 }
870
871 inline CollapsedBorderValue RenderTableCell::cachedCollapsedTopBorder(const Rend erStyle* styleForCellFlow) const
872 {
873 if (styleForCellFlow->isHorizontalWritingMode())
874 return styleForCellFlow->slowIsFlippedBlocksWritingMode() ? section()->c achedCollapsedBorder(this, CBSAfter) : section()->cachedCollapsedBorder(this, CB SBefore);
875 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCollaps edBorder(this, CBSStart) : section()->cachedCollapsedBorder(this, CBSEnd);
876 }
877
878 inline CollapsedBorderValue RenderTableCell::cachedCollapsedBottomBorder(const R enderStyle* styleForCellFlow) const
879 {
880 if (styleForCellFlow->isHorizontalWritingMode())
881 return styleForCellFlow->slowIsFlippedBlocksWritingMode() ? section()->c achedCollapsedBorder(this, CBSBefore) : section()->cachedCollapsedBorder(this, C BSAfter);
882 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCollaps edBorder(this, CBSEnd) : section()->cachedCollapsedBorder(this, CBSStart);
883 }
884
885 int RenderTableCell::borderLeft() const 856 int RenderTableCell::borderLeft() const
886 { 857 {
887 return table()->collapseBorders() ? borderHalfLeft(false) : RenderBlockFlow: :borderLeft(); 858 return table()->collapseBorders() ? borderHalfLeft(false) : RenderBlockFlow: :borderLeft();
888 } 859 }
889 860
890 int RenderTableCell::borderRight() const 861 int RenderTableCell::borderRight() const
891 { 862 {
892 return table()->collapseBorders() ? borderHalfRight(false) : RenderBlockFlow ::borderRight(); 863 return table()->collapseBorders() ? borderHalfRight(false) : RenderBlockFlow ::borderRight();
893 } 864 }
894 865
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 int RenderTableCell::borderHalfAfter(bool outer) const 954 int RenderTableCell::borderHalfAfter(bool outer) const
984 { 955 {
985 CollapsedBorderValue border = collapsedAfterBorder(DoNotIncludeBorderColor); 956 CollapsedBorderValue border = collapsedAfterBorder(DoNotIncludeBorderColor);
986 if (border.exists()) 957 if (border.exists())
987 return (border.width() + ((styleForCellFlow()->slowIsFlippedBlocksWritin gMode() ^ outer) ? 1 : 0)) / 2; 958 return (border.width() + ((styleForCellFlow()->slowIsFlippedBlocksWritin gMode() ^ outer) ? 1 : 0)) / 2;
988 return 0; 959 return 0;
989 } 960 }
990 961
991 void RenderTableCell::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset ) 962 void RenderTableCell::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset )
992 { 963 {
993 ASSERT(paintInfo.phase != PaintPhaseCollapsedTableBorders); 964 TableCellPainter(*this).paint(paintInfo, paintOffset);
994 RenderBlock::paint(paintInfo, paintOffset);
995 } 965 }
996 966
997 static EBorderStyle collapsedBorderStyle(EBorderStyle style)
998 {
999 if (style == OUTSET)
1000 return GROOVE;
1001 if (style == INSET)
1002 return RIDGE;
1003 return style;
1004 }
1005
1006 struct CollapsedBorder {
1007 CollapsedBorderValue borderValue;
1008 BoxSide side;
1009 bool shouldPaint;
1010 int x1;
1011 int y1;
1012 int x2;
1013 int y2;
1014 EBorderStyle style;
1015 };
1016
1017 class CollapsedBorders {
1018 public:
1019 CollapsedBorders()
1020 : m_count(0)
1021 {
1022 }
1023
1024 void addBorder(const CollapsedBorderValue& borderValue, BoxSide borderSide, bool shouldPaint,
1025 int x1, int y1, int x2, int y2, EBorderStyle borderStyle)
1026 {
1027 if (borderValue.exists() && shouldPaint) {
1028 m_borders[m_count].borderValue = borderValue;
1029 m_borders[m_count].side = borderSide;
1030 m_borders[m_count].shouldPaint = shouldPaint;
1031 m_borders[m_count].x1 = x1;
1032 m_borders[m_count].x2 = x2;
1033 m_borders[m_count].y1 = y1;
1034 m_borders[m_count].y2 = y2;
1035 m_borders[m_count].style = borderStyle;
1036 m_count++;
1037 }
1038 }
1039
1040 CollapsedBorder* nextBorder()
1041 {
1042 for (unsigned i = 0; i < m_count; i++) {
1043 if (m_borders[i].borderValue.exists() && m_borders[i].shouldPaint) {
1044 m_borders[i].shouldPaint = false;
1045 return &m_borders[i];
1046 }
1047 }
1048
1049 return 0;
1050 }
1051
1052 CollapsedBorder m_borders[4];
1053 unsigned m_count;
1054 };
1055
1056 static void addBorderStyle(RenderTable::CollapsedBorderValues& borderValues, 967 static void addBorderStyle(RenderTable::CollapsedBorderValues& borderValues,
1057 CollapsedBorderValue borderValue) 968 CollapsedBorderValue borderValue)
1058 { 969 {
1059 if (!borderValue.exists()) 970 if (!borderValue.exists())
1060 return; 971 return;
1061 size_t count = borderValues.size(); 972 size_t count = borderValues.size();
1062 for (size_t i = 0; i < count; ++i) 973 for (size_t i = 0; i < count; ++i)
1063 if (borderValues[i].isSameIgnoringColor(borderValue)) 974 if (borderValues[i].isSameIgnoringColor(borderValue))
1064 return; 975 return;
1065 borderValues.append(borderValue); 976 borderValues.append(borderValue);
(...skipping 15 matching lines...) Expand all
1081 return 0; 992 return 0;
1082 return compareBorders(*a, *b); 993 return compareBorders(*a, *b);
1083 } 994 }
1084 995
1085 void RenderTableCell::sortBorderValues(RenderTable::CollapsedBorderValues& borde rValues) 996 void RenderTableCell::sortBorderValues(RenderTable::CollapsedBorderValues& borde rValues)
1086 { 997 {
1087 qsort(borderValues.data(), borderValues.size(), sizeof(CollapsedBorderValue) , 998 qsort(borderValues.data(), borderValues.size(), sizeof(CollapsedBorderValue) ,
1088 compareBorderValuesForQSort); 999 compareBorderValuesForQSort);
1089 } 1000 }
1090 1001
1091 void RenderTableCell::paintCollapsedBorders(PaintInfo& paintInfo, const LayoutPo int& paintOffset)
1092 {
1093 ASSERT(paintInfo.phase == PaintPhaseCollapsedTableBorders);
1094
1095 if (!paintInfo.shouldPaintWithinRoot(this) || style()->visibility() != VISIB LE)
1096 return;
1097
1098 LayoutRect paintRect = LayoutRect(paintOffset + location(), pixelSnappedSize ());
1099 if (paintRect.y() - table()->outerBorderTop() >= paintInfo.rect.maxY())
1100 return;
1101
1102 if (paintRect.maxY() + table()->outerBorderBottom() <= paintInfo.rect.y())
1103 return;
1104
1105 if (!table()->currentBorderValue())
1106 return;
1107
1108 const RenderStyle* styleForCellFlow = this->styleForCellFlow();
1109 CollapsedBorderValue leftVal = cachedCollapsedLeftBorder(styleForCellFlow);
1110 CollapsedBorderValue rightVal = cachedCollapsedRightBorder(styleForCellFlow) ;
1111 CollapsedBorderValue topVal = cachedCollapsedTopBorder(styleForCellFlow);
1112 CollapsedBorderValue bottomVal = cachedCollapsedBottomBorder(styleForCellFlo w);
1113
1114 // Adjust our x/y/width/height so that we paint the collapsed borders at the correct location.
1115 int topWidth = topVal.width();
1116 int bottomWidth = bottomVal.width();
1117 int leftWidth = leftVal.width();
1118 int rightWidth = rightVal.width();
1119
1120 IntRect borderRect = pixelSnappedIntRect(paintRect.x() - leftWidth / 2,
1121 paintRect.y() - topWidth / 2,
1122 paintRect.width() + leftWidth / 2 + (rightWidth + 1) / 2,
1123 paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2);
1124
1125 EBorderStyle topStyle = collapsedBorderStyle(topVal.style());
1126 EBorderStyle bottomStyle = collapsedBorderStyle(bottomVal.style());
1127 EBorderStyle leftStyle = collapsedBorderStyle(leftVal.style());
1128 EBorderStyle rightStyle = collapsedBorderStyle(rightVal.style());
1129
1130 bool renderTop = topStyle > BHIDDEN && !topVal.isTransparent();
1131 bool renderBottom = bottomStyle > BHIDDEN && !bottomVal.isTransparent();
1132 bool renderLeft = leftStyle > BHIDDEN && !leftVal.isTransparent();
1133 bool renderRight = rightStyle > BHIDDEN && !rightVal.isTransparent();
1134
1135 // We never paint diagonals at the joins. We simply let the border with the highest
1136 // precedence paint on top of borders with lower precedence.
1137 CollapsedBorders borders;
1138 borders.addBorder(topVal, BSTop, renderTop, borderRect.x(), borderRect.y(), borderRect.maxX(), borderRect.y() + topWidth, topStyle);
1139 borders.addBorder(bottomVal, BSBottom, renderBottom, borderRect.x(), borderR ect.maxY() - bottomWidth, borderRect.maxX(), borderRect.maxY(), bottomStyle);
1140 borders.addBorder(leftVal, BSLeft, renderLeft, borderRect.x(), borderRect.y( ), borderRect.x() + leftWidth, borderRect.maxY(), leftStyle);
1141 borders.addBorder(rightVal, BSRight, renderRight, borderRect.maxX() - rightW idth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), rightStyle);
1142
1143 GraphicsContext* graphicsContext = paintInfo.context;
1144 bool antialias = BoxPainter::shouldAntialiasLines(graphicsContext);
1145
1146 for (CollapsedBorder* border = borders.nextBorder(); border; border = border s.nextBorder()) {
1147 if (border->borderValue.isSameIgnoringColor(*table()->currentBorderValue ())) {
1148 ObjectPainter::drawLineForBoxSide(graphicsContext, border->x1, borde r->y1, border->x2, border->y2, border->side,
1149 border->borderValue.color().resolve(style()->visitedDependentCol or(CSSPropertyColor)), border->style, 0, 0, antialias);
1150 }
1151 }
1152 }
1153
1154 void RenderTableCell::paintBackgroundsBehindCell(PaintInfo& paintInfo, const Lay outPoint& paintOffset, RenderObject* backgroundObject)
1155 {
1156 if (!paintInfo.shouldPaintWithinRoot(this))
1157 return;
1158
1159 if (!backgroundObject)
1160 return;
1161
1162 if (style()->visibility() != VISIBLE)
1163 return;
1164
1165 RenderTable* tableElt = table();
1166 if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstC hild())
1167 return;
1168
1169 LayoutPoint adjustedPaintOffset = paintOffset;
1170 if (backgroundObject != this)
1171 adjustedPaintOffset.moveBy(location());
1172
1173 Color c = backgroundObject->resolveColor(CSSPropertyBackgroundColor);
1174 const FillLayer& bgLayer = backgroundObject->style()->backgroundLayers();
1175
1176 if (bgLayer.hasImage() || c.alpha()) {
1177 // We have to clip here because the background would paint
1178 // on top of the borders otherwise. This only matters for cells and row s.
1179 bool shouldClip = backgroundObject->hasLayer() && (backgroundObject == t his || backgroundObject == parent()) && tableElt->collapseBorders();
1180 GraphicsContextStateSaver stateSaver(*paintInfo.context, shouldClip);
1181 if (shouldClip) {
1182 LayoutRect clipRect(adjustedPaintOffset.x() + borderLeft(), adjusted PaintOffset.y() + borderTop(),
1183 width() - borderLeft() - borderRight(), height() - borderTop() - borderBottom());
1184 paintInfo.context->clip(clipRect);
1185 }
1186 BoxPainter(*this).paintFillLayers(paintInfo, c, bgLayer, LayoutRect(adju stedPaintOffset, pixelSnappedSize()), BackgroundBleedNone, CompositeSourceOver, backgroundObject);
1187 }
1188 }
1189
1190 void RenderTableCell::paintBoxDecorationBackground(PaintInfo& paintInfo, const L ayoutPoint& paintOffset) 1002 void RenderTableCell::paintBoxDecorationBackground(PaintInfo& paintInfo, const L ayoutPoint& paintOffset)
1191 { 1003 {
1192 if (!paintInfo.shouldPaintWithinRoot(this)) 1004 TableCellPainter(*this).paintBoxDecorationBackground(paintInfo, paintOffset) ;
1193 return;
1194
1195 RenderTable* tableElt = table();
1196 if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstC hild())
1197 return;
1198
1199 LayoutRect paintRect = LayoutRect(paintOffset, pixelSnappedSize());
1200 DrawingRecorder recorder(paintInfo.context, this, paintInfo.phase, pixelSnap pedIntRect(paintRect));
1201 BoxPainter::paintBoxShadow(paintInfo, paintRect, style(), Normal);
1202
1203 // Paint our cell background.
1204 paintBackgroundsBehindCell(paintInfo, paintOffset, this);
1205
1206 BoxPainter::paintBoxShadow(paintInfo, paintRect, style(), Inset);
1207
1208 if (!style()->hasBorder() || tableElt->collapseBorders())
1209 return;
1210
1211 BoxPainter::paintBorder(*this, paintInfo, paintRect, style());
1212 } 1005 }
1213 1006
1214 void RenderTableCell::paintMask(PaintInfo& paintInfo, const LayoutPoint& paintOf fset) 1007 void RenderTableCell::paintMask(PaintInfo& paintInfo, const LayoutPoint& paintOf fset)
1215 { 1008 {
1216 if (style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) 1009 TableCellPainter(*this).paintMask(paintInfo, paintOffset);
1217 return;
1218
1219 RenderTable* tableElt = table();
1220 if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstC hild())
1221 return;
1222
1223 BoxPainter(*this).paintMaskImages(paintInfo, LayoutRect(paintOffset, pixelSn appedSize()));
1224 } 1010 }
1225 1011
1226 bool RenderTableCell::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoida nce, InlineFlowBox*) const 1012 bool RenderTableCell::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoida nce, InlineFlowBox*) const
1227 { 1013 {
1228 return false; 1014 return false;
1229 } 1015 }
1230 1016
1231 void RenderTableCell::scrollbarsChanged(bool horizontalScrollbarChanged, bool ve rticalScrollbarChanged) 1017 void RenderTableCell::scrollbarsChanged(bool horizontalScrollbarChanged, bool ve rticalScrollbarChanged)
1232 { 1018 {
1233 LayoutUnit scrollbarHeight = scrollbarLogicalHeight(); 1019 LayoutUnit scrollbarHeight = scrollbarLogicalHeight();
(...skipping 27 matching lines...) Expand all
1261 1047
1262 RenderTableCell* RenderTableCell::createAnonymousWithParentRenderer(const Render Object* parent) 1048 RenderTableCell* RenderTableCell::createAnonymousWithParentRenderer(const Render Object* parent)
1263 { 1049 {
1264 RenderTableCell* newCell = RenderTableCell::createAnonymous(&parent->documen t()); 1050 RenderTableCell* newCell = RenderTableCell::createAnonymous(&parent->documen t());
1265 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_CELL); 1051 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_CELL);
1266 newCell->setStyle(newStyle.release()); 1052 newCell->setStyle(newStyle.release());
1267 return newCell; 1053 return newCell;
1268 } 1054 }
1269 1055
1270 } // namespace blink 1056 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderTableCell.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698