diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2010-06-04 19:41:52 +0000 |
|---|---|---|
| committer | tavmjong-free <tavmjong@free.fr> | 2010-06-04 19:41:52 +0000 |
| commit | 763ecf36ae7377cd9c1fadefbe0c4c24b37a3ab0 (patch) | |
| tree | e6d6e2b84f4908b778a9380f6624c523fb79da41 /src/libnrtype | |
| parent | About screen. Screen folder cleanup (0.47 screens removed). (diff) | |
| download | inkscape-763ecf36ae7377cd9c1fadefbe0c4c24b37a3ab0.tar.gz inkscape-763ecf36ae7377cd9c1fadefbe0c4c24b37a3ab0.zip | |
Add support for baseline-shift attribute (all possible values).
Add superscript and subscript support to Text toolbar.
Missing icons for superscript and subscript.
Known bug: adding a character to a superscript or subscript text
string resets baseline-shift attribute.
(bzr r9475)
Diffstat (limited to 'src/libnrtype')
| -rw-r--r-- | src/libnrtype/FontInstance.cpp | 3 | ||||
| -rw-r--r-- | src/libnrtype/Layout-TNG-Compute.cpp | 20 |
2 files changed, 18 insertions, 5 deletions
diff --git a/src/libnrtype/FontInstance.cpp b/src/libnrtype/FontInstance.cpp index b958e899d..bdf700346 100644 --- a/src/libnrtype/FontInstance.cpp +++ b/src/libnrtype/FontInstance.cpp @@ -412,7 +412,7 @@ void font_instance::InitTheFace() SetGraphicsMode(daddy->hScreenDC, GM_COMPATIBLE); SelectObject(daddy->hScreenDC,theFace); #else - theFace=pango_ft2_font_get_face(pFont); + theFace=pango_ft2_font_get_face(pFont); // Deprecated, use pango_fc_font_lock_face() instead if ( theFace ) { FT_Select_Charmap(theFace,ft_encoding_unicode) && FT_Select_Charmap(theFace,ft_encoding_symbol); } @@ -662,6 +662,7 @@ bool font_instance::FontMetrics(double &ascent,double &descent,double &leading) ascent=fabs(otm.otmAscent*scale); descent=fabs(otm.otmDescent*scale); leading=fabs(otm.otmLineGap*scale); + //otmSubscriptSize, otmSubscriptOffset, otmSuperscriptSize, otmSuperscriptOffset, #else if ( theFace->units_per_EM == 0 ) { return false; // bitmap font diff --git a/src/libnrtype/Layout-TNG-Compute.cpp b/src/libnrtype/Layout-TNG-Compute.cpp index cad2f9b19..192596ecf 100644 --- a/src/libnrtype/Layout-TNG-Compute.cpp +++ b/src/libnrtype/Layout-TNG-Compute.cpp @@ -124,8 +124,9 @@ class Layout::Calculator unsigned input_index; /// index into Layout::_input_stream Glib::ustring::const_iterator input_stream_first_character; double font_size; - LineHeight line_height; + LineHeight line_height; /// This is not the CSS line-height attribute! double line_height_multiplier; /// calculated from the font-height css property + double baseline_shift; /// calculated from the baseline-shift css property unsigned text_bytes; unsigned char_index_in_para; /// the index of the first character in this span in the paragraph, for looking up char_attributes SVGLength x, y, dx, dy, rotate; // these are reoriented copies of the <tspan> attributes. We change span when we encounter one. @@ -521,7 +522,7 @@ class Layout::Calculator new_span.in_chunk = _flow._chunks.size() - 1; new_span.line_height = unbroken_span.line_height; new_span.in_input_stream_item = unbroken_span.input_index; - new_span.baseline_shift = _y_offset; + new_span.baseline_shift = 0.0; new_span.block_progression = _block_progression; if ((_flow._input_stream[unbroken_span.input_index]->Type() == TEXT_SOURCE) && (new_span.font = para.pango_items[unbroken_span.pango_item_index].font)) { @@ -604,11 +605,16 @@ class Layout::Calculator if (_block_progression == LEFT_TO_RIGHT || _block_progression == RIGHT_TO_LEFT) { new_glyph.x = x + unbroken_span.glyph_string->glyphs[glyph_index].geometry.x_offset * font_size_multiplier + new_span.line_height.ascent; - new_glyph.y = _y_offset + (unbroken_span.glyph_string->glyphs[glyph_index].geometry.y_offset - unbroken_span.glyph_string->glyphs[glyph_index].geometry.width * 0.5) * font_size_multiplier; + new_glyph.y = _y_offset - + unbroken_span.baseline_shift + + (unbroken_span.glyph_string->glyphs[glyph_index].geometry.y_offset - + unbroken_span.glyph_string->glyphs[glyph_index].geometry.width * 0.5) * font_size_multiplier; new_glyph.width = new_span.font_size * para.pango_items[unbroken_span.pango_item_index].font->Advance(unbroken_span.glyph_string->glyphs[glyph_index].glyph, true); } else { new_glyph.x = x + unbroken_span.glyph_string->glyphs[glyph_index].geometry.x_offset * font_size_multiplier; - new_glyph.y = _y_offset + unbroken_span.glyph_string->glyphs[glyph_index].geometry.y_offset * font_size_multiplier; + new_glyph.y = _y_offset - + unbroken_span.baseline_shift + + unbroken_span.glyph_string->glyphs[glyph_index].geometry.y_offset * font_size_multiplier; new_glyph.width = unbroken_span.glyph_string->glyphs[glyph_index].geometry.width * font_size_multiplier; if ((new_glyph.width == 0) && (para.pango_items[unbroken_span.pango_item_index].font)) new_glyph.width = new_span.font_size * para.pango_items[unbroken_span.pango_item_index].font->Advance(unbroken_span.glyph_string->glyphs[glyph_index].glyph, false); @@ -984,6 +990,7 @@ void Layout::Calculator::_computeFontLineHeight(font_instance *font, double font *line_height_multiplier = LINE_HEIGHT_NORMAL * font_size / line_height->total(); } + /** * Split the paragraph into spans. Also call pango_shape() on them. * @@ -1130,6 +1137,11 @@ unsigned Layout::Calculator::_buildSpansForPara(ParagraphInfo *para) const } new_span.pango_item_index = pango_item_index; _computeFontLineHeight(para->pango_items[pango_item_index].font, new_span.font_size, text_source->style, &new_span.line_height, &new_span.line_height_multiplier); + + // At some point we may want to calculate baseline_shift here (to take advantage + // of otm features like superscript baseline), but for now we use style baseline_shift. + new_span.baseline_shift = text_source->style->baseline_shift.computed; + // TODO: metrics for vertical text TRACE(("add text span %d \"%s\"\n", para->unbroken_spans.size(), text_source->text->raw().substr(span_start_byte_in_source, new_span.text_bytes).c_str())); TRACE((" %d glyphs\n", new_span.glyph_string->num_glyphs)); |
