|
@@ -4,6 +4,9 @@
|
|
|
*
|
|
|
* CONFIGURATION:
|
|
|
*
|
|
|
+* #define SUPPORT_MODULE_RTEXTURES
|
|
|
+* rtextures module is included in the build
|
|
|
+*
|
|
|
* #define SUPPORT_FILEFORMAT_BMP
|
|
|
* #define SUPPORT_FILEFORMAT_PNG
|
|
|
* #define SUPPORT_FILEFORMAT_TGA
|
|
@@ -65,11 +68,13 @@
|
|
|
#include "config.h" // Defines module configuration flags
|
|
|
#endif
|
|
|
|
|
|
+#if defined(SUPPORT_MODULE_RTEXTURES)
|
|
|
+
|
|
|
#include "utils.h" // Required for: TRACELOG() and fopen() Android mapping
|
|
|
#include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 3.3 or ES2
|
|
|
|
|
|
#include <stdlib.h> // Required for: malloc(), free()
|
|
|
-#include <string.h> // Required for: strlen() [Used in ImageTextEx()]
|
|
|
+#include <string.h> // Required for: strlen() [Used in ImageTextEx()], strcmp() [Used in LoadImageFromMemory()]
|
|
|
#include <math.h> // Required for: fabsf()
|
|
|
#include <stdio.h> // Required for: sprintf() [Used in ExportImageAsCode()]
|
|
|
|
|
@@ -296,36 +301,33 @@ Image LoadImageAnim(const char *fileName, int *frames)
|
|
|
}
|
|
|
|
|
|
// Load image from memory buffer, fileType refers to extension: i.e. ".png"
|
|
|
+// WARNING: File extension must be provided in lower-case
|
|
|
Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)
|
|
|
{
|
|
|
Image image = { 0 };
|
|
|
|
|
|
- char fileExtLower[16] = { 0 };
|
|
|
- strcpy(fileExtLower, TextToLower(fileType));
|
|
|
-
|
|
|
#if defined(SUPPORT_FILEFORMAT_PNG)
|
|
|
- if ((TextIsEqual(fileExtLower, ".png"))
|
|
|
+ if ((strcmp(fileType, ".png") == 0)
|
|
|
#else
|
|
|
if ((false)
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_BMP)
|
|
|
- || (TextIsEqual(fileExtLower, ".bmp"))
|
|
|
+ || (strcmp(fileType, ".bmp") == 0)
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_TGA)
|
|
|
- || (TextIsEqual(fileExtLower, ".tga"))
|
|
|
+ || (strcmp(fileType, ".tga") == 0)
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_JPG)
|
|
|
- || (TextIsEqual(fileExtLower, ".jpg") ||
|
|
|
- TextIsEqual(fileExtLower, ".jpeg"))
|
|
|
+ || ((strcmp(fileType, ".jpg") == 0) || (strcmp(fileType, ".jpeg") == 0))
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_GIF)
|
|
|
- || (TextIsEqual(fileExtLower, ".gif"))
|
|
|
+ || (strcmp(fileType, ".gif") == 0)
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_PIC)
|
|
|
- || (TextIsEqual(fileExtLower, ".pic"))
|
|
|
+ || (strcmp(fileType, ".pic") == 0)
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_PSD)
|
|
|
- || (TextIsEqual(fileExtLower, ".psd"))
|
|
|
+ || (strcmp(fileType, ".psd") == 0)
|
|
|
#endif
|
|
|
)
|
|
|
{
|
|
@@ -350,7 +352,7 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
|
|
#endif
|
|
|
}
|
|
|
#if defined(SUPPORT_FILEFORMAT_HDR)
|
|
|
- else if (TextIsEqual(fileExtLower, ".hdr"))
|
|
|
+ else if (strcmp(fileType, ".hdr") == 0)
|
|
|
{
|
|
|
#if defined(STBI_REQUIRED)
|
|
|
if (fileData != NULL)
|
|
@@ -373,7 +375,7 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
|
|
}
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_QOI)
|
|
|
- else if (TextIsEqual(fileExtLower, ".qoi"))
|
|
|
+ else if (strcmp(fileType, ".qoi") == 0)
|
|
|
{
|
|
|
qoi_desc desc = { 0 };
|
|
|
image.data = qoi_decode(fileData, dataSize, &desc, 4);
|
|
@@ -384,19 +386,19 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
|
|
}
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_DDS)
|
|
|
- else if (TextIsEqual(fileExtLower, ".dds")) image = LoadDDS(fileData, dataSize);
|
|
|
+ else if (strcmp(fileType, ".dds") == 0) image = LoadDDS(fileData, dataSize);
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_PKM)
|
|
|
- else if (TextIsEqual(fileExtLower, ".pkm")) image = LoadPKM(fileData, dataSize);
|
|
|
+ else if (strcmp(fileType, ".pkm") == 0) image = LoadPKM(fileData, dataSize);
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_KTX)
|
|
|
- else if (TextIsEqual(fileExtLower, ".ktx")) image = LoadKTX(fileData, dataSize);
|
|
|
+ else if (strcmp(fileType, ".ktx") == 0) image = LoadKTX(fileData, dataSize);
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_PVR)
|
|
|
- else if (TextIsEqual(fileExtLower, ".pvr")) image = LoadPVR(fileData, dataSize);
|
|
|
+ else if (strcmp(fileType, ".pvr") == 0) image = LoadPVR(fileData, dataSize);
|
|
|
#endif
|
|
|
#if defined(SUPPORT_FILEFORMAT_ASTC)
|
|
|
- else if (TextIsEqual(fileExtLower, ".astc")) image = LoadASTC(fileData, dataSize);
|
|
|
+ else if (strcmp(fileType, ".astc") == 0) image = LoadASTC(fileData, dataSize);
|
|
|
#endif
|
|
|
else TRACELOG(LOG_WARNING, "IMAGE: Data format not supported");
|
|
|
|
|
@@ -1133,35 +1135,41 @@ void ImageToPOT(Image *image, Color fill)
|
|
|
// Create an image from text (default font)
|
|
|
Image ImageText(const char *text, int fontSize, Color color)
|
|
|
{
|
|
|
+ Image imText = { 0 };
|
|
|
+#if defined(SUPPORT_MODULE_RTEXT)
|
|
|
int defaultFontSize = 10; // Default Font chars height in pixel
|
|
|
if (fontSize < defaultFontSize) fontSize = defaultFontSize;
|
|
|
int spacing = fontSize/defaultFontSize;
|
|
|
-
|
|
|
- Image imText = ImageTextEx(GetFontDefault(), text, (float)fontSize, (float)spacing, color);
|
|
|
-
|
|
|
+ imText = ImageTextEx(GetFontDefault(), text, (float)fontSize, (float)spacing, color); // WARNING: Module required: rtext
|
|
|
+#else
|
|
|
+ imText = GenImageColor(200, 60, BLACK); // Generating placeholder black image rectangle
|
|
|
+ TRACELOG(LOG_WARNING, "IMAGE: ImageTextEx() requires module: rtext");
|
|
|
+#endif
|
|
|
return imText;
|
|
|
}
|
|
|
|
|
|
// Create an image from text (custom sprite font)
|
|
|
Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint)
|
|
|
{
|
|
|
+ Image imText = { 0 };
|
|
|
+#if defined(SUPPORT_MODULE_RTEXT)
|
|
|
int size = (int)strlen(text); // Get size in bytes of text
|
|
|
|
|
|
int textOffsetX = 0; // Image drawing position X
|
|
|
int textOffsetY = 0; // Offset between lines (on line break '\n')
|
|
|
|
|
|
// NOTE: Text image is generated at font base size, later scaled to desired font size
|
|
|
- Vector2 imSize = MeasureTextEx(font, text, (float)font.baseSize, spacing);
|
|
|
+ Vector2 imSize = MeasureTextEx(font, text, (float)font.baseSize, spacing); // WARNING: Module required: rtext
|
|
|
|
|
|
// Create image to store text
|
|
|
- Image imText = GenImageColor((int)imSize.x, (int)imSize.y, BLANK);
|
|
|
+ imText = GenImageColor((int)imSize.x, (int)imSize.y, BLANK);
|
|
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
{
|
|
|
// Get next codepoint from byte string and glyph index in font
|
|
|
int codepointByteCount = 0;
|
|
|
- int codepoint = GetCodepoint(&text[i], &codepointByteCount);
|
|
|
- int index = GetGlyphIndex(font, codepoint);
|
|
|
+ int codepoint = GetCodepoint(&text[i], &codepointByteCount); // WARNING: Module required: rtext
|
|
|
+ int index = GetGlyphIndex(font, codepoint); // WARNING: Module required: rtext
|
|
|
|
|
|
// NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
|
|
|
// but we need to draw all of the bad bytes using the '?' symbol moving one byte
|
|
@@ -1196,10 +1204,14 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co
|
|
|
TRACELOG(LOG_INFO, "IMAGE: Text scaled by factor: %f", scaleFactor);
|
|
|
|
|
|
// Using nearest-neighbor scaling algorithm for default font
|
|
|
+ // WARNING: Module required: rtext
|
|
|
if (font.texture.id == GetFontDefault().texture.id) ImageResizeNN(&imText, (int)(imSize.x*scaleFactor), (int)(imSize.y*scaleFactor));
|
|
|
else ImageResize(&imText, (int)(imSize.x*scaleFactor), (int)(imSize.y*scaleFactor));
|
|
|
}
|
|
|
-
|
|
|
+#else
|
|
|
+ imText = GenImageColor(200, 60, BLACK); // Generating placeholder black image rectangle
|
|
|
+ TRACELOG(LOG_WARNING, "IMAGE: ImageTextEx() requires module: rtext");
|
|
|
+#endif
|
|
|
return imText;
|
|
|
}
|
|
|
|
|
@@ -2809,10 +2821,13 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color
|
|
|
// Draw text (default font) within an image (destination)
|
|
|
void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color)
|
|
|
{
|
|
|
+#if defined(SUPPORT_MODULE_RTEXT)
|
|
|
Vector2 position = { (float)posX, (float)posY };
|
|
|
-
|
|
|
- // NOTE: For default font, sapcing is set to desired font size / default font size (10)
|
|
|
- ImageDrawTextEx(dst, GetFontDefault(), text, position, (float)fontSize, (float)fontSize/10, color);
|
|
|
+ // NOTE: For default font, spacing is set to desired font size / default font size (10)
|
|
|
+ ImageDrawTextEx(dst, GetFontDefault(), text, position, (float)fontSize, (float)fontSize/10, color); // WARNING: Module required: rtext
|
|
|
+#else
|
|
|
+ TRACELOG(LOG_WARNING, "IMAGE: ImageDrawText() requires module: rtext");
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
// Draw text (custom sprite font) within an image (destination)
|
|
@@ -4803,3 +4818,5 @@ static Vector4 *LoadImageDataNormalized(Image image)
|
|
|
|
|
|
return pixels;
|
|
|
}
|
|
|
+
|
|
|
+#endif // SUPPORT_MODULE_RTEXTURES
|