StringTruncator.cpp revision ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StringTruncator.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CharacterNames.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextBreakIterator.h" 35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "TextRun.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define STRING_BUFFER_SIZE 2048 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef unsigned TruncationFunction(const String&, unsigned length, unsigned keepCount, UChar* buffer); 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline int textBreakAtOrPreceding(TextBreakIterator* it, int offset) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isTextBreak(it, offset)) 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return offset; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int result = textBreakPreceding(it, offset); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result == TextBreakDone ? 0 : result; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline int boundedTextBreakFollowing(TextBreakIterator* it, int offset, int length) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int result = textBreakFollowing(it, offset); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result == TextBreakDone ? length : result; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic unsigned centerTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer) 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < length); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < STRING_BUFFER_SIZE); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned omitStart = (keepCount + 1) / 2; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TextBreakIterator* it = characterBreakIterator(string.characters(), length); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned omitEnd = boundedTextBreakFollowing(it, omitStart + (length - keepCount) - 1, length); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project omitStart = textBreakAtOrPreceding(it, omitStart); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned truncatedLength = omitStart + 1 + (length - omitEnd); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(truncatedLength <= length); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memcpy(buffer, string.characters(), sizeof(UChar) * omitStart); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project buffer[omitStart] = horizontalEllipsis; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memcpy(&buffer[omitStart + 1], &string.characters()[omitEnd], sizeof(UChar) * (length - omitEnd)); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return truncatedLength; 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic unsigned rightTruncateToBuffer(const String& string, unsigned length, unsigned keepCount, UChar* buffer) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < length); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < STRING_BUFFER_SIZE); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TextBreakIterator* it = characterBreakIterator(string.characters(), length); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepLength = textBreakAtOrPreceding(it, keepCount); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned truncatedLength = keepLength + 1; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memcpy(buffer, string.characters(), sizeof(UChar) * keepLength); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project buffer[keepLength] = horizontalEllipsis; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return truncatedLength; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic float stringWidth(const Font& renderer, const UChar* characters, unsigned length, bool disableRoundingHacks) 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TextRun run(characters, length); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (disableRoundingHacks) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project run.disableRoundingHacks(); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return renderer.floatWidth(run); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic String truncateString(const String& string, float maxWidth, const Font& font, TruncationFunction truncateToBuffer, bool disableRoundingHacks) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string.isEmpty()) 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return string; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(maxWidth >= 0); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float currentEllipsisWidth = stringWidth(font, &horizontalEllipsis, 1, disableRoundingHacks); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UChar stringBuffer[STRING_BUFFER_SIZE]; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned truncatedLength; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCount; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned length = string.length(); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (length > STRING_BUFFER_SIZE) { 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = STRING_BUFFER_SIZE - 1; // need 1 character for the ellipsis 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = centerTruncateToBuffer(string, length, keepCount, stringBuffer); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = length; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memcpy(stringBuffer, string.characters(), sizeof(UChar) * length); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = length; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float width = stringWidth(font, stringBuffer, truncatedLength, disableRoundingHacks); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width <= maxWidth) 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return string; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCountForLargestKnownToFit = 0; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float widthForLargestKnownToFit = currentEllipsisWidth; 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCountForSmallestKnownToNotFit = keepCount; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float widthForSmallestKnownToNotFit = width; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currentEllipsisWidth >= maxWidth) { 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = 1; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForSmallestKnownToNotFit = 2; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (keepCountForLargestKnownToFit + 1 < keepCountForSmallestKnownToNotFit) { 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(widthForLargestKnownToFit <= maxWidth); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(widthForSmallestKnownToNotFit > maxWidth); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float ratio = (keepCountForSmallestKnownToNotFit - keepCountForLargestKnownToFit) 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project / (widthForSmallestKnownToNotFit - widthForLargestKnownToFit); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = static_cast<unsigned>(maxWidth * ratio); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCount <= keepCountForLargestKnownToFit) { 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForLargestKnownToFit + 1; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (keepCount >= keepCountForSmallestKnownToNotFit) { 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForSmallestKnownToNotFit - 1; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < length); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount > 0); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < keepCountForSmallestKnownToNotFit); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount > keepCountForLargestKnownToFit); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = truncateToBuffer(string, length, keepCount, stringBuffer); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project width = stringWidth(font, stringBuffer, truncatedLength, disableRoundingHacks); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width <= maxWidth) { 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = keepCount; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project widthForLargestKnownToFit = width; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForSmallestKnownToNotFit = keepCount; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project widthForSmallestKnownToNotFit = width; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCountForLargestKnownToFit == 0) { 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = 1; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCount != keepCountForLargestKnownToFit) { 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForLargestKnownToFit; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = truncateToBuffer(string, length, keepCount, stringBuffer); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(stringBuffer, truncatedLength); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString StringTruncator::centerTruncate(const String& string, float maxWidth, const Font& font, bool disableRoundingHacks) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return truncateString(string, maxWidth, font, centerTruncateToBuffer, disableRoundingHacks); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString StringTruncator::rightTruncate(const String& string, float maxWidth, const Font& font, bool disableRoundingHacks) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return truncateString(string, maxWidth, font, rightTruncateToBuffer, disableRoundingHacks); 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat StringTruncator::width(const String& string, const Font& font, bool disableRoundingHacks) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return stringWidth(font, string.characters(), string.length(), disableRoundingHacks); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 200