|
@@ -186,7 +186,8 @@ static Image LoadPVR(const unsigned char *fileData, unsigned int fileSize); //
|
|
#if defined(SUPPORT_FILEFORMAT_ASTC)
|
|
#if defined(SUPPORT_FILEFORMAT_ASTC)
|
|
static Image LoadASTC(const unsigned char *fileData, unsigned int fileSize); // Load ASTC file data
|
|
static Image LoadASTC(const unsigned char *fileData, unsigned int fileSize); // Load ASTC file data
|
|
#endif
|
|
#endif
|
|
-static Vector4 *LoadImageDataNormalized(Image image); // Load pixel data from image as Vector4 array (float normalized)
|
|
|
|
|
|
+
|
|
|
|
+static Vector4 *LoadImageDataNormalized(Image image); // Load pixel data from image as Vector4 array (float normalized)
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------------
|
|
// Module Functions Definition
|
|
// Module Functions Definition
|
|
@@ -212,16 +213,10 @@ Image LoadImage(const char *fileName)
|
|
unsigned int fileSize = 0;
|
|
unsigned int fileSize = 0;
|
|
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
unsigned char *fileData = LoadFileData(fileName, &fileSize);
|
|
|
|
|
|
- if (fileData != NULL)
|
|
|
|
- {
|
|
|
|
- // Loading image from memory data
|
|
|
|
- image = LoadImageFromMemory(GetFileExtension(fileName), fileData, fileSize);
|
|
|
|
-
|
|
|
|
- if (image.data != NULL) TRACELOG(LOG_INFO, "IMAGE: [%s] Data loaded successfully (%ix%i)", fileName, image.width, image.height);
|
|
|
|
- else TRACELOG(LOG_WARNING, "IMAGE: [%s] Failed to load data", fileName);
|
|
|
|
|
|
+ // Loading image from memory data
|
|
|
|
+ if (fileData != NULL) image = LoadImageFromMemory(GetFileExtension(fileName), fileData, fileSize);
|
|
|
|
|
|
- RL_FREE(fileData);
|
|
|
|
- }
|
|
|
|
|
|
+ RL_FREE(fileData);
|
|
|
|
|
|
return image;
|
|
return image;
|
|
}
|
|
}
|
|
@@ -383,7 +378,9 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
|
#if defined(SUPPORT_FILEFORMAT_ASTC)
|
|
#if defined(SUPPORT_FILEFORMAT_ASTC)
|
|
else if (TextIsEqual(fileExtLower, ".astc")) image = LoadASTC(fileData, dataSize);
|
|
else if (TextIsEqual(fileExtLower, ".astc")) image = LoadASTC(fileData, dataSize);
|
|
#endif
|
|
#endif
|
|
- else TRACELOG(LOG_WARNING, "IMAGE: File format not supported");
|
|
|
|
|
|
+ else TRACELOG(LOG_WARNING, "IMAGE: Data format not supported");
|
|
|
|
+
|
|
|
|
+ TRACELOG(LOG_INFO, "IMAGE: Data loaded successfully (%ix%i | %s | %i mipmaps)", image.width, image.height, rlGetPixelFormatName(image.format), image.mipmaps);
|
|
|
|
|
|
return image;
|
|
return image;
|
|
}
|
|
}
|
|
@@ -2203,117 +2200,6 @@ void UnloadImagePalette(Color *colors)
|
|
RL_FREE(colors);
|
|
RL_FREE(colors);
|
|
}
|
|
}
|
|
|
|
|
|
-// Get pixel data from image as Vector4 array (float normalized)
|
|
|
|
-static Vector4 *LoadImageDataNormalized(Image image)
|
|
|
|
-{
|
|
|
|
- Vector4 *pixels = (Vector4 *)RL_MALLOC(image.width*image.height*sizeof(Vector4));
|
|
|
|
-
|
|
|
|
- if (image.format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) TRACELOG(LOG_WARNING, "IMAGE: Pixel data retrieval not supported for compressed image formats");
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- for (int i = 0, k = 0; i < image.width*image.height; i++)
|
|
|
|
- {
|
|
|
|
- switch (image.format)
|
|
|
|
- {
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
- pixels[i].y = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
- pixels[i].z = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
- pixels[i].w = 1.0f;
|
|
|
|
-
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
- pixels[i].y = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
- pixels[i].z = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
- pixels[i].w = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
-
|
|
|
|
- k += 2;
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
|
|
|
|
- {
|
|
|
|
- unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
-
|
|
|
|
- pixels[i].x = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31);
|
|
|
|
- pixels[i].y = (float)((pixel & 0b0000011111000000) >> 6)*(1.0f/31);
|
|
|
|
- pixels[i].z = (float)((pixel & 0b0000000000111110) >> 1)*(1.0f/31);
|
|
|
|
- pixels[i].w = ((pixel & 0b0000000000000001) == 0)? 0.0f : 1.0f;
|
|
|
|
-
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R5G6B5:
|
|
|
|
- {
|
|
|
|
- unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
-
|
|
|
|
- pixels[i].x = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31);
|
|
|
|
- pixels[i].y = (float)((pixel & 0b0000011111100000) >> 5)*(1.0f/63);
|
|
|
|
- pixels[i].z = (float)(pixel & 0b0000000000011111)*(1.0f/31);
|
|
|
|
- pixels[i].w = 1.0f;
|
|
|
|
-
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4:
|
|
|
|
- {
|
|
|
|
- unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
-
|
|
|
|
- pixels[i].x = (float)((pixel & 0b1111000000000000) >> 12)*(1.0f/15);
|
|
|
|
- pixels[i].y = (float)((pixel & 0b0000111100000000) >> 8)*(1.0f/15);
|
|
|
|
- pixels[i].z = (float)((pixel & 0b0000000011110000) >> 4)*(1.0f/15);
|
|
|
|
- pixels[i].w = (float)(pixel & 0b0000000000001111)*(1.0f/15);
|
|
|
|
-
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
- pixels[i].y = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
- pixels[i].z = (float)((unsigned char *)image.data)[k + 2]/255.0f;
|
|
|
|
- pixels[i].w = (float)((unsigned char *)image.data)[k + 3]/255.0f;
|
|
|
|
-
|
|
|
|
- k += 4;
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R8G8B8:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
- pixels[i].y = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
- pixels[i].z = (float)((unsigned char *)image.data)[k + 2]/255.0f;
|
|
|
|
- pixels[i].w = 1.0f;
|
|
|
|
-
|
|
|
|
- k += 3;
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R32:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = ((float *)image.data)[k];
|
|
|
|
- pixels[i].y = 0.0f;
|
|
|
|
- pixels[i].z = 0.0f;
|
|
|
|
- pixels[i].w = 1.0f;
|
|
|
|
-
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R32G32B32:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = ((float *)image.data)[k];
|
|
|
|
- pixels[i].y = ((float *)image.data)[k + 1];
|
|
|
|
- pixels[i].z = ((float *)image.data)[k + 2];
|
|
|
|
- pixels[i].w = 1.0f;
|
|
|
|
-
|
|
|
|
- k += 3;
|
|
|
|
- } break;
|
|
|
|
- case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
|
|
|
|
- {
|
|
|
|
- pixels[i].x = ((float *)image.data)[k];
|
|
|
|
- pixels[i].y = ((float *)image.data)[k + 1];
|
|
|
|
- pixels[i].z = ((float *)image.data)[k + 2];
|
|
|
|
- pixels[i].w = ((float *)image.data)[k + 3];
|
|
|
|
-
|
|
|
|
- k += 4;
|
|
|
|
- }
|
|
|
|
- default: break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return pixels;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// Get image alpha border rectangle
|
|
// Get image alpha border rectangle
|
|
// NOTE: Threshold is defined as a percentatge: 0.0f -> 1.0f
|
|
// NOTE: Threshold is defined as a percentatge: 0.0f -> 1.0f
|
|
Rectangle GetImageAlphaBorder(Image image, float threshold)
|
|
Rectangle GetImageAlphaBorder(Image image, float threshold)
|
|
@@ -4600,3 +4486,114 @@ static Image LoadASTC(const unsigned char *fileData, unsigned int fileSize)
|
|
return image;
|
|
return image;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
+
|
|
|
|
+// Get pixel data from image as Vector4 array (float normalized)
|
|
|
|
+static Vector4 *LoadImageDataNormalized(Image image)
|
|
|
|
+{
|
|
|
|
+ Vector4 *pixels = (Vector4 *)RL_MALLOC(image.width*image.height*sizeof(Vector4));
|
|
|
|
+
|
|
|
|
+ if (image.format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) TRACELOG(LOG_WARNING, "IMAGE: Pixel data retrieval not supported for compressed image formats");
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ for (int i = 0, k = 0; i < image.width*image.height; i++)
|
|
|
|
+ {
|
|
|
|
+ switch (image.format)
|
|
|
|
+ {
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
+ pixels[i].y = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
+ pixels[i].z = (float)((unsigned char *)image.data)[i]/255.0f;
|
|
|
|
+ pixels[i].w = 1.0f;
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
+ pixels[i].y = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
+ pixels[i].z = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
+ pixels[i].w = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
+
|
|
|
|
+ k += 2;
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
|
|
|
|
+ {
|
|
|
|
+ unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
+
|
|
|
|
+ pixels[i].x = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31);
|
|
|
|
+ pixels[i].y = (float)((pixel & 0b0000011111000000) >> 6)*(1.0f/31);
|
|
|
|
+ pixels[i].z = (float)((pixel & 0b0000000000111110) >> 1)*(1.0f/31);
|
|
|
|
+ pixels[i].w = ((pixel & 0b0000000000000001) == 0)? 0.0f : 1.0f;
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R5G6B5:
|
|
|
|
+ {
|
|
|
|
+ unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
+
|
|
|
|
+ pixels[i].x = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31);
|
|
|
|
+ pixels[i].y = (float)((pixel & 0b0000011111100000) >> 5)*(1.0f/63);
|
|
|
|
+ pixels[i].z = (float)(pixel & 0b0000000000011111)*(1.0f/31);
|
|
|
|
+ pixels[i].w = 1.0f;
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4:
|
|
|
|
+ {
|
|
|
|
+ unsigned short pixel = ((unsigned short *)image.data)[i];
|
|
|
|
+
|
|
|
|
+ pixels[i].x = (float)((pixel & 0b1111000000000000) >> 12)*(1.0f/15);
|
|
|
|
+ pixels[i].y = (float)((pixel & 0b0000111100000000) >> 8)*(1.0f/15);
|
|
|
|
+ pixels[i].z = (float)((pixel & 0b0000000011110000) >> 4)*(1.0f/15);
|
|
|
|
+ pixels[i].w = (float)(pixel & 0b0000000000001111)*(1.0f/15);
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
+ pixels[i].y = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
+ pixels[i].z = (float)((unsigned char *)image.data)[k + 2]/255.0f;
|
|
|
|
+ pixels[i].w = (float)((unsigned char *)image.data)[k + 3]/255.0f;
|
|
|
|
+
|
|
|
|
+ k += 4;
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R8G8B8:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = (float)((unsigned char *)image.data)[k]/255.0f;
|
|
|
|
+ pixels[i].y = (float)((unsigned char *)image.data)[k + 1]/255.0f;
|
|
|
|
+ pixels[i].z = (float)((unsigned char *)image.data)[k + 2]/255.0f;
|
|
|
|
+ pixels[i].w = 1.0f;
|
|
|
|
+
|
|
|
|
+ k += 3;
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R32:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = ((float *)image.data)[k];
|
|
|
|
+ pixels[i].y = 0.0f;
|
|
|
|
+ pixels[i].z = 0.0f;
|
|
|
|
+ pixels[i].w = 1.0f;
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R32G32B32:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = ((float *)image.data)[k];
|
|
|
|
+ pixels[i].y = ((float *)image.data)[k + 1];
|
|
|
|
+ pixels[i].z = ((float *)image.data)[k + 2];
|
|
|
|
+ pixels[i].w = 1.0f;
|
|
|
|
+
|
|
|
|
+ k += 3;
|
|
|
|
+ } break;
|
|
|
|
+ case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
|
|
|
|
+ {
|
|
|
|
+ pixels[i].x = ((float *)image.data)[k];
|
|
|
|
+ pixels[i].y = ((float *)image.data)[k + 1];
|
|
|
|
+ pixels[i].z = ((float *)image.data)[k + 2];
|
|
|
|
+ pixels[i].w = ((float *)image.data)[k + 3];
|
|
|
|
+
|
|
|
|
+ k += 4;
|
|
|
|
+ }
|
|
|
|
+ default: break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return pixels;
|
|
|
|
+}
|