int Font::offsetForPositionForComplexText(const TextRun& run, float xFloat, bool includePartialGlyphs) const { #if USE(FREETYPE) if (!primaryFont()->platformData().m_pattern) return offsetForPositionForSimpleText(run, xFloat, includePartialGlyphs); #endif // FIXME: This truncation is not a problem for HTML, but only affects SVG, which passes floating-point numbers // to Font::offsetForPosition(). Bug http://webkit.org/b/40673 tracks fixing this problem. int x = static_cast<int>(xFloat); PangoLayout* layout = getDefaultPangoLayout(run); setPangoAttributes(this, run, layout); gchar* utf8 = convertUniCharToUTF8(run.characters(), run.length(), 0, run.length()); pango_layout_set_text(layout, utf8, -1); int index, trailing; pango_layout_xy_to_index(layout, x * PANGO_SCALE, 1, &index, &trailing); glong offset = g_utf8_pointer_to_offset(utf8, utf8 + index); if (includePartialGlyphs) offset += trailing; g_free(utf8); g_object_unref(layout); return offset; }
int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyphs) const { if (codePath(run) != Complex) return offsetForPositionForSimpleText(run, x, includePartialGlyphs); return offsetForPositionForComplexText(run, x, includePartialGlyphs); }
int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyphs) const { // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050 if (codePath(run) != Complex && !typesettingFeatures()) return offsetForPositionForSimpleText(run, x, includePartialGlyphs); return offsetForPositionForComplexText(run, x, includePartialGlyphs); }
int Font::offsetForPositionForComplexText(const TextRun& run, float xFloat, bool includePartialGlyphs) const { // FIXME: This truncation is not a problem for HTML, but only affects SVG, which passes floating-point numbers // to Font::offsetForPosition(). Bug http://webkit.org/b/40673 tracks fixing this problem. int position = static_cast<int>(xFloat); TextRunComponents components; int w = generateComponents(&components, *this, run); if (position >= w) return run.length(); int offset = 0; if (run.rtl()) { for (size_t i = 0; i < components.size(); ++i) { const TextRunComponent& comp = components.at(i); int xe = w - comp.m_offset; int xs = xe - comp.m_width; if (position >= xs) return offset + (comp.isSpace() ? static_cast<int>((position - xe) * comp.m_spaces / std::max(1.f, comp.m_width) + 0.5) : offsetForPositionForSimpleText(comp.m_textRun, position - xs, includePartialGlyphs)); offset += comp.textLength(); } } else { for (size_t i = 0; i < components.size(); ++i) { const TextRunComponent& comp = components.at(i); int xs = comp.m_offset; int xe = xs + comp.m_width; if (position <= xe) { if (position - xs >= xe) return offset + comp.textLength(); return offset + (comp.isSpace() ? static_cast<int>((position - xs) * comp.m_spaces / std::max(1.f, comp.m_width) + 0.5) : offsetForPositionForSimpleText(comp.m_textRun, position - xs, includePartialGlyphs)); } offset += comp.textLength(); } } return run.length(); }
int Font::offsetForPosition(const TextRun& run, int x, bool includePartialGlyphs) const { #if ENABLE(SVG_FONTS) if (primaryFont()->isSVGFont()) return offsetForPositionForTextUsingSVGFont(run, x, includePartialGlyphs); #endif if (canUseGlyphCache(run)) return offsetForPositionForSimpleText(run, x, includePartialGlyphs); return offsetForPositionForComplexText(run, x, includePartialGlyphs); }
int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyphs) const { #if ENABLE(SVG_FONTS) if (primaryFont()->isSVGFont()) return offsetForPositionForTextUsingSVGFont(run, x, includePartialGlyphs); #endif #if USE(WRATH) //return DrawnTextOfWRATH::offsetForPosition(*this, run, x, includePartialGlyphs); #endif if (codePath(run) != Complex) return offsetForPositionForSimpleText(run, x, includePartialGlyphs); return offsetForPositionForComplexText(run, x, includePartialGlyphs); }
int Font::offsetForPosition(const TextRun& run, const TextStyle& style, int x, bool includePartialGlyphs) const { if (canUseGlyphCache(run)) return offsetForPositionForSimpleText(run, style, x, includePartialGlyphs); return offsetForPositionForComplexText(run, style, x, includePartialGlyphs); }