summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/textures.c113
1 files changed, 111 insertions, 2 deletions
diff --git a/src/textures.c b/src/textures.c
index 3071a7de..15701dda 100644
--- a/src/textures.c
+++ b/src/textures.c
@@ -2025,15 +2025,124 @@ void ImageClearBackground(Image *dst, Color color)
}
// Draw pixel within an image
+// NOTE: Compressed image formats not supported
void ImageDrawPixel(Image *dst, int x, int y, Color color)
{
- ImageDrawRectangle(dst, x, y, 1, 1, color);
+ // Security check to avoid program crash
+ if ((dst->data == NULL) || (x < 0) || (x >= dst->width) || (y < 0) || (y >= dst->height)) return;
+
+ switch (dst->format)
+ {
+ case UNCOMPRESSED_GRAYSCALE:
+ {
+ // NOTE: Calculate grayscale equivalent color
+ Vector3 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f };
+ unsigned char gray = (unsigned char)((coln.x*0.299f + coln.y*0.587f + coln.z*0.114f)*255.0f);
+
+ ((unsigned char *)dst->data)[y*dst->width + x] = gray;
+
+ } break;
+ case UNCOMPRESSED_GRAY_ALPHA:
+ {
+ // NOTE: Calculate grayscale equivalent color
+ Vector3 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f };
+ unsigned char gray = (unsigned char)((coln.x*0.299f + coln.y*0.587f + coln.z*0.114f)*255.0f);
+
+ ((unsigned char *)dst->data)[(y*dst->width + x)*2] = gray;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*2 + 1] = color.a;
+
+ } break;
+ case UNCOMPRESSED_R5G6B5:
+ {
+ // NOTE: Calculate R5G6B5 equivalent color
+ Vector3 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f };
+
+ unsigned char r = (unsigned char)(round(coln.x*31.0f));
+ unsigned char g = (unsigned char)(round(coln.y*63.0f));
+ unsigned char b = (unsigned char)(round(coln.z*31.0f));
+
+ ((unsigned short *)dst->data)[y*dst->width + x] = (unsigned short)r << 11 | (unsigned short)g << 5 | (unsigned short)b;
+
+ } break;
+ case UNCOMPRESSED_R5G5B5A1:
+ {
+ #define PIXEL_ALPHA_THRESHOLD 50
+
+ // NOTE: Calculate R5G5B5A1 equivalent color
+ Vector4 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f, (float)color.a/255.0f };
+
+ unsigned char r = (unsigned char)(round(coln.x*31.0f));
+ unsigned char g = (unsigned char)(round(coln.y*31.0f));
+ unsigned char b = (unsigned char)(round(coln.z*31.0f));
+ unsigned char a = (coln.w > ((float)PIXEL_ALPHA_THRESHOLD/255.0f))? 1 : 0;;
+
+ ((unsigned short *)dst->data)[y*dst->width + x] = (unsigned short)r << 11 | (unsigned short)g << 6 | (unsigned short)b << 1 | (unsigned short)a;
+
+ } break;
+ case UNCOMPRESSED_R4G4B4A4:
+ {
+ // NOTE: Calculate R5G5B5A1 equivalent color
+ Vector4 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f, (float)color.a/255.0f };
+
+ unsigned char r = (unsigned char)(round(coln.x*15.0f));
+ unsigned char g = (unsigned char)(round(coln.y*15.0f));
+ unsigned char b = (unsigned char)(round(coln.z*15.0f));
+ unsigned char a = (unsigned char)(round(coln.w*15.0f));
+
+ ((unsigned short *)dst->data)[y*dst->width + x] = (unsigned short)r << 12 | (unsigned short)g << 8 | (unsigned short)b << 4 | (unsigned short)a;
+
+ } break;
+ case UNCOMPRESSED_R8G8B8:
+ {
+ ((unsigned char *)dst->data)[(y*dst->width + x)*3] = color.r;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*3 + 1] = color.g;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*3 + 2] = color.b;
+
+ } break;
+ case UNCOMPRESSED_R8G8B8A8:
+ {
+ ((unsigned char *)dst->data)[(y*dst->width + x)*4] = color.r;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*4 + 1] = color.g;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*4 + 2] = color.b;
+ ((unsigned char *)dst->data)[(y*dst->width + x)*4 + 3] = color.a;
+
+ } break;
+ case UNCOMPRESSED_R32:
+ {
+ // NOTE: Calculate grayscale equivalent color (normalized to 32bit)
+ Vector3 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f };
+
+ ((float *)dst->data)[y*dst->width + x] = coln.x*0.299f + coln.y*0.587f + coln.z*0.114f;
+
+ } break;
+ case UNCOMPRESSED_R32G32B32:
+ {
+ // NOTE: Calculate R32G32B32 equivalent color (normalized to 32bit)
+ Vector3 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f };
+
+ ((float *)dst->data)[(y*dst->width + x)*3] = coln.x;
+ ((float *)dst->data)[(y*dst->width + x)*3 + 1] = coln.y;
+ ((float *)dst->data)[(y*dst->width + x)*3 + 2] = coln.z;
+ } break;
+ case UNCOMPRESSED_R32G32B32A32:
+ {
+ // NOTE: Calculate R32G32B32A32 equivalent color (normalized to 32bit)
+ Vector4 coln = { (float)color.r/255.0f, (float)color.g/255.0f, (float)color.b/255.0f, (float)color.a/255.0f };
+
+ ((float *)dst->data)[(y*dst->width + x)*4] = coln.x;
+ ((float *)dst->data)[(y*dst->width + x)*4 + 1] = coln.y;
+ ((float *)dst->data)[(y*dst->width + x)*4 + 2] = coln.z;
+ ((float *)dst->data)[(y*dst->width + x)*4 + 3] = coln.w;
+
+ } break;
+ default: break;
+ }
}
// Draw pixel within an image (Vector version)
void ImageDrawPixelV(Image *dst, Vector2 position, Color color)
{
- ImageDrawRectangle(dst, (int)position.x, (int)position.y, 1, 1, color);
+ ImageDrawPixel(dst, (int)position.x, (int)position.y, color);
}
// Draw circle within an image