diff options
| author | Ray <raysan5@gmail.com> | 2016-09-05 10:08:28 +0200 |
|---|---|---|
| committer | Ray <raysan5@gmail.com> | 2016-09-05 10:08:28 +0200 |
| commit | 9d66bc4a05f17f5dfe0e81b9be38f044b0dc16d4 (patch) | |
| tree | 358252bcdd3f71d98ef5fb9c979060977ed8acd4 /src | |
| parent | a9ab516dae83d95a8701160bb7dcc72917e2d2ab (diff) | |
| download | raylib-9d66bc4a05f17f5dfe0e81b9be38f044b0dc16d4.tar.gz raylib-9d66bc4a05f17f5dfe0e81b9be38f044b0dc16d4.zip | |
Added function: ImageAlphaMask()
Diffstat (limited to 'src')
| -rw-r--r-- | src/raylib.h | 1 | ||||
| -rw-r--r-- | src/textures.c | 32 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/raylib.h b/src/raylib.h index d295ef90..d86b1745 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -762,6 +762,7 @@ RLAPI Color *GetImageData(Image image); RLAPI Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image RLAPI void ImageToPOT(Image *image, Color fillColor); // Convert image to POT (power-of-two) RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle diff --git a/src/textures.c b/src/textures.c index 4d9fc6b0..87ac1f85 100644 --- a/src/textures.c +++ b/src/textures.c @@ -548,7 +548,7 @@ void ImageFormat(Image *image, int newFormat) { if (image->format != newFormat) { - if ((image->format < 8) && (newFormat < 8)) + if ((image->format < COMPRESSED_DXT1_RGB) && (newFormat < COMPRESSED_DXT1_RGB)) { Color *pixels = GetImageData(*image); @@ -676,12 +676,40 @@ void ImageFormat(Image *image, int newFormat) } } +// Apply alpha mask to image +// NOTE: alphaMask must be should be same size as image +void ImageAlphaMask(Image *image, Image alphaMask) +{ + if (image->format >= COMPRESSED_DXT1_RGB) + { + TraceLog(WARNING, "Alpha mask can not be applied to compressed data formats"); + return; + } + else + { + // Force mask to be Grayscale + Image mask = ImageCopy(alphaMask); + ImageFormat(&mask, UNCOMPRESSED_GRAYSCALE); + + // Convert image to RGBA + if (image->format != UNCOMPRESSED_R8G8B8A8) ImageFormat(image, UNCOMPRESSED_R8G8B8A8); + + // Apply alpha mask to alpha channel + for (int i = 0, k = 3; (i < mask.width*mask.height) || (i < image->width*image->height); i++, k += 4) + { + ((unsigned char *)image->data)[k] = ((unsigned char *)mask.data)[i]; + } + + UnloadImage(mask); + } +} + // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) // NOTE: In case selected bpp do not represent an known 16bit format, // dithered data is stored in the LSB part of the unsigned short void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp) { - if (image->format >= 8) + if (image->format >= COMPRESSED_DXT1_RGB) { TraceLog(WARNING, "Compressed data formats can not be dithered"); return; |
