OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 setLineBreakInfo(0, 0, BidiStatus()); | 214 setLineBreakInfo(0, 0, BidiStatus()); |
215 | 215 |
216 for (RootInlineBox* prev = prevRootBox(); | 216 for (RootInlineBox* prev = prevRootBox(); |
217 prev && prev->lineBreakObj() == box->getLineLayoutItem(); | 217 prev && prev->lineBreakObj() == box->getLineLayoutItem(); |
218 prev = prev->prevRootBox()) { | 218 prev = prev->prevRootBox()) { |
219 prev->setLineBreakInfo(0, 0, BidiStatus()); | 219 prev->setLineBreakInfo(0, 0, BidiStatus()); |
220 prev->markDirty(); | 220 prev->markDirty(); |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 static inline void snapHeight(int& maxAscent, | 224 static inline void applyLineHeightStep(uint8_t lineHeightStep, |
225 int& maxDescent, | 225 int& maxAscent, |
226 const ComputedStyle& style) { | 226 int& maxDescent) { |
227 // If position is 0, add spaces to over/under equally. | 227 // Round up to the multiple of units, by adding spaces to over/under equally. |
228 // https://drafts.csswg.org/css-snap-size/#snap-height | 228 // https://drafts.csswg.org/css-rhythm/#line-height-step |
229 int unit = style.snapHeightUnit(); | 229 int remainder = (maxAscent + maxDescent) % lineHeightStep; |
230 ASSERT(unit); | 230 if (!remainder) |
231 int position = style.snapHeightPosition(); | |
232 if (!position) { | |
233 int space = unit - ((maxAscent + maxDescent) % unit); | |
234 maxDescent += space / 2; | |
235 maxAscent += space - space / 2; | |
236 return; | 231 return; |
237 } | 232 DCHECK_GT(remainder, 0); |
238 | 233 int space = lineHeightStep - remainder; |
239 // Match the baseline to the specified position. | 234 maxDescent += space / 2; |
240 // https://drafts.csswg.org/css-snap-size/#snap-baseline | 235 maxAscent += space - space / 2; |
241 ASSERT(position > 0 && position <= 100); | |
242 position = position * unit / 100; | |
243 int spaceOver = position - maxAscent % unit; | |
244 if (spaceOver < 0) { | |
245 spaceOver += unit; | |
246 ASSERT(spaceOver >= 0); | |
247 } | |
248 maxAscent += spaceOver; | |
249 maxDescent += unit - (maxAscent + maxDescent) % unit; | |
250 } | 236 } |
251 | 237 |
252 LayoutUnit RootInlineBox::alignBoxesInBlockDirection( | 238 LayoutUnit RootInlineBox::alignBoxesInBlockDirection( |
253 LayoutUnit heightOfBlock, | 239 LayoutUnit heightOfBlock, |
254 GlyphOverflowAndFallbackFontsMap& textBoxDataMap, | 240 GlyphOverflowAndFallbackFontsMap& textBoxDataMap, |
255 VerticalPositionCache& verticalPositionCache) { | 241 VerticalPositionCache& verticalPositionCache) { |
256 // SVG will handle vertical alignment on its own. | 242 // SVG will handle vertical alignment on its own. |
257 if (isSVGRootInlineBox()) | 243 if (isSVGRootInlineBox()) |
258 return LayoutUnit(); | 244 return LayoutUnit(); |
259 | 245 |
(...skipping 11 matching lines...) Expand all Loading... |
271 | 257 |
272 computeLogicalBoxHeights(this, maxPositionTop, maxPositionBottom, maxAscent, | 258 computeLogicalBoxHeights(this, maxPositionTop, maxPositionBottom, maxAscent, |
273 maxDescent, setMaxAscent, setMaxDescent, | 259 maxDescent, setMaxAscent, setMaxDescent, |
274 noQuirksMode, textBoxDataMap, baselineType(), | 260 noQuirksMode, textBoxDataMap, baselineType(), |
275 verticalPositionCache); | 261 verticalPositionCache); |
276 | 262 |
277 if (maxAscent + maxDescent < std::max(maxPositionTop, maxPositionBottom)) | 263 if (maxAscent + maxDescent < std::max(maxPositionTop, maxPositionBottom)) |
278 adjustMaxAscentAndDescent(maxAscent, maxDescent, maxPositionTop.toInt(), | 264 adjustMaxAscentAndDescent(maxAscent, maxDescent, maxPositionTop.toInt(), |
279 maxPositionBottom.toInt()); | 265 maxPositionBottom.toInt()); |
280 | 266 |
281 if (getLineLayoutItem().styleRef().snapHeightUnit()) | 267 if (uint8_t lineHeightStep = getLineLayoutItem().styleRef().lineHeightStep()) |
282 snapHeight(maxAscent, maxDescent, getLineLayoutItem().styleRef()); | 268 applyLineHeightStep(lineHeightStep, maxAscent, maxDescent); |
283 | 269 |
284 LayoutUnit maxHeight = LayoutUnit(maxAscent + maxDescent); | 270 LayoutUnit maxHeight = LayoutUnit(maxAscent + maxDescent); |
285 LayoutUnit lineTop = heightOfBlock; | 271 LayoutUnit lineTop = heightOfBlock; |
286 LayoutUnit lineBottom = heightOfBlock; | 272 LayoutUnit lineBottom = heightOfBlock; |
287 LayoutUnit lineTopIncludingMargins = heightOfBlock; | 273 LayoutUnit lineTopIncludingMargins = heightOfBlock; |
288 LayoutUnit lineBottomIncludingMargins = heightOfBlock; | 274 LayoutUnit lineBottomIncludingMargins = heightOfBlock; |
289 LayoutUnit selectionBottom = heightOfBlock; | 275 LayoutUnit selectionBottom = heightOfBlock; |
290 bool setLineTop = false; | 276 bool setLineTop = false; |
291 bool hasAnnotationsBefore = false; | 277 bool hasAnnotationsBefore = false; |
292 bool hasAnnotationsAfter = false; | 278 bool hasAnnotationsAfter = false; |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 } | 774 } |
789 endBox = nullptr; | 775 endBox = nullptr; |
790 return nullptr; | 776 return nullptr; |
791 } | 777 } |
792 | 778 |
793 const char* RootInlineBox::boxName() const { | 779 const char* RootInlineBox::boxName() const { |
794 return "RootInlineBox"; | 780 return "RootInlineBox"; |
795 } | 781 } |
796 | 782 |
797 } // namespace blink | 783 } // namespace blink |
OLD | NEW |