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

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

Issue 21430003: Implement interfaces in PaintInfo and make it a class. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@getterPaintInfo01
Patch Set: Fixed Linux compilation (hopefuly Windows too), addressing some reviewer's suggestions. Created 7 years, 4 months 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
OLDNEW
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 2898 matching lines...) Expand 10 before | Expand all | Expand 10 after
2909 } 2909 }
2910 } 2910 }
2911 } 2911 }
2912 2912
2913 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) 2913 void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
2914 { 2914 {
2915 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); 2915 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this);
2916 2916
2917 LayoutPoint adjustedPaintOffset = paintOffset + location(); 2917 LayoutPoint adjustedPaintOffset = paintOffset + location();
2918 2918
2919 PaintPhase phase = paintInfo.phase; 2919 PaintPhase phase = paintInfo.getPhase();
2920 2920
2921 // Check if we need to do anything at all. 2921 // Check if we need to do anything at all.
2922 // FIXME: Could eliminate the isRoot() check if we fix background painting s o that the RenderView 2922 // FIXME: Could eliminate the isRoot() check if we fix background painting s o that the RenderView
2923 // paints the root's background. 2923 // paints the root's background.
2924 if (!isRoot()) { 2924 if (!isRoot()) {
2925 LayoutRect overflowBox = overflowRectForPaintRejection(); 2925 LayoutRect overflowBox = overflowRectForPaintRejection();
2926 flipForWritingMode(overflowBox); 2926 flipForWritingMode(overflowBox);
2927 overflowBox.inflate(maximalOutlineSize(paintInfo.phase)); 2927 overflowBox.inflate(maximalOutlineSize(paintInfo.getPhase()));
2928 overflowBox.moveBy(adjustedPaintOffset); 2928 overflowBox.moveBy(adjustedPaintOffset);
2929 if (!overflowBox.intersects(paintInfo.rect)) 2929 if (!overflowBox.intersects(paintInfo.getRect()))
2930 return; 2930 return;
2931 } 2931 }
2932 2932
2933 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset); 2933 bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset);
2934 paintObject(paintInfo, adjustedPaintOffset); 2934 paintObject(paintInfo, adjustedPaintOffset);
2935 if (pushedClip) 2935 if (pushedClip)
2936 popContentsClip(paintInfo, phase, adjustedPaintOffset); 2936 popContentsClip(paintInfo, phase, adjustedPaintOffset);
2937 2937
2938 // Our scrollbar widgets paint exactly when we tell them to, so that they wo rk properly with 2938 // Our scrollbar widgets paint exactly when we tell them to, so that they wo rk properly with
2939 // z-index. We paint after we painted the background/border, so that the sc rollbars will 2939 // z-index. We paint after we painted the background/border, so that the sc rollbars will
2940 // sit above the background/border. 2940 // sit above the background/border.
2941 if (hasOverflowClip() && style()->visibility() == VISIBLE && (phase == Paint PhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.sh ouldPaintWithinRoot(this) && !paintInfo.paintRootBackgroundOnly()) 2941 if (hasOverflowClip() && style()->visibility() == VISIBLE && (phase == Paint PhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.sh ouldPaintWithinRoot(this) && !paintInfo.paintRootBackgroundOnly())
2942 layer()->paintOverflowControls(paintInfo.context, roundedIntPoint(adjust edPaintOffset), paintInfo.rect); 2942 layer()->paintOverflowControls(paintInfo.getContext(), roundedIntPoint(a djustedPaintOffset), paintInfo.getRect());
2943 } 2943 }
2944 2944
2945 void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& pain tOffset) 2945 void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& pain tOffset)
2946 { 2946 {
2947 if (paintInfo.context->paintingDisabled()) 2947 if (paintInfo.getContext()->paintingDisabled())
2948 return; 2948 return;
2949 2949
2950 const Color& ruleColor = resolveColor(CSSPropertyWebkitColumnRuleColor); 2950 const Color& ruleColor = resolveColor(CSSPropertyWebkitColumnRuleColor);
2951 bool ruleTransparent = style()->columnRuleIsTransparent(); 2951 bool ruleTransparent = style()->columnRuleIsTransparent();
2952 EBorderStyle ruleStyle = style()->columnRuleStyle(); 2952 EBorderStyle ruleStyle = style()->columnRuleStyle();
2953 LayoutUnit ruleThickness = style()->columnRuleWidth(); 2953 LayoutUnit ruleThickness = style()->columnRuleWidth();
2954 LayoutUnit colGap = columnGap(); 2954 LayoutUnit colGap = columnGap();
2955 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; 2955 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent;
2956 if (!renderRule) 2956 if (!renderRule)
2957 return; 2957 return;
2958 2958
2959 ColumnInfo* colInfo = columnInfo(); 2959 ColumnInfo* colInfo = columnInfo();
2960 unsigned colCount = columnCount(colInfo); 2960 unsigned colCount = columnCount(colInfo);
2961 2961
2962 bool antialias = shouldAntialiasLines(paintInfo.context); 2962 bool antialias = shouldAntialiasLines(paintInfo.getContext());
2963 2963
2964 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { 2964 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) {
2965 bool leftToRight = style()->isLeftToRightDirection() ^ colInfo->progress ionIsReversed(); 2965 bool leftToRight = style()->isLeftToRightDirection() ^ colInfo->progress ionIsReversed();
2966 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL ogicalWidth(); 2966 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL ogicalWidth();
2967 LayoutUnit ruleAdd = logicalLeftOffsetForContent(); 2967 LayoutUnit ruleAdd = logicalLeftOffsetForContent();
2968 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical Width(); 2968 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical Width();
2969 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth(); 2969 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth();
2970 BoxSide boxSide = isHorizontalWritingMode() 2970 BoxSide boxSide = isHorizontalWritingMode()
2971 ? leftToRight ? BSLeft : BSRight 2971 ? leftToRight ? BSLeft : BSRight
2972 : leftToRight ? BSTop : BSBottom; 2972 : leftToRight ? BSTop : BSBottom;
2973 2973
2974 for (unsigned i = 0; i < colCount; i++) { 2974 for (unsigned i = 0; i < colCount; i++) {
2975 // Move to the next position. 2975 // Move to the next position.
2976 if (leftToRight) { 2976 if (leftToRight) {
2977 ruleLogicalLeft += inlineDirectionSize + colGap / 2; 2977 ruleLogicalLeft += inlineDirectionSize + colGap / 2;
2978 currLogicalLeftOffset += inlineDirectionSize + colGap; 2978 currLogicalLeftOffset += inlineDirectionSize + colGap;
2979 } else { 2979 } else {
2980 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); 2980 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2);
2981 currLogicalLeftOffset -= (inlineDirectionSize + colGap); 2981 currLogicalLeftOffset -= (inlineDirectionSize + colGap);
2982 } 2982 }
2983 2983
2984 // Now paint the column rule. 2984 // Now paint the column rule.
2985 if (i < colCount - 1) { 2985 if (i < colCount - 1) {
2986 LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x( ) + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft () + paddingLeft(); 2986 LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x( ) + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft () + paddingLeft();
2987 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru leThickness : ruleLeft + contentWidth(); 2987 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru leThickness : ruleLeft + contentWidth();
2988 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes s / 2 + ruleAdd; 2988 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes s / 2 + ruleAdd;
2989 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co ntentHeight() : ruleTop + ruleThickness; 2989 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co ntentHeight() : ruleTop + ruleThickness;
2990 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule Left, ruleTop, ruleRight, ruleBottom); 2990 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule Left, ruleTop, ruleRight, ruleBottom);
2991 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY (), boxSide, ruleColor, ruleStyle, 0, 0, antialias); 2991 drawLineForBoxSide(paintInfo.getContext(), pixelSnappedRuleRect. x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect .maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias);
2992 } 2992 }
2993 2993
2994 ruleLogicalLeft = currLogicalLeftOffset; 2994 ruleLogicalLeft = currLogicalLeftOffset;
2995 } 2995 }
2996 } else { 2996 } else {
2997 bool topToBottom = !style()->isFlippedBlocksWritingMode() ^ colInfo->pro gressionIsReversed(); 2997 bool topToBottom = !style()->isFlippedBlocksWritingMode() ^ colInfo->pro gressionIsReversed();
2998 LayoutUnit ruleLeft = isHorizontalWritingMode() 2998 LayoutUnit ruleLeft = isHorizontalWritingMode()
2999 ? borderLeft() + paddingLeft() 2999 ? borderLeft() + paddingLeft()
3000 : colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter()); 3000 : colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter());
3001 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule Thickness; 3001 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule Thickness;
(...skipping 16 matching lines...) Expand all
3018 ? topToBottom ? BSTop : BSBottom 3018 ? topToBottom ? BSTop : BSBottom
3019 : topToBottom ? BSLeft : BSRight; 3019 : topToBottom ? BSLeft : BSRight;
3020 3020
3021 LayoutSize step(0, topToBottom ? colInfo->columnHeight() + colGap : -(co lInfo->columnHeight() + colGap)); 3021 LayoutSize step(0, topToBottom ? colInfo->columnHeight() + colGap : -(co lInfo->columnHeight() + colGap));
3022 if (!isHorizontalWritingMode()) 3022 if (!isHorizontalWritingMode())
3023 step = step.transposedSize(); 3023 step = step.transposedSize();
3024 3024
3025 for (unsigned i = 1; i < colCount; i++) { 3025 for (unsigned i = 1; i < colCount; i++) {
3026 ruleRect.move(step); 3026 ruleRect.move(step);
3027 IntRect pixelSnappedRuleRect = pixelSnappedIntRect(ruleRect); 3027 IntRect pixelSnappedRuleRect = pixelSnappedIntRect(ruleRect);
3028 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixe lSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); 3028 drawLineForBoxSide(paintInfo.getContext(), pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.max Y(), boxSide, ruleColor, ruleStyle, 0, 0, antialias);
3029 } 3029 }
3030 } 3030 }
3031 } 3031 }
3032 3032
3033 void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& p aintOffset, bool paintingFloats) 3033 void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& p aintOffset, bool paintingFloats)
3034 { 3034 {
3035 // We need to do multiple passes, breaking up our child painting into strips . 3035 // We need to do multiple passes, breaking up our child painting into strips .
3036 GraphicsContext* context = paintInfo.context; 3036 GraphicsContext* context = paintInfo.getContext();
3037 ColumnInfo* colInfo = columnInfo(); 3037 ColumnInfo* colInfo = columnInfo();
3038 unsigned colCount = columnCount(colInfo); 3038 unsigned colCount = columnCount(colInfo);
3039 if (!colCount) 3039 if (!colCount)
3040 return; 3040 return;
3041 LayoutUnit currLogicalTopOffset = 0; 3041 LayoutUnit currLogicalTopOffset = 0;
3042 LayoutUnit colGap = columnGap(); 3042 LayoutUnit colGap = columnGap();
3043 for (unsigned i = 0; i < colCount; i++) { 3043 for (unsigned i = 0; i < colCount; i++) {
3044 // For each rect, we clip to the rect, and then we adjust our coords. 3044 // For each rect, we clip to the rect, and then we adjust our coords.
3045 LayoutRect colRect = columnRectAt(colInfo, i); 3045 LayoutRect colRect = columnRectAt(colInfo, i);
3046 flipForWritingMode(colRect); 3046 flipForWritingMode(colRect);
3047 LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x() : colRect.y()) - logicalLeftOffsetForContent(); 3047 LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x() : colRect.y()) - logicalLeftOffsetForContent();
3048 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOf fset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset ); 3048 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOf fset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset );
3049 if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) { 3049 if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) {
3050 if (isHorizontalWritingMode()) 3050 if (isHorizontalWritingMode())
3051 offset.expand(0, colRect.y() - borderTop() - paddingTop()); 3051 offset.expand(0, colRect.y() - borderTop() - paddingTop());
3052 else 3052 else
3053 offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0); 3053 offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0);
3054 } 3054 }
3055 colRect.moveBy(paintOffset); 3055 colRect.moveBy(paintOffset);
3056 PaintInfo info(paintInfo); 3056 PaintInfo info(paintInfo);
3057 info.rect.intersect(pixelSnappedIntRect(colRect)); 3057 info.getRect().intersect(pixelSnappedIntRect(colRect));
3058 3058
3059 if (!info.rect.isEmpty()) { 3059 if (!info.getRect().isEmpty()) {
3060 GraphicsContextStateSaver stateSaver(*context); 3060 GraphicsContextStateSaver stateSaver(*context);
3061 LayoutRect clipRect(colRect); 3061 LayoutRect clipRect(colRect);
3062 3062
3063 if (i < colCount - 1) { 3063 if (i < colCount - 1) {
3064 if (isHorizontalWritingMode()) 3064 if (isHorizontalWritingMode())
3065 clipRect.expand(colGap / 2, 0); 3065 clipRect.expand(colGap / 2, 0);
3066 else 3066 else
3067 clipRect.expand(0, colGap / 2); 3067 clipRect.expand(0, colGap / 2);
3068 } 3068 }
3069 // Each strip pushes a clip, since column boxes are specified as bei ng 3069 // Each strip pushes a clip, since column boxes are specified as bei ng
3070 // like overflow:hidden. 3070 // like overflow:hidden.
3071 // FIXME: Content and column rules that extend outside column boxes at the edges of the multi-column element 3071 // FIXME: Content and column rules that extend outside column boxes at the edges of the multi-column element
3072 // are clipped according to the 'overflow' property. 3072 // are clipped according to the 'overflow' property.
3073 context->clip(pixelSnappedIntRect(clipRect)); 3073 context->clip(pixelSnappedIntRect(clipRect));
3074 3074
3075 // Adjust our x and y when painting. 3075 // Adjust our x and y when painting.
3076 LayoutPoint adjustedPaintOffset = paintOffset + offset; 3076 LayoutPoint adjustedPaintOffset = paintOffset + offset;
3077 if (paintingFloats) 3077 if (paintingFloats)
3078 paintFloats(info, adjustedPaintOffset, paintInfo.phase == PaintP haseSelection || paintInfo.phase == PaintPhaseTextClip); 3078 paintFloats(info, adjustedPaintOffset, paintInfo.getPhase() == P aintPhaseSelection || paintInfo.getPhase() == PaintPhaseTextClip);
3079 else 3079 else
3080 paintContents(info, adjustedPaintOffset); 3080 paintContents(info, adjustedPaintOffset);
3081 } 3081 }
3082 3082
3083 LayoutUnit blockDelta = (isHorizontalWritingMode() ? colRect.height() : colRect.width()); 3083 LayoutUnit blockDelta = (isHorizontalWritingMode() ? colRect.height() : colRect.width());
3084 if (style()->isFlippedBlocksWritingMode()) 3084 if (style()->isFlippedBlocksWritingMode())
3085 currLogicalTopOffset += blockDelta; 3085 currLogicalTopOffset += blockDelta;
3086 else 3086 else
3087 currLogicalTopOffset -= blockDelta; 3087 currLogicalTopOffset -= blockDelta;
3088 } 3088 }
3089 } 3089 }
3090 3090
3091 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf fset) 3091 void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf fset)
3092 { 3092 {
3093 // Avoid painting descendants of the root element when stylesheets haven't l oaded. This eliminates FOUC. 3093 // Avoid painting descendants of the root element when stylesheets haven't l oaded. This eliminates FOUC.
3094 // It's ok not to draw, because later on, when all the stylesheets do load, styleResolverChanged() on the Document 3094 // It's ok not to draw, because later on, when all the stylesheets do load, styleResolverChanged() on the Document
3095 // will do a full repaint. 3095 // will do a full repaint.
3096 if (document()->didLayoutWithPendingStylesheets() && !isRenderView()) 3096 if (document()->didLayoutWithPendingStylesheets() && !isRenderView())
3097 return; 3097 return;
3098 3098
3099 if (childrenInline()) 3099 if (childrenInline())
3100 m_lineBoxes.paint(this, paintInfo, paintOffset); 3100 m_lineBoxes.paint(this, paintInfo, paintOffset);
3101 else { 3101 else {
3102 PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? Pai ntPhaseOutline : paintInfo.phase; 3102 PaintPhase newPhase = (paintInfo.getPhase() == PaintPhaseChildOutlines) ? PaintPhaseOutline : paintInfo.getPhase();
3103 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi ldBlockBackground : newPhase; 3103 newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChi ldBlockBackground : newPhase;
3104 3104
3105 // We don't paint our own background, but we do let the kids paint their backgrounds. 3105 // We don't paint our own background, but we do let the kids paint their backgrounds.
3106 PaintInfo paintInfoForChild(paintInfo); 3106 PaintInfo paintInfoForChild(paintInfo);
3107 paintInfoForChild.phase = newPhase; 3107 paintInfoForChild.setPhase(newPhase);
3108 paintInfoForChild.updatePaintingRootForChildren(this); 3108 paintInfoForChild.updatePaintingRootForChildren(this);
3109 paintChildren(paintInfoForChild, paintOffset); 3109 paintChildren(paintInfoForChild, paintOffset);
3110 } 3110 }
3111 } 3111 }
3112 3112
3113 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf fset) 3113 void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOf fset)
3114 { 3114 {
3115 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) 3115 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x())
3116 paintChild(child, paintInfo, paintOffset); 3116 paintChild(child, paintInfo, paintOffset);
3117 } 3117 }
(...skipping 15 matching lines...) Expand all
3133 if (type == CursorCaret) { 3133 if (type == CursorCaret) {
3134 caretPainter = frame()->selection()->caretRenderer(); 3134 caretPainter = frame()->selection()->caretRenderer();
3135 isContentEditable = frame()->selection()->rendererIsEditable(); 3135 isContentEditable = frame()->selection()->rendererIsEditable();
3136 } else { 3136 } else {
3137 caretPainter = frame()->page()->dragCaretController()->caretRenderer(); 3137 caretPainter = frame()->page()->dragCaretController()->caretRenderer();
3138 isContentEditable = frame()->page()->dragCaretController()->isContentEdi table(); 3138 isContentEditable = frame()->page()->dragCaretController()->isContentEdi table();
3139 } 3139 }
3140 3140
3141 if (caretPainter == this && (isContentEditable || caretBrowsing)) { 3141 if (caretPainter == this && (isContentEditable || caretBrowsing)) {
3142 if (type == CursorCaret) 3142 if (type == CursorCaret)
3143 frame()->selection()->paintCaret(paintInfo.context, paintOffset, pai ntInfo.rect); 3143 frame()->selection()->paintCaret(paintInfo.getContext(), paintOffset , paintInfo.getRect());
3144 else 3144 else
3145 frame()->page()->dragCaretController()->paintDragCaret(frame(), pain tInfo.context, paintOffset, paintInfo.rect); 3145 frame()->page()->dragCaretController()->paintDragCaret(frame(), pain tInfo.getContext(), paintOffset, paintInfo.getRect());
3146 } 3146 }
3147 } 3147 }
3148 3148
3149 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs et) 3149 void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs et)
3150 { 3150 {
3151 PaintPhase paintPhase = paintInfo.phase; 3151 PaintPhase paintPhase = paintInfo.getPhase();
3152 3152
3153 // 1. paint background, borders etc 3153 // 1. paint background, borders etc
3154 if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChil dBlockBackground) && style()->visibility() == VISIBLE) { 3154 if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChil dBlockBackground) && style()->visibility() == VISIBLE) {
3155 if (hasBoxDecorations()) 3155 if (hasBoxDecorations())
3156 paintBoxDecorations(paintInfo, paintOffset); 3156 paintBoxDecorations(paintInfo, paintOffset);
3157 if (hasColumns() && !paintInfo.paintRootBackgroundOnly()) 3157 if (hasColumns() && !paintInfo.paintRootBackgroundOnly())
3158 paintColumnRules(paintInfo, paintOffset); 3158 paintColumnRules(paintInfo, paintOffset);
3159 } 3159 }
3160 3160
3161 if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) { 3161 if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
3252 if (!floats) 3252 if (!floats)
3253 return; 3253 return;
3254 3254
3255 const FloatingObjectSet& floatingObjectSet = floats->set(); 3255 const FloatingObjectSet& floatingObjectSet = floats->set();
3256 FloatingObjectSetIterator end = floatingObjectSet.end(); 3256 FloatingObjectSetIterator end = floatingObjectSet.end();
3257 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 3257 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
3258 FloatingObject* r = *it; 3258 FloatingObject* r = *it;
3259 // Only paint the object if our m_shouldPaint flag is set. 3259 // Only paint the object if our m_shouldPaint flag is set.
3260 if (r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()) { 3260 if (r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()) {
3261 PaintInfo currentPaintInfo(paintInfo); 3261 PaintInfo currentPaintInfo(paintInfo);
3262 currentPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhas eBlockBackground; 3262 PaintPhase phase = preservePhase ? paintInfo.getPhase() : PaintPhase BlockBackground;
3263 currentPaintInfo.setPhase(phase);
3263 LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPo int(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->m_renderer->x(), paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->m_renderer->y())); 3264 LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPo int(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->m_renderer->x(), paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->m_renderer->y()));
3264 r->m_renderer->paint(currentPaintInfo, childPoint); 3265 r->m_renderer->paint(currentPaintInfo, childPoint);
3265 if (!preservePhase) { 3266 if (!preservePhase) {
3266 currentPaintInfo.phase = PaintPhaseChildBlockBackgrounds; 3267 currentPaintInfo.setPhase(PaintPhaseChildBlockBackgrounds);
3267 r->m_renderer->paint(currentPaintInfo, childPoint); 3268 r->m_renderer->paint(currentPaintInfo, childPoint);
3268 currentPaintInfo.phase = PaintPhaseFloat; 3269 currentPaintInfo.setPhase(PaintPhaseFloat);
3269 r->m_renderer->paint(currentPaintInfo, childPoint); 3270 r->m_renderer->paint(currentPaintInfo, childPoint);
3270 currentPaintInfo.phase = PaintPhaseForeground; 3271 currentPaintInfo.setPhase(PaintPhaseForeground);
3271 r->m_renderer->paint(currentPaintInfo, childPoint); 3272 r->m_renderer->paint(currentPaintInfo, childPoint);
3272 currentPaintInfo.phase = PaintPhaseOutline; 3273 currentPaintInfo.setPhase(PaintPhaseOutline);
3273 r->m_renderer->paint(currentPaintInfo, childPoint); 3274 r->m_renderer->paint(currentPaintInfo, childPoint);
3274 } 3275 }
3275 } 3276 }
3276 } 3277 }
3277 } 3278 }
3278 3279
3279 RenderInline* RenderBlock::inlineElementContinuation() const 3280 RenderInline* RenderBlock::inlineElementContinuation() const
3280 { 3281 {
3281 RenderBoxModelObject* continuation = this->continuation(); 3282 RenderBoxModelObject* continuation = this->continuation();
3282 return continuation && continuation->isInline() ? toRenderInline(continuatio n) : 0; 3283 return continuation && continuation->isInline() ? toRenderInline(continuatio n) : 0;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
3399 3400
3400 LayoutUnit lastTop = 0; 3401 LayoutUnit lastTop = 0;
3401 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); 3402 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop);
3402 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); 3403 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop);
3403 3404
3404 return selectionGaps(this, offsetFromRepaintContainer, IntSize(), lastTop, l astLeft, lastRight); 3405 return selectionGaps(this, offsetFromRepaintContainer, IntSize(), lastTop, l astLeft, lastRight);
3405 } 3406 }
3406 3407
3407 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO ffset) 3408 void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO ffset)
3408 { 3409 {
3409 if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) { 3410 if (shouldPaintSelectionGaps() && paintInfo.getPhase() == PaintPhaseForegrou nd) {
3410 LayoutUnit lastTop = 0; 3411 LayoutUnit lastTop = 0;
3411 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop); 3412 LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop);
3412 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop); 3413 LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop);
3413 GraphicsContextStateSaver stateSaver(*paintInfo.context); 3414 GraphicsContextStateSaver stateSaver(*paintInfo.getContext());
3414 3415
3415 LayoutRect gapRectsBounds = selectionGaps(this, paintOffset, LayoutSize( ), lastTop, lastLeft, lastRight, &paintInfo); 3416 LayoutRect gapRectsBounds = selectionGaps(this, paintOffset, LayoutSize( ), lastTop, lastLeft, lastRight, &paintInfo);
3416 if (!gapRectsBounds.isEmpty()) { 3417 if (!gapRectsBounds.isEmpty()) {
3417 if (RenderLayer* layer = enclosingLayer()) { 3418 if (RenderLayer* layer = enclosingLayer()) {
3418 gapRectsBounds.moveBy(-paintOffset); 3419 gapRectsBounds.moveBy(-paintOffset);
3419 if (!hasLayer()) { 3420 if (!hasLayer()) {
3420 LayoutRect localBounds(gapRectsBounds); 3421 LayoutRect localBounds(gapRectsBounds);
3421 flipForWritingMode(localBounds); 3422 flipForWritingMode(localBounds);
3422 gapRectsBounds = localToContainerQuad(FloatRect(localBounds) , layer->renderer()).enclosingBoundingBox(); 3423 gapRectsBounds = localToContainerQuad(FloatRect(localBounds) , layer->renderer()).enclosingBoundingBox();
3423 if (layer->renderer()->hasOverflowClip()) 3424 if (layer->renderer()->hasOverflowClip())
3424 gapRectsBounds.move(layer->renderBox()->scrolledContentO ffset()); 3425 gapRectsBounds.move(layer->renderBox()->scrolledContentO ffset());
3425 } 3426 }
3426 layer->addBlockSelectionGapsBounds(gapRectsBounds); 3427 layer->addBlockSelectionGapsBounds(gapRectsBounds);
3427 } 3428 }
3428 } 3429 }
3429 } 3430 }
3430 } 3431 }
3431 3432
3432 static void clipOutPositionedObjects(const PaintInfo* paintInfo, const LayoutPoi nt& offset, TrackedRendererListHashSet* positionedObjects) 3433 static void clipOutPositionedObjects(PaintInfo* paintInfo, const LayoutPoint& of fset, TrackedRendererListHashSet* positionedObjects)
3433 { 3434 {
3434 if (!positionedObjects) 3435 if (!positionedObjects)
3435 return; 3436 return;
3436 3437
3437 TrackedRendererListHashSet::const_iterator end = positionedObjects->end(); 3438 TrackedRendererListHashSet::const_iterator end = positionedObjects->end();
3438 for (TrackedRendererListHashSet::const_iterator it = positionedObjects->begi n(); it != end; ++it) { 3439 for (TrackedRendererListHashSet::const_iterator it = positionedObjects->begi n(); it != end; ++it) {
3439 RenderBox* r = *it; 3440 RenderBox* r = *it;
3440 paintInfo->context->clipOut(IntRect(offset.x() + r->x(), offset.y() + r- >y(), r->width(), r->height())); 3441 paintInfo->getContext()->clipOut(IntRect(offset.x() + r->x(), offset.y() + r->y(), r->width(), r->height()));
3441 } 3442 }
3442 } 3443 }
3443 3444
3444 static LayoutUnit blockDirectionOffset(RenderBlock* rootBlock, const LayoutSize& offsetFromRootBlock) 3445 static LayoutUnit blockDirectionOffset(RenderBlock* rootBlock, const LayoutSize& offsetFromRootBlock)
3445 { 3446 {
3446 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.height() : offsetFromRootBlock.width(); 3447 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.height() : offsetFromRootBlock.width();
3447 } 3448 }
3448 3449
3449 static LayoutUnit inlineDirectionOffset(RenderBlock* rootBlock, const LayoutSize & offsetFromRootBlock) 3450 static LayoutUnit inlineDirectionOffset(RenderBlock* rootBlock, const LayoutSize & offsetFromRootBlock)
3450 { 3451 {
3451 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.width() : offsetFromRootBlock.height(); 3452 return rootBlock->isHorizontalWritingMode() ? offsetFromRootBlock.width() : offsetFromRootBlock.height();
3452 } 3453 }
3453 3454
3454 LayoutRect RenderBlock::logicalRectToPhysicalRect(const LayoutPoint& rootBlockPh ysicalPosition, const LayoutRect& logicalRect) 3455 LayoutRect RenderBlock::logicalRectToPhysicalRect(const LayoutPoint& rootBlockPh ysicalPosition, const LayoutRect& logicalRect)
3455 { 3456 {
3456 LayoutRect result; 3457 LayoutRect result;
3457 if (isHorizontalWritingMode()) 3458 if (isHorizontalWritingMode())
3458 result = logicalRect; 3459 result = logicalRect;
3459 else 3460 else
3460 result = LayoutRect(logicalRect.y(), logicalRect.x(), logicalRect.height (), logicalRect.width()); 3461 result = LayoutRect(logicalRect.y(), logicalRect.x(), logicalRect.height (), logicalRect.width());
3461 flipForWritingMode(result); 3462 flipForWritingMode(result);
3462 result.moveBy(rootBlockPhysicalPosition); 3463 result.moveBy(rootBlockPhysicalPosition);
3463 return result; 3464 return result;
3464 } 3465 }
3465 3466
3466 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3467 GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r ootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3467 LayoutUnit& lastLogicalTop, LayoutUnit& last LogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) 3468 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog icalRight, PaintInfo* paintInfo)
3468 { 3469 {
3469 // IMPORTANT: Callers of this method that intend for painting to happen need to do a save/restore. 3470 // IMPORTANT: Callers of this method that intend for painting to happen need to do a save/restore.
3470 // Clip out floating and positioned objects when painting selection gaps. 3471 // Clip out floating and positioned objects when painting selection gaps.
3471 if (paintInfo) { 3472 if (paintInfo) {
3472 // Note that we don't clip out overflow for positioned objects. We just stick to the border box. 3473 // Note that we don't clip out overflow for positioned objects. We just stick to the border box.
3473 LayoutRect flippedBlockRect(offsetFromRootBlock.width(), offsetFromRootB lock.height(), width(), height()); 3474 LayoutRect flippedBlockRect(offsetFromRootBlock.width(), offsetFromRootB lock.height(), width(), height());
3474 rootBlock->flipForWritingMode(flippedBlockRect); 3475 rootBlock->flipForWritingMode(flippedBlockRect);
3475 flippedBlockRect.moveBy(rootBlockPhysicalPosition); 3476 flippedBlockRect.moveBy(rootBlockPhysicalPosition);
3476 clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), positio nedObjects()); 3477 clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), positio nedObjects());
3477 if (isBody() || isRoot()) // The <body> must make sure to examine its co ntainingBlock's positioned objects. 3478 if (isBody() || isRoot()) // The <body> must make sure to examine its co ntainingBlock's positioned objects.
3478 for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView(); cb = cb->containingBlock()) 3479 for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView(); cb = cb->containingBlock())
3479 clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y() ), cb->positionedObjects()); // FIXME: Not right for flipped writing modes. 3480 clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y() ), cb->positionedObjects()); // FIXME: Not right for flipped writing modes.
3480 if (FloatingObjects* floats = floatingObjects()) { 3481 if (FloatingObjects* floats = floatingObjects()) {
3481 const FloatingObjectSet& floatingObjectSet = floats->set(); 3482 const FloatingObjectSet& floatingObjectSet = floats->set();
3482 FloatingObjectSetIterator end = floatingObjectSet.end(); 3483 FloatingObjectSetIterator end = floatingObjectSet.end();
3483 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) { 3484 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
3484 FloatingObject* r = *it; 3485 FloatingObject* r = *it;
3485 LayoutRect floatBox(offsetFromRootBlock.width() + xPositionForFl oatIncludingMargin(r), 3486 LayoutRect floatBox(offsetFromRootBlock.width() + xPositionForFl oatIncludingMargin(r),
3486 offsetFromRootBlock.height() + yPositionForF loatIncludingMargin(r), 3487 offsetFromRootBlock.height() + yPositionForF loatIncludingMargin(r),
3487 r->m_renderer->width(), r->m_renderer->heigh t()); 3488 r->m_renderer->width(), r->m_renderer->heigh t());
3488 rootBlock->flipForWritingMode(floatBox); 3489 rootBlock->flipForWritingMode(floatBox);
3489 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPo sition.y()); 3490 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPo sition.y());
3490 paintInfo->context->clipOut(pixelSnappedIntRect(floatBox)); 3491 paintInfo->getContext()->clipOut(pixelSnappedIntRect(floatBox));
3491 } 3492 }
3492 } 3493 }
3493 } 3494 }
3494 3495
3495 // 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 3496 // 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
3496 // fixed). 3497 // fixed).
3497 GapRects result; 3498 GapRects result;
3498 if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work s omeday. 3499 if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work s omeday.
3499 return result; 3500 return result;
3500 3501
(...skipping 11 matching lines...) Expand all
3512 result = blockSelectionGaps(rootBlock, rootBlockPhysicalPosition, offset FromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo); 3513 result = blockSelectionGaps(rootBlock, rootBlockPhysicalPosition, offset FromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo);
3513 3514
3514 // Go ahead and fill the vertical gap all the way to the bottom of our block if the selection extends past our block. 3515 // Go ahead and fill the vertical gap all the way to the bottom of our block if the selection extends past our block.
3515 if (rootBlock == this && (selectionState() != SelectionBoth && selectionStat e() != SelectionEnd)) 3516 if (rootBlock == this && (selectionState() != SelectionBoth && selectionStat e() != SelectionEnd))
3516 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPositio n, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, 3517 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPositio n, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight,
3517 logicalHeight(), paintInfo)); 3518 logicalHeight(), paintInfo));
3518 return result; 3519 return result;
3519 } 3520 }
3520 3521
3521 GapRects RenderBlock::inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPo int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3522 GapRects RenderBlock::inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPo int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3522 LayoutUnit& lastLogicalTop, LayoutUnit & lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) 3523 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog icalRight, PaintInfo* paintInfo)
3523 { 3524 {
3524 GapRects result; 3525 GapRects result;
3525 3526
3526 bool containsStart = selectionState() == SelectionStart || selectionState() == SelectionBoth; 3527 bool containsStart = selectionState() == SelectionStart || selectionState() == SelectionBoth;
3527 3528
3528 if (!firstLineBox()) { 3529 if (!firstLineBox()) {
3529 if (containsStart) { 3530 if (containsStart) {
3530 // Go ahead and update our lastLogicalTop to be the bottom of the bl ock. <hr>s or empty blocks with height can trip this 3531 // Go ahead and update our lastLogicalTop to be the bottom of the bl ock. <hr>s or empty blocks with height can trip this
3531 // case. 3532 // case.
3532 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock ) + logicalHeight(); 3533 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock ) + logicalHeight();
(...skipping 13 matching lines...) Expand all
3546 LayoutUnit selHeight = curr->selectionHeightAdjustedForPrecedingBlock(); 3547 LayoutUnit selHeight = curr->selectionHeightAdjustedForPrecedingBlock();
3547 3548
3548 if (!containsStart && !lastSelectedLine && 3549 if (!containsStart && !lastSelectedLine &&
3549 selectionState() != SelectionStart && selectionState() != SelectionB oth) 3550 selectionState() != SelectionStart && selectionState() != SelectionB oth)
3550 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPos ition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, 3551 result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPos ition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight,
3551 selTop, paintInfo)); 3552 selTop, paintInfo));
3552 3553
3553 LayoutRect logicalRect(curr->logicalLeft(), selTop, curr->logicalWidth() , selTop + selHeight); 3554 LayoutRect logicalRect(curr->logicalLeft(), selTop, curr->logicalWidth() , selTop + selHeight);
3554 logicalRect.move(isHorizontalWritingMode() ? offsetFromRootBlock : offse tFromRootBlock.transposedSize()); 3555 logicalRect.move(isHorizontalWritingMode() ? offsetFromRootBlock : offse tFromRootBlock.transposedSize());
3555 LayoutRect physicalRect = rootBlock->logicalRectToPhysicalRect(rootBlock PhysicalPosition, logicalRect); 3556 LayoutRect physicalRect = rootBlock->logicalRectToPhysicalRect(rootBlock PhysicalPosition, logicalRect);
3556 if (!paintInfo || (isHorizontalWritingMode() && physicalRect.y() < paint Info->rect.maxY() && physicalRect.maxY() > paintInfo->rect.y()) 3557 if (!paintInfo || (isHorizontalWritingMode() && physicalRect.y() < paint Info->getRect().maxY() && physicalRect.maxY() > paintInfo->getRect().y())
3557 || (!isHorizontalWritingMode() && physicalRect.x() < paintInfo->rect .maxX() && physicalRect.maxX() > paintInfo->rect.x())) 3558 || (!isHorizontalWritingMode() && physicalRect.x() < paintInfo->getR ect().maxX() && physicalRect.maxX() > paintInfo->getRect().x()))
3558 result.unite(curr->lineSelectionGap(rootBlock, rootBlockPhysicalPosi tion, offsetFromRootBlock, selTop, selHeight, paintInfo)); 3559 result.unite(curr->lineSelectionGap(rootBlock, rootBlockPhysicalPosi tion, offsetFromRootBlock, selTop, selHeight, paintInfo));
3559 3560
3560 lastSelectedLine = curr; 3561 lastSelectedLine = curr;
3561 } 3562 }
3562 3563
3563 if (containsStart && !lastSelectedLine) 3564 if (containsStart && !lastSelectedLine)
3564 // VisibleSelection must start just after our last line. 3565 // VisibleSelection must start just after our last line.
3565 lastSelectedLine = lastRootBox(); 3566 lastSelectedLine = lastRootBox();
3566 3567
3567 if (lastSelectedLine && selectionState() != SelectionEnd && selectionState() != SelectionBoth) { 3568 if (lastSelectedLine && selectionState() != SelectionEnd && selectionState() != SelectionBoth) {
3568 // Go ahead and update our lastY to be the bottom of the last selected l ine. 3569 // Go ahead and update our lastY to be the bottom of the last selected l ine.
3569 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock) + lastSelectedLine->selectionBottom(); 3570 lastLogicalTop = blockDirectionOffset(rootBlock, offsetFromRootBlock) + lastSelectedLine->selectionBottom();
3570 lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, lastSelectedLine ->selectionBottom()); 3571 lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, lastSelectedLine ->selectionBottom());
3571 lastLogicalRight = logicalRightSelectionOffset(rootBlock, lastSelectedLi ne->selectionBottom()); 3572 lastLogicalRight = logicalRightSelectionOffset(rootBlock, lastSelectedLi ne->selectionBottom());
3572 } 3573 }
3573 return result; 3574 return result;
3574 } 3575 }
3575 3576
3576 GapRects RenderBlock::blockSelectionGaps(RenderBlock* rootBlock, const LayoutPoi nt& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3577 GapRects RenderBlock::blockSelectionGaps(RenderBlock* rootBlock, const LayoutPoi nt& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3577 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) 3578 LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLog icalRight, PaintInfo* paintInfo)
3578 { 3579 {
3579 GapRects result; 3580 GapRects result;
3580 3581
3581 // Go ahead and jump right to the first block child that contains some selec ted objects. 3582 // Go ahead and jump right to the first block child that contains some selec ted objects.
3582 RenderBox* curr; 3583 RenderBox* curr;
3583 for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone ; curr = curr->nextSiblingBox()) { } 3584 for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone ; curr = curr->nextSiblingBox()) { }
3584 3585
3585 for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->ne xtSiblingBox()) { 3586 for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->ne xtSiblingBox()) {
3586 SelectionState childState = curr->selectionState(); 3587 SelectionState childState = curr->selectionState();
3587 if (childState == SelectionBoth || childState == SelectionEnd) 3588 if (childState == SelectionBoth || childState == SelectionEnd)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3629 lastLogicalRight = logicalRightSelectionOffset(rootBlock, curr->logi calBottom()); 3630 lastLogicalRight = logicalRightSelectionOffset(rootBlock, curr->logi calBottom());
3630 } else if (childState != SelectionNone) 3631 } else if (childState != SelectionNone)
3631 // We must be a block that has some selected object inside it. Go a head and recur. 3632 // We must be a block that has some selected object inside it. Go a head and recur.
3632 result.unite(toRenderBlock(curr)->selectionGaps(rootBlock, rootBlock PhysicalPosition, LayoutSize(offsetFromRootBlock.width() + curr->x(), offsetFrom RootBlock.height() + curr->y()), 3633 result.unite(toRenderBlock(curr)->selectionGaps(rootBlock, rootBlock PhysicalPosition, LayoutSize(offsetFromRootBlock.width() + curr->x(), offsetFrom RootBlock.height() + curr->y()),
3633 lastLogicalTop, last LogicalLeft, lastLogicalRight, paintInfo)); 3634 lastLogicalTop, last LogicalLeft, lastLogicalRight, paintInfo));
3634 } 3635 }
3635 return result; 3636 return result;
3636 } 3637 }
3637 3638
3638 LayoutRect RenderBlock::blockSelectionGap(RenderBlock* rootBlock, const LayoutPo int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3639 LayoutRect RenderBlock::blockSelectionGap(RenderBlock* rootBlock, const LayoutPo int& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3639 LayoutUnit lastLogicalTop, LayoutUnit lastLogicalLeft, LayoutUnit lastLogicalRight, LayoutUnit logicalBottom, const Pa intInfo* paintInfo) 3640 LayoutUnit lastLogicalTop, LayoutUnit lastLogicalLeft, LayoutUnit lastLogica lRight, LayoutUnit logicalBottom, PaintInfo* paintInfo)
3640 { 3641 {
3641 LayoutUnit logicalTop = lastLogicalTop; 3642 LayoutUnit logicalTop = lastLogicalTop;
3642 LayoutUnit logicalHeight = blockDirectionOffset(rootBlock, offsetFromRootBlo ck) + logicalBottom - logicalTop; 3643 LayoutUnit logicalHeight = blockDirectionOffset(rootBlock, offsetFromRootBlo ck) + logicalBottom - logicalTop;
3643 if (logicalHeight <= 0) 3644 if (logicalHeight <= 0)
3644 return LayoutRect(); 3645 return LayoutRect();
3645 3646
3646 // Get the selection offsets for the bottom of the gap 3647 // Get the selection offsets for the bottom of the gap
3647 LayoutUnit logicalLeft = max(lastLogicalLeft, logicalLeftSelectionOffset(roo tBlock, logicalBottom)); 3648 LayoutUnit logicalLeft = max(lastLogicalLeft, logicalLeftSelectionOffset(roo tBlock, logicalBottom));
3648 LayoutUnit logicalRight = min(lastLogicalRight, logicalRightSelectionOffset( rootBlock, logicalBottom)); 3649 LayoutUnit logicalRight = min(lastLogicalRight, logicalRightSelectionOffset( rootBlock, logicalBottom));
3649 LayoutUnit logicalWidth = logicalRight - logicalLeft; 3650 LayoutUnit logicalWidth = logicalRight - logicalLeft;
3650 if (logicalWidth <= 0) 3651 if (logicalWidth <= 0)
3651 return LayoutRect(); 3652 return LayoutRect();
3652 3653
3653 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(logicalLeft, logicalTop, logicalWidth, logicalHeight)); 3654 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(logicalLeft, logicalTop, logicalWidth, logicalHeight));
3654 if (paintInfo) 3655 if (paintInfo)
3655 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selectionBack groundColor()); 3656 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selectio nBackgroundColor());
3656 return gapRect; 3657 return gapRect;
3657 } 3658 }
3658 3659
3659 LayoutRect RenderBlock::logicalLeftSelectionGap(RenderBlock* rootBlock, const La youtPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3660 LayoutRect RenderBlock::logicalLeftSelectionGap(RenderBlock* rootBlock, const La youtPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3660 RenderObject* selObj, LayoutUnit logicalLeft, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo* paintInfo) 3661 RenderObject* selObj, LayoutUnit logicalLeft, LayoutUnit logicalTop, LayoutU nit logicalHeight, PaintInfo* paintInfo)
3661 { 3662 {
3662 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR ootBlock) + logicalTop; 3663 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR ootBlock) + logicalTop;
3663 LayoutUnit rootBlockLogicalLeft = max(logicalLeftSelectionOffset(rootBlock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight)); 3664 LayoutUnit rootBlockLogicalLeft = max(logicalLeftSelectionOffset(rootBlock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight));
3664 LayoutUnit rootBlockLogicalRight = min(inlineDirectionOffset(rootBlock, offs etFromRootBlock) + floorToInt(logicalLeft), min(logicalRightSelectionOffset(root Block, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalH eight))); 3665 LayoutUnit rootBlockLogicalRight = min(inlineDirectionOffset(rootBlock, offs etFromRootBlock) + floorToInt(logicalLeft), min(logicalRightSelectionOffset(root Block, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalH eight)));
3665 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL eft; 3666 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL eft;
3666 if (rootBlockLogicalWidth <= 0) 3667 if (rootBlockLogicalWidth <= 0)
3667 return LayoutRect(); 3668 return LayoutRect();
3668 3669
3669 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW idth, logicalHeight)); 3670 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW idth, logicalHeight));
3670 if (paintInfo) 3671 if (paintInfo)
3671 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selObj->selec tionBackgroundColor()); 3672 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selObj-> selectionBackgroundColor());
3672 return gapRect; 3673 return gapRect;
3673 } 3674 }
3674 3675
3675 LayoutRect RenderBlock::logicalRightSelectionGap(RenderBlock* rootBlock, const L ayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, 3676 LayoutRect RenderBlock::logicalRightSelectionGap(RenderBlock* rootBlock, const L ayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
3676 RenderObject* selObj, LayoutUni t logicalRight, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo * paintInfo) 3677 RenderObject* selObj, LayoutUnit logicalRight, LayoutUnit logicalTop, Layout Unit logicalHeight, PaintInfo* paintInfo)
3677 { 3678 {
3678 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR ootBlock) + logicalTop; 3679 LayoutUnit rootBlockLogicalTop = blockDirectionOffset(rootBlock, offsetFromR ootBlock) + logicalTop;
3679 LayoutUnit rootBlockLogicalLeft = max(inlineDirectionOffset(rootBlock, offse tFromRootBlock) + floorToInt(logicalRight), max(logicalLeftSelectionOffset(rootB lock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHei ght))); 3680 LayoutUnit rootBlockLogicalLeft = max(inlineDirectionOffset(rootBlock, offse tFromRootBlock) + floorToInt(logicalRight), max(logicalLeftSelectionOffset(rootB lock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHei ght)));
3680 LayoutUnit rootBlockLogicalRight = min(logicalRightSelectionOffset(rootBlock , logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight )); 3681 LayoutUnit rootBlockLogicalRight = min(logicalRightSelectionOffset(rootBlock , logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight ));
3681 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL eft; 3682 LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalL eft;
3682 if (rootBlockLogicalWidth <= 0) 3683 if (rootBlockLogicalWidth <= 0)
3683 return LayoutRect(); 3684 return LayoutRect();
3684 3685
3685 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW idth, logicalHeight)); 3686 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalP osition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalW idth, logicalHeight));
3686 if (paintInfo) 3687 if (paintInfo)
3687 paintInfo->context->fillRect(pixelSnappedIntRect(gapRect), selObj->selec tionBackgroundColor()); 3688 paintInfo->getContext()->fillRect(pixelSnappedIntRect(gapRect), selObj-> selectionBackgroundColor());
3688 return gapRect; 3689 return gapRect;
3689 } 3690 }
3690 3691
3691 void RenderBlock::getSelectionGapInfo(SelectionState state, bool& leftGap, bool& rightGap) 3692 void RenderBlock::getSelectionGapInfo(SelectionState state, bool& leftGap, bool& rightGap)
3692 { 3693 {
3693 bool ltr = style()->isLeftToRightDirection(); 3694 bool ltr = style()->isLeftToRightDirection();
3694 leftGap = (state == RenderObject::SelectionInside) || 3695 leftGap = (state == RenderObject::SelectionInside) ||
3695 (state == RenderObject::SelectionEnd && ltr) || 3696 (state == RenderObject::SelectionEnd && ltr) ||
3696 (state == RenderObject::SelectionStart && !ltr); 3697 (state == RenderObject::SelectionStart && !ltr);
3697 rightGap = (state == RenderObject::SelectionInside) || 3698 rightGap = (state == RenderObject::SelectionInside) ||
(...skipping 4560 matching lines...) Expand 10 before | Expand all | Expand 10 after
8258 } 8259 }
8259 8260
8260 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 8261 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
8261 { 8262 {
8262 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY()); 8263 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY());
8263 } 8264 }
8264 8265
8265 #endif 8266 #endif
8266 8267
8267 } // namespace WebCore 8268 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698