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