OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 2925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2936 } | 2936 } |
2937 } | 2937 } |
2938 } | 2938 } |
2939 | 2939 |
2940 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) | 2940 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) |
2941 { | 2941 { |
2942 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); | 2942 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); |
2943 | 2943 |
2944 LayoutPoint adjustedPaintOffset = paintOffset + location(); | 2944 LayoutPoint adjustedPaintOffset = paintOffset + location(); |
2945 | 2945 |
2946 PaintPhase phase = paintInfo.phase; | 2946 PaintPhase phase = paintInfo.getPhase(); |
2947 | 2947 |
2948 // Check if we need to do anything at all. | 2948 // Check if we need to do anything at all. |
2949 // FIXME: Could eliminate the isRoot() check if we fix background painting s
o that the RenderView | 2949 // FIXME: Could eliminate the isRoot() check if we fix background painting s
o that the RenderView |
2950 // paints the root's background. | 2950 // paints the root's background. |
2951 if (!isRoot()) { | 2951 if (!isRoot()) { |
2952 LayoutRect overflowBox = overflowRectForPaintRejection(); | 2952 LayoutRect overflowBox = overflowRectForPaintRejection(); |
2953 flipForWritingMode(overflowBox); | 2953 flipForWritingMode(overflowBox); |
2954 overflowBox.inflate(maximalOutlineSize(paintInfo.phase)); | 2954 overflowBox.inflate(maximalOutlineSize(paintInfo.getPhase())); |
2955 overflowBox.moveBy(adjustedPaintOffset); | 2955 overflowBox.moveBy(adjustedPaintOffset); |
2956 if (!overflowBox.intersects(paintInfo.rect)) | 2956 if (!overflowBox.intersects(paintInfo.getRect())) |
2957 return; | 2957 return; |
2958 } | 2958 } |
2959 | 2959 |
2960 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset); | 2960 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset); |
2961 paintObject(paintInfo, adjustedPaintOffset); | 2961 paintObject(paintInfo, adjustedPaintOffset); |
2962 if (pushedClip) | 2962 if (pushedClip) |
2963 popContentsClip(paintInfo, phase, adjustedPaintOffset); | 2963 popContentsClip(paintInfo, phase, adjustedPaintOffset); |
2964 | 2964 |
2965 // Our scrollbar widgets paint exactly when we tell them to, so that they wo
rk properly with | 2965 // Our scrollbar widgets paint exactly when we tell them to, so that they wo
rk properly with |
2966 // z-index. We paint after we painted the background/border, so that the sc
rollbars will | 2966 // z-index. We paint after we painted the background/border, so that the sc
rollbars will |
2967 // sit above the background/border. | 2967 // sit above the background/border. |
2968 if (hasOverflowClip() && style()->visibility() == VISIBLE && (phase == Paint
PhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.sh
ouldPaintWithinRoot(this) && !paintInfo.paintRootBackgroundOnly()) | 2968 if (hasOverflowClip() && style()->visibility() == VISIBLE && (phase == Paint
PhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.sh
ouldPaintWithinRoot(this) && !paintInfo.paintRootBackgroundOnly()) |
2969 layer()->paintOverflowControls(paintInfo.context, roundedIntPoint(adjust
edPaintOffset), paintInfo.rect); | 2969 layer()->paintOverflowControls(paintInfo.getContext(), roundedIntPoint(a
djustedPaintOffset), paintInfo.getRect()); |
2970 } | 2970 } |
2971 | 2971 |
2972 void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& pain
tOffset) | 2972 void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& pain
tOffset) |
2973 { | 2973 { |
2974 if (paintInfo.context->paintingDisabled()) | 2974 if (paintInfo.getContext()->paintingDisabled()) |
2975 return; | 2975 return; |
2976 | 2976 |
2977 const Color& ruleColor = resolveColor(CSSPropertyWebkitColumnRuleColor); | 2977 const Color& ruleColor = resolveColor(CSSPropertyWebkitColumnRuleColor); |
2978 bool ruleTransparent = style()->columnRuleIsTransparent(); | 2978 bool ruleTransparent = style()->columnRuleIsTransparent(); |
2979 EBorderStyle ruleStyle = style()->columnRuleStyle(); | 2979 EBorderStyle ruleStyle = style()->columnRuleStyle(); |
2980 LayoutUnit ruleThickness = style()->columnRuleWidth(); | 2980 LayoutUnit ruleThickness = style()->columnRuleWidth(); |
2981 LayoutUnit colGap = columnGap(); | 2981 LayoutUnit colGap = columnGap(); |
2982 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; | 2982 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; |
2983 if (!renderRule) | 2983 if (!renderRule) |
2984 return; | 2984 return; |
2985 | 2985 |
2986 ColumnInfo* colInfo = columnInfo(); | 2986 ColumnInfo* colInfo = columnInfo(); |
2987 unsigned colCount = columnCount(colInfo); | 2987 unsigned colCount = columnCount(colInfo); |
2988 | 2988 |
2989 bool antialias = shouldAntialiasLines(paintInfo.context); | 2989 bool antialias = shouldAntialiasLines(paintInfo.getContext()); |
2990 | 2990 |
2991 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { | 2991 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { |
2992 bool leftToRight = style()->isLeftToRightDirection() ^ colInfo->progress
ionIsReversed(); | 2992 bool leftToRight = style()->isLeftToRightDirection() ^ colInfo->progress
ionIsReversed(); |
2993 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL
ogicalWidth(); | 2993 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL
ogicalWidth(); |
2994 LayoutUnit ruleAdd = logicalLeftOffsetForContent(); | 2994 LayoutUnit ruleAdd = logicalLeftOffsetForContent(); |
2995 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical
Width(); | 2995 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical
Width(); |
2996 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth(); | 2996 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth(); |
2997 BoxSide boxSide = isHorizontalWritingMode() | 2997 BoxSide boxSide = isHorizontalWritingMode() |
2998 ? leftToRight ? BSLeft : BSRight | 2998 ? leftToRight ? BSLeft : BSRight |
2999 : leftToRight ? BSTop : BSBottom; | 2999 : leftToRight ? BSTop : BSBottom; |
3000 | 3000 |
3001 for (unsigned i = 0; i < colCount; i++) { | 3001 for (unsigned i = 0; i < colCount; i++) { |
3002 // Move to the next position. | 3002 // Move to the next position. |
3003 if (leftToRight) { | 3003 if (leftToRight) { |
3004 ruleLogicalLeft += inlineDirectionSize + colGap / 2; | 3004 ruleLogicalLeft += inlineDirectionSize + colGap / 2; |
3005 currLogicalLeftOffset += inlineDirectionSize + colGap; | 3005 currLogicalLeftOffset += inlineDirectionSize + colGap; |
3006 } else { | 3006 } else { |
3007 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); | 3007 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); |
3008 currLogicalLeftOffset -= (inlineDirectionSize + colGap); | 3008 currLogicalLeftOffset -= (inlineDirectionSize + colGap); |
3009 } | 3009 } |
3010 | 3010 |
3011 // Now paint the column rule. | 3011 // Now paint the column rule. |
3012 if (i < colCount - 1) { | 3012 if (i < colCount - 1) { |
3013 LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x(
) + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft
() + paddingLeft(); | 3013 LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x(
) + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft
() + paddingLeft(); |
3014 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru
leThickness : ruleLeft + contentWidth(); | 3014 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru
leThickness : ruleLeft + contentWidth(); |
3015 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y()
+ borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes
s / 2 + ruleAdd; | 3015 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y()
+ borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes
s / 2 + ruleAdd; |
3016 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co
ntentHeight() : ruleTop + ruleThickness; | 3016 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co
ntentHeight() : ruleTop + ruleThickness; |
3017 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule
Left, ruleTop, ruleRight, ruleBottom); | 3017 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule
Left, ruleTop, ruleRight, ruleBottom); |
3018 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(),
pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY
(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); | 3018 drawLineForBoxSide(paintInfo.getContext(), pixelSnappedRuleRect.
x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect
.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); |
3019 } | 3019 } |
3020 | 3020 |
3021 ruleLogicalLeft = currLogicalLeftOffset; | 3021 ruleLogicalLeft = currLogicalLeftOffset; |
3022 } | 3022 } |
3023 } else { | 3023 } else { |
3024 bool topToBottom = !style()->isFlippedBlocksWritingMode() ^ colInfo->pro
gressionIsReversed(); | 3024 bool topToBottom = !style()->isFlippedBlocksWritingMode() ^ colInfo->pro
gressionIsReversed(); |
3025 LayoutUnit ruleLeft = isHorizontalWritingMode() | 3025 LayoutUnit ruleLeft = isHorizontalWritingMode() |
3026 ? borderLeft() + paddingLeft() | 3026 ? borderLeft() + paddingLeft() |
3027 : colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs
Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter()); | 3027 : colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs
Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter()); |
3028 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule
Thickness; | 3028 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule
Thickness; |
(...skipping 16 matching lines...) Expand all Loading... |
3045 ? topToBottom ? BSTop : BSBottom | 3045 ? topToBottom ? BSTop : BSBottom |
3046 : topToBottom ? BSLeft : BSRight; | 3046 : topToBottom ? BSLeft : BSRight; |
3047 | 3047 |
3048 LayoutSize step(0, topToBottom ? colInfo->columnHeight() + colGap : -(co
lInfo->columnHeight() + colGap)); | 3048 LayoutSize step(0, topToBottom ? colInfo->columnHeight() + colGap : -(co
lInfo->columnHeight() + colGap)); |
3049 if (!isHorizontalWritingMode()) | 3049 if (!isHorizontalWritingMode()) |
3050 step = step.transposedSize(); | 3050 step = step.transposedSize(); |
3051 | 3051 |
3052 for (unsigned i = 1; i < colCount; i++) { | 3052 for (unsigned i = 1; i < colCount; i++) { |
3053 ruleRect.move(step); | 3053 ruleRect.move(step); |
3054 IntRect pixelSnappedRuleRect = pixelSnappedIntRect(ruleRect); | 3054 IntRect pixelSnappedRuleRect = pixelSnappedIntRect(ruleRect); |
3055 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixe
lSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY(),
boxSide, ruleColor, ruleStyle, 0, 0, antialias); | 3055 drawLineForBoxSide(paintInfo.getContext(), pixelSnappedRuleRect.x(),
pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.max
Y(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); |
3056 } | 3056 } |
3057 } | 3057 } |
3058 } | 3058 } |
3059 | 3059 |
3060 void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& p
aintOffset, bool paintingFloats) | 3060 void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& p
aintOffset, bool paintingFloats) |
3061 { | 3061 { |
3062 // We need to do multiple passes, breaking up our child painting into strips
. | 3062 // We need to do multiple passes, breaking up our child painting into strips
. |
3063 GraphicsContext* context = paintInfo.context; | 3063 GraphicsContext* context = paintInfo.getContext(); |
3064 ColumnInfo* colInfo = columnInfo(); | 3064 ColumnInfo* colInfo = columnInfo(); |
3065 unsigned colCount = columnCount(colInfo); | 3065 unsigned colCount = columnCount(colInfo); |
3066 if (!colCount) | 3066 if (!colCount) |
3067 return; | 3067 return; |
3068 LayoutUnit currLogicalTopOffset = 0; | 3068 LayoutUnit currLogicalTopOffset = 0; |
3069 LayoutUnit colGap = columnGap(); | 3069 LayoutUnit colGap = columnGap(); |
3070 for (unsigned i = 0; i < colCount; i++) { | 3070 for (unsigned i = 0; i < colCount; i++) { |
3071 // For each rect, we clip to the rect, and then we adjust our coords. | 3071 // For each rect, we clip to the rect, and then we adjust our coords. |
3072 LayoutRect colRect = columnRectAt(colInfo, i); | 3072 LayoutRect colRect = columnRectAt(colInfo, i); |
3073 flipForWritingMode(colRect); | 3073 flipForWritingMode(colRect); |
3074 LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x()
: colRect.y()) - logicalLeftOffsetForContent(); | 3074 LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x()
: colRect.y()) - logicalLeftOffsetForContent(); |
3075 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOf
fset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset
); | 3075 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOf
fset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset
); |
3076 if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) { | 3076 if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) { |
3077 if (isHorizontalWritingMode()) | 3077 if (isHorizontalWritingMode()) |
3078 offset.expand(0, colRect.y() - borderTop() - paddingTop()); | 3078 offset.expand(0, colRect.y() - borderTop() - paddingTop()); |
3079 else | 3079 else |
3080 offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0); | 3080 offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0); |
3081 } | 3081 } |
3082 colRect.moveBy(paintOffset); | 3082 colRect.moveBy(paintOffset); |
3083 PaintInfo info(paintInfo); | 3083 PaintInfo info(paintInfo); |
3084 info.rect.intersect(pixelSnappedIntRect(colRect)); | 3084 info.getRect().intersect(pixelSnappedIntRect(colRect)); |
3085 | 3085 |
3086 if (!info.rect.isEmpty()) { | 3086 if (!info.getRect().isEmpty()) { |
3087 GraphicsContextStateSaver stateSaver(*context); | 3087 GraphicsContextStateSaver stateSaver(*context); |
3088 LayoutRect clipRect(colRect); | 3088 LayoutRect clipRect(colRect); |
3089 | 3089 |
3090 if (i < colCount - 1) { | 3090 if (i < colCount - 1) { |
3091 if (isHorizontalWritingMode()) | 3091 if (isHorizontalWritingMode()) |
3092 clipRect.expand(colGap / 2, 0); | 3092 clipRect.expand(colGap / 2, 0); |
3093 else | 3093 else |
3094 clipRect.expand(0, colGap / 2); | 3094 clipRect.expand(0, colGap / 2); |
3095 } | 3095 } |
3096 // Each strip pushes a clip, since column boxes are specified as bei
ng | 3096 // Each strip pushes a clip, since column boxes are specified as bei
ng |
3097 // like overflow:hidden. | 3097 // like overflow:hidden. |
3098 // FIXME: Content and column rules that extend outside column boxes
at the edges of the multi-column element | 3098 // FIXME: Content and column rules that extend outside column boxes
at the edges of the multi-column element |
3099 // are clipped according to the 'overflow' property. | 3099 // are clipped according to the 'overflow' property. |
3100 context->clip(pixelSnappedIntRect(clipRect)); | 3100 context->clip(pixelSnappedIntRect(clipRect)); |
3101 | 3101 |
3102 // Adjust our x and y when painting. | 3102 // Adjust our x and y when painting. |
3103 LayoutPoint adjustedPaintOffset = paintOffset + offset; | 3103 LayoutPoint adjustedPaintOffset = paintOffset + offset; |
3104 if (paintingFloats) | 3104 if (paintingFloats) |
3105 paintFloats(info, adjustedPaintOffset, paintInfo.phase == PaintP
haseSelection || paintInfo.phase == PaintPhaseTextClip); | 3105 paintFloats(info, adjustedPaintOffset, paintInfo.getPhase() == P
aintPhaseSelection || paintInfo.getPhase() == PaintPhaseTextClip); |
3106 else | 3106 else |
3107 paintContents(info, adjustedPaintOffset); | 3107 paintContents(info, adjustedPaintOffset); |
3108 } | 3108 } |
3109 | 3109 |
3110 LayoutUnit blockDelta = (isHorizontalWritingMode() ? colRect.height() :
colRect.width()); | 3110 LayoutUnit blockDelta = (isHorizontalWritingMode() ? colRect.height() :
colRect.width()); |
3111 if (style()->isFlippedBlocksWritingMode()) | 3111 if (style()->isFlippedBlocksWritingMode()) |
3112 currLogicalTopOffset += blockDelta; | 3112 currLogicalTopOffset += blockDelta; |
3113 else | 3113 else |
3114 currLogicalTopOffset -= blockDelta; | 3114 currLogicalTopOffset -= blockDelta; |
3115 } | 3115 } |
3116 } | 3116 } |
3117 | 3117 |
3118 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) | 3118 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) |
3119 { | 3119 { |
3120 // Avoid painting descendants of the root element when stylesheets haven't l
oaded. This eliminates FOUC. | 3120 // Avoid painting descendants of the root element when stylesheets haven't l
oaded. This eliminates FOUC. |
3121 // It's ok not to draw, because later on, when all the stylesheets do load,
styleResolverChanged() on the Document | 3121 // It's ok not to draw, because later on, when all the stylesheets do load,
styleResolverChanged() on the Document |
3122 // will do a full repaint. | 3122 // will do a full repaint. |
3123 if (document()->didLayoutWithPendingStylesheets() && !isRenderView()) | 3123 if (document()->didLayoutWithPendingStylesheets() && !isRenderView()) |
3124 return; | 3124 return; |
3125 | 3125 |
3126 if (childrenInline()) | 3126 if (childrenInline()) |
3127 m_lineBoxes.paint(this, paintInfo, paintOffset); | 3127 m_lineBoxes.paint(this, paintInfo, paintOffset); |
3128 else { | 3128 else { |
3129 PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? Pai
ntPhaseOutline : paintInfo.phase; | 3129 PaintPhase newPhase = (paintInfo.getPhase() == PaintPhaseChildOutlines)
? PaintPhaseOutline : paintInfo.getPhase(); |
3130 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi
ldBlockBackground : newPhase; | 3130 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi
ldBlockBackground : newPhase; |
3131 | 3131 |
3132 // We don't paint our own background, but we do let the kids paint their
backgrounds. | 3132 // We don't paint our own background, but we do let the kids paint their
backgrounds. |
3133 PaintInfo paintInfoForChild(paintInfo); | 3133 PaintInfo paintInfoForChild(paintInfo); |
3134 paintInfoForChild.phase = newPhase; | 3134 paintInfoForChild.setPhase(newPhase); |
3135 paintInfoForChild.updatePaintingRootForChildren(this); | 3135 paintInfoForChild.updatePaintingRootForChildren(this); |
3136 paintChildren(paintInfoForChild, paintOffset); | 3136 paintChildren(paintInfoForChild, paintOffset); |
3137 } | 3137 } |
3138 } | 3138 } |
3139 | 3139 |
3140 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) | 3140 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf
fset) |
3141 { | 3141 { |
3142 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) | 3142 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) |
3143 paintChild(child, paintInfo, paintOffset); | 3143 paintChild(child, paintInfo, paintOffset); |
3144 } | 3144 } |
(...skipping 15 matching lines...) Expand all Loading... |
3160 if (type == CursorCaret) { | 3160 if (type == CursorCaret) { |
3161 caretPainter = frame()->selection()->caretRenderer(); | 3161 caretPainter = frame()->selection()->caretRenderer(); |
3162 isContentEditable = frame()->selection()->rendererIsEditable(); | 3162 isContentEditable = frame()->selection()->rendererIsEditable(); |
3163 } else { | 3163 } else { |
3164 caretPainter = frame()->page()->dragCaretController()->caretRenderer(); | 3164 caretPainter = frame()->page()->dragCaretController()->caretRenderer(); |
3165 isContentEditable = frame()->page()->dragCaretController()->isContentEdi
table(); | 3165 isContentEditable = frame()->page()->dragCaretController()->isContentEdi
table(); |
3166 } | 3166 } |
3167 | 3167 |
3168 if (caretPainter == this && (isContentEditable || caretBrowsing)) { | 3168 if (caretPainter == this && (isContentEditable || caretBrowsing)) { |
3169 if (type == CursorCaret) | 3169 if (type == CursorCaret) |
3170 frame()->selection()->paintCaret(paintInfo.context, paintOffset, pai
ntInfo.rect); | 3170 frame()->selection()->paintCaret(paintInfo.getContext(), paintOffset
, paintInfo.getRect()); |
3171 else | 3171 else |
3172 frame()->page()->dragCaretController()->paintDragCaret(frame(), pain
tInfo.context, paintOffset, paintInfo.rect); | 3172 frame()->page()->dragCaretController()->paintDragCaret(frame(), pain
tInfo.getContext(), paintOffset, paintInfo.getRect()); |
3173 } | 3173 } |
3174 } | 3174 } |
3175 | 3175 |
3176 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et) | 3176 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et) |
3177 { | 3177 { |
3178 PaintPhase paintPhase = paintInfo.phase; | 3178 PaintPhase paintPhase = paintInfo.getPhase(); |
3179 | 3179 |
3180 // 1. paint background, borders etc | 3180 // 1. paint background, borders etc |
3181 if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChil
dBlockBackground) && style()->visibility() == VISIBLE) { | 3181 if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChil
dBlockBackground) && style()->visibility() == VISIBLE) { |
3182 if (hasBoxDecorations()) | 3182 if (hasBoxDecorations()) |
3183 paintBoxDecorations(paintInfo, paintOffset); | 3183 paintBoxDecorations(paintInfo, paintOffset); |
3184 if (hasColumns() && !paintInfo.paintRootBackgroundOnly()) | 3184 if (hasColumns() && !paintInfo.paintRootBackgroundOnly()) |
3185 paintColumnRules(paintInfo, paintOffset); | 3185 paintColumnRules(paintInfo, paintOffset); |
3186 } | 3186 } |
3187 | 3187 |
3188 if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) { | 3188 if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3279 if (!floats) | 3279 if (!floats) |
3280 return; | 3280 return; |
3281 | 3281 |
3282 const FloatingObjectSet& floatingObjectSet = floats->set(); | 3282 const FloatingObjectSet& floatingObjectSet = floats->set(); |
3283 FloatingObjectSetIterator end = floatingObjectSet.end(); | 3283 FloatingObjectSetIterator end = floatingObjectSet.end(); |
3284 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { | 3284 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++
it) { |
3285 FloatingObject* r = *it; | 3285 FloatingObject* r = *it; |
3286 // Only paint the object if our m_shouldPaint flag is set. | 3286 // Only paint the object if our m_shouldPaint flag is set. |
3287 if (r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()) { | 3287 if (r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()) { |
3288 PaintInfo currentPaintInfo(paintInfo); | 3288 PaintInfo currentPaintInfo(paintInfo); |
3289 currentPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhas
eBlockBackground; | 3289 PaintPhase phase = preservePhase ? paintInfo.getPhase() : PaintPhase
BlockBackground; |
| 3290 currentPaintInfo.setPhase(phase); |
3290 LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPo
int(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->m_renderer->x(),
paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->m_renderer->y())); | 3291 LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPo
int(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->m_renderer->x(),
paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->m_renderer->y())); |
3291 r->m_renderer->paint(currentPaintInfo, childPoint); | 3292 r->m_renderer->paint(currentPaintInfo, childPoint); |
3292 if (!preservePhase) { | 3293 if (!preservePhase) { |
3293 currentPaintInfo.phase = PaintPhaseChildBlockBackgrounds; | 3294 currentPaintInfo.setPhase(PaintPhaseChildBlockBackgrounds); |
3294 r->m_renderer->paint(currentPaintInfo, childPoint); | 3295 r->m_renderer->paint(currentPaintInfo, childPoint); |
3295 currentPaintInfo.phase = PaintPhaseFloat; | 3296 currentPaintInfo.setPhase(PaintPhaseFloat); |
3296 r->m_renderer->paint(currentPaintInfo, childPoint); | 3297 r->m_renderer->paint(currentPaintInfo, childPoint); |
3297 currentPaintInfo.phase = PaintPhaseForeground; | 3298 currentPaintInfo.setPhase(PaintPhaseForeground); |
3298 r->m_renderer->paint(currentPaintInfo, childPoint); | 3299 r->m_renderer->paint(currentPaintInfo, childPoint); |
3299 currentPaintInfo.phase = PaintPhaseOutline; | 3300 currentPaintInfo.setPhase(PaintPhaseOutline); |
3300 r->m_renderer->paint(currentPaintInfo, childPoint); | 3301 r->m_renderer->paint(currentPaintInfo, childPoint); |
3301 } | 3302 } |
3302 } | 3303 } |
3303 } | 3304 } |
3304 } | 3305 } |
3305 | 3306 |
3306 RenderInline* RenderBlock::inlineElementContinuation() const | 3307 RenderInline* RenderBlock::inlineElementContinuation() const |
3307 { | 3308 { |
3308 RenderBoxModelObject* continuation = this->continuation(); | 3309 RenderBoxModelObject* continuation = this->continuation(); |
3309 return continuation && continuation->isInline() ? toRenderInline(continuatio
n) : 0; | 3310 return continuation && continuation->isInline() ? toRenderInline(continuatio
n) : 0; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3426 | 3427 |
3427 LayoutUnit lastTop = 0; | 3428 LayoutUnit lastTop = 0; |
3428 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); | 3429 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); |
3429 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); | 3430 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); |
3430 | 3431 |
3431 return selectionGaps(this, offsetFromRepaintContainer, IntSize(), lastTop, l
astLeft, lastRight); | 3432 return selectionGaps(this, offsetFromRepaintContainer, IntSize(), lastTop, l
astLeft, lastRight); |
3432 } | 3433 } |
3433 | 3434 |
3434 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) | 3435 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) |
3435 { | 3436 { |
3436 if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) { | 3437 if (shouldPaintSelectionGaps() && paintInfo.getPhase() == PaintPhaseForegrou
nd) { |
3437 LayoutUnit lastTop = 0; | 3438 LayoutUnit lastTop = 0; |
3438 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); | 3439 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); |
3439 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); | 3440 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); |
3440 GraphicsContextStateSaver stateSaver(*paintInfo.context); | 3441 GraphicsContextStateSaver stateSaver(*paintInfo.getContext()); |
3441 | 3442 |
3442 LayoutRect gapRectsBounds = selectionGaps(this, paintOffset, LayoutSize(
), lastTop, lastLeft, lastRight, &paintInfo); | 3443 LayoutRect gapRectsBounds = selectionGaps(this, paintOffset, LayoutSize(
), lastTop, lastLeft, lastRight, &paintInfo); |
3443 if (!gapRectsBounds.isEmpty()) { | 3444 if (!gapRectsBounds.isEmpty()) { |
3444 if (RenderLayer* layer = enclosingLayer()) { | 3445 if (RenderLayer* layer = enclosingLayer()) { |
3445 gapRectsBounds.moveBy(-paintOffset); | 3446 gapRectsBounds.moveBy(-paintOffset); |
3446 if (!hasLayer()) { | 3447 if (!hasLayer()) { |
3447 LayoutRect localBounds(gapRectsBounds); | 3448 LayoutRect localBounds(gapRectsBounds); |
3448 flipForWritingMode(localBounds); | 3449 flipForWritingMode(localBounds); |
3449 gapRectsBounds = localToContainerQuad(FloatRect(localBounds)
, layer->renderer()).enclosingBoundingBox(); | 3450 gapRectsBounds = localToContainerQuad(FloatRect(localBounds)
, layer->renderer()).enclosingBoundingBox(); |
3450 if (layer->renderer()->hasOverflowClip()) | 3451 if (layer->renderer()->hasOverflowClip()) |
3451 gapRectsBounds.move(layer->renderBox()->scrolledContentO
ffset()); | 3452 gapRectsBounds.move(layer->renderBox()->scrolledContentO
ffset()); |
3452 } | 3453 } |
3453 layer->addBlockSelectionGapsBounds(gapRectsBounds); | 3454 layer->addBlockSelectionGapsBounds(gapRectsBounds); |
3454 } | 3455 } |
3455 } | 3456 } |
3456 } | 3457 } |
3457 } | 3458 } |
3458 | 3459 |
3459 static void clipOutPositionedObjects(const PaintInfo* paintInfo, const LayoutPoi
nt& offset, TrackedRendererListHashSet* positionedObjects) | 3460 static void clipOutPositionedObjects(PaintInfo* paintInfo, const LayoutPoint& of
fset, TrackedRendererListHashSet* positionedObjects) |
3460 { | 3461 { |
3461 if (!positionedObjects) | 3462 if (!positionedObjects) |
3462 return; | 3463 return; |
3463 | 3464 |
3464 TrackedRendererListHashSet::const_iterator end = positionedObjects->end(); | 3465 TrackedRendererListHashSet::const_iterator end = positionedObjects->end(); |
3465 for (TrackedRendererListHashSet::const_iterator it = positionedObjects->begi
n(); it != end; ++it) { | 3466 for (TrackedRendererListHashSet::const_iterator it = positionedObjects->begi
n(); it != end; ++it) { |
3466 RenderBox* r = *it; | 3467 RenderBox* r = *it; |
3467 paintInfo->context->clipOut(IntRect(offset.x() + r->x(), offset.y() + r-
>y(), r->width(), r->height())); | 3468 paintInfo->getContext()->clipOut(IntRect(offset.x() + r->x(), offset.y()
+ r->y(), r->width(), r->height())); |
3468 } | 3469 } |
3469 } | 3470 } |
3470 | 3471 |
3471 static LayoutUnit blockDirectionOffset(RenderBlock* rootBlock, const LayoutSize&
offsetFromRootBlock) | 3472 static LayoutUnit blockDirectionOffset(RenderBlock* rootBlock, const LayoutSize&
offsetFromRootBlock) |
3472 { | 3473 { |
3473 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.height() :
offsetFromRootBlock.width(); | 3474 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.height() :
offsetFromRootBlock.width(); |
3474 } | 3475 } |
3475 | 3476 |
3476 static LayoutUnit inlineDirectionOffset(RenderBlock* rootBlock, const LayoutSize
& offsetFromRootBlock) | 3477 static LayoutUnit inlineDirectionOffset(RenderBlock* rootBlock, const LayoutSize
& offsetFromRootBlock) |
3477 { | 3478 { |
3478 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.width() :
offsetFromRootBlock.height(); | 3479 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.width() :
offsetFromRootBlock.height(); |
3479 } | 3480 } |
3480 | 3481 |
3481 LayoutRect RenderBlock::logicalRectToPhysicalRect(const LayoutPoint& rootBlockPh
ysicalPosition, const LayoutRect& logicalRect) | 3482 LayoutRect RenderBlock::logicalRectToPhysicalRect(const LayoutPoint& rootBlockPh
ysicalPosition, const LayoutRect& logicalRect) |
3482 { | 3483 { |
3483 LayoutRect result; | 3484 LayoutRect result; |
3484 if (isHorizontalWritingMode()) | 3485 if (isHorizontalWritingMode()) |
3485 result = logicalRect; | 3486 result = logicalRect; |
3486 else | 3487 else |
3487 result = LayoutRect(logicalRect.y(), logicalRect.x(), logicalRect.height
(), logicalRect.width()); | 3488 result = LayoutRect(logicalRect.y(), logicalRect.x(), logicalRect.height
(), logicalRect.width()); |
3488 flipForWritingMode(result); | 3489 flipForWritingMode(result); |
3489 result.moveBy(rootBlockPhysicalPosition); | 3490 result.moveBy(rootBlockPhysicalPosition); |
3490 return result; | 3491 return result; |
3491 } | 3492 } |
3492 | 3493 |
3493 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r
ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3494 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r
ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3494 LayoutUnit& lastLogicalTop, LayoutUnit& last
LogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) | 3495 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog
icalRight, PaintInfo* paintInfo) |
3495 { | 3496 { |
3496 // IMPORTANT: Callers of this method that intend for painting to happen need
to do a save/restore. | 3497 // IMPORTANT: Callers of this method that intend for painting to happen need
to do a save/restore. |
3497 // Clip out floating and positioned objects when painting selection gaps. | 3498 // Clip out floating and positioned objects when painting selection gaps. |
3498 if (paintInfo) { | 3499 if (paintInfo) { |
3499 // Note that we don't clip out overflow for positioned objects. We just
stick to the border box. | 3500 // Note that we don't clip out overflow for positioned objects. We just
stick to the border box. |
3500 LayoutRect flippedBlockRect(offsetFromRootBlock.width(), offsetFromRootB
lock.height(), width(), height()); | 3501 LayoutRect flippedBlockRect(offsetFromRootBlock.width(), offsetFromRootB
lock.height(), width(), height()); |
3501 rootBlock->flipForWritingMode(flippedBlockRect); | 3502 rootBlock->flipForWritingMode(flippedBlockRect); |
3502 flippedBlockRect.moveBy(rootBlockPhysicalPosition); | 3503 flippedBlockRect.moveBy(rootBlockPhysicalPosition); |
3503 clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), positio
nedObjects()); | 3504 clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), positio
nedObjects()); |
3504 if (isBody() || isRoot()) // The <body> must make sure to examine its co
ntainingBlock's positioned objects. | 3505 if (isBody() || isRoot()) // The <body> must make sure to examine its co
ntainingBlock's positioned objects. |
3505 for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView();
cb = cb->containingBlock()) | 3506 for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView();
cb = cb->containingBlock()) |
3506 clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y()
), cb->positionedObjects()); // FIXME: Not right for flipped writing modes. | 3507 clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y()
), cb->positionedObjects()); // FIXME: Not right for flipped writing modes. |
3507 if (FloatingObjects* floats = floatingObjects()) { | 3508 if (FloatingObjects* floats = floatingObjects()) { |
3508 const FloatingObjectSet& floatingObjectSet = floats->set(); | 3509 const FloatingObjectSet& floatingObjectSet = floats->set(); |
3509 FloatingObjectSetIterator end = floatingObjectSet.end(); | 3510 FloatingObjectSetIterator end = floatingObjectSet.end(); |
3510 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it !=
end; ++it) { | 3511 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it !=
end; ++it) { |
3511 FloatingObject* r = *it; | 3512 FloatingObject* r = *it; |
3512 LayoutRect floatBox(offsetFromRootBlock.width() + xPositionForFl
oatIncludingMargin(r), | 3513 LayoutRect floatBox(offsetFromRootBlock.width() + xPositionForFl
oatIncludingMargin(r), |
3513 offsetFromRootBlock.height() + yPositionForF
loatIncludingMargin(r), | 3514 offsetFromRootBlock.height() + yPositionForF
loatIncludingMargin(r), |
3514 r->m_renderer->width(), r->m_renderer->heigh
t()); | 3515 r->m_renderer->width(), r->m_renderer->heigh
t()); |
3515 rootBlock->flipForWritingMode(floatBox); | 3516 rootBlock->flipForWritingMode(floatBox); |
3516 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPo
sition.y()); | 3517 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPo
sition.y()); |
3517 paintInfo->context->clipOut(pixelSnappedIntRect(floatBox)); | 3518 paintInfo->getContext()->clipOut(pixelSnappedIntRect(floatBox)); |
3518 } | 3519 } |
3519 } | 3520 } |
3520 } | 3521 } |
3521 | 3522 |
3522 // FIXME: overflow: auto/scroll regions need more math here, since painting
in the border box is different from painting in the padding box (one is scrolled
, the other is | 3523 // FIXME: overflow: auto/scroll regions need more math here, since painting
in the border box is different from painting in the padding box (one is scrolled
, the other is |
3523 // fixed). | 3524 // fixed). |
3524 GapRects result; | 3525 GapRects result; |
3525 if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work s
omeday. | 3526 if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work s
omeday. |
3526 return result; | 3527 return result; |
3527 | 3528 |
(...skipping 11 matching lines...) Expand all Loading... |
3539 result = blockSelectionGaps(rootBlock, rootBlockPhysicalPosition, offset
FromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo); | 3540 result = blockSelectionGaps(rootBlock, rootBlockPhysicalPosition, offset
FromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo); |
3540 | 3541 |
3541 // Go ahead and fill the vertical gap all the way to the bottom of our block
if the selection extends past our block. | 3542 // Go ahead and fill the vertical gap all the way to the bottom of our block
if the selection extends past our block. |
3542 if (rootBlock == this && (selectionState() != SelectionBoth && selectionStat
e() != SelectionEnd)) | 3543 if (rootBlock == this && (selectionState() != SelectionBoth && selectionStat
e() != SelectionEnd)) |
3543 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPositio
n, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, | 3544 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPositio
n, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, |
3544 logicalHeight(), paintInfo)); | 3545 logicalHeight(), paintInfo)); |
3545 return result; | 3546 return result; |
3546 } | 3547 } |
3547 | 3548 |
3548 GapRects RenderBlock::inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPo
int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3549 GapRects RenderBlock::inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPo
int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3549 LayoutUnit& lastLogicalTop, LayoutUnit
& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) | 3550 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog
icalRight, PaintInfo* paintInfo) |
3550 { | 3551 { |
3551 GapRects result; | 3552 GapRects result; |
3552 | 3553 |
3553 bool containsStart = selectionState() == SelectionStart || selectionState()
== SelectionBoth; | 3554 bool containsStart = selectionState() == SelectionStart || selectionState()
== SelectionBoth; |
3554 | 3555 |
3555 if (!firstLineBox()) { | 3556 if (!firstLineBox()) { |
3556 if (containsStart) { | 3557 if (containsStart) { |
3557 // Go ahead and update our lastLogicalTop to be the bottom of the bl
ock. <hr>s or empty blocks with height can trip this | 3558 // Go ahead and update our lastLogicalTop to be the bottom of the bl
ock. <hr>s or empty blocks with height can trip this |
3558 // case. | 3559 // case. |
3559 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock
) + logicalHeight(); | 3560 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock
) + logicalHeight(); |
(...skipping 13 matching lines...) Expand all Loading... |
3573 LayoutUnit selHeight = curr->selectionHeightAdjustedForPrecedingBlock(); | 3574 LayoutUnit selHeight = curr->selectionHeightAdjustedForPrecedingBlock(); |
3574 | 3575 |
3575 if (!containsStart && !lastSelectedLine && | 3576 if (!containsStart && !lastSelectedLine && |
3576 selectionState() != SelectionStart && selectionState() != SelectionB
oth) | 3577 selectionState() != SelectionStart && selectionState() != SelectionB
oth) |
3577 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPos
ition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, | 3578 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPos
ition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, |
3578 selTop, paintInfo)); | 3579 selTop, paintInfo)); |
3579 | 3580 |
3580 LayoutRect logicalRect(curr->logicalLeft(), selTop, curr->logicalWidth()
, selTop + selHeight); | 3581 LayoutRect logicalRect(curr->logicalLeft(), selTop, curr->logicalWidth()
, selTop + selHeight); |
3581 logicalRect.move(isHorizontalWritingMode() ? offsetFromRootBlock : offse
tFromRootBlock.transposedSize()); | 3582 logicalRect.move(isHorizontalWritingMode() ? offsetFromRootBlock : offse
tFromRootBlock.transposedSize()); |
3582 LayoutRect physicalRect = rootBlock->logicalRectToPhysicalRect(rootBlock
PhysicalPosition, logicalRect); | 3583 LayoutRect physicalRect = rootBlock->logicalRectToPhysicalRect(rootBlock
PhysicalPosition, logicalRect); |
3583 if (!paintInfo || (isHorizontalWritingMode() && physicalRect.y() < paint
Info->rect.maxY() && physicalRect.maxY() > paintInfo->rect.y()) | 3584 if (!paintInfo || (isHorizontalWritingMode() && physicalRect.y() < paint
Info->getRect().maxY() && physicalRect.maxY() > paintInfo->getRect().y()) |
3584 || (!isHorizontalWritingMode() && physicalRect.x() < paintInfo->rect
.maxX() && physicalRect.maxX() > paintInfo->rect.x())) | 3585 || (!isHorizontalWritingMode() && physicalRect.x() < paintInfo->getR
ect().maxX() && physicalRect.maxX() > paintInfo->getRect().x())) |
3585 result.unite(curr->lineSelectionGap(rootBlock, rootBlockPhysicalPosi
tion, offsetFromRootBlock, selTop, selHeight, paintInfo)); | 3586 result.unite(curr->lineSelectionGap(rootBlock, rootBlockPhysicalPosi
tion, offsetFromRootBlock, selTop, selHeight, paintInfo)); |
3586 | 3587 |
3587 lastSelectedLine = curr; | 3588 lastSelectedLine = curr; |
3588 } | 3589 } |
3589 | 3590 |
3590 if (containsStart && !lastSelectedLine) | 3591 if (containsStart && !lastSelectedLine) |
3591 // VisibleSelection must start just after our last line. | 3592 // VisibleSelection must start just after our last line. |
3592 lastSelectedLine = lastRootBox(); | 3593 lastSelectedLine = lastRootBox(); |
3593 | 3594 |
3594 if (lastSelectedLine && selectionState() != SelectionEnd && selectionState()
!= SelectionBoth) { | 3595 if (lastSelectedLine && selectionState() != SelectionEnd && selectionState()
!= SelectionBoth) { |
3595 // Go ahead and update our lastY to be the bottom of the last selected l
ine. | 3596 // Go ahead and update our lastY to be the bottom of the last selected l
ine. |
3596 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock) +
lastSelectedLine->selectionBottom(); | 3597 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock) +
lastSelectedLine->selectionBottom(); |
3597 lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, lastSelectedLine
->selectionBottom()); | 3598 lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, lastSelectedLine
->selectionBottom()); |
3598 lastLogicalRight = logicalRightSelectionOffset(rootBlock, lastSelectedLi
ne->selectionBottom()); | 3599 lastLogicalRight = logicalRightSelectionOffset(rootBlock, lastSelectedLi
ne->selectionBottom()); |
3599 } | 3600 } |
3600 return result; | 3601 return result; |
3601 } | 3602 } |
3602 | 3603 |
3603 GapRects RenderBlock::blockSelectionGaps(RenderBlock* rootBlock, const LayoutPoi
nt& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3604 GapRects RenderBlock::blockSelectionGaps(RenderBlock* rootBlock, const LayoutPoi
nt& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3604 LayoutUnit& lastLogicalTop, LayoutUnit&
lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) | 3605 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog
icalRight, PaintInfo* paintInfo) |
3605 { | 3606 { |
3606 GapRects result; | 3607 GapRects result; |
3607 | 3608 |
3608 // Go ahead and jump right to the first block child that contains some selec
ted objects. | 3609 // Go ahead and jump right to the first block child that contains some selec
ted objects. |
3609 RenderBox* curr; | 3610 RenderBox* curr; |
3610 for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone
; curr = curr->nextSiblingBox()) { } | 3611 for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone
; curr = curr->nextSiblingBox()) { } |
3611 | 3612 |
3612 for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->ne
xtSiblingBox()) { | 3613 for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->ne
xtSiblingBox()) { |
3613 SelectionState childState = curr->selectionState(); | 3614 SelectionState childState = curr->selectionState(); |
3614 if (childState == SelectionBoth || childState == SelectionEnd) | 3615 if (childState == SelectionBoth || childState == SelectionEnd) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3656 lastLogicalRight = logicalRightSelectionOffset(rootBlock, curr->logi
calBottom()); | 3657 lastLogicalRight = logicalRightSelectionOffset(rootBlock, curr->logi
calBottom()); |
3657 } else if (childState != SelectionNone) | 3658 } else if (childState != SelectionNone) |
3658 // We must be a block that has some selected object inside it. Go a
head and recur. | 3659 // We must be a block that has some selected object inside it. Go a
head and recur. |
3659 result.unite(toRenderBlock(curr)->selectionGaps(rootBlock, rootBlock
PhysicalPosition, LayoutSize(offsetFromRootBlock.width() + curr->x(), offsetFrom
RootBlock.height() + curr->y()), | 3660 result.unite(toRenderBlock(curr)->selectionGaps(rootBlock, rootBlock
PhysicalPosition, LayoutSize(offsetFromRootBlock.width() + curr->x(), offsetFrom
RootBlock.height() + curr->y()), |
3660 lastLogicalTop, last
LogicalLeft, lastLogicalRight, paintInfo)); | 3661 lastLogicalTop, last
LogicalLeft, lastLogicalRight, paintInfo)); |
3661 } | 3662 } |
3662 return result; | 3663 return result; |
3663 } | 3664 } |
3664 | 3665 |
3665 LayoutRect RenderBlock::blockSelectionGap(RenderBlock* rootBlock, const LayoutPo
int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3666 LayoutRect RenderBlock::blockSelectionGap(RenderBlock* rootBlock, const LayoutPo
int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3666 LayoutUnit lastLogicalTop, LayoutUnit
lastLogicalLeft, LayoutUnit lastLogicalRight, LayoutUnit logicalBottom, const Pa
intInfo* paintInfo) | 3667 LayoutUnit lastLogicalTop, LayoutUnit lastLogicalLeft, LayoutUnit lastLogica
lRight, LayoutUnit logicalBottom, PaintInfo* paintInfo) |
3667 { | 3668 { |
3668 LayoutUnit logicalTop = lastLogicalTop; | 3669 LayoutUnit logicalTop = lastLogicalTop; |
3669 LayoutUnit logicalHeight = blockDirectionOffset(rootBlock, offsetFromRootBlo
ck) + logicalBottom - logicalTop; | 3670 LayoutUnit logicalHeight = blockDirectionOffset(rootBlock, offsetFromRootBlo
ck) + logicalBottom - logicalTop; |
3670 if (logicalHeight <= 0) | 3671 if (logicalHeight <= 0) |
3671 return LayoutRect(); | 3672 return LayoutRect(); |
3672 | 3673 |
3673 // Get the selection offsets for the bottom of the gap | 3674 // Get the selection offsets for the bottom of the gap |
3674 LayoutUnit logicalLeft = max(lastLogicalLeft, logicalLeftSelectionOffset(roo
tBlock, logicalBottom)); | 3675 LayoutUnit logicalLeft = max(lastLogicalLeft, logicalLeftSelectionOffset(roo
tBlock, logicalBottom)); |
3675 LayoutUnit logicalRight = min(lastLogicalRight, logicalRightSelectionOffset(
rootBlock, logicalBottom)); | 3676 LayoutUnit logicalRight = min(lastLogicalRight, logicalRightSelectionOffset(
rootBlock, logicalBottom)); |
3676 LayoutUnit logicalWidth = logicalRight - logicalLeft; | 3677 LayoutUnit logicalWidth = logicalRight - logicalLeft; |
3677 if (logicalWidth <= 0) | 3678 if (logicalWidth <= 0) |
3678 return LayoutRect(); | 3679 return LayoutRect(); |
3679 | 3680 |
3680 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(logicalLeft, logicalTop, logicalWidth, logicalHeight)); | 3681 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(logicalLeft, logicalTop, logicalWidth, logicalHeight)); |
3681 if (paintInfo) | 3682 if (paintInfo) |
3682 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selectionBack
groundColor()); | 3683 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selectio
nBackgroundColor()); |
3683 return gapRect; | 3684 return gapRect; |
3684 } | 3685 } |
3685 | 3686 |
3686 LayoutRect RenderBlock::logicalLeftSelectionGap(RenderBlock* rootBlock, const La
youtPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3687 LayoutRect RenderBlock::logicalLeftSelectionGap(RenderBlock* rootBlock, const La
youtPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3687 RenderObject* selObj, LayoutUnit
logicalLeft, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo*
paintInfo) | 3688 RenderObject* selObj, LayoutUnit logicalLeft, LayoutUnit logicalTop, LayoutU
nit logicalHeight, PaintInfo* paintInfo) |
3688 { | 3689 { |
3689 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR
ootBlock) + logicalTop; | 3690 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR
ootBlock) + logicalTop; |
3690 LayoutUnit rootBlockLogicalLeft = max(logicalLeftSelectionOffset(rootBlock,
logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight)); | 3691 LayoutUnit rootBlockLogicalLeft = max(logicalLeftSelectionOffset(rootBlock,
logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight)); |
3691 LayoutUnit rootBlockLogicalRight = min(inlineDirectionOffset(rootBlock, offs
etFromRootBlock) + floorToInt(logicalLeft), min(logicalRightSelectionOffset(root
Block, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalH
eight))); | 3692 LayoutUnit rootBlockLogicalRight = min(inlineDirectionOffset(rootBlock, offs
etFromRootBlock) + floorToInt(logicalLeft), min(logicalRightSelectionOffset(root
Block, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalH
eight))); |
3692 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL
eft; | 3693 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL
eft; |
3693 if (rootBlockLogicalWidth <= 0) | 3694 if (rootBlockLogicalWidth <= 0) |
3694 return LayoutRect(); | 3695 return LayoutRect(); |
3695 | 3696 |
3696 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW
idth, logicalHeight)); | 3697 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW
idth, logicalHeight)); |
3697 if (paintInfo) | 3698 if (paintInfo) |
3698 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selObj->selec
tionBackgroundColor()); | 3699 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selObj->
selectionBackgroundColor()); |
3699 return gapRect; | 3700 return gapRect; |
3700 } | 3701 } |
3701 | 3702 |
3702 LayoutRect RenderBlock::logicalRightSelectionGap(RenderBlock* rootBlock, const L
ayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, | 3703 LayoutRect RenderBlock::logicalRightSelectionGap(RenderBlock* rootBlock, const L
ayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, |
3703 RenderObject* selObj, LayoutUni
t logicalRight, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo
* paintInfo) | 3704 RenderObject* selObj, LayoutUnit logicalRight, LayoutUnit logicalTop, Layout
Unit logicalHeight, PaintInfo* paintInfo) |
3704 { | 3705 { |
3705 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR
ootBlock) + logicalTop; | 3706 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR
ootBlock) + logicalTop; |
3706 LayoutUnit rootBlockLogicalLeft = max(inlineDirectionOffset(rootBlock, offse
tFromRootBlock) + floorToInt(logicalRight), max(logicalLeftSelectionOffset(rootB
lock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHei
ght))); | 3707 LayoutUnit rootBlockLogicalLeft = max(inlineDirectionOffset(rootBlock, offse
tFromRootBlock) + floorToInt(logicalRight), max(logicalLeftSelectionOffset(rootB
lock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHei
ght))); |
3707 LayoutUnit rootBlockLogicalRight = min(logicalRightSelectionOffset(rootBlock
, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight
)); | 3708 LayoutUnit rootBlockLogicalRight = min(logicalRightSelectionOffset(rootBlock
, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight
)); |
3708 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL
eft; | 3709 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL
eft; |
3709 if (rootBlockLogicalWidth <= 0) | 3710 if (rootBlockLogicalWidth <= 0) |
3710 return LayoutRect(); | 3711 return LayoutRect(); |
3711 | 3712 |
3712 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW
idth, logicalHeight)); | 3713 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP
osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW
idth, logicalHeight)); |
3713 if (paintInfo) | 3714 if (paintInfo) |
3714 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selObj->selec
tionBackgroundColor()); | 3715 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selObj->
selectionBackgroundColor()); |
3715 return gapRect; | 3716 return gapRect; |
3716 } | 3717 } |
3717 | 3718 |
3718 void RenderBlock::getSelectionGapInfo(SelectionState state, bool& leftGap, bool&
rightGap) | 3719 void RenderBlock::getSelectionGapInfo(SelectionState state, bool& leftGap, bool&
rightGap) |
3719 { | 3720 { |
3720 bool ltr = style()->isLeftToRightDirection(); | 3721 bool ltr = style()->isLeftToRightDirection(); |
3721 leftGap = (state == RenderObject::SelectionInside) || | 3722 leftGap = (state == RenderObject::SelectionInside) || |
3722 (state == RenderObject::SelectionEnd && ltr) || | 3723 (state == RenderObject::SelectionEnd && ltr) || |
3723 (state == RenderObject::SelectionStart && !ltr); | 3724 (state == RenderObject::SelectionStart && !ltr); |
3724 rightGap = (state == RenderObject::SelectionInside) || | 3725 rightGap = (state == RenderObject::SelectionInside) || |
(...skipping 4547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8272 } | 8273 } |
8273 | 8274 |
8274 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl
oatingObject* floatingObject) | 8275 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl
oatingObject* floatingObject) |
8275 { | 8276 { |
8276 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr
ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating
Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped
MaxY()); | 8277 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr
ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating
Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped
MaxY()); |
8277 } | 8278 } |
8278 | 8279 |
8279 #endif | 8280 #endif |
8280 | 8281 |
8281 } // namespace WebCore | 8282 } // namespace WebCore |
OLD | NEW |