fix icu_shaper

This commit is contained in:
artemp 2014-08-15 14:11:44 +01:00
parent f41b15f967
commit 67379d1bba

View file

@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
* Copyright (C) 2013 Artem Pavlenko
* Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -51,15 +51,15 @@ static void shape_text(text_line & line,
{
unsigned start = line.first_char();
unsigned end = line.last_char();
mapnik::value_unicode_string const& text = itemizer.text();
size_t length = end - start;
if (!length) return;
line.reserve(length);
std::list<text_item> const& list = itemizer.itemize(start, end);
mapnik::value_unicode_string const& text = itemizer.text();
UErrorCode err = U_ZERO_ERROR;
mapnik::value_unicode_string shaped;
mapnik::value_unicode_string reordered;
unsigned char_index = 0;
for (auto const& text_item : list)
{
@ -68,8 +68,9 @@ static void shape_text(text_line & line,
face_set->set_unscaled_character_sizes();
for (auto const& face : *face_set)
{
UBiDi *bidi = ubidi_openSized(length, 0, &err);
ubidi_setPara(bidi, text.getBuffer(), length, UBIDI_DEFAULT_LTR, 0, &err);
ubidi_setPara(bidi, text.getBuffer() + start, length, UBIDI_DEFAULT_LTR, 0, &err);
ubidi_writeReordered(bidi, reordered.getBuffer(length),
length, UBIDI_DO_MIRRORING, &err);
ubidi_close(bidi);
@ -89,26 +90,26 @@ static void shape_text(text_line & line,
if (U_SUCCESS(err) && (num_chars == length))
{
U_NAMESPACE_QUALIFIER StringCharacterIterator iter(shaped);
unsigned i = 0;
for (iter.setToStart(); iter.hasNext();)
{
UChar ch = iter.nextPostInc();
glyph_info tmp;
tmp.offset.clear();
tmp.char_index = i;
tmp.glyph_index = FT_Get_Char_Index(face->get_face(), ch);
tmp.offset.clear();
if (tmp.glyph_index == 0)
{
shaped_status = false;
break;
}
if (face->glyph_dimensions(tmp))
{
tmp.char_index = char_index;
tmp.face = face;
tmp.format = text_item.format;
face->glyph_dimensions(tmp);
tmp.scale_multiplier = size / face->get_face()->units_per_EM;
width_map[i] += tmp.advance();
width_map[char_index++] += tmp.advance();
line.add_glyph(tmp, scale_factor);
++i;
}
}
}
if (!shaped_status) continue;