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(RenderBoxModelObject* repaintC
ontainer) | 1070 IntRect RenderText::clippedOverflowRectForRepaint(RenderBox* repaintContainer) |
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(RenderBoxModelObject* repaintContain
er, bool clipToVisibleContent) | 1076 IntRect RenderText::selectionRectForRepaint(RenderBox* repaintContainer, bool cl
ipToVisibleContent) |
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 | |
1271 int RenderText::nextOffset(int current) const | 1171 int RenderText::nextOffset(int current) const |
1272 { | 1172 { |
1273 StringImpl* si = m_text.get(); | 1173 StringImpl* si = m_text.get(); |
1274 TextBreakIterator* iterator = characterBreakIterator(si->characters(), si->l
ength()); | 1174 TextBreakIterator* iterator = characterBreakIterator(si->characters(), si->l
ength()); |
1275 if (!iterator) | 1175 if (!iterator) |
1276 return current + 1; | 1176 return current + 1; |
1277 | 1177 |
1278 long result = textBreakFollowing(iterator, current); | 1178 long result = textBreakFollowing(iterator, current); |
1279 if (result == TextBreakDone) | 1179 if (result == TextBreakDone) |
1280 result = current + 1; | 1180 result = current + 1; |
(...skipping 12 matching lines...) Expand all Loading... |
1293 ASSERT(child->prevTextBox() == prev); | 1193 ASSERT(child->prevTextBox() == prev); |
1294 prev = child; | 1194 prev = child; |
1295 } | 1195 } |
1296 ASSERT(prev == m_lastTextBox); | 1196 ASSERT(prev == m_lastTextBox); |
1297 #endif | 1197 #endif |
1298 } | 1198 } |
1299 | 1199 |
1300 #endif | 1200 #endif |
1301 | 1201 |
1302 } // namespace WebCore | 1202 } // namespace WebCore |
OLD | NEW |