106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/*
206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Apple Inc. All rights reserved.
306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met:
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer.
906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    documentation and/or other materials provided with the distribution.
1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE POSSIBILITY OF SUCH DAMAGE.
2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "config.h"
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "Hyphenation.h"
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "AtomicStringKeyedMRUCache.h"
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "TextBreakIteratorInternalICU.h"
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/ListHashSet.h>
3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/RetainPtr.h>
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
3606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace WebCore {
3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(WIN) || (defined(MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7)
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochtemplate<>
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochRetainPtr<CFLocaleRef> AtomicStringKeyedMRUCache<RetainPtr<CFLocaleRef> >::createValueForNullKey()
4206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RetainPtr<CFLocaleRef> locale(AdoptCF, CFLocaleCopyCurrent());
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return CFStringIsHyphenationAvailableForLocale(locale.get()) ? locale : 0;
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochtemplate<>
49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochRetainPtr<CFLocaleRef> AtomicStringKeyedMRUCache<RetainPtr<CFLocaleRef> >::createValueForKey(const AtomicString& localeIdentifier)
50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    RetainPtr<CFStringRef> cfLocaleIdentifier(AdoptCF, localeIdentifier.createCFString());
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    RetainPtr<CFLocaleRef> locale(AdoptCF, CFLocaleCreate(kCFAllocatorDefault, cfLocaleIdentifier.get()));
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return CFStringIsHyphenationAvailableForLocale(locale.get()) ? locale : 0;
55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic AtomicStringKeyedMRUCache<RetainPtr<CFLocaleRef> >& cfLocaleCache()
58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_STATIC_LOCAL(AtomicStringKeyedMRUCache<RetainPtr<CFLocaleRef> >, cache, ());
60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return cache;
61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool canHyphenate(const AtomicString& localeIdentifier)
64dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return cfLocaleCache().get(localeIdentifier);
66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochsize_t lastHyphenLocation(const UChar* characters, size_t length, size_t beforeIndex, const AtomicString& localeIdentifier)
6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    RetainPtr<CFStringRef> string(AdoptCF, CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, reinterpret_cast<const UniChar*>(characters), length, kCFAllocatorNull));
7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RetainPtr<CFLocaleRef> locale = cfLocaleCache().get(localeIdentifier);
73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT(locale);
7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
75dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    CFIndex result = CFStringGetHyphenationLocationBeforeIndex(string.get(), beforeIndex, CFRangeMake(0, length), 0, locale.get(), 0);
7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return result == kCFNotFound ? 0 : result;
7706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
7806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool canHyphenate(const AtomicString&)
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochsize_t lastHyphenLocation(const UChar*, size_t, size_t, const AtomicString&)
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ASSERT_NOT_REACHED();
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return 0;
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // PLATFORM(WIN) && (!defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7)
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
9406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} // namespace WebCore
9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif // !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
97