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

Side by Side Diff: Source/core/rendering/exclusions/ExclusionRectangle.cpp

Issue 14892005: [CSS Exclusions] ExclusionShape bounding box methods should return LayoutRects (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: reverted LineSegment logicalLeft,Right type change Created 7 years, 7 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) 2012 Adobe Systems Incorporated. All rights reserved. 2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 94
95 FloatRoundedRect ExclusionRectangle::shapeMarginBounds() const 95 FloatRoundedRect ExclusionRectangle::shapeMarginBounds() const
96 { 96 {
97 if (!m_haveInitializedMarginBounds) { 97 if (!m_haveInitializedMarginBounds) {
98 m_haveInitializedMarginBounds = true; 98 m_haveInitializedMarginBounds = true;
99 m_marginBounds = m_bounds.marginBounds(shapeMargin()); 99 m_marginBounds = m_bounds.marginBounds(shapeMargin());
100 } 100 }
101 return m_marginBounds; 101 return m_marginBounds;
102 } 102 }
103 103
104 void ExclusionRectangle::getExcludedIntervals(float logicalTop, float logicalHei ght, SegmentList& result) const 104 void ExclusionRectangle::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
105 { 105 {
106 const FloatRoundedRect& bounds = shapeMarginBounds(); 106 const FloatRoundedRect& bounds = shapeMarginBounds();
107 if (bounds.isEmpty()) 107 if (bounds.isEmpty())
108 return; 108 return;
109 109
110 float y1 = logicalTop; 110 float y1 = logicalTop;
111 float y2 = y1 + logicalHeight; 111 float y2 = logicalTop + logicalHeight;
112 112
113 if (y2 < bounds.y() || y1 >= bounds.maxY()) 113 if (y2 < bounds.y() || y1 >= bounds.maxY())
114 return; 114 return;
115 115
116 float x1 = bounds.x(); 116 float x1 = bounds.x();
117 float x2 = bounds.maxX(); 117 float x2 = bounds.maxX();
118 118
119 if (bounds.ry() > 0) { 119 if (bounds.ry() > 0) {
120 if (y2 < bounds.y() + bounds.ry()) { 120 if (y2 < bounds.y() + bounds.ry()) {
121 float yi = y2 - bounds.y() - bounds.ry(); 121 float yi = y2 - bounds.y() - bounds.ry();
122 float xi = ellipseXIntercept(yi, bounds.rx(), bounds.ry()); 122 float xi = ellipseXIntercept(yi, bounds.rx(), bounds.ry());
123 x1 = bounds.x() + bounds.rx() - xi; 123 x1 = bounds.x() + bounds.rx() - xi;
124 x2 = bounds.maxX() - bounds.rx() + xi; 124 x2 = bounds.maxX() - bounds.rx() + xi;
125 } else if (y1 > bounds.maxY() - bounds.ry()) { 125 } else if (y1 > bounds.maxY() - bounds.ry()) {
126 float yi = y1 - (bounds.maxY() - bounds.ry()); 126 float yi = y1 - (bounds.maxY() - bounds.ry());
127 float xi = ellipseXIntercept(yi, bounds.rx(), bounds.ry()); 127 float xi = ellipseXIntercept(yi, bounds.rx(), bounds.ry());
128 x1 = bounds.x() + bounds.rx() - xi; 128 x1 = bounds.x() + bounds.rx() - xi;
129 x2 = bounds.maxX() - bounds.rx() + xi; 129 x2 = bounds.maxX() - bounds.rx() + xi;
130 } 130 }
131 } 131 }
132 132
133 result.append(LineSegment(x1, x2)); 133 result.append(LineSegment(x1, x2));
134 } 134 }
135 135
136 void ExclusionRectangle::getIncludedIntervals(float logicalTop, float logicalHei ght, SegmentList& result) const 136 void ExclusionRectangle::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
137 { 137 {
138 const FloatRoundedRect& bounds = shapePaddingBounds(); 138 const FloatRoundedRect& bounds = shapePaddingBounds();
139 if (bounds.isEmpty()) 139 if (bounds.isEmpty())
140 return; 140 return;
141 141
142 float y1 = logicalTop; 142 float y1 = logicalTop;
143 float y2 = y1 + logicalHeight; 143 float y2 = logicalTop + logicalHeight;
144 144
145 if (y1 < bounds.y() || y2 > bounds.maxY()) 145 if (y1 < bounds.y() || y2 > bounds.maxY())
146 return; 146 return;
147 147
148 float x1 = bounds.x(); 148 float x1 = bounds.x();
149 float x2 = bounds.maxX(); 149 float x2 = bounds.maxX();
150 150
151 if (bounds.ry() > 0) { 151 if (bounds.ry() > 0) {
152 bool y1InterceptsCorner = y1 < bounds.y() + bounds.ry(); 152 bool y1InterceptsCorner = y1 < bounds.y() + bounds.ry();
153 bool y2InterceptsCorner = y2 > bounds.maxY() - bounds.ry(); 153 bool y2InterceptsCorner = y2 > bounds.maxY() - bounds.ry();
(...skipping 17 matching lines...) Expand all
171 171
172 if (y1InterceptsCorner || y2InterceptsCorner) { 172 if (y1InterceptsCorner || y2InterceptsCorner) {
173 x1 = bounds.x() + bounds.rx() - xi; 173 x1 = bounds.x() + bounds.rx() - xi;
174 x2 = bounds.maxX() - bounds.rx() + xi; 174 x2 = bounds.maxX() - bounds.rx() + xi;
175 } 175 }
176 } 176 }
177 177
178 result.append(LineSegment(x1, x2)); 178 result.append(LineSegment(x1, x2));
179 } 179 }
180 180
181 bool ExclusionRectangle::firstIncludedIntervalLogicalTop(float minLogicalInterva lTop, const FloatSize& minLogicalIntervalSize, float& result) const 181 bool ExclusionRectangle::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIn tervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit& result) const
182 { 182 {
183 float minIntervalTop = minLogicalIntervalTop;
184 float minIntervalHeight = minLogicalIntervalSize.height();
185 float minIntervalWidth = minLogicalIntervalSize.width();
186
183 const FloatRoundedRect& bounds = shapePaddingBounds(); 187 const FloatRoundedRect& bounds = shapePaddingBounds();
184 if (bounds.isEmpty() || minLogicalIntervalSize.width() > bounds.width()) 188 if (bounds.isEmpty() || minIntervalWidth > bounds.width())
185 return false; 189 return false;
186 190
187 float minY = std::max(bounds.y(), minLogicalIntervalTop); 191 float minY = std::max(bounds.y(), minIntervalTop);
188 float maxY = minY + minLogicalIntervalSize.height(); 192 float maxY = minY + minIntervalHeight;
189 193
190 if (maxY > bounds.maxY()) 194 if (maxY > bounds.maxY())
191 return false; 195 return false;
192 196
193 bool intervalOverlapsMinCorner = minY < bounds.y() + bounds.ry(); 197 bool intervalOverlapsMinCorner = minY < bounds.y() + bounds.ry();
194 bool intervalOverlapsMaxCorner = maxY > bounds.maxY() - bounds.ry(); 198 bool intervalOverlapsMaxCorner = maxY > bounds.maxY() - bounds.ry();
195 199
196 if (!intervalOverlapsMinCorner && !intervalOverlapsMaxCorner) { 200 if (!intervalOverlapsMinCorner && !intervalOverlapsMaxCorner) {
197 result = minY; 201 result = minY;
198 return true; 202 return true;
199 } 203 }
200 204
201 float centerY = bounds.y() + bounds.height() / 2; 205 float centerY = bounds.y() + bounds.height() / 2;
202 bool minCornerDefinesX = fabs(centerY - minY) > fabs(centerY - maxY); 206 bool minCornerDefinesX = fabs(centerY - minY) > fabs(centerY - maxY);
203 bool intervalFitsWithinCorners = minLogicalIntervalSize.width() + 2 * bounds .rx() <= bounds.width(); 207 bool intervalFitsWithinCorners = minIntervalWidth + 2 * bounds.rx() <= bound s.width();
204 FloatPoint cornerIntercept = bounds.cornerInterceptForWidth(minLogicalInterv alSize.width()); 208 FloatPoint cornerIntercept = bounds.cornerInterceptForWidth(minIntervalWidth );
205 209
206 if (intervalOverlapsMinCorner && (!intervalOverlapsMaxCorner || minCornerDef inesX)) { 210 if (intervalOverlapsMinCorner && (!intervalOverlapsMaxCorner || minCornerDef inesX)) {
207 if (intervalFitsWithinCorners || bounds.y() + cornerIntercept.y() < minY ) { 211 if (intervalFitsWithinCorners || bounds.y() + cornerIntercept.y() < minY ) {
208 result = minY; 212 result = minY;
209 return true; 213 return true;
210 } 214 }
211 if (minLogicalIntervalSize.height() < bounds.height() - (2 * cornerInter cept.y())) { 215 if (minIntervalHeight < bounds.height() - (2 * cornerIntercept.y())) {
212 result = bounds.y() + cornerIntercept.y(); 216 result = LayoutUnit::fromFloatCeil(bounds.y() + cornerIntercept.y()) ;
213 return true; 217 return true;
214 } 218 }
215 } 219 }
216 220
217 if (intervalOverlapsMaxCorner && (!intervalOverlapsMinCorner || !minCornerDe finesX)) { 221 if (intervalOverlapsMaxCorner && (!intervalOverlapsMinCorner || !minCornerDe finesX)) {
218 if (intervalFitsWithinCorners || minY <= bounds.maxY() - cornerIntercep t.y() - minLogicalIntervalSize.height()) { 222 if (intervalFitsWithinCorners || minY <= bounds.maxY() - cornerIntercep t.y() - minIntervalHeight) {
219 result = minY; 223 result = minY;
220 return true; 224 return true;
221 } 225 }
222 } 226 }
223 227
224 return false; 228 return false;
225 } 229 }
226 230
227 } // namespace WebCore 231 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/exclusions/ExclusionRectangle.h ('k') | Source/core/rendering/exclusions/ExclusionShape.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698