Added rudimentary SVG support. Added 2 functions ImageLoadSvg and ImageLoadSvgWithSize.
This commit is contained in:
parent
62d228346b
commit
2a1305809f
3053
src/external/nanosvg.h
vendored
Normal file
3053
src/external/nanosvg.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1458
src/external/nanosvgrast.h
vendored
Normal file
1458
src/external/nanosvgrast.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -1226,6 +1226,8 @@ RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2);
|
|||
// NOTE: This functions do not require GPU access
|
||||
RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM)
|
||||
RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data
|
||||
RLAPI Image LoadImageSvg(const char* fileName); // Load image from SVG file data with default size from SVG
|
||||
RLAPI Image LoadImageSvgWithSize(const char* fileName, int width, int height); // Load image from SVG file data with specified size
|
||||
RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data)
|
||||
RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png'
|
||||
RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data
|
||||
|
|
|
|||
|
|
@ -187,6 +187,13 @@
|
|||
#include "external/stb_image_resize.h" // Required for: stbir_resize_uint8() [ImageResize()]
|
||||
#endif
|
||||
|
||||
#define NANOSVG_IMPLEMENTATION // Expands implementation
|
||||
#include "external/nanosvg.h"
|
||||
|
||||
#define NANOSVGRAST_IMPLEMENTATION
|
||||
#include "external/nanosvgrast.h"
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Defines and Macros
|
||||
//----------------------------------------------------------------------------------
|
||||
|
|
@ -275,6 +282,88 @@ Image LoadImageRaw(const char *fileName, int width, int height, int format, int
|
|||
return image;
|
||||
}
|
||||
|
||||
// Load image from SVG file data with default size from SVG
|
||||
Image LoadImageSvg(const char* fileName)
|
||||
{
|
||||
Image image = { 0 };
|
||||
|
||||
unsigned int dataSize = 0;
|
||||
unsigned char* fileData = LoadFileData(fileName, &dataSize);
|
||||
|
||||
if (fileData != NULL)
|
||||
{
|
||||
struct NSVGimage* svgImage = nsvgParse(fileData, "px", 96.0f);
|
||||
|
||||
const int width = (int)svgImage->width;
|
||||
const int height = (int)svgImage->height;
|
||||
// Delete
|
||||
nsvgDelete(svgImage);
|
||||
|
||||
return LoadImageSvgWithSize(fileName, width, height);
|
||||
}
|
||||
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
// Load an image from SVG file data with a custom size
|
||||
Image LoadImageSvgWithSize(const char* fileName, int width, int height)
|
||||
{
|
||||
Image image = { 0 };
|
||||
|
||||
unsigned int dataSize = 0;
|
||||
unsigned char* fileData = LoadFileData(fileName, &dataSize);
|
||||
|
||||
if (fileData != NULL)
|
||||
{
|
||||
struct NSVGimage* svgImage = nsvgParse(fileData, "px", 96.0f);
|
||||
|
||||
|
||||
|
||||
// Allocate memory for image
|
||||
unsigned char* img = malloc(width * height * 4);
|
||||
|
||||
// Calculate scales for both the width and the height
|
||||
const float scaleWidth = width / svgImage->width;
|
||||
const float scaleHeight = height / svgImage->height;
|
||||
|
||||
// Set the largest of the 2 scales to be the scale to use
|
||||
const float scale = (scaleHeight > scaleWidth) ? scaleWidth : scaleHeight;
|
||||
|
||||
int offsetX = 0;
|
||||
int offsetY = 0;
|
||||
|
||||
if (scaleHeight > scaleWidth)
|
||||
{
|
||||
offsetY = (height - svgImage->height * scale) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
offsetX = (width - svgImage->width * scale) / 2;
|
||||
}
|
||||
|
||||
|
||||
// Rasterize
|
||||
struct NSVGrasterizer* rast = nsvgCreateRasterizer();
|
||||
nsvgRasterize(rast, svgImage, (int)offsetX, (int)offsetY, scale, img, width, height, width * 4);
|
||||
|
||||
// Populate image struct with all data
|
||||
image.data = img;
|
||||
image.width = width;
|
||||
image.height = height;
|
||||
image.mipmaps = 1;
|
||||
image.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
|
||||
|
||||
|
||||
// Delete
|
||||
nsvgDelete(svgImage);
|
||||
RL_FREE(fileData);
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
|
||||
// Load animated image data
|
||||
// - Image.data buffer includes all frames: [image#0][image#1][image#2][...]
|
||||
// - Number of frames is returned through 'frames' parameter
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user