(svn r25691) -Add: [OSX] Support for mouse selection in the IME composition string.

This commit is contained in:
michi_cc
2013-08-05 20:37:53 +00:00
parent e2ec0ddb03
commit 30867c487f
10 changed files with 129 additions and 2 deletions

View File

@@ -565,6 +565,50 @@ Point Layouter::GetCharPosition(const char *ch) const
return p;
}
/**
* Get the character that is at a position.
* @param x Position in the string.
* @return Pointer to the character at the position or NULL if no character is at the position.
*/
const char *Layouter::GetCharAtPosition(int x) const
{
const ParagraphLayout::Line *line = *this->Begin();;
for (int run_index = 0; run_index < line->countRuns(); run_index++) {
const ParagraphLayout::VisualRun *run = line->getVisualRun(run_index);
for (int i = 0; i < run->getGlyphCount(); i++) {
/* Not a valid glyph (empty). */
if (run->getGlyphs()[i] == 0xFFFF) continue;
int begin_x = run->getPositions()[i * 2];
int end_x = run->getPositions()[i * 2 + 2];
if (IsInsideMM(x, begin_x, end_x)) {
/* Found our glyph, now convert to UTF-8 string index. */
size_t index = run->getGlyphToCharMap()[i];
size_t cur_idx = 0;
for (const char *str = this->string; *str != '\0'; ) {
if (cur_idx == index) return str;
WChar c;
size_t len = Utf8Decode(&c, str);
#ifdef WITH_ICU
/* ICU uses UTF-16 internally which means we need to account for surrogate pairs. */
cur_idx += len < 4 ? 1 : 2;
#else
cur_idx++;
#endif
str += len;
}
}
}
}
return NULL;
}
/**
* Get a static font instance.
*/