Changeset 453f203b in mainline for uspace/lib/gfxfont/src/font.c


Ignore:
Timestamp:
2020-09-25T14:31:27Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
16357ec
Parents:
120031a5
git-author:
Jiri Svoboda <jiri@…> (2020-09-24 18:30:07)
git-committer:
Jiri Svoboda <jiri@…> (2020-09-25 14:31:27)
Message:

Cannot just write structures to TPF file

This would compromise portability of TPF files. What was I thinking?
Endianness and type widths must be fixed.

File:
1 edited

Legend:

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

    r120031a5 r453f203b  
    3636#include <adt/list.h>
    3737#include <assert.h>
     38#include <byteorder.h>
    3839#include <errno.h>
    3940#include <gfx/bitmap.h>
     
    403404        errno_t rc;
    404405        riff_rchunk_t propsck;
     406        tpf_font_props_t tprops;
    405407        size_t nread;
    406408
     
    409411                return rc;
    410412
    411         rc = riff_read(&propsck, (void *) props, sizeof(*props), &nread);
    412         if (rc != EOK || nread != sizeof(*props))
     413        rc = riff_read(&propsck, (void *) &tprops, sizeof(tprops), &nread);
     414        if (rc != EOK || nread != sizeof(tprops))
    413415                return EIO;
    414416
     
    416418        if (rc != EOK)
    417419                return rc;
     420
     421        props->size = uint16_t_le2host(tprops.size);
     422        props->flags = uint16_t_le2host(tprops.flags);
    418423
    419424        return EOK;
     
    430435        errno_t rc;
    431436        riff_wchunk_t propsck;
     437        tpf_font_props_t tprops;
     438
     439        tprops.size = host2uint16_t_le(props->size);
     440        tprops.flags = host2uint16_t_le(props->flags);
    432441
    433442        rc = riff_wchunk_start(riffw, CKID_fprp, &propsck);
     
    435444                return rc;
    436445
    437         rc = riff_write(riffw, (void *) props, sizeof(*props));
     446        rc = riff_write(riffw, (void *) &tprops, sizeof(tprops));
    438447        if (rc != EOK)
    439448                return rc;
     
    457466        errno_t rc;
    458467        riff_rchunk_t mtrck;
     468        tpf_font_metrics_t tmetrics;
    459469        size_t nread;
    460470
     
    463473                return rc;
    464474
    465         rc = riff_read(&mtrck, (void *) metrics, sizeof(*metrics), &nread);
    466         if (rc != EOK || nread != sizeof(*metrics))
     475        rc = riff_read(&mtrck, (void *) &tmetrics, sizeof(tmetrics), &nread);
     476        if (rc != EOK || nread != sizeof(tmetrics))
    467477                return EIO;
    468478
     
    471481                return rc;
    472482
     483        metrics->ascent = uint16_t_le2host(tmetrics.ascent);
     484        metrics->descent = uint16_t_le2host(tmetrics.descent);
     485        metrics->leading = uint16_t_le2host(tmetrics.leading);
    473486        return EOK;
    474487}
     
    484497{
    485498        errno_t rc;
     499        tpf_font_metrics_t tmetrics;
    486500        riff_wchunk_t mtrck;
    487501
     502        tmetrics.ascent = host2uint16_t_le(metrics->ascent);
     503        tmetrics.descent = host2uint16_t_le(metrics->descent);
     504        tmetrics.leading = host2uint16_t_le(metrics->leading);
     505
    488506        rc = riff_wchunk_start(riffw, CKID_fmtr, &mtrck);
    489507        if (rc != EOK)
    490508                return rc;
    491509
    492         rc = riff_write(riffw, (void *) metrics, sizeof(*metrics));
     510        rc = riff_write(riffw, (void *) &tmetrics, sizeof(tmetrics));
    493511        if (rc != EOK)
    494512                return rc;
     
    511529        errno_t rc;
    512530        riff_rchunk_t bmpck;
     531        tpf_font_bmp_hdr_t thdr;
    513532        gfx_bitmap_params_t params;
    514533        gfx_bitmap_alloc_t alloc;
     
    516535        uint32_t width;
    517536        uint32_t height;
    518         uint32_t depth;
     537        uint16_t fmt;
     538        uint16_t depth;
    519539        size_t nread;
    520540
     
    523543                goto error;
    524544
    525         rc = riff_read_uint32(&bmpck, &width);
    526         if (rc != EOK)
    527                 goto error;
    528 
    529         rc = riff_read_uint32(&bmpck, &height);
    530         if (rc != EOK)
    531                 goto error;
    532 
    533         rc = riff_read_uint32(&bmpck, &depth);
    534         if (rc != EOK)
    535                 goto error;
    536 
    537         if (depth != 8 * sizeof(uint32_t)) {
     545        rc = riff_read(&bmpck, &thdr, sizeof(thdr), &nread);
     546        if (rc != EOK || nread != sizeof(thdr))
     547                goto error;
     548
     549        width = uint32_t_le2host(thdr.width);
     550        height = uint32_t_le2host(thdr.height);
     551        fmt = uint16_t_le2host(thdr.fmt);
     552        depth = uint16_t_le2host(thdr.depth);
     553
     554        if (fmt != 0 || depth != 8 * sizeof(uint32_t)) {
    538555                rc = ENOTSUP;
    539556                goto error;
     
    587604{
    588605        errno_t rc;
     606        tpf_font_bmp_hdr_t thdr;
    589607        riff_wchunk_t bmpck;
    590608        gfx_bitmap_alloc_t alloc;
    591609
     610        thdr.width = host2uint32_t_le(font->rect.p1.x);
     611        thdr.height = host2uint32_t_le(font->rect.p1.y);
     612        thdr.fmt = 0;
     613        thdr.depth = host2uint16_t_le(8 * sizeof(uint32_t));
     614
    592615        rc = gfx_bitmap_get_alloc(font->bitmap, &alloc);
    593616        if (rc != EOK)
     
    598621                return rc;
    599622
    600         rc = riff_write_uint32(riffw, font->rect.p1.x);
    601         if (rc != EOK)
    602                 return rc;
    603 
    604         rc = riff_write_uint32(riffw, font->rect.p1.y);
    605         if (rc != EOK)
    606                 return rc;
    607 
    608         rc = riff_write_uint32(riffw, 8 * sizeof(uint32_t));
     623        rc = riff_write(riffw, &thdr, sizeof(thdr));
    609624        if (rc != EOK)
    610625                return rc;
Note: See TracChangeset for help on using the changeset viewer.