Improved module for rGuiIcons
- ADDED: GuiLoadIcons() - ADDED: GuiGetIconData() and GuiSetIconData() - ADDED: GuiSetIconPixel(), GuiClearIconPixel(), GuiCheckIconPixel()
This commit is contained in:
parent
f164f744ac
commit
2c96d4a157
227
src/ricons.h
227
src/ricons.h
@ -40,8 +40,21 @@
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Defines and Macros
|
// Defines and Macros
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#define RICONS_COUNT 199 // Number of icons included
|
#define RICON_MAX_ICONS 256 // Maximum number of icons
|
||||||
#define RICONS_SIZE 16 // Size of icons (squared)
|
#define RICON_SIZE 16 // Size of icons (squared)
|
||||||
|
|
||||||
|
// Icons data is defined by bit array (every bit represents one pixel)
|
||||||
|
// Those arrays are stored as unsigned int data arrays, so every array
|
||||||
|
// element defines 32 pixels (bits) of information
|
||||||
|
// Number of elemens depend on RICON_SIZE (by default 16x16 pixels)
|
||||||
|
#define RICON_DATA_ELEMENTS (RICON_SIZE*RICON_SIZE/32)
|
||||||
|
|
||||||
|
#define RICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// ...
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Icons enumeration
|
// Icons enumeration
|
||||||
@ -246,12 +259,21 @@ typedef enum {
|
|||||||
RICON_LAYERS_VISIBLE,
|
RICON_LAYERS_VISIBLE,
|
||||||
RICON_LAYERS,
|
RICON_LAYERS,
|
||||||
RICON_WINDOW
|
RICON_WINDOW
|
||||||
} rIconDescription;
|
} guiIconName;
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Declaration
|
// Module Functions Declaration
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
void DrawIcon(int iconId, Vector2 position, int pixelSize, Color color);
|
void GuiDrawIcon(int iconId, Vector2 position, int pixelSize, Color color);
|
||||||
|
|
||||||
|
unsigned int *GuiGetIcons(void); // Get full icons data pointer
|
||||||
|
|
||||||
|
unsigned int *GuiGetIconData(int iconId); // Get icon bit data
|
||||||
|
void GuiSetIconData(int iconId, unsigned int *data); // Set icon bit data
|
||||||
|
|
||||||
|
void GuiSetIconPixel(int iconId, int x, int y); // Set icon pixel value
|
||||||
|
void GuiClearIconPixel(int iconId, int x, int y); // Clear icon pixel value
|
||||||
|
bool GuiCheckIconPixel(int iconId, int x, int y); // Check icon pixel value
|
||||||
|
|
||||||
#endif // RICONS_H
|
#endif // RICONS_H
|
||||||
|
|
||||||
@ -267,7 +289,14 @@ void DrawIcon(int iconId, Vector2 position, int pixelSize, Color color);
|
|||||||
#include "raylib.h" // Required for: Icons drawing function: DrawRectangle()
|
#include "raylib.h" // Required for: Icons drawing function: DrawRectangle()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const unsigned int RICONS[RICONS_COUNT*8] = {
|
#include <stdio.h> // Required for: fopen(), fclose()...
|
||||||
|
#include <string.h> // Required for: memset(), memcpy()
|
||||||
|
#include <stdlib.h> // Required for: malloc()
|
||||||
|
|
||||||
|
// Global gui icons array (allocated on heap by default)
|
||||||
|
// NOTE: A new icon set could be loaded over this array using GuiLoadIcons(),
|
||||||
|
// just note that loaded icons set must be same RICON_SIZE
|
||||||
|
static unsigned int guiIcons[RICON_MAX_ICONS*RICON_DATA_ELEMENTS] = {
|
||||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_NONE
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RICON_NONE
|
||||||
0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // RICON_FOLDER_FILE_OPEN
|
0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // RICON_FOLDER_FILE_OPEN
|
||||||
0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // RICON_FILE_SAVE_CLASSIC
|
0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // RICON_FILE_SAVE_CLASSIC
|
||||||
@ -467,21 +496,154 @@ static const unsigned int RICONS[RICONS_COUNT*8] = {
|
|||||||
0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS_VISIBLE
|
0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS_VISIBLE
|
||||||
0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS
|
0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // RICON_LAYERS
|
||||||
0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // RICON_WINDOW
|
0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // RICON_WINDOW
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Get full icons data pointer
|
||||||
|
unsigned int *GuiGetIcons(void) { return guiIcons; }
|
||||||
|
|
||||||
|
// Load raygui icons file (.rgi)
|
||||||
|
// NOTE: In case nameIds are required, they can be requested with loadIconsName,
|
||||||
|
// they are returned as a guiIconsName[iconsCount][RICON_MAX_NAME_LENGTH],
|
||||||
|
// guiIconsName[]][] memory should be manually freed!
|
||||||
|
char **GuiLoadIcons(const char *fileName, bool loadIconsName)
|
||||||
|
{
|
||||||
|
// Style File Structure (.rgi)
|
||||||
|
// ------------------------------------------------------
|
||||||
|
// Offset | Size | Type | Description
|
||||||
|
// ------------------------------------------------------
|
||||||
|
// 0 | 4 | char | Signature: "rGI "
|
||||||
|
// 4 | 2 | short | Version: 100
|
||||||
|
// 6 | 2 | short | reserved
|
||||||
|
|
||||||
|
// 8 | 2 | short | Num icons (N)
|
||||||
|
// 10 | 2 | short | Icons size (Options: 16, 32, 64) (S)
|
||||||
|
|
||||||
|
// Icons name id (32 bytes per name id)
|
||||||
|
// foreach (icon)
|
||||||
|
// {
|
||||||
|
// 12+32*i | 32 | char | Icon NameId
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Icons data: One bit per pixel, stored as unsigned int array (depends on icon size)
|
||||||
|
// S*S pixels/32bit per unsigned int = K unsigned int per icon
|
||||||
|
// foreach (icon)
|
||||||
|
// {
|
||||||
|
// ... | K | unsigned int | Icon Data
|
||||||
|
// }
|
||||||
|
|
||||||
|
FILE *rgiFile = fopen(fileName, "rb");
|
||||||
|
|
||||||
|
char **guiIconsName = NULL;
|
||||||
|
|
||||||
|
if (rgiFile != NULL)
|
||||||
|
{
|
||||||
|
char signature[5] = "";
|
||||||
|
short version = 0;
|
||||||
|
short reserved = 0;
|
||||||
|
short iconsCount = 0;
|
||||||
|
short iconsSize = 0;
|
||||||
|
|
||||||
|
fread(signature, 1, 4, rgiFile);
|
||||||
|
fread(&version, 1, sizeof(short), rgiFile);
|
||||||
|
fread(&reserved, 1, sizeof(short), rgiFile);
|
||||||
|
fread(&iconsCount, 1, sizeof(short), rgiFile);
|
||||||
|
fread(&iconsSize, 1, sizeof(short), rgiFile);
|
||||||
|
|
||||||
|
if ((signature[0] == 'r') &&
|
||||||
|
(signature[1] == 'G') &&
|
||||||
|
(signature[2] == 'I') &&
|
||||||
|
(signature[3] == ' '))
|
||||||
|
{
|
||||||
|
if (loadIconsName)
|
||||||
|
{
|
||||||
|
guiIconsName = (char **)malloc(iconsCount*sizeof(char **));
|
||||||
|
for (int i = 0; i < iconsCount; i++)
|
||||||
|
{
|
||||||
|
guiIconsName[i] = (char *)malloc(RICON_MAX_NAME_LENGTH);
|
||||||
|
fread(guiIconsName[i], 32, 1, rgiFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read icons data directly over guiIcons data array
|
||||||
|
fread(guiIcons, iconsCount*(iconsSize*iconsSize/32), sizeof(unsigned int), rgiFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(rgiFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return guiIconsName;
|
||||||
|
}
|
||||||
|
|
||||||
// Draw selected icon using rectangles pixel-by-pixel
|
// Draw selected icon using rectangles pixel-by-pixel
|
||||||
void DrawIcon(int iconId, Vector2 position, int pixelSize, Color color)
|
void GuiDrawIcon(int iconId, Vector2 position, int pixelSize, Color color)
|
||||||
{
|
{
|
||||||
#define BIT_CHECK(a,b) ((a) & (1<<(b)))
|
#define BIT_CHECK(a,b) ((a) & (1<<(b)))
|
||||||
|
|
||||||
for (int i = 0, y = 0; i < RICONS_SIZE*RICONS_SIZE/32; i++)
|
for (int i = 0, y = 0; i < RICON_SIZE*RICON_SIZE/32; i++)
|
||||||
{
|
{
|
||||||
for (int k = 0; k < 32; k++)
|
for (int k = 0; k < 32; k++)
|
||||||
{
|
{
|
||||||
if (BIT_CHECK(RICONS[8*iconId + i], k))
|
if (BIT_CHECK(guiIcons[iconId*RICON_DATA_ELEMENTS + i], k))
|
||||||
{
|
{
|
||||||
#if !defined(RICONS_STANDALONE)
|
#if !defined(RICONS_STANDALONE)
|
||||||
DrawRectangle(position.x + (k%RICONS_SIZE)*pixelSize, position.y + y*pixelSize, pixelSize, pixelSize, color);
|
DrawRectangle(position.x + (k%RICON_SIZE)*pixelSize, position.y + y*pixelSize, pixelSize, pixelSize, color);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,4 +652,51 @@ void DrawIcon(int iconId, Vector2 position, int pixelSize, Color color)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get icon bit data
|
||||||
|
// NOTE: Bit data array grouped as unsigned int (ICON_SIZE*ICON_SIZE/32 elements)
|
||||||
|
unsigned int *GuiGetIconData(int iconId)
|
||||||
|
{
|
||||||
|
static unsigned int iconData[RICON_DATA_ELEMENTS] = { 0 };
|
||||||
|
memset(iconData, 0, RICON_DATA_ELEMENTS*sizeof(unsigned int));
|
||||||
|
|
||||||
|
if (iconId < RICON_MAX_ICONS) memcpy(iconData, &guiIcons[iconId*RICON_DATA_ELEMENTS], RICON_DATA_ELEMENTS*sizeof(unsigned int));
|
||||||
|
|
||||||
|
return iconData;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set icon bit data
|
||||||
|
// NOTE: Data must be provided as unsigned int array (ICON_SIZE*ICON_SIZE/32 elements)
|
||||||
|
void GuiSetIconData(int iconId, unsigned int *data)
|
||||||
|
{
|
||||||
|
if (iconId < RICON_MAX_ICONS) memcpy(&guiIcons[iconId*RICON_DATA_ELEMENTS], data, RICON_DATA_ELEMENTS*sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set icon pixel value
|
||||||
|
void GuiSetIconPixel(int iconId, int x, int y)
|
||||||
|
{
|
||||||
|
#define BIT_SET(a,b) ((a) |= (1<<(b)))
|
||||||
|
|
||||||
|
// This logic works for any RICON_SIZE pixels icons,
|
||||||
|
// For example, in case of 16x16 pixels, every 2 lines fit in one unsigned int data element
|
||||||
|
BIT_SET(guiIcons[iconId*RICON_DATA_ELEMENTS + y/(sizeof(unsigned int)*8/RICON_SIZE)], x + (y%(sizeof(unsigned int)*8/RICON_SIZE)*RICON_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear icon pixel value
|
||||||
|
void GuiClearIconPixel(int iconId, int x, int y)
|
||||||
|
{
|
||||||
|
#define BIT_CLEAR(a,b) ((a) &= ~((1)<<(b)))
|
||||||
|
|
||||||
|
// This logic works for any RICON_SIZE pixels icons,
|
||||||
|
// For example, in case of 16x16 pixels, every 2 lines fit in one unsigned int data element
|
||||||
|
BIT_CLEAR(guiIcons[iconId*RICON_DATA_ELEMENTS + y/(sizeof(unsigned int)*8/RICON_SIZE)], x + (y%(sizeof(unsigned int)*8/RICON_SIZE)*RICON_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check icon pixel value
|
||||||
|
bool GuiCheckIconPixel(int iconId, int x, int y)
|
||||||
|
{
|
||||||
|
#define BIT_CHECK(a,b) ((a) & (1<<(b)))
|
||||||
|
|
||||||
|
return (BIT_CHECK(guiIcons[iconId*8 + y/2], x + (y%2*16)));
|
||||||
|
}
|
||||||
|
|
||||||
#endif // RICONS_IMPLEMENTATION
|
#endif // RICONS_IMPLEMENTATION
|
||||||
|
Loading…
x
Reference in New Issue
Block a user