Make a given color transparent in an image, using chroma if possible
int PhMakeTransparent( PhImage_t *image, PgColor_t trans_color );
ph
PhMakeTransparent() makes the given trans_color transparent in the given image. This function is similar to PhMakeTransBitmap(), but PhMakeTransparent() uses chroma when possible; chroma is accelerated by most hardware, whereas transparency bitmaps are always implemented in software.
If the image is palette-based, and the specified color appears more than once in the palette, both become transparent if chroma is used. In this case, PhMakeTransparent() calls PhMakeTransBitmap() to create a transparency mask. |
The trans_color argument is the RGB color in the image's palette to be made transparent. You can pass an index into the palette as trans_color by ORing it with Pg_INDEX_COLOR. For example:
if ( PhMakeTransparent( my_image, n | Pg_INDEX_COLOR ) == 0 ) { … }
To draw the image, use PgDrawPhImage() or PgDrawPhImagemx().
/* * This is code for a PhAB application that demonstrates * how to make an image transparent. It also shows how * to take that image, put it into a label widget, and * draw it on a PtRaw's canvas. */ /* Standard headers */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> /* Toolkit headers */ #include <Ph.h> #include <Pt.h> #include <Ap.h> /* Local headers */ #include "abimport.h" #include "proto.h" ApDBase_t *database; PhImage_t trans_image; /* * Setup function for the base window */ int base_window_setup( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) { PhImage_t *imgptr; /* Get the original image from an image-type label widget that we've put in a PhAB picture module - don't close the database since we'll still be using its image and palette data. */ database = ApOpenDBase( ABM_our_picture_module ); imgptr = ApGetImageRes( database, "image_label" ); /* Copy it so that we don't change the original PhImage_t; we'll still be using the same image and palette data though. */ memcpy( &trans_image, imgptr, sizeof(PhImage_t) ); /* Make all the white pixels transparent. */ PhMakeTransparent( &trans_image, Pg_WHITE ); /* Put the transparent image into another image-type label. */ PtSetResource( ABW_destination_label, Pt_ARG_LABEL_IMAGE, &trans_image, 0 ); /* eliminate 'unreferenced' warnings */ link_instance = link_instance, apinfo = apinfo; cbinfo = cbinfo; return( Pt_CONTINUE ); } /* * Draw function (Pt_ARG_RAW_DRAW_F) for a PtRaw widget */ void raw_draw_f( PtWidget_t *widget, PhTile_t *damage ) { PhPoint_t pos = {0, 0}; PhRect_t rect; damage = damage; PtSuperClassDraw( PtBasic, widget, damage ); /* Find our canvas. */ PtCalcCanvas( widget, &rect ); /* Set translation so that drawing is relative to the PtRaw widget, not its parent. */ PgSetTranslation( &rect.ul, Pg_RELATIVE ); /* Clip to our basic canvas (it's only polite). */ PtClipAdd( widget, &rect ); /* Do our drawing. */ PgDrawPhImagemx( &pos, &trans_image, 0 ); /* Remove our translation and clipping by subtracting what we added above. */ rect.ul.x *= -1; rect.ul.y *= -1; PgSetTranslation( &rect.ul, Pg_RELATIVE ); PtClipRemove(); }
Photon
Safety: | |
---|---|
Interrupt handler | No |
Signal handler | No |
Thread | No |
PgColor_t, PgDrawPhImage*(), PgDrawPhImageRect*(), PgDrawRepPhImage*(), PhCreateImage(), PhImage_t, PhMakeTransBitmap()
“Images” in the Raw Drawing and Animation chapter of the Photon Programmer's Guide