summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/VerticalTextMap.cpp
diff options
context:
space:
mode:
authorclaireho <chinglanho@gmail.com>2011-10-11 13:28:10 -0700
committerclaireho <chinglanho@gmail.com>2011-10-11 17:17:36 -0700
commitd7a8fefd0e472b1a70e651ae5b43b94e9a4bd976 (patch)
tree5925a21c3148dc01da87d36c7e6df92004cc68ad /Source/WebCore/platform/graphics/android/VerticalTextMap.cpp
parent6453761f63c04897066bb40bf7d9e0c8daac1a98 (diff)
downloadexternal_webkit-d7a8fefd0e472b1a70e651ae5b43b94e9a4bd976.zip
external_webkit-d7a8fefd0e472b1a70e651ae5b43b94e9a4bd976.tar.gz
external_webkit-d7a8fefd0e472b1a70e651ae5b43b94e9a4bd976.tar.bz2
Fallback handle if vertical glyphs are missing.
Bug 5094208 : browser VerticalWritingMode support. Some punctuation has to change its glyph in vertical writing mode. For example, dash in vertical text is a vertical bar. In current Android system fonts and fallback fonts, none of them have the substitute tables for vertical writing mode. We call a conversion function that converts the punctuation to the Unicode Vertical Form (0xFE10 - 0xFE19) or to the closest glyphs as alternative when vertical substitute tables are absent in fonts. Otherwise, we use Harfbuzz to do the vertical glyph shapping. Change-Id: If1d31bb72aaaba45ed50bbb75d6246cfa30e3428
Diffstat (limited to 'Source/WebCore/platform/graphics/android/VerticalTextMap.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/VerticalTextMap.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/VerticalTextMap.cpp b/Source/WebCore/platform/graphics/android/VerticalTextMap.cpp
new file mode 100644
index 0000000..2bb008f
--- /dev/null
+++ b/Source/WebCore/platform/graphics/android/VerticalTextMap.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2011, The Android Open Source Project
+ *
+ * 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.
+ *
+ * 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 "VerticalTextMap.h"
+
+#include <wtf/Forward.h>
+#include <wtf/MessageQueue.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+static const UChar vTextCnvTable[][2] = {
+ // TODO: uncomment mappings once we add glyphs for vertical forms.
+ // {0x0021, 0xfe15}, // exclamation mark
+ {0x0028, 0xfe35}, // left paren
+ {0x0029, 0xfe36}, // right paren
+ // {0x002c, 0xfe10}, // comma
+ {0x003a, 0xfe30}, // colon
+ {0x003b, 0x007c}, // hyphen
+ // {0x003f, 0xfe16}, // question mark
+ // {0x005b, 0xfe14}, // semicolon
+ {0x005d, 0xfe47}, // left square bracket
+ {0x005f, 0xfe48}, // right square bracket
+ {0x007b, 0xfe37}, // left curly bracket
+ {0x007d, 0xfe38}, // right curly bracket
+ {0x007e, 0x007c}, // tilde to vertical line
+ {0x2013, 0xfe32}, // en dash
+ {0x2014, 0xfe31}, // em dash
+ {0x2015, 0xfe31}, // horizontal bar
+ {0x2025, 0xfe30}, // two dot leader
+ // TODO: change the mapping 0x2026 -> 0xFE19 once Android has the glyph for 0xFE19.
+ {0x2026, 0xfe30}, // three dot leader
+ // {0x3001, 0xfe11}, // Ideographic comma
+ // {0x3002, 0xfe12}, // Ideographic full stop
+ {0x3008, 0xfe3f}, // left angle bracket
+ {0x3009, 0xfe40}, // right angle bracket
+ {0x300a, 0xfe3d}, // left double angle bracket
+ {0x300b, 0xfe3e}, // right double angle bracket
+ {0x300c, 0xfe41}, // left corner bracket
+ {0x300d, 0xfe42}, // right corner bracket
+ {0x300e, 0xfe43}, // left white corner bracket
+ {0x300f, 0xfe44}, // right white corner bracket
+ {0x3010, 0xfe3b}, // left black lenticular bracket
+ {0x3011, 0xfe3c}, // right black lenticular bracket
+ {0x3014, 0xfe39}, // left black lenticular bracket
+ {0x3015, 0xfe3a}, // right tortise shell bracket
+ // {0x3016, 0xfe17}, // left white lenticular bracket
+ // {0x3017, 0xfe18}, // right white lenticular bracket
+ // {0x3019, 0xfe19}, // horizontal ellipses
+ {0x30fc, 0x3021}, // prolonged sound
+ {0xfe4f, 0xfe34}, // wavy low line
+ {0xff08, 0xfe35}, // full width left paren
+ {0xff09, 0xfe36}, // full width right paren
+ {0xff3b, 0xfe47}, // full width left square bracket
+ {0xff3d, 0xfe48}, // full width right square bracket
+ {0xff5b, 0xfe37}, // full width left curly bracket
+ {0xff5d, 0xfe38}, // full width right curly bracket
+ // {0xff64, 0xfe11}, // halfwidth ideo comma
+ // {0xff61, 0xfe12}, // halfwidth ideo full stop
+};
+
+using namespace android;
+
+namespace WebCore {
+
+static WTF::Mutex m_verticalTextHashMapMutex;
+static HashMap<UChar, UChar>* verticalTextHashMap = 0;
+
+UChar VerticalTextMap::getVerticalForm(UChar c) {
+ {
+ MutexLocker lock(m_verticalTextHashMapMutex);
+ if (!verticalTextHashMap) {
+ // Lazy initialization.
+ verticalTextHashMap = new HashMap<UChar, UChar>;
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(vTextCnvTable); ++i)
+ verticalTextHashMap->set(vTextCnvTable[i][0], vTextCnvTable[i][1]);
+ }
+ }
+ return verticalTextHashMap->get(c);
+}
+
+}