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 "Font.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextBreakIterator.h" 34ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "TextRun.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/unicode/CharacterNames.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 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic float stringWidth(const Font& renderer, const UChar* characters, unsigned length) 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TextRun run(characters, length); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return renderer.width(run); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic String truncateString(const String& string, float maxWidth, const Font& font, TruncationFunction truncateToBuffer) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string.isEmpty()) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return string; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(maxWidth >= 0); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch float currentEllipsisWidth = stringWidth(font, &horizontalEllipsis, 1); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UChar stringBuffer[STRING_BUFFER_SIZE]; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned truncatedLength; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCount; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned length = string.length(); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (length > STRING_BUFFER_SIZE) { 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = STRING_BUFFER_SIZE - 1; // need 1 character for the ellipsis 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = centerTruncateToBuffer(string, length, keepCount, stringBuffer); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = length; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memcpy(stringBuffer, string.characters(), sizeof(UChar) * length); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = length; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch float width = stringWidth(font, stringBuffer, truncatedLength); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width <= maxWidth) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return string; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCountForLargestKnownToFit = 0; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float widthForLargestKnownToFit = currentEllipsisWidth; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned keepCountForSmallestKnownToNotFit = keepCount; 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float widthForSmallestKnownToNotFit = width; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currentEllipsisWidth >= maxWidth) { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = 1; 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForSmallestKnownToNotFit = 2; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (keepCountForLargestKnownToFit + 1 < keepCountForSmallestKnownToNotFit) { 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(widthForLargestKnownToFit <= maxWidth); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(widthForSmallestKnownToNotFit > maxWidth); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float ratio = (keepCountForSmallestKnownToNotFit - keepCountForLargestKnownToFit) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project / (widthForSmallestKnownToNotFit - widthForLargestKnownToFit); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = static_cast<unsigned>(maxWidth * ratio); 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCount <= keepCountForLargestKnownToFit) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForLargestKnownToFit + 1; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (keepCount >= keepCountForSmallestKnownToNotFit) { 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForSmallestKnownToNotFit - 1; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < length); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount > 0); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount < keepCountForSmallestKnownToNotFit); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(keepCount > keepCountForLargestKnownToFit); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = truncateToBuffer(string, length, keepCount, stringBuffer); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch width = stringWidth(font, stringBuffer, truncatedLength); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (width <= maxWidth) { 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = keepCount; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project widthForLargestKnownToFit = width; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForSmallestKnownToNotFit = keepCount; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project widthForSmallestKnownToNotFit = width; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCountForLargestKnownToFit == 0) { 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCountForLargestKnownToFit = 1; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keepCount != keepCountForLargestKnownToFit) { 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keepCount = keepCountForLargestKnownToFit; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project truncatedLength = truncateToBuffer(string, length, keepCount, stringBuffer); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(stringBuffer, truncatedLength); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochString StringTruncator::centerTruncate(const String& string, float maxWidth, const Font& font) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return truncateString(string, maxWidth, font, centerTruncateToBuffer); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochString StringTruncator::rightTruncate(const String& string, float maxWidth, const Font& font) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return truncateString(string, maxWidth, font, rightTruncateToBuffer); 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochfloat StringTruncator::width(const String& string, const Font& font) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return stringWidth(font, string.characters(), string.length()); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 198