Changeset bea947f in mainline for uspace/drv/fb/kfb/port.c


Ignore:
Timestamp:
2020-05-24T17:59:02Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b3b00b6
Parents:
ef20a91
Message:

Implement bitmap color key to allow transparent cursor background

This seems to be the simplest solution of them all. It will work
on any bit depth except 1 bit per pixel (monochrome), where we would
need to extend the bitmap with a bit mask instead.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/fb/kfb/port.c

    ref20a91 rbea947f  
    9090        gfx_bitmap_alloc_t alloc;
    9191        gfx_rect_t rect;
     92        gfx_bitmap_flags_t flags;
     93        pixel_t key_color;
    9294        bool myalloc;
    9395} kfb_bitmap_t;
     
    203205        gfx_coord2_subtract(&params->rect.p1, &params->rect.p0, &dim);
    204206        kfbbm->rect = params->rect;
     207        kfbbm->flags = params->flags;
     208        kfbbm->key_color = params->key_color;
    205209
    206210        if (alloc == NULL) {
     
    298302        gfx_rect_clip(&srect, &skfbrect, &crect);
    299303
    300         for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
    301                 for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
    302                         gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
    303                         gfx_coord2_add(&pos, &offs, &dp);
    304 
    305                         color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
    306                         kfb->pixel2visual(kfb->addr +
    307                             FB_POS(kfb, dp.x, dp.y), color);
     304        if ((kfbbm->flags & bmpf_color_key) != 0) {
     305                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     306                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     307                                gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
     308                                gfx_coord2_add(&pos, &offs, &dp);
     309
     310                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     311                                if (color != kfbbm->key_color) {
     312                                        kfb->pixel2visual(kfb->addr +
     313                                            FB_POS(kfb, dp.x, dp.y), color);
     314                                }
     315                        }
     316                }
     317        } else {
     318                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     319                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     320                                gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
     321                                gfx_coord2_add(&pos, &offs, &dp);
     322
     323                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     324                                kfb->pixel2visual(kfb->addr +
     325                                    FB_POS(kfb, dp.x, dp.y), color);
     326                        }
    308327                }
    309328        }
Note: See TracChangeset for help on using the changeset viewer.