diff options
Diffstat (limited to 'WebCore/platform/text')
-rw-r--r-- | WebCore/platform/text/CharacterNames.h | 1 | ||||
-rw-r--r-- | WebCore/platform/text/SegmentedString.h | 27 | ||||
-rw-r--r-- | WebCore/platform/text/transcoder/FontTranscoder.cpp | 105 | ||||
-rw-r--r-- | WebCore/platform/text/transcoder/FontTranscoder.h | 66 |
4 files changed, 198 insertions, 1 deletions
diff --git a/WebCore/platform/text/CharacterNames.h b/WebCore/platform/text/CharacterNames.h index f97ba96..687bfb4 100644 --- a/WebCore/platform/text/CharacterNames.h +++ b/WebCore/platform/text/CharacterNames.h @@ -64,6 +64,7 @@ const UChar rightToLeftOverride = 0x202E; const UChar softHyphen = 0x00AD; const UChar space = 0x0020; const UChar whiteBullet = 0x25E6; +const UChar yenSign = 0x00A5; const UChar zeroWidthJoiner = 0x200D; const UChar zeroWidthNonJoiner = 0x200C; const UChar zeroWidthSpace = 0x200B; diff --git a/WebCore/platform/text/SegmentedString.h b/WebCore/platform/text/SegmentedString.h index 79ed1f0..c5daaaa 100644 --- a/WebCore/platform/text/SegmentedString.h +++ b/WebCore/platform/text/SegmentedString.h @@ -103,6 +103,25 @@ public: bool isEmpty() const { return !current(); } unsigned length() const; + enum LookAheadResult { + DidNotMatch, + DidMatch, + NotEnoughCharacters, + }; + + // WARNING: This method is currently used only by the HTML5 parser and is incomplete. + LookAheadResult lookAhead(const String& string) + { + if (!m_pushedChar1 && string.length() <= (unsigned) m_currentString.m_length) { + if (memcmp(string.characters(), m_currentString.m_current, string.length() * sizeof(UChar))) + return DidNotMatch; + return DidMatch; + } + // We haven't implemented the slow case yet. + ASSERT_NOT_REACHED(); + return DidNotMatch; + } + void advance() { if (!m_pushedChar1 && m_currentString.m_length > 1) { @@ -112,7 +131,13 @@ public: } advanceSlowCase(); } - + + void advanceAndASSERT(UChar expectedCharacter) + { + ASSERT_UNUSED(expectedCharacter, *current() == expectedCharacter); + advance(); + } + void advancePastNewline(int& lineNumber) { ASSERT(*current() == '\n'); diff --git a/WebCore/platform/text/transcoder/FontTranscoder.cpp b/WebCore/platform/text/transcoder/FontTranscoder.cpp new file mode 100644 index 0000000..12678e8 --- /dev/null +++ b/WebCore/platform/text/transcoder/FontTranscoder.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2010, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "FontTranscoder.h" + +#include "CharacterNames.h" +#include "TextEncoding.h" + +namespace WebCore { + +FontTranscoder::FontTranscoder() +{ + m_converterTypes.add("MS PGothic", BackslashToYenSign); + UChar unicodeNameMSPGothic[] = {0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF}; + m_converterTypes.add(AtomicString(unicodeNameMSPGothic, sizeof(unicodeNameMSPGothic) / sizeof(UChar)), BackslashToYenSign); + + m_converterTypes.add("MS PMincho", BackslashToYenSign); + UChar unicodeNameMSPMincho[] = {0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x660E, 0x671D}; + m_converterTypes.add(AtomicString(unicodeNameMSPMincho, sizeof(unicodeNameMSPMincho) / sizeof(UChar)), BackslashToYenSign); + + m_converterTypes.add("MS Gothic", BackslashToYenSign); + UChar unicodeNameMSGothic[] = {0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF}; + m_converterTypes.add(AtomicString(unicodeNameMSGothic, sizeof(unicodeNameMSGothic) / sizeof(UChar)), BackslashToYenSign); + + m_converterTypes.add("MS Mincho", BackslashToYenSign); + UChar unicodeNameMSMincho[] = {0xFF2D, 0xFF33, 0x0020, 0x660E, 0x671D}; + m_converterTypes.add(AtomicString(unicodeNameMSMincho, sizeof(unicodeNameMSMincho) / sizeof(UChar)), BackslashToYenSign); + + m_converterTypes.add("Meiryo", BackslashToYenSign); + UChar unicodeNameMeiryo[] = {0x30E1, 0x30A4, 0x30EA, 0x30AA}; + m_converterTypes.add(AtomicString(unicodeNameMeiryo, sizeof(unicodeNameMeiryo) / sizeof(UChar)), BackslashToYenSign); +} + +FontTranscoder::ConverterType FontTranscoder::converterType(const AtomicString& fontFamily, const TextEncoding* encoding) const +{ + if (!fontFamily.isNull()) { + HashMap<AtomicString, ConverterType>::const_iterator found = m_converterTypes.find(fontFamily); + if (found != m_converterTypes.end()) + return found->second; + } + + // IE's default fonts for Japanese encodings change backslashes into yen signs. + // FIXME: We don't need transcoding when the document explicitly + // specifies a font which doesn't change backslashes into yen signs. + if (encoding && encoding->backslashAsCurrencySymbol() != '\\') + return BackslashToYenSign; + + return NoConversion; +} + +void FontTranscoder::convert(String& text, const AtomicString& fontFamily, const TextEncoding* encoding) const +{ + switch (converterType(fontFamily, encoding)) { + case BackslashToYenSign: { + // FIXME: TextEncoding.h has similar code. We need to factor them out. + text.replace('\\', yenSign); + break; + } + case NoConversion: + default: + ASSERT_NOT_REACHED(); + } +} + +bool FontTranscoder::needsTranscoding(const AtomicString& fontFamily, const TextEncoding* encoding) const +{ + ConverterType type = converterType(fontFamily, encoding); + return type != NoConversion; +} + +FontTranscoder& fontTranscoder() +{ + static FontTranscoder* transcoder = new FontTranscoder; + return *transcoder; +} + +} // namespace WebCore diff --git a/WebCore/platform/text/transcoder/FontTranscoder.h b/WebCore/platform/text/transcoder/FontTranscoder.h new file mode 100644 index 0000000..f013453 --- /dev/null +++ b/WebCore/platform/text/transcoder/FontTranscoder.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FontTranscoder_h +#define FontTranscoder_h + +#include "AtomicStringHash.h" +#include <wtf/HashMap.h> +#include <wtf/Noncopyable.h> + +namespace WebCore { + +class TextEncoding; + +class FontTranscoder : public Noncopyable { +public: + void convert(String& text, const AtomicString& fontFamily, const TextEncoding* = 0) const; + bool needsTranscoding(const AtomicString& fontFamily, const TextEncoding* = 0) const; + +private: + FontTranscoder(); + ~FontTranscoder(); // Not implemented to make sure nobody accidentally calls delete -- WebCore does not delete singletons. + + enum ConverterType { + NoConversion, BackslashToYenSign, + }; + + ConverterType converterType(const AtomicString& fontFamily, const TextEncoding*) const; + + HashMap<AtomicString, ConverterType> m_converterTypes; + + friend FontTranscoder& fontTranscoder(); +}; + +FontTranscoder& fontTranscoder(); + +} // namespace WebCore + +#endif // FontTranscoder_h |