Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gfxfont/src/text.c

    r4583015 rf2d4a46  
    9797/** Print string using text characters in text mode.
    9898 *
    99  * @param font Font
    10099 * @param pos Position of top-left corner of text
    101  * @param color Text color
     100 * @param fmt Formatting
    102101 * @param str String
    103102 * @return EOK on success or an error code
    104103 */
    105 static errno_t gfx_puttext_textmode(gfx_font_t *font, gfx_coord2_t *pos,
    106     gfx_color_t *color, const char *str)
    107 {
    108         gfx_context_t *gc = font->typeface->gc;
     104static errno_t gfx_puttext_textmode(gfx_coord2_t *pos, gfx_text_fmt_t *fmt,
     105    const char *str)
     106{
     107        gfx_context_t *gc = fmt->font->typeface->gc;
    109108        gfx_bitmap_params_t params;
    110109        gfx_bitmap_t *bitmap;
    111110        gfx_bitmap_alloc_t alloc;
     111        gfx_coord_t width;
    112112        uint8_t attr;
    113113        pixelmap_t pmap;
    114114        gfx_coord_t x;
     115        gfx_coord_t rmargin;
    115116        pixel_t pixel;
    116117        char32_t c;
    117118        size_t off;
     119        bool ellipsis;
    118120        errno_t rc;
     121
     122        width = str_width(str);
     123        if (fmt->abbreviate && width > fmt->width) {
     124                ellipsis = true;
     125                width = fmt->width;
     126                if (width > 3)
     127                        rmargin = width - 3;
     128                else
     129                        rmargin = width;
     130        } else {
     131                ellipsis = false;
     132                rmargin = width;
     133        }
    119134
    120135        /*
     
    123138         */
    124139
    125         gfx_color_get_ega(color, &attr);
     140        gfx_color_get_ega(fmt->color, &attr);
    126141
    127142        gfx_bitmap_params_init(&params);
    128143        params.rect.p0.x = 0;
    129144        params.rect.p0.y = 0;
    130         params.rect.p1.x = str_width(str);
     145        params.rect.p1.x = width;
    131146        params.rect.p1.y = 1;
    132147
     
    151166
    152167        off = 0;
    153         for (x = 0; x < params.rect.p1.x; x++) {
     168        for (x = 0; x < rmargin; x++) {
    154169                c = str_decode(str, &off, STR_NO_LIMIT);
    155170                pixel = PIXEL(attr,
     
    160175        }
    161176
     177        if (ellipsis) {
     178                for (x = rmargin; x < params.rect.p1.x; x++) {
     179                        c = '.';
     180                        pixel = PIXEL(attr,
     181                            (c >> 16) & 0xff,
     182                            (c >> 8) & 0xff,
     183                            c & 0xff);
     184                        pixelmap_put_pixel(&pmap, x, 0, pixel);
     185                }
     186        }
     187
    162188        rc = gfx_bitmap_render(bitmap, NULL, pos);
    163189
     
    183209        /* Adjust position for horizontal alignment */
    184210        if (fmt->halign != gfx_halign_left) {
     211                /* Compute text width */
    185212                width = gfx_text_width(fmt->font, str);
     213                if (fmt->abbreviate && width > fmt->width)
     214                        width = fmt->width;
     215
    186216                switch (fmt->halign) {
    187217                case gfx_halign_center:
     
    233263        gfx_coord2_t spos;
    234264        gfx_rect_t rect;
     265        gfx_coord_t width;
     266        gfx_coord_t rmargin;
     267        bool ellipsis;
    235268        errno_t rc;
    236269
     
    239272        /* Text mode */
    240273        if ((fmt->font->finfo->props.flags & gff_text_mode) != 0)
    241                 return gfx_puttext_textmode(fmt->font, &spos, fmt->color, str);
     274                return gfx_puttext_textmode(&spos, fmt, str);
    242275
    243276        rc = gfx_set_color(fmt->font->typeface->gc, fmt->color);
    244277        if (rc != EOK)
    245278                return rc;
     279
     280        width = gfx_text_width(fmt->font, str);
     281
     282        if (fmt->abbreviate && width > fmt->width) {
     283                /* Need to append ellipsis */
     284                ellipsis = true;
     285                rmargin = spos.x + fmt->width - gfx_text_width(fmt->font, "...");
     286        } else {
     287                ellipsis = false;
     288                rmargin = spos.x + width;
     289        }
    246290
    247291        cpos = spos;
     
    256300                gfx_glyph_get_metrics(glyph, &gmetrics);
    257301
     302                /* Stop if we would run over the right margin */
     303                if (fmt->abbreviate && cpos.x + gmetrics.advance > rmargin)
     304                        break;
     305
    258306                rc = gfx_glyph_render(glyph, &cpos);
    259307                if (rc != EOK)
     
    274322
    275323                rc = gfx_fill_rect(fmt->font->typeface->gc, &rect);
     324                if (rc != EOK)
     325                        return rc;
     326        }
     327
     328        /* Render ellipsis, if required */
     329        if (ellipsis) {
     330                rc = gfx_font_search_glyph(fmt->font, ".", &glyph, &stradv);
     331                if (rc != EOK)
     332                        return EOK;
     333
     334                gfx_glyph_get_metrics(glyph, &gmetrics);
     335
     336                rc = gfx_glyph_render(glyph, &cpos);
     337                if (rc != EOK)
     338                        return rc;
     339
     340                cpos.x += gmetrics.advance;
     341
     342                rc = gfx_glyph_render(glyph, &cpos);
     343                if (rc != EOK)
     344                        return rc;
     345
     346                cpos.x += gmetrics.advance;
     347
     348                rc = gfx_glyph_render(glyph, &cpos);
    276349                if (rc != EOK)
    277350                        return rc;
     
    376449        tfmt.valign = gfx_valign_baseline;
    377450
     451        /* Remaining available width */
     452        tfmt.width = fmt->width - (cpos->x - spos.x);
     453
    378454        *cfmt = tfmt;
    379455}
     
    390466{
    391467        gfx_coord2_t spos;
     468        gfx_coord_t width;
    392469
    393470        gfx_text_start_pos(pos, fmt, str, &spos);
     471        width = gfx_text_width(fmt->font, str);
     472        if (fmt->abbreviate && width > fmt->width)
     473                width = fmt->width;
    394474
    395475        rect->p0.x = spos.x;
    396476        rect->p0.y = spos.y - fmt->font->metrics.ascent;
    397         rect->p1.x = spos.x + gfx_text_width(fmt->font, str);
     477        rect->p1.x = spos.x + width;
    398478        rect->p1.y = spos.y +  fmt->font->metrics.descent + 1;
    399479}
Note: See TracChangeset for help on using the changeset viewer.