Changeset 0d62c10 in mainline for uspace/drv/fb


Ignore:
Timestamp:
2020-10-09T20:27:24Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f80690a
Parents:
8bf9058
Message:

Rendering text in different colors via colorization

Location:
uspace/drv/fb
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.c

    r8bf9058 r0d62c10  
    383383
    384384        /* Check that we support all required flags */
    385         if ((params->flags & ~bmpf_color_key) != 0)
     385        if ((params->flags & ~(bmpf_color_key | bmpf_colorize)) != 0)
    386386                return ENOTSUP;
    387387
     
    392392        gfx_coord2_subtract(&params->rect.p1, &params->rect.p0, &dim);
    393393        dcbm->rect = params->rect;
     394        dcbm->flags = params->flags;
    394395
    395396        if (alloc == NULL) {
     
    487488        gfx_rect_clip(&srect, &skfbrect, &crect);
    488489
    489         // XXX bmpf_color_key
    490         for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
    491                 for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
    492                         gfx_coord2_subtract(&pos, &dcbm->rect.p0, &sp);
    493                         gfx_coord2_add(&pos, &offs, &dp);
    494 
    495                         color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
    496                         dispc->active_fb.pixel2visual(dispc->fb_data +
    497                             FB_POS(dispc, dp.x, dp.y), color);
     490        if ((dcbm->flags & bmpf_color_key) == 0) {
     491                /* Simple copy */
     492                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     493                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     494                                gfx_coord2_subtract(&pos, &dcbm->rect.p0, &sp);
     495                                gfx_coord2_add(&pos, &offs, &dp);
     496
     497                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     498                                dispc->active_fb.pixel2visual(dispc->fb_data +
     499                                    FB_POS(dispc, dp.x, dp.y), color);
     500                        }
     501                }
     502        } else if ((dcbm->flags & bmpf_colorize) == 0) {
     503                /* Color key */
     504                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     505                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     506                                gfx_coord2_subtract(&pos, &dcbm->rect.p0, &sp);
     507                                gfx_coord2_add(&pos, &offs, &dp);
     508
     509                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     510                                if (color != dcbm->key_color) {
     511                                        dispc->active_fb.pixel2visual(dispc->fb_data +
     512                                            FB_POS(dispc, dp.x, dp.y), color);
     513                                }
     514                        }
     515                }
     516        } else {
     517                /* Color key & colorize */
     518                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     519                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     520                                gfx_coord2_subtract(&pos, &dcbm->rect.p0, &sp);
     521                                gfx_coord2_add(&pos, &offs, &dp);
     522
     523                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     524                                if (color != dcbm->key_color) {
     525                                        dispc->active_fb.pixel2visual(dispc->fb_data +
     526                                            FB_POS(dispc, dp.x, dp.y),
     527                                            dcbm->dispc->color);
     528                                }
     529                        }
    498530                }
    499531        }
  • uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.h

    r8bf9058 r0d62c10  
    6868
    6969typedef struct {
     70        /* Containing display controller */
    7071        amdm37x_dispc_t *dispc;
     72        /** Allocation info */
    7173        gfx_bitmap_alloc_t alloc;
     74        /** @c true if we allocated the bitmap, @c false if allocated by caller */
     75        bool myalloc;
     76        /** Rectangle covered by bitmap */
    7277        gfx_rect_t rect;
    73         bool myalloc;
     78        /** Bitmap flags */
     79        gfx_bitmap_flags_t flags;
     80        /** Key color */
     81        pixel_t key_color;
    7482} amdm37x_bitmap_t;
    7583
  • uspace/drv/fb/kfb/port.c

    r8bf9058 r0d62c10  
    200200
    201201        /* Check that we support all required flags */
    202         if ((params->flags & ~bmpf_color_key) != 0)
     202        if ((params->flags & ~(bmpf_color_key | bmpf_colorize)) != 0)
    203203                return ENOTSUP;
    204204
     
    307307
    308308        if ((kfbbm->flags & bmpf_color_key) != 0) {
     309                /* Simple copy */
    309310                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
    310311                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     
    319320                        }
    320321                }
     322        } else if ((kfbbm->flags & bmpf_colorize) != 0) {
     323                /* Color key */
     324                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
     325                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
     326                                gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
     327                                gfx_coord2_add(&pos, &offs, &dp);
     328
     329                                color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
     330                                kfb->pixel2visual(kfb->addr +
     331                                    FB_POS(kfb, dp.x, dp.y), color);
     332                        }
     333                }
    321334        } else {
     335                /* Color key & colorize */
    322336                for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
    323337                        for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
Note: See TracChangeset for help on using the changeset viewer.