Changeset d2100e2 in mainline for uspace/lib/gfxfont/test/font.c


Ignore:
Timestamp:
2020-08-09T18:40:28Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
06b8383
Parents:
5592c56
Message:

Finish glyph bitmap operations and tests

Setting/getting pixel, opening/saving glyph bitmap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gfxfont/test/font.c

    r5592c56 rd2100e2  
    2929#include <gfx/context.h>
    3030#include <gfx/font.h>
     31#include <gfx/glyph.h>
    3132#include <pcut/pcut.h>
     33#include "../private/font.h"
    3234
    3335PCUT_INIT;
     
    3739static errno_t testgc_set_color(void *, gfx_color_t *);
    3840static errno_t testgc_fill_rect(void *, gfx_rect_t *);
     41static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
     42    gfx_bitmap_alloc_t *, void **);
     43static errno_t testgc_bitmap_destroy(void *);
     44static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
     45static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
    3946
    4047static gfx_context_ops_t test_ops = {
    4148        .set_color = testgc_set_color,
    42         .fill_rect = testgc_fill_rect
     49        .fill_rect = testgc_fill_rect,
     50        .bitmap_create = testgc_bitmap_create,
     51        .bitmap_destroy = testgc_bitmap_destroy,
     52        .bitmap_render = testgc_bitmap_render,
     53        .bitmap_get_alloc = testgc_bitmap_get_alloc
    4354};
     55
     56typedef struct {
     57        gfx_bitmap_params_t bm_params;
     58        void *bm_pixels;
     59        gfx_rect_t bm_srect;
     60        gfx_coord2_t bm_offs;
     61} test_gc_t;
     62
     63typedef struct {
     64        test_gc_t *tgc;
     65        gfx_bitmap_alloc_t alloc;
     66        bool myalloc;
     67} testgc_bitmap_t;
    4468
    4569/** Test creating and destroying font */
     
    4973        gfx_font_t *font;
    5074        gfx_context_t *gc;
    51         errno_t rc;
    52 
    53         rc = gfx_context_new(&test_ops, NULL, &gc);
     75        test_gc_t tgc;
     76        errno_t rc;
     77
     78        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
    5479        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    5580
     
    7095        gfx_font_t *font;
    7196        gfx_context_t *gc;
    72         errno_t rc;
    73 
    74         rc = gfx_context_new(&test_ops, NULL, &gc);
     97        test_gc_t tgc;
     98        errno_t rc;
     99
     100        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
    75101        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    76102
     
    101127        gfx_font_t *font;
    102128        gfx_context_t *gc;
    103         errno_t rc;
    104 
    105         rc = gfx_context_new(&test_ops, NULL, &gc);
     129        test_gc_t tgc;
     130        errno_t rc;
     131
     132        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
    106133        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    107134
     
    136163{
    137164        gfx_font_metrics_t metrics;
     165        gfx_glyph_metrics_t gmetrics;
    138166        gfx_font_t *font;
    139167        gfx_context_t *gc;
    140168        gfx_glyph_t *glyph;
    141         errno_t rc;
    142 
    143         rc = gfx_context_new(&test_ops, NULL, &gc);
    144         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    145 
    146         gfx_font_metrics_init(&metrics);
    147 
    148         rc = gfx_font_create(gc, &metrics, &font);
    149         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    150 
     169        gfx_glyph_t *gfirst;
     170        test_gc_t tgc;
     171        errno_t rc;
     172
     173        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
     174        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     175
     176        gfx_font_metrics_init(&metrics);
     177
     178        rc = gfx_font_create(gc, &metrics, &font);
     179        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     180
     181        /* Should get NULL since there is no glyph in the font */
    151182        glyph = gfx_font_first_glyph(font);
    152183        PCUT_ASSERT_NULL(glyph);
    153184
     185        /* Now add one */
     186        gfx_glyph_metrics_init(&gmetrics);
     187        rc = gfx_glyph_create(font, &gmetrics, &glyph);
     188        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     189
     190        /* gfx_font_first_glyph() should return the same */
     191        gfirst = gfx_font_first_glyph(font);
     192        PCUT_ASSERT_EQUALS(glyph, gfirst);
     193
     194        gfx_glyph_destroy(glyph);
    154195        gfx_font_destroy(font);
    155196        rc = gfx_context_delete(gc);
     
    160201PCUT_TEST(next_glyph)
    161202{
    162         /* TODO */
     203        gfx_font_metrics_t metrics;
     204        gfx_glyph_metrics_t gmetrics;
     205        gfx_font_t *font;
     206        gfx_context_t *gc;
     207        gfx_glyph_t *glyph1;
     208        gfx_glyph_t *glyph2;
     209        gfx_glyph_t *gfirst;
     210        gfx_glyph_t *gsecond;
     211        test_gc_t tgc;
     212        errno_t rc;
     213
     214        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
     215        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     216
     217        gfx_font_metrics_init(&metrics);
     218
     219        rc = gfx_font_create(gc, &metrics, &font);
     220        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     221
     222        /* Add first glyph */
     223        gfx_glyph_metrics_init(&gmetrics);
     224        rc = gfx_glyph_create(font, &gmetrics, &glyph1);
     225        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     226
     227        /* Add second glyph */
     228        gfx_glyph_metrics_init(&gmetrics);
     229        rc = gfx_glyph_create(font, &gmetrics, &glyph2);
     230        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     231
     232        /* gfx_font_first_glyph() should return glyph1 */
     233        gfirst = gfx_font_first_glyph(font);
     234        PCUT_ASSERT_EQUALS(glyph1, gfirst);
     235
     236        /* gfx_font_next_glyph() should return glyph2 */
     237        gsecond = gfx_font_next_glyph(gfirst);
     238        PCUT_ASSERT_EQUALS(glyph2, gsecond);
     239
     240        gfx_glyph_destroy(glyph1);
     241        gfx_glyph_destroy(glyph2);
     242        gfx_font_destroy(font);
     243        rc = gfx_context_delete(gc);
     244        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    163245}
    164246
     
    171253        gfx_glyph_t *glyph;
    172254        size_t bytes;
    173         errno_t rc;
    174 
    175         rc = gfx_context_new(&test_ops, NULL, &gc);
     255        test_gc_t tgc;
     256        errno_t rc;
     257
     258        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
    176259        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    177260
     
    189272}
    190273
     274/** Test gfx_font_splice_at_glyph() */
     275PCUT_TEST(splice_at_glyph)
     276{
     277        gfx_font_metrics_t fmetrics;
     278        gfx_font_t *font;
     279        gfx_glyph_metrics_t gmetrics;
     280        gfx_glyph_t *glyph;
     281        gfx_context_t *gc;
     282        test_gc_t tgc;
     283        errno_t rc;
     284
     285        rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
     286        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     287
     288        gfx_font_metrics_init(&fmetrics);
     289        rc = gfx_font_create(gc, &fmetrics, &font);
     290        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     291
     292        gfx_glyph_metrics_init(&gmetrics);
     293        rc = gfx_glyph_create(font, &gmetrics, &glyph);
     294        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     295
     296        rc = gfx_font_splice_at_glyph(font, glyph, 10, 10);
     297        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     298
     299        gfx_glyph_destroy(glyph);
     300
     301        gfx_font_destroy(font);
     302        rc = gfx_context_delete(gc);
     303        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     304}
     305
    191306static errno_t testgc_set_color(void *arg, gfx_color_t *color)
    192307{
     
    199314}
    200315
     316static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
     317    gfx_bitmap_alloc_t *alloc, void **rbm)
     318{
     319        test_gc_t *tgc = (test_gc_t *) arg;
     320        testgc_bitmap_t *tbm;
     321
     322        tbm = calloc(1, sizeof(testgc_bitmap_t));
     323        if (tbm == NULL)
     324                return ENOMEM;
     325
     326        if (alloc == NULL) {
     327                tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
     328                    sizeof(uint32_t);
     329                tbm->alloc.off0 = 0;
     330                tbm->alloc.pixels = calloc(sizeof(uint32_t),
     331                    tbm->alloc.pitch * (params->rect.p1.y - params->rect.p0.y));
     332                tbm->myalloc = true;
     333                if (tbm->alloc.pixels == NULL) {
     334                        free(tbm);
     335                        return ENOMEM;
     336                }
     337        } else {
     338                tbm->alloc = *alloc;
     339        }
     340
     341        tbm->tgc = tgc;
     342        tgc->bm_params = *params;
     343        tgc->bm_pixels = tbm->alloc.pixels;
     344        *rbm = (void *)tbm;
     345        return EOK;
     346}
     347
     348static errno_t testgc_bitmap_destroy(void *bm)
     349{
     350        testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
     351        if (tbm->myalloc)
     352                free(tbm->alloc.pixels);
     353        free(tbm);
     354        return EOK;
     355}
     356
     357static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
     358    gfx_coord2_t *offs)
     359{
     360        testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
     361        tbm->tgc->bm_srect = *srect;
     362        tbm->tgc->bm_offs = *offs;
     363        return EOK;
     364}
     365
     366static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
     367{
     368        testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
     369        *alloc = tbm->alloc;
     370        return EOK;
     371}
     372
    201373PCUT_EXPORT(font);
Note: See TracChangeset for help on using the changeset viewer.