summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/text
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/text')
-rw-r--r--WebCore/platform/text/CharacterNames.h1
-rw-r--r--WebCore/platform/text/SegmentedString.h27
-rw-r--r--WebCore/platform/text/transcoder/FontTranscoder.cpp105
-rw-r--r--WebCore/platform/text/transcoder/FontTranscoder.h66
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