OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2009, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2009, 2011 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007-2008 Torch Mobile Inc. | 3 * Copyright (C) 2007-2008 Torch Mobile Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 ASSERT(index < size()); | 85 ASSERT(index < size()); |
86 return hasVerticalOffsets() ? m_offsets[index * 2] : m_offsets[index]; | 86 return hasVerticalOffsets() ? m_offsets[index * 2] : m_offsets[index]; |
87 } | 87 } |
88 | 88 |
89 float yOffsetAt(unsigned index) const { | 89 float yOffsetAt(unsigned index) const { |
90 ASSERT(index < size()); | 90 ASSERT(index < size()); |
91 ASSERT(hasVerticalOffsets()); | 91 ASSERT(hasVerticalOffsets()); |
92 return m_offsets[index * 2 + 1]; | 92 return m_offsets[index * 2 + 1]; |
93 } | 93 } |
94 | 94 |
95 void add(Glyph glyph, const SimpleFontData* font, float x) { | 95 void add(Glyph glyph, |
| 96 const SimpleFontData* font, |
| 97 float x, |
| 98 unsigned characterIndex = 0) { |
96 // cannot mix x-only/xy offsets | 99 // cannot mix x-only/xy offsets |
97 ASSERT(!hasVerticalOffsets()); | 100 ASSERT(!hasVerticalOffsets()); |
98 | 101 |
99 m_fontData.append(font); | 102 m_fontData.append(font); |
100 m_glyphs.append(glyph); | 103 m_glyphs.append(glyph); |
101 m_offsets.append(x); | 104 m_offsets.append(x); |
| 105 if (m_characterIndexes) |
| 106 m_characterIndexes->append(characterIndex); |
102 } | 107 } |
103 | 108 |
104 void add(Glyph glyph, const SimpleFontData* font, const FloatPoint& offset) { | 109 void add(Glyph glyph, |
| 110 const SimpleFontData* font, |
| 111 const FloatPoint& offset, |
| 112 unsigned characterIndex = 0) { |
105 // cannot mix x-only/xy offsets | 113 // cannot mix x-only/xy offsets |
106 ASSERT(isEmpty() || hasVerticalOffsets()); | 114 ASSERT(isEmpty() || hasVerticalOffsets()); |
107 | 115 |
108 m_fontData.append(font); | 116 m_fontData.append(font); |
109 m_glyphs.append(glyph); | 117 m_glyphs.append(glyph); |
110 m_offsets.append(offset.x()); | 118 m_offsets.append(offset.x()); |
111 m_offsets.append(offset.y()); | 119 m_offsets.append(offset.y()); |
| 120 if (m_characterIndexes) |
| 121 m_characterIndexes->append(characterIndex); |
112 } | 122 } |
113 | 123 |
114 void reverseForSimpleRTL(float afterOffset, float totalWidth) { | 124 void reverseForSimpleRTL(float afterOffset, float totalWidth) { |
115 ASSERT(!hasVerticalOffsets()); | 125 ASSERT(!hasVerticalOffsets()); |
116 | 126 |
117 if (isEmpty()) | 127 if (isEmpty()) |
118 return; | 128 return; |
119 | 129 |
120 m_fontData.reverse(); | 130 m_fontData.reverse(); |
121 m_glyphs.reverse(); | 131 m_glyphs.reverse(); |
(...skipping 12 matching lines...) Expand all Loading... |
134 // yield correctly positioned RTL glyphs without any post-shape | 144 // yield correctly positioned RTL glyphs without any post-shape |
135 // munging). | 145 // munging). |
136 SECURITY_DCHECK(!m_offsets.isEmpty()); | 146 SECURITY_DCHECK(!m_offsets.isEmpty()); |
137 for (unsigned i = 0; i + 1 < m_offsets.size(); ++i) | 147 for (unsigned i = 0; i + 1 < m_offsets.size(); ++i) |
138 m_offsets[i] = totalWidth - m_offsets[i + 1]; | 148 m_offsets[i] = totalWidth - m_offsets[i + 1]; |
139 m_offsets.back() = totalWidth - afterOffset; | 149 m_offsets.back() = totalWidth - afterOffset; |
140 | 150 |
141 m_offsets.reverse(); | 151 m_offsets.reverse(); |
142 } | 152 } |
143 | 153 |
| 154 void saveCharacterIndexes() { |
| 155 m_characterIndexes.reset(new Vector<unsigned, 2048>()); |
| 156 } |
| 157 |
| 158 unsigned characterIndex(unsigned index) const { |
| 159 DCHECK(m_characterIndexes); |
| 160 return (*m_characterIndexes)[index]; |
| 161 } |
| 162 |
144 protected: | 163 protected: |
145 Vector<const SimpleFontData*, 2048> m_fontData; | 164 Vector<const SimpleFontData*, 2048> m_fontData; |
146 Vector<Glyph, 2048> m_glyphs; | 165 Vector<Glyph, 2048> m_glyphs; |
147 | 166 |
148 // Glyph positioning: either x-only offsets, or interleaved x,y offsets | 167 // Glyph positioning: either x-only offsets, or interleaved x,y offsets |
149 // (depending on the buffer-wide positioning mode). This matches the | 168 // (depending on the buffer-wide positioning mode). This matches the |
150 // glyph positioning format used by Skia. | 169 // glyph positioning format used by Skia. |
151 Vector<float, 2048> m_offsets; | 170 Vector<float, 2048> m_offsets; |
| 171 |
| 172 std::unique_ptr<Vector<unsigned, 2048>> m_characterIndexes; |
152 }; | 173 }; |
153 | 174 |
154 } // namespace blink | 175 } // namespace blink |
155 | 176 |
156 #endif | 177 #endif |
OLD | NEW |