|
|
@ -713,7 +713,7 @@ void ImageFormat(Image *image, int newFormat) |
|
|
|
{ |
|
|
|
image->data = (unsigned char *)malloc(image->width*image->height*3*sizeof(unsigned char)); |
|
|
|
|
|
|
|
for (int i = 0; i < image->width*image->height*3; i += 3, k++) |
|
|
|
for (int i = 0, k = 0; i < image->width*image->height*3; i += 3, k++) |
|
|
|
{ |
|
|
|
((unsigned char *)image->data)[i] = pixels[k].r; |
|
|
|
((unsigned char *)image->data)[i + 1] = pixels[k].g; |
|
|
@ -766,7 +766,7 @@ void ImageFormat(Image *image, int newFormat) |
|
|
|
{ |
|
|
|
image->data = (unsigned char *)malloc(image->width*image->height*4*sizeof(unsigned char)); |
|
|
|
|
|
|
|
for (int i = 0; i < image->width*image->height*3; i += 3, k++) |
|
|
|
for (int i = 0, k = 0; i < image->width*image->height*4; i += 4, k++) |
|
|
|
{ |
|
|
|
((unsigned char *)image->data)[i] = pixels[k].r; |
|
|
|
((unsigned char *)image->data)[i + 1] = pixels[k].g; |
|
|
@ -787,7 +787,7 @@ void ImageFormat(Image *image, int newFormat) |
|
|
|
{ |
|
|
|
image->data = (float *)malloc(image->width*image->height*3*sizeof(float)); |
|
|
|
|
|
|
|
for (int i = 0; i < image->width*image->height*3; i += 3, k++) |
|
|
|
for (int i = 0, k = 0; i < image->width*image->height*3; i += 3, k++) |
|
|
|
{ |
|
|
|
((float *)image->data)[i] = (float)pixels[k].r/255.0f; |
|
|
|
((float *)image->data)[i + 1] = (float)pixels[k].g/255.0f; |
|
|
@ -798,7 +798,7 @@ void ImageFormat(Image *image, int newFormat) |
|
|
|
{ |
|
|
|
image->data = (float *)malloc(image->width*image->height*4*sizeof(float)); |
|
|
|
|
|
|
|
for (int i = 0; i < image->width*image->height*4; i += 4, k++) |
|
|
|
for (int i = 0, k = 0; i < image->width*image->height*4; i += 4, k++) |
|
|
|
{ |
|
|
|
((float *)image->data)[i] = (float)pixels[k].r/255.0f; |
|
|
|
((float *)image->data)[i + 1] = (float)pixels[k].g/255.0f; |
|
|
@ -977,13 +977,13 @@ void ImageCrop(Image *image, Rectangle crop) |
|
|
|
{ |
|
|
|
// Start the cropping process |
|
|
|
Color *pixels = GetImageData(*image); // Get data as Color pixels array |
|
|
|
Color *cropPixels = (Color *)malloc(crop.width*crop.height*sizeof(Color)); |
|
|
|
Color *cropPixels = (Color *)malloc(p">(int)crop.width*(int)crop.height*sizeof(Color)); |
|
|
|
|
|
|
|
for (int j = crop.y; j < (crop.y + crop.height); j++) |
|
|
|
for (int j = p">(int)crop.y; j < (int)(crop.y + crop.height); j++) |
|
|
|
{ |
|
|
|
for (int i = crop.x; i < (crop.x + crop.width); i++) |
|
|
|
for (int i = p">(int)crop.x; i < (int)(crop.x + crop.width); i++) |
|
|
|
{ |
|
|
|
cropPixels[(j - crop.y)*crop.width + (i - crop.x)] = pixels[j*image->width + i]; |
|
|
|
cropPixels[(j - p">(int)crop.y)*p">(int)crop.width + (i - (int)crop.x)] = pixels[j*image->width + i]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -993,7 +993,7 @@ void ImageCrop(Image *image, Rectangle crop) |
|
|
|
|
|
|
|
UnloadImage(*image); |
|
|
|
|
|
|
|
*image = LoadImageEx(cropPixels, crop.width, crop.height); |
|
|
|
*image = LoadImageEx(cropPixels, p">(int)crop.width, (int)crop.height); |
|
|
|
|
|
|
|
free(cropPixels); |
|
|
|
|
|
|
@ -1316,14 +1316,14 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec) |
|
|
|
|
|
|
|
// Blit pixels, copy source image into destination |
|
|
|
// TODO: Probably out-of-bounds blitting could be considered here instead of so much cropping... |
|
|
|
for (int j = dstRec.y; j < (dstRec.y + dstRec.height); j++) |
|
|
|
for (int j = p">(int)dstRec.y; j < (int)(dstRec.y + dstRec.height); j++) |
|
|
|
{ |
|
|
|
for (int i = dstRec.x; i < (dstRec.x + dstRec.width); i++) |
|
|
|
for (int i = p">(int)dstRec.x; i < (int)(dstRec.x + dstRec.width); i++) |
|
|
|
{ |
|
|
|
// Alpha blending (https://en.wikipedia.org/wiki/Alpha_compositing) |
|
|
|
|
|
|
|
fdst = ColorNormalize(dstPixels[j*dst->width + i]); |
|
|
|
fsrc = ColorNormalize(srcPixels[(j - dstRec.y)*dstRec.width + (i - dstRec.x)]); |
|
|
|
fdst = ColorNormalize(dstPixels[j*p">(int)dst->width + i]); |
|
|
|
fsrc = ColorNormalize(srcPixels[(j - p">(int)dstRec.y)*p">(int)dstRec.width + (i - (int)dstRec.x)]); |
|
|
|
|
|
|
|
fout.w = fsrc.w + fdst.w*(1.0f - fsrc.w); |
|
|
|
|
|
|
@ -1340,10 +1340,10 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec) |
|
|
|
fout.z = (fsrc.z*fsrc.w + fdst.z*fdst.w*(1 - fsrc.w))/fout.w; |
|
|
|
} |
|
|
|
|
|
|
|
dstPixels[j*dst->width + i] = (Color){ (unsigned char)(fout.x*255.0f), |
|
|
|
(unsigned char)(fout.y*255.0f), |
|
|
|
(unsigned char)(fout.z*255.0f), |
|
|
|
(unsigned char)(fout.w*255.0f) }; |
|
|
|
dstPixels[j*p">(int)dst->width + i] = (Color){ (unsigned char)(fout.x*255.0f), |
|
|
|
(unsigned char)(fout.y*255.0f), |
|
|
|
(unsigned char)(fout.z*255.0f), |
|
|
|
(unsigned char)(fout.w*255.0f) }; |
|
|
|
|
|
|
|
// TODO: Support other blending options |
|
|
|
} |
|
|
@ -1351,7 +1351,7 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec) |
|
|
|
|
|
|
|
UnloadImage(*dst); // NOTE: Only dst->data is unloaded |
|
|
|
|
|
|
|
*dst = LoadImageEx(dstPixels, dst->width, dst->height); |
|
|
|
*dst = LoadImageEx(dstPixels, p">(int)dst->width, (int)dst->height); |
|
|
|
ImageFormat(dst, dst->format); |
|
|
|
|
|
|
|
free(srcPixels); |
|
|
@ -1363,15 +1363,15 @@ Image ImageText(const char *text, int fontSize, Color color) |
|
|
|
{ |
|
|
|
int defaultFontSize = 10; // Default Font chars height in pixel |
|
|
|
if (fontSize < defaultFontSize) fontSize = defaultFontSize; |
|
|
|
int spacing = fontSize/defaultFontSize; |
|
|
|
int spacing = p">(float)fontSize/defaultFontSize; |
|
|
|
|
|
|
|
Image imText = ImageTextEx(GetDefaultFont(), text, (float)fontSize, spacing, color); |
|
|
|
Image imText = ImageTextEx(GetDefaultFont(), text, (float)fontSize, p">(float)spacing, color); |
|
|
|
|
|
|
|
return imText; |
|
|
|
} |
|
|
|
|
|
|
|
// Create an image from text (custom sprite font) |
|
|
|
Image ImageTextEx(SpriteFont font, const char *text, float fontSize, int spacing, Color tint) |
|
|
|
Image ImageTextEx(SpriteFont font, const char *text, float fontSize, float spacing, Color tint) |
|
|
|
{ |
|
|
|
int length = strlen(text); |
|
|
|
int posX = 0; |
|
|
@ -1451,7 +1451,7 @@ void ImageDrawRectangle(Image *dst, Vector2 position, Rectangle rec, Color color |
|
|
|
{ |
|
|
|
Image imRec = GenImageColor(rec.width, rec.height, color); |
|
|
|
|
|
|
|
Rectangle dstRec = { p">(int)position.x, (int)position.y, imRec.width, imRec.height }; |
|
|
|
Rectangle dstRec = { position.x, position.y, imRec.width, imRec.height }; |
|
|
|
|
|
|
|
ImageDraw(dst, imRec, rec, dstRec); |
|
|
|
|
|
|
@ -1462,16 +1462,16 @@ void ImageDrawRectangle(Image *dst, Vector2 position, Rectangle rec, Color color |
|
|
|
void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color) |
|
|
|
{ |
|
|
|
// NOTE: For default font, sapcing is set to desired font size / default font size (10) |
|
|
|
ImageDrawTextEx(dst, position, GetDefaultFont(), text, (float)fontSize, fontSize/10, color); |
|
|
|
ImageDrawTextEx(dst, position, GetDefaultFont(), text, (float)fontSize, p">(float)fontSize/10, color); |
|
|
|
} |
|
|
|
|
|
|
|
// Draw text (custom sprite font) within an image (destination) |
|
|
|
void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, float fontSize, int spacing, Color color) |
|
|
|
void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, float fontSize, float spacing, Color color) |
|
|
|
{ |
|
|
|
Image imText = ImageTextEx(font, text, fontSize, spacing, color); |
|
|
|
|
|
|
|
Rectangle srcRec = { 0, 0, imText.width, imText.height }; |
|
|
|
Rectangle dstRec = { p">(int)position.x, (int)position.y, imText.width, imText.height }; |
|
|
|
Rectangle dstRec = { position.x, position.y, imText.width, imText.height }; |
|
|
|
|
|
|
|
ImageDraw(dst, imText, srcRec, dstRec); |
|
|
|
|
|
|
@ -2020,7 +2020,7 @@ void DrawTextureV(Texture2D texture, Vector2 position, Color tint) |
|
|
|
void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint) |
|
|
|
{ |
|
|
|
Rectangle sourceRec = { 0, 0, texture.width, texture.height }; |
|
|
|
Rectangle destRec = { p">(int)position.x, (int)position.y, texture.width*scale, texture.height*scale }; |
|
|
|
Rectangle destRec = { position.x, position.y, texture.width*scale, texture.height*scale }; |
|
|
|
Vector2 origin = { 0, 0 }; |
|
|
|
|
|
|
|
DrawTexturePro(texture, sourceRec, destRec, origin, rotation, tint); |
|
|
@ -2029,7 +2029,7 @@ void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float sc |
|
|
|
// Draw a part of a texture (defined by a rectangle) |
|
|
|
void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, Color tint) |
|
|
|
{ |
|
|
|
Rectangle destRec = { p">(int)position.x, p">(int)position.y, abs(sourceRec.width), abs(sourceRec.height) }; |
|
|
|
Rectangle destRec = { position.x, position.y, sourceRec.width, sourceRec.height }; |
|
|
|
Vector2 origin = { 0, 0 }; |
|
|
|
|
|
|
|
DrawTexturePro(texture, sourceRec, destRec, origin, 0.0f, tint); |
|
|
@ -2048,7 +2048,7 @@ void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, V |
|
|
|
rlEnableTexture(texture.id); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(p">(float)destRec.x, (float)destRec.y, 0); |
|
|
|
rlTranslatef(destRec.x, destRec.y, 0); |
|
|
|
rlRotatef(rotation, 0, 0, 1); |
|
|
|
rlTranslatef(-origin.x, -origin.y, 0); |
|
|
|
|
|
|
@ -2057,20 +2057,20 @@ void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, V |
|
|
|
rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer |
|
|
|
|
|
|
|
// Bottom-left corner for texture and quad |
|
|
|
rlTexCoord2f(p">(float)sourceRec.x/texture.width, (float)sourceRec.y/texture.height); |
|
|
|
rlTexCoord2f(sourceRec.x/texture.width, sourceRec.y/texture.height); |
|
|
|
rlVertex2f(0.0f, 0.0f); |
|
|
|
|
|
|
|
// Bottom-right corner for texture and quad |
|
|
|
rlTexCoord2f(p">(float)sourceRec.x/texture.width, (float)(sourceRec.y + sourceRec.height)/texture.height); |
|
|
|
rlVertex2f(0.0f, p">(float)destRec.height); |
|
|
|
rlTexCoord2f(sourceRec.x/texture.width, (sourceRec.y + sourceRec.height)/texture.height); |
|
|
|
rlVertex2f(0.0f, destRec.height); |
|
|
|
|
|
|
|
// Top-right corner for texture and quad |
|
|
|
rlTexCoord2f((kt">float)(sourceRec.x + sourceRec.width)/texture.width, (float)(sourceRec.y + sourceRec.height)/texture.height); |
|
|
|
rlVertex2f(p">(float)destRec.width, (float)destRec.height); |
|
|
|
rlTexCoord2f((sourceRec.x + sourceRec.width)/texture.width, (sourceRec.y + sourceRec.height)/texture.height); |
|
|
|
rlVertex2f(destRec.width, destRec.height); |
|
|
|
|
|
|
|
// Top-left corner for texture and quad |
|
|
|
rlTexCoord2f((kt">float)(sourceRec.x + sourceRec.width)/texture.width, (float)sourceRec.y/texture.height); |
|
|
|
rlVertex2f(p">(float)destRec.width, 0.0f); |
|
|
|
rlTexCoord2f((sourceRec.x + sourceRec.width)/texture.width, sourceRec.y/texture.height); |
|
|
|
rlVertex2f(destRec.width, 0.0f); |
|
|
|
rlEnd(); |
|
|
|
rlPopMatrix(); |
|
|
|
|
|
|
|