OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * (C) 2000 Dirk Mueller (mueller@kde.org) |
4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 } | 1060 } |
1061 result.setWidth(rightSide - leftSide); | 1061 result.setWidth(rightSide - leftSide); |
1062 result.setX(leftSide); | 1062 result.setX(leftSide); |
1063 result.setHeight(lastTextBox()->yPos() + lastTextBox()->height() - first
TextBox()->yPos()); | 1063 result.setHeight(lastTextBox()->yPos() + lastTextBox()->height() - first
TextBox()->yPos()); |
1064 result.setY(firstTextBox()->yPos()); | 1064 result.setY(firstTextBox()->yPos()); |
1065 } | 1065 } |
1066 | 1066 |
1067 return result; | 1067 return result; |
1068 } | 1068 } |
1069 | 1069 |
1070 IntRect RenderText::clippedOverflowRectForRepaint(RenderBox* repaintContainer) | 1070 IntRect RenderText::clippedOverflowRectForRepaint(RenderBoxModelObject* repaintC
ontainer) |
1071 { | 1071 { |
1072 RenderObject* cb = containingBlock(); | 1072 RenderObject* cb = containingBlock(); |
1073 return cb->clippedOverflowRectForRepaint(repaintContainer); | 1073 return cb->clippedOverflowRectForRepaint(repaintContainer); |
1074 } | 1074 } |
1075 | 1075 |
1076 IntRect RenderText::selectionRectForRepaint(RenderBox* repaintContainer, bool cl
ipToVisibleContent) | 1076 IntRect RenderText::selectionRectForRepaint(RenderBoxModelObject* repaintContain
er, bool clipToVisibleContent) |
1077 { | 1077 { |
1078 ASSERT(!needsLayout()); | 1078 ASSERT(!needsLayout()); |
1079 | 1079 |
1080 if (selectionState() == SelectionNone) | 1080 if (selectionState() == SelectionNone) |
1081 return IntRect(); | 1081 return IntRect(); |
1082 RenderBlock* cb = containingBlock(); | 1082 RenderBlock* cb = containingBlock(); |
1083 if (!cb) | 1083 if (!cb) |
1084 return IntRect(); | 1084 return IntRect(); |
1085 | 1085 |
1086 // Now calculate startPos and endPos for painting selection. | 1086 // Now calculate startPos and endPos for painting selection. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1161 if (!iterator) | 1161 if (!iterator) |
1162 return current - 1; | 1162 return current - 1; |
1163 | 1163 |
1164 long result = textBreakPreceding(iterator, current); | 1164 long result = textBreakPreceding(iterator, current); |
1165 if (result == TextBreakDone) | 1165 if (result == TextBreakDone) |
1166 result = current - 1; | 1166 result = current - 1; |
1167 | 1167 |
1168 return result; | 1168 return result; |
1169 } | 1169 } |
1170 | 1170 |
| 1171 #define HANGUL_CHOSEONG_START (0x1100) |
| 1172 #define HANGUL_CHOSEONG_END (0x115F) |
| 1173 #define HANGUL_JUNGSEONG_START (0x1160) |
| 1174 #define HANGUL_JUNGSEONG_END (0x11A2) |
| 1175 #define HANGUL_JONGSEONG_START (0x11A8) |
| 1176 #define HANGUL_JONGSEONG_END (0x11F9) |
| 1177 #define HANGUL_SYLLABLE_START (0xAC00) |
| 1178 #define HANGUL_SYLLABLE_END (0xD7AF) |
| 1179 #define HANGUL_JONGSEONG_COUNT (28) |
| 1180 |
| 1181 enum HangulState { |
| 1182 HangulStateL, |
| 1183 HangulStateV, |
| 1184 HangulStateT, |
| 1185 HangulStateLV, |
| 1186 HangulStateLVT, |
| 1187 HangulStateBreak |
| 1188 }; |
| 1189 |
| 1190 inline bool isHangulLVT(UChar32 character) |
| 1191 { |
| 1192 return (character - HANGUL_SYLLABLE_START) % HANGUL_JONGSEONG_COUNT; |
| 1193 } |
| 1194 |
| 1195 int RenderText::previousOffsetForBackwardDeletion(int current) const |
| 1196 { |
| 1197 #if PLATFORM(MAC) |
| 1198 UChar32 character; |
| 1199 while (current > 0) { |
| 1200 if (U16_IS_TRAIL((*m_text)[--current])) |
| 1201 --current; |
| 1202 if (current < 0) |
| 1203 break; |
| 1204 |
| 1205 UChar32 character = m_text->characterStartingAt(current); |
| 1206 |
| 1207 // We don't combine characters in Armenian ... Limbu range for backward
deletion. |
| 1208 if ((character >= 0x0530) && (character < 0x1950)) |
| 1209 break; |
| 1210 |
| 1211 if (u_isbase(character) && (character != 0xFF9E) && (character != 0xFF9F
)) |
| 1212 break; |
| 1213 } |
| 1214 |
| 1215 if (current <= 0) |
| 1216 return current; |
| 1217 |
| 1218 // Hangul |
| 1219 character = m_text->characterStartingAt(current); |
| 1220 if (((character >= HANGUL_CHOSEONG_START) && (character <= HANGUL_JONGSEONG_
END)) || ((character >= HANGUL_SYLLABLE_START) && (character <= HANGUL_SYLLABLE_
END))) { |
| 1221 HangulState state; |
| 1222 HangulState initialState; |
| 1223 |
| 1224 if (character < HANGUL_JUNGSEONG_START) |
| 1225 state = HangulStateL; |
| 1226 else if (character < HANGUL_JONGSEONG_START) |
| 1227 state = HangulStateV; |
| 1228 else if (character < HANGUL_SYLLABLE_START) |
| 1229 state = HangulStateT; |
| 1230 else |
| 1231 state = isHangulLVT(character) ? HangulStateLVT : HangulStateLV; |
| 1232 |
| 1233 initialState = state; |
| 1234 |
| 1235 while (current > 0 && ((character = m_text->characterStartingAt(current
- 1)) >= HANGUL_CHOSEONG_START) && (character <= HANGUL_SYLLABLE_END) && ((chara
cter <= HANGUL_JONGSEONG_END) || (character >= HANGUL_SYLLABLE_START))) { |
| 1236 switch (state) { |
| 1237 case HangulStateV: |
| 1238 if (character <= HANGUL_CHOSEONG_END) |
| 1239 state = HangulStateL; |
| 1240 else if ((character >= HANGUL_SYLLABLE_START) && (character <= H
ANGUL_SYLLABLE_END) && !isHangulLVT(character)) |
| 1241 state = HangulStateLV; |
| 1242 else if (character > HANGUL_JUNGSEONG_END) |
| 1243 state = HangulStateBreak; |
| 1244 break; |
| 1245 case HangulStateT: |
| 1246 if ((character >= HANGUL_JUNGSEONG_START) && (character <= HANGU
L_JUNGSEONG_END)) |
| 1247 state = HangulStateV; |
| 1248 else if ((character >= HANGUL_SYLLABLE_START) && (character <= H
ANGUL_SYLLABLE_END)) |
| 1249 state = (isHangulLVT(character) ? HangulStateLVT : HangulSta
teLV); |
| 1250 else if (character < HANGUL_JUNGSEONG_START) |
| 1251 state = HangulStateBreak; |
| 1252 break; |
| 1253 default: |
| 1254 state = (character < HANGUL_JUNGSEONG_START) ? HangulStateL : Ha
ngulStateBreak; |
| 1255 break; |
| 1256 } |
| 1257 if (state == HangulStateBreak) |
| 1258 break; |
| 1259 |
| 1260 --current; |
| 1261 } |
| 1262 } |
| 1263 |
| 1264 return current; |
| 1265 #else |
| 1266 // Platforms other than Mac delete by one code point. |
| 1267 return current - 1; |
| 1268 #endif |
| 1269 } |
| 1270 |
1171 int RenderText::nextOffset(int current) const | 1271 int RenderText::nextOffset(int current) const |
1172 { | 1272 { |
1173 StringImpl* si = m_text.get(); | 1273 StringImpl* si = m_text.get(); |
1174 TextBreakIterator* iterator = characterBreakIterator(si->characters(), si->l
ength()); | 1274 TextBreakIterator* iterator = characterBreakIterator(si->characters(), si->l
ength()); |
1175 if (!iterator) | 1275 if (!iterator) |
1176 return current + 1; | 1276 return current + 1; |
1177 | 1277 |
1178 long result = textBreakFollowing(iterator, current); | 1278 long result = textBreakFollowing(iterator, current); |
1179 if (result == TextBreakDone) | 1279 if (result == TextBreakDone) |
1180 result = current + 1; | 1280 result = current + 1; |
(...skipping 12 matching lines...) Expand all Loading... |
1193 ASSERT(child->prevTextBox() == prev); | 1293 ASSERT(child->prevTextBox() == prev); |
1194 prev = child; | 1294 prev = child; |
1195 } | 1295 } |
1196 ASSERT(prev == m_lastTextBox); | 1296 ASSERT(prev == m_lastTextBox); |
1197 #endif | 1297 #endif |
1198 } | 1298 } |
1199 | 1299 |
1200 #endif | 1300 #endif |
1201 | 1301 |
1202 } // namespace WebCore | 1302 } // namespace WebCore |
OLD | NEW |