mirror of
https://github.com/raysan5/raylib.git
synced 2026-03-29 11:51:59 +00:00
Code gardening
REVIEWED: Some early returns, avoid if possible REVIEWED: Some return variable names, for consistency, rename `success` to `result`
This commit is contained in:
107
src/raudio.c
107
src/raudio.c
@@ -963,20 +963,18 @@ Sound LoadSoundFromWave(Wave wave)
|
||||
if (frameCount == 0) TRACELOG(LOG_WARNING, "SOUND: Failed to get frame count for format conversion");
|
||||
|
||||
AudioBuffer *audioBuffer = LoadAudioBuffer(AUDIO_DEVICE_FORMAT, AUDIO_DEVICE_CHANNELS, AUDIO.System.device.sampleRate, frameCount, AUDIO_BUFFER_USAGE_STATIC);
|
||||
if (audioBuffer == NULL)
|
||||
if (audioBuffer != NULL)
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "SOUND: Failed to create buffer");
|
||||
return sound; // early return to avoid dereferencing the audioBuffer null pointer
|
||||
frameCount = (ma_uint32)ma_convert_frames(audioBuffer->data, frameCount, AUDIO_DEVICE_FORMAT, AUDIO_DEVICE_CHANNELS, AUDIO.System.device.sampleRate, wave.data, frameCountIn, formatIn, wave.channels, wave.sampleRate);
|
||||
if (frameCount == 0) TRACELOG(LOG_WARNING, "SOUND: Failed format conversion");
|
||||
|
||||
sound.frameCount = frameCount;
|
||||
sound.stream.sampleRate = AUDIO.System.device.sampleRate;
|
||||
sound.stream.sampleSize = 32;
|
||||
sound.stream.channels = AUDIO_DEVICE_CHANNELS;
|
||||
sound.stream.buffer = audioBuffer;
|
||||
}
|
||||
|
||||
frameCount = (ma_uint32)ma_convert_frames(audioBuffer->data, frameCount, AUDIO_DEVICE_FORMAT, AUDIO_DEVICE_CHANNELS, AUDIO.System.device.sampleRate, wave.data, frameCountIn, formatIn, wave.channels, wave.sampleRate);
|
||||
if (frameCount == 0) TRACELOG(LOG_WARNING, "SOUND: Failed format conversion");
|
||||
|
||||
sound.frameCount = frameCount;
|
||||
sound.stream.sampleRate = AUDIO.System.device.sampleRate;
|
||||
sound.stream.sampleSize = 32;
|
||||
sound.stream.channels = AUDIO_DEVICE_CHANNELS;
|
||||
sound.stream.buffer = audioBuffer;
|
||||
else TRACELOG(LOG_WARNING, "SOUND: Failed to create buffer");
|
||||
}
|
||||
|
||||
return sound;
|
||||
@@ -992,25 +990,23 @@ Sound LoadSoundAlias(Sound source)
|
||||
{
|
||||
AudioBuffer *audioBuffer = LoadAudioBuffer(AUDIO_DEVICE_FORMAT, AUDIO_DEVICE_CHANNELS, AUDIO.System.device.sampleRate, 0, AUDIO_BUFFER_USAGE_STATIC);
|
||||
|
||||
if (audioBuffer == NULL)
|
||||
if (audioBuffer != NULL)
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "SOUND: Failed to create buffer");
|
||||
return sound; // Early return to avoid dereferencing the audioBuffer null pointer
|
||||
audioBuffer->sizeInFrames = source.stream.buffer->sizeInFrames;
|
||||
audioBuffer->data = source.stream.buffer->data;
|
||||
|
||||
// Initalize the buffer as if it was new
|
||||
audioBuffer->volume = 1.0f;
|
||||
audioBuffer->pitch = 1.0f;
|
||||
audioBuffer->pan = 0.0f; // Center
|
||||
|
||||
sound.frameCount = source.frameCount;
|
||||
sound.stream.sampleRate = AUDIO.System.device.sampleRate;
|
||||
sound.stream.sampleSize = 32;
|
||||
sound.stream.channels = AUDIO_DEVICE_CHANNELS;
|
||||
sound.stream.buffer = audioBuffer;
|
||||
}
|
||||
|
||||
audioBuffer->sizeInFrames = source.stream.buffer->sizeInFrames;
|
||||
audioBuffer->data = source.stream.buffer->data;
|
||||
|
||||
// Initalize the buffer as if it was new
|
||||
audioBuffer->volume = 1.0f;
|
||||
audioBuffer->pitch = 1.0f;
|
||||
audioBuffer->pan = 0.0f; // Center
|
||||
|
||||
sound.frameCount = source.frameCount;
|
||||
sound.stream.sampleRate = AUDIO.System.device.sampleRate;
|
||||
sound.stream.sampleSize = 32;
|
||||
sound.stream.channels = AUDIO_DEVICE_CHANNELS;
|
||||
sound.stream.buffer = audioBuffer;
|
||||
else TRACELOG(LOG_WARNING, "SOUND: Failed to create buffer");
|
||||
}
|
||||
|
||||
return sound;
|
||||
@@ -1071,7 +1067,7 @@ void UpdateSound(Sound sound, const void *data, int frameCount)
|
||||
// Export wave data to file
|
||||
bool ExportWave(Wave wave, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
if (false) { }
|
||||
#if SUPPORT_FILEFORMAT_WAV
|
||||
@@ -1088,11 +1084,11 @@ bool ExportWave(Wave wave, const char *fileName)
|
||||
|
||||
void *fileData = NULL;
|
||||
size_t fileDataSize = 0;
|
||||
success = drwav_init_memory_write(&wav, &fileData, &fileDataSize, &format, NULL);
|
||||
if (success) success = (int)drwav_write_pcm_frames(&wav, wave.frameCount, wave.data);
|
||||
result = drwav_init_memory_write(&wav, &fileData, &fileDataSize, &format, NULL);
|
||||
if (result) result = (int)drwav_write_pcm_frames(&wav, wave.frameCount, wave.data);
|
||||
drwav_result result = drwav_uninit(&wav);
|
||||
|
||||
if (result == DRWAV_SUCCESS) success = SaveFileData(fileName, (unsigned char *)fileData, (unsigned int)fileDataSize);
|
||||
if (result == DRWAV_SUCCESS) result = SaveFileData(fileName, (unsigned char *)fileData, (unsigned int)fileDataSize);
|
||||
|
||||
drwav_free(fileData, NULL);
|
||||
}
|
||||
@@ -1108,7 +1104,7 @@ bool ExportWave(Wave wave, const char *fileName)
|
||||
qoa.samples = wave.frameCount;
|
||||
|
||||
int bytesWritten = qoa_write(fileName, (const short *)wave.data, &qoa);
|
||||
if (bytesWritten > 0) success = true;
|
||||
if (bytesWritten > 0) result = true;
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "AUDIO: Wave data must be 16 bit per sample for QOA format export");
|
||||
}
|
||||
@@ -1117,19 +1113,19 @@ bool ExportWave(Wave wave, const char *fileName)
|
||||
{
|
||||
// Export raw sample data (without header)
|
||||
// NOTE: It's up to the user to track wave parameters
|
||||
success = SaveFileData(fileName, wave.data, wave.frameCount*wave.channels*wave.sampleSize/8);
|
||||
result = SaveFileData(fileName, wave.data, wave.frameCount*wave.channels*wave.sampleSize/8);
|
||||
}
|
||||
|
||||
if (success) TRACELOG(LOG_INFO, "FILEIO: [%s] Wave data exported successfully", fileName);
|
||||
if (result) TRACELOG(LOG_INFO, "FILEIO: [%s] Wave data exported successfully", fileName);
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export wave data", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Export wave sample data to code (.h)
|
||||
bool ExportWaveAsCode(Wave wave, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#ifndef TEXT_BYTES_PER_LINE
|
||||
#define TEXT_BYTES_PER_LINE 20
|
||||
@@ -1183,14 +1179,14 @@ bool ExportWaveAsCode(Wave wave, const char *fileName)
|
||||
}
|
||||
|
||||
// NOTE: Text data length exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
|
||||
if (success != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Wave as code exported successfully", fileName);
|
||||
if (result != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Wave as code exported successfully", fileName);
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export wave as code", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Play a sound
|
||||
@@ -2187,12 +2183,15 @@ void UpdateAudioStream(AudioStream stream, const void *data, int frameCount)
|
||||
// Check if any audio stream buffers requires refill
|
||||
bool IsAudioStreamProcessed(AudioStream stream)
|
||||
{
|
||||
if (stream.buffer == NULL) return false;
|
||||
|
||||
bool result = false;
|
||||
ma_mutex_lock(&AUDIO.System.lock);
|
||||
result = stream.buffer->isSubBufferProcessed[0] || stream.buffer->isSubBufferProcessed[1];
|
||||
ma_mutex_unlock(&AUDIO.System.lock);
|
||||
|
||||
if (stream.buffer != NULL)
|
||||
{
|
||||
ma_mutex_lock(&AUDIO.System.lock);
|
||||
result = stream.buffer->isSubBufferProcessed[0] || stream.buffer->isSubBufferProcessed[1];
|
||||
ma_mutex_unlock(&AUDIO.System.lock);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2885,6 +2884,8 @@ static unsigned char *LoadFileData(const char *fileName, int *dataSize)
|
||||
// Save data to file from buffer
|
||||
static bool SaveFileData(const char *fileName, void *data, int dataSize)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
if (fileName != NULL)
|
||||
{
|
||||
FILE *file = fopen(fileName, "wb");
|
||||
@@ -2902,21 +2903,23 @@ static bool SaveFileData(const char *fileName, void *data, int dataSize)
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
||||
return false;
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||
return false;
|
||||
result = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Save text data to file (write), string must be '\0' terminated
|
||||
static bool SaveFileText(const char *fileName, char *text)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
if (fileName != NULL)
|
||||
{
|
||||
FILE *file = fopen(fileName, "wt");
|
||||
@@ -2934,16 +2937,16 @@ static bool SaveFileText(const char *fileName, char *text)
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
||||
return false;
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||
return false;
|
||||
result = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
54
src/rcore.c
54
src/rcore.c
@@ -1621,18 +1621,20 @@ int GetFPS(void)
|
||||
for (int i = 0; i < FPS_CAPTURE_FRAMES_COUNT; i++) history[i] = 0;
|
||||
}
|
||||
|
||||
if (fpsFrame == 0) return 0;
|
||||
|
||||
if ((GetTime() - last) > FPS_STEP)
|
||||
if (fpsFrame != 0)
|
||||
{
|
||||
last = (float)GetTime();
|
||||
index = (index + 1)%FPS_CAPTURE_FRAMES_COUNT;
|
||||
average -= history[index];
|
||||
history[index] = fpsFrame/FPS_CAPTURE_FRAMES_COUNT;
|
||||
average += history[index];
|
||||
}
|
||||
if ((GetTime() - last) > FPS_STEP)
|
||||
{
|
||||
last = (float)GetTime();
|
||||
index = (index + 1)%FPS_CAPTURE_FRAMES_COUNT;
|
||||
average -= history[index];
|
||||
history[index] = fpsFrame/FPS_CAPTURE_FRAMES_COUNT;
|
||||
average += history[index];
|
||||
}
|
||||
|
||||
fps = (int)roundf(1.0f/average);
|
||||
fps = (int)roundf(1.0f/average);
|
||||
}
|
||||
else fps = 0;
|
||||
#endif
|
||||
|
||||
return fps;
|
||||
@@ -2025,7 +2027,7 @@ void UnloadFileData(unsigned char *data)
|
||||
// Save data to file from buffer
|
||||
bool SaveFileData(const char *fileName, void *data, int dataSize)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
if (fileName != NULL)
|
||||
{
|
||||
@@ -2043,20 +2045,20 @@ bool SaveFileData(const char *fileName, void *data, int dataSize)
|
||||
else if (count != dataSize) TRACELOG(LOG_WARNING, "FILEIO: [%s] File partially written", fileName);
|
||||
else TRACELOG(LOG_INFO, "FILEIO: [%s] File saved successfully", fileName);
|
||||
|
||||
int result = fclose(file);
|
||||
if (result == 0) success = true;
|
||||
int closed = fclose(file);
|
||||
if (closed == 0) result = true;
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open file", fileName);
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Export data to code (.h), returns true on success
|
||||
bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#ifndef TEXT_BYTES_PER_LINE
|
||||
#define TEXT_BYTES_PER_LINE 20
|
||||
@@ -2096,14 +2098,14 @@ bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileN
|
||||
byteCount += sprintf(txtData + byteCount, "0x%x };\n", data[dataSize - 1]);
|
||||
|
||||
// NOTE: Text data size exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
|
||||
if (success != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Data as code exported successfully", fileName);
|
||||
if (result != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Data as code exported successfully", fileName);
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export data as code", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Load text data from file, returns a '\0' terminated string
|
||||
@@ -2166,7 +2168,7 @@ void UnloadFileText(char *text)
|
||||
// Save text data to file (write), string must be '\0' terminated
|
||||
bool SaveFileText(const char *fileName, const char *text)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
if (fileName != NULL)
|
||||
{
|
||||
@@ -2181,14 +2183,14 @@ bool SaveFileText(const char *fileName, const char *text)
|
||||
if (count < 0) TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to write text file", fileName);
|
||||
else TRACELOG(LOG_INFO, "FILEIO: [%s] Text file saved successfully", fileName);
|
||||
|
||||
int result = fclose(file);
|
||||
if (result == 0) success = true;
|
||||
int closed = fclose(file);
|
||||
if (closed == 0) result = true;
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to open text file", fileName);
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: File name provided is not valid");
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// File access custom callbacks
|
||||
@@ -3628,7 +3630,7 @@ void UnloadAutomationEventList(AutomationEventList list)
|
||||
// Export automation events list as text file
|
||||
bool ExportAutomationEventList(AutomationEventList list, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#if SUPPORT_AUTOMATION_EVENTS
|
||||
// Export events as binary file
|
||||
@@ -3646,7 +3648,7 @@ bool ExportAutomationEventList(AutomationEventList list, const char *fileName)
|
||||
memcpy(binBuffer + offset, list.events, sizeof(AutomationEvent)*list.count);
|
||||
offset += sizeof(AutomationEvent)*list.count;
|
||||
|
||||
success = SaveFileData(TextFormat("%s.rae",fileName), binBuffer, binarySize);
|
||||
result = SaveFileData(TextFormat("%s.rae",fileName), binBuffer, binarySize);
|
||||
RL_FREE(binBuffer);
|
||||
}
|
||||
*/
|
||||
@@ -3677,12 +3679,12 @@ bool ExportAutomationEventList(AutomationEventList list, const char *fileName)
|
||||
}
|
||||
|
||||
// NOTE: Text data size exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
#endif
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Setup automation event list to record to
|
||||
|
||||
@@ -4647,14 +4647,14 @@ void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSi
|
||||
// Get SSBO buffer size
|
||||
unsigned int rlGetShaderBufferSize(unsigned int id)
|
||||
{
|
||||
unsigned int result = 0;
|
||||
#if defined(GRAPHICS_API_OPENGL_43)
|
||||
GLint64 size = 0;
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
|
||||
glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size);
|
||||
return (size > 0)? (unsigned int)size : 0;
|
||||
#else
|
||||
return 0;
|
||||
if (size > 0) result = (unsigned int)size;
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
// Read SSBO buffer data (GPU->CPU)
|
||||
|
||||
@@ -1949,7 +1949,7 @@ void UnloadMesh(Mesh mesh)
|
||||
// Export mesh data to file
|
||||
bool ExportMesh(Mesh mesh, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
if (IsFileExtension(fileName, ".obj"))
|
||||
{
|
||||
@@ -2013,7 +2013,7 @@ bool ExportMesh(Mesh mesh, const char *fileName)
|
||||
}
|
||||
|
||||
// NOTE: Text data length exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
}
|
||||
@@ -2022,13 +2022,13 @@ bool ExportMesh(Mesh mesh, const char *fileName)
|
||||
// TODO: Support additional file formats to export mesh vertex data
|
||||
}
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Export mesh as code file (.h) defining multiple arrays of vertex attributes
|
||||
bool ExportMeshAsCode(Mesh mesh, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#ifndef TEXT_BYTES_PER_LINE
|
||||
#define TEXT_BYTES_PER_LINE 20
|
||||
@@ -2112,14 +2112,14 @@ bool ExportMeshAsCode(Mesh mesh, const char *fileName)
|
||||
//-----------------------------------------------------------------------------------------
|
||||
|
||||
// NOTE: Text data size exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
|
||||
//if (success != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Image as code exported successfully", fileName);
|
||||
//if (result != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Image as code exported successfully", fileName);
|
||||
//else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export image as code", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
#if SUPPORT_FILEFORMAT_OBJ || SUPPORT_FILEFORMAT_MTL
|
||||
|
||||
@@ -2348,16 +2348,18 @@ bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec)
|
||||
float dx = fabsf(center.x - recCenterX);
|
||||
float dy = fabsf(center.y - recCenterY);
|
||||
|
||||
if (dx > (rec.width/2.0f + radius)) { return false; }
|
||||
if (dy > (rec.height/2.0f + radius)) { return false; }
|
||||
if ((dx <= (rec.width/2.0f + radius)) && (dy <= (rec.height/2.0f + radius)))
|
||||
{
|
||||
if (dx <= (rec.width/2.0f)) collision = true;
|
||||
else if (dy <= (rec.height/2.0f)) collision = true;
|
||||
else
|
||||
{
|
||||
float cornerDistanceSq = (dx - rec.width/2.0f)*(dx - rec.width/2.0f) +
|
||||
(dy - rec.height/2.0f)*(dy - rec.height/2.0f);
|
||||
|
||||
if (dx <= (rec.width/2.0f)) { return true; }
|
||||
if (dy <= (rec.height/2.0f)) { return true; }
|
||||
|
||||
float cornerDistanceSq = (dx - rec.width/2.0f)*(dx - rec.width/2.0f) +
|
||||
(dy - rec.height/2.0f)*(dy - rec.height/2.0f);
|
||||
|
||||
collision = (cornerDistanceSq <= (radius*radius));
|
||||
collision = (cornerDistanceSq <= (radius*radius));
|
||||
}
|
||||
}
|
||||
|
||||
return collision;
|
||||
}
|
||||
@@ -2418,25 +2420,31 @@ bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshol
|
||||
// Check if circle collides with a line created between two points [p1] and [p2]
|
||||
bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 p1, Vector2 p2)
|
||||
{
|
||||
bool collision = false;
|
||||
|
||||
float dx = p1.x - p2.x;
|
||||
float dy = p1.y - p2.y;
|
||||
|
||||
if ((fabsf(dx) + fabsf(dy)) <= FLT_EPSILON)
|
||||
{
|
||||
return CheckCollisionCircles(p1, 0, center, radius);
|
||||
collision = CheckCollisionCircles(p1, 0, center, radius);
|
||||
}
|
||||
else
|
||||
{
|
||||
float lengthSQ = ((dx*dx) + (dy*dy));
|
||||
float dotProduct = (((center.x - p1.x)*(p2.x - p1.x)) + ((center.y - p1.y)*(p2.y - p1.y)))/(lengthSQ);
|
||||
|
||||
if (dotProduct > 1.0f) dotProduct = 1.0f;
|
||||
else if (dotProduct < 0.0f) dotProduct = 0.0f;
|
||||
|
||||
float dx2 = (p1.x - (dotProduct*(dx))) - center.x;
|
||||
float dy2 = (p1.y - (dotProduct*(dy))) - center.y;
|
||||
float distanceSQ = ((dx2*dx2) + (dy2*dy2));
|
||||
|
||||
if (distanceSQ <= radius*radius) collision = true;
|
||||
}
|
||||
|
||||
float lengthSQ = ((dx*dx) + (dy*dy));
|
||||
float dotProduct = (((center.x - p1.x)*(p2.x - p1.x)) + ((center.y - p1.y)*(p2.y - p1.y)))/(lengthSQ);
|
||||
|
||||
if (dotProduct > 1.0f) dotProduct = 1.0f;
|
||||
else if (dotProduct < 0.0f) dotProduct = 0.0f;
|
||||
|
||||
float dx2 = (p1.x - (dotProduct*(dx))) - center.x;
|
||||
float dy2 = (p1.y - (dotProduct*(dy))) - center.y;
|
||||
float distanceSQ = ((dx2*dx2) + (dy2*dy2));
|
||||
|
||||
return (distanceSQ <= radius*radius);
|
||||
return collision;
|
||||
}
|
||||
|
||||
// Get collision rectangle for two rectangles collision
|
||||
|
||||
66
src/rtext.c
66
src/rtext.c
@@ -447,7 +447,7 @@ Font LoadFontFromImage(Image image, Color key, int firstChar)
|
||||
int j = 0;
|
||||
|
||||
while (((lineSpacing + j) < image.height) &&
|
||||
!COLOR_EQUAL(pixels[(lineSpacing + j)*image.width + charSpacing], key)) j++;
|
||||
!COLOR_EQUAL(pixels[(lineSpacing + j)*image.width + charSpacing], key)) j++;
|
||||
|
||||
charHeight = j;
|
||||
|
||||
@@ -1017,7 +1017,7 @@ void UnloadFont(Font font)
|
||||
// Export font as code file, returns true on success
|
||||
bool ExportFontAsCode(Font font, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#ifndef TEXT_BYTES_PER_LINE
|
||||
#define TEXT_BYTES_PER_LINE 20
|
||||
@@ -1159,14 +1159,14 @@ bool ExportFontAsCode(Font font, const char *fileName)
|
||||
UnloadImage(image);
|
||||
|
||||
// NOTE: Text data size exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
|
||||
if (success != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Font as code exported successfully", fileName);
|
||||
if (result != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Font as code exported successfully", fileName);
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export font as code", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Draw current FPS
|
||||
@@ -1395,8 +1395,7 @@ Vector2 MeasureTextCodepoints(Font font, const int *codepoints, int length, floa
|
||||
{
|
||||
Vector2 textSize = { 0 };
|
||||
|
||||
// Security check
|
||||
if ((font.texture.id == 0) || (codepoints == NULL) || (length == 0)) return textSize;
|
||||
if ((font.texture.id == 0) || (codepoints == NULL) || (length == 0)) return textSize; // Security check
|
||||
|
||||
float textWidth = 0.0f;
|
||||
// Used to count longer text line width
|
||||
@@ -1699,17 +1698,18 @@ const char *TextSubtext(const char *text, int position, int length)
|
||||
{
|
||||
int textLength = TextLength(text);
|
||||
|
||||
if (position >= textLength) return buffer; // First char is already '\0' by memset
|
||||
if (position < textLength)
|
||||
{
|
||||
int maxLength = textLength - position;
|
||||
if (length > maxLength) length = maxLength;
|
||||
if (length >= MAX_TEXT_BUFFER_LENGTH) length = MAX_TEXT_BUFFER_LENGTH - 1;
|
||||
|
||||
int maxLength = textLength - position;
|
||||
if (length > maxLength) length = maxLength;
|
||||
if (length >= MAX_TEXT_BUFFER_LENGTH) length = MAX_TEXT_BUFFER_LENGTH - 1;
|
||||
// NOTE: Alternative: memcpy(buffer, text + position, length)
|
||||
|
||||
// NOTE: Alternative: memcpy(buffer, text + position, length)
|
||||
for (int c = 0; c < length; c++) buffer[c] = text[position + c];
|
||||
|
||||
for (int c = 0; c < length; c++) buffer[c] = text[position + c];
|
||||
|
||||
buffer[length] = '\0';
|
||||
buffer[length] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return buffer;
|
||||
@@ -1763,8 +1763,8 @@ char *GetTextBetween(const char *text, const char *begin, const char *end)
|
||||
// NOTE: Limited text replace functionality, using static string
|
||||
char *TextReplace(const char *text, const char *search, const char *replacement)
|
||||
{
|
||||
static char result[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(result, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(buffer, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
|
||||
if ((text != NULL) && (search != NULL) && (search[0] != '\0'))
|
||||
{
|
||||
@@ -1790,7 +1790,7 @@ char *TextReplace(const char *text, const char *search, const char *replacement)
|
||||
{
|
||||
// TODO: Allow copying data replaced up to maximum buffer size and stop
|
||||
|
||||
tempPtr = result; // Point to result start
|
||||
tempPtr = buffer; // Point to result start
|
||||
|
||||
// First time through the loop, all the variable are set correctly from here on,
|
||||
// - 'temp' points to the end of the result string
|
||||
@@ -1821,7 +1821,7 @@ char *TextReplace(const char *text, const char *search, const char *replacement)
|
||||
else TRACELOG(LOG_WARNING, "Text with replacement is longer than internal buffer, use TextReplaceAlloc()");
|
||||
}
|
||||
|
||||
return result;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Replace text string
|
||||
@@ -1894,8 +1894,8 @@ char *TextReplaceAlloc(const char *text, const char *search, const char *replace
|
||||
// NOTE: If (replacement == NULL) removes "begin"[ ]"end" text
|
||||
char *TextReplaceBetween(const char *text, const char *begin, const char *end, const char *replacement)
|
||||
{
|
||||
static char result[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(result, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(buffer, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
|
||||
if ((text != NULL) && (begin != NULL) && (end != NULL))
|
||||
{
|
||||
@@ -1912,16 +1912,16 @@ char *TextReplaceBetween(const char *text, const char *begin, const char *end, c
|
||||
|
||||
int textLen = TextLength(text);
|
||||
int replaceLen = (replacement == NULL)? 0 : TextLength(replacement);
|
||||
int toreplaceLen = endIndex - beginIndex - beginLen;
|
||||
//int toreplaceLen = endIndex - beginIndex - beginLen;
|
||||
|
||||
strncpy(result, text, beginIndex + beginLen); // Copy first text part
|
||||
if (replacement != NULL) strncpy(result + beginIndex + beginLen, replacement, replaceLen); // Copy replacement (if provided)
|
||||
strncpy(result + beginIndex + beginLen + replaceLen, text + endIndex, textLen - endIndex); // Copy end text part
|
||||
strncpy(buffer, text, beginIndex + beginLen); // Copy first text part
|
||||
if (replacement != NULL) strncpy(buffer + beginIndex + beginLen, replacement, replaceLen); // Copy replacement (if provided)
|
||||
strncpy(buffer + beginIndex + beginLen + replaceLen, text + endIndex, textLen - endIndex); // Copy end text part
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Replace text between two specific strings
|
||||
@@ -1964,8 +1964,8 @@ char *TextReplaceBetweenAlloc(const char *text, const char *begin, const char *e
|
||||
// WARNING: Allocated memory must be manually freed
|
||||
char *TextInsert(const char *text, const char *insert, int position)
|
||||
{
|
||||
static char result[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(result, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
|
||||
memset(buffer, 0, MAX_TEXT_BUFFER_LENGTH);
|
||||
|
||||
if ((text != NULL) && (insert != NULL))
|
||||
{
|
||||
@@ -1976,16 +1976,16 @@ char *TextInsert(const char *text, const char *insert, int position)
|
||||
{
|
||||
// TODO: Allow copying data inserted up to maximum buffer size and stop
|
||||
|
||||
for (int i = 0; i < position; i++) result[i] = text[i];
|
||||
for (int i = position; i < insertLen + position; i++) result[i] = insert[i - position];
|
||||
for (int i = (insertLen + position); i < (textLen + insertLen); i++) result[i] = text[i];
|
||||
for (int i = 0; i < position; i++) buffer[i] = text[i];
|
||||
for (int i = position; i < insertLen + position; i++) buffer[i] = insert[i - position];
|
||||
for (int i = (insertLen + position); i < (textLen + insertLen); i++) buffer[i] = text[i];
|
||||
|
||||
result[textLen + insertLen] = '\0'; // Add EOL
|
||||
buffer[textLen + insertLen] = '\0'; // Add EOL
|
||||
}
|
||||
else TRACELOG(LOG_WARNING, "Text with inserted string is longer than internal buffer, use TextInserExt()");
|
||||
}
|
||||
|
||||
return result;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Insert text in a specific position, moves all text forward
|
||||
|
||||
@@ -376,8 +376,7 @@ Image LoadImageAnimFromMemory(const char *fileType, const unsigned char *fileDat
|
||||
Image image = { 0 };
|
||||
int frameCount = 0;
|
||||
|
||||
// Security check for input data
|
||||
if ((fileType == NULL) || (fileData == NULL) || (dataSize == 0)) return image;
|
||||
if ((fileType == NULL) || (fileData == NULL) || (dataSize == 0)) return image; // Security check
|
||||
|
||||
#if SUPPORT_FILEFORMAT_GIF
|
||||
if ((strcmp(fileType, ".gif") == 0) || (strcmp(fileType, ".GIF") == 0))
|
||||
@@ -621,8 +620,7 @@ bool ExportImage(Image image, const char *fileName)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
// Security check for input data
|
||||
if ((image.width == 0) || (image.height == 0) || (image.data == NULL)) return result;
|
||||
if ((image.width == 0) || (image.height == 0) || (image.data == NULL)) return result; // Security check
|
||||
|
||||
#if SUPPORT_IMAGE_EXPORT
|
||||
int channels = 4;
|
||||
@@ -709,8 +707,7 @@ unsigned char *ExportImageToMemory(Image image, const char *fileType, int *dataS
|
||||
unsigned char *fileData = NULL;
|
||||
*dataSize = 0;
|
||||
|
||||
// Security check for input data
|
||||
if ((image.width == 0) || (image.height == 0) || (image.data == NULL)) return NULL;
|
||||
if ((image.width == 0) || (image.height == 0) || (image.data == NULL)) return fileData; // Security check
|
||||
|
||||
int channels = 4;
|
||||
|
||||
@@ -734,7 +731,7 @@ unsigned char *ExportImageToMemory(Image image, const char *fileType, int *dataS
|
||||
// Export image as code file (.h) defining an array of bytes
|
||||
bool ExportImageAsCode(Image image, const char *fileName)
|
||||
{
|
||||
bool success = false;
|
||||
bool result = false;
|
||||
|
||||
#ifndef TEXT_BYTES_PER_LINE
|
||||
#define TEXT_BYTES_PER_LINE 20
|
||||
@@ -774,14 +771,14 @@ bool ExportImageAsCode(Image image, const char *fileName)
|
||||
byteCount += sprintf(txtData + byteCount, "0x%x };\n", ((unsigned char *)image.data)[dataSize - 1]);
|
||||
|
||||
// NOTE: Text data size exported is determined by '\0' (NULL) character
|
||||
success = SaveFileText(fileName, txtData);
|
||||
result = SaveFileText(fileName, txtData);
|
||||
|
||||
RL_FREE(txtData);
|
||||
|
||||
if (success != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Image as code exported successfully", fileName);
|
||||
if (result != 0) TRACELOG(LOG_INFO, "FILEIO: [%s] Image as code exported successfully", fileName);
|
||||
else TRACELOG(LOG_WARNING, "FILEIO: [%s] Failed to export image as code", fileName);
|
||||
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
@@ -1536,8 +1533,7 @@ Image ImageFromChannel(Image image, int selectedChannel)
|
||||
{
|
||||
Image result = { 0 };
|
||||
|
||||
// Security check to avoid program crash
|
||||
if ((image.data == NULL) || (image.width == 0) || (image.height == 0)) return result;
|
||||
if ((image.data == NULL) || (image.width == 0) || (image.height == 0)) return result; // Security check
|
||||
|
||||
// Check selected channel is valid
|
||||
if (selectedChannel < 0)
|
||||
@@ -2937,7 +2933,7 @@ void ImageColorReplace(Image *image, Color color, Color replace)
|
||||
// NOTE: Memory allocated should be freed using UnloadImageColors();
|
||||
Color *LoadImageColors(Image image)
|
||||
{
|
||||
if ((image.width == 0) || (image.height == 0)) return NULL;
|
||||
if ((image.width == 0) || (image.height == 0)) return NULL; // Security check
|
||||
|
||||
Color *pixels = (Color *)RL_MALLOC(image.width*image.height*sizeof(Color));
|
||||
|
||||
@@ -4903,44 +4899,44 @@ Vector3 ColorToHSV(Color color)
|
||||
float max = 0.0f;
|
||||
float delta = 0.0f;
|
||||
|
||||
min = rgb.x < rgb.y? rgb.x : rgb.y;
|
||||
min = min < rgb.z? min : rgb.z;
|
||||
min = (rgb.x < rgb.y)? rgb.x : rgb.y;
|
||||
min = (min < rgb.z)? min : rgb.z;
|
||||
|
||||
max = rgb.x > rgb.y? rgb.x : rgb.y;
|
||||
max = max > rgb.z? max : rgb.z;
|
||||
max = (rgb.x > rgb.y)? rgb.x : rgb.y;
|
||||
max = (max > rgb.z)? max : rgb.z;
|
||||
|
||||
hsv.z = max; // Value
|
||||
hsv.z = max; // Value
|
||||
delta = max - min;
|
||||
|
||||
if (delta < 0.00001f)
|
||||
{
|
||||
hsv.y = 0.0f;
|
||||
hsv.x = 0.0f; // Undefined, maybe NAN?
|
||||
hsv.x = 0.0f; // Undefined, maybe NAN?
|
||||
return hsv;
|
||||
}
|
||||
|
||||
if (max > 0.0f)
|
||||
{
|
||||
// NOTE: If max is 0, this divide would cause a crash
|
||||
hsv.y = (delta/max); // Saturation
|
||||
hsv.y = (delta/max); // Saturation
|
||||
}
|
||||
else
|
||||
{
|
||||
// NOTE: If max is 0, then r = g = b = 0, s = 0, h is undefined
|
||||
hsv.y = 0.0f;
|
||||
hsv.x = NAN; // Undefined
|
||||
hsv.x = NAN; // Undefined
|
||||
return hsv;
|
||||
}
|
||||
|
||||
// NOTE: Comparing float values could not work properly
|
||||
if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta
|
||||
if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta
|
||||
else
|
||||
{
|
||||
if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow
|
||||
else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan
|
||||
if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow
|
||||
else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan
|
||||
}
|
||||
|
||||
hsv.x *= 60.0f; // Convert to degrees
|
||||
hsv.x *= 60.0f; // Convert to degrees
|
||||
|
||||
if (hsv.x < 0.0f) hsv.x += 360.0f;
|
||||
|
||||
@@ -5093,7 +5089,7 @@ Color ColorAlpha(Color color, float alpha)
|
||||
// Get src alpha-blended into dst color with tint
|
||||
Color ColorAlphaBlend(Color dst, Color src, Color tint)
|
||||
{
|
||||
Color out = WHITE;
|
||||
Color result = WHITE;
|
||||
|
||||
// Apply color tint to source color
|
||||
src.r = (unsigned char)(((unsigned int)src.r*((unsigned int)tint.r+1)) >> 8);
|
||||
@@ -5104,24 +5100,24 @@ Color ColorAlphaBlend(Color dst, Color src, Color tint)
|
||||
//#define COLORALPHABLEND_FLOAT
|
||||
#define COLORALPHABLEND_INTEGERS
|
||||
#if defined(COLORALPHABLEND_INTEGERS)
|
||||
if (src.a == 0) out = dst;
|
||||
else if (src.a == 255) out = src;
|
||||
if (src.a == 0) result = dst;
|
||||
else if (src.a == 255) result = src;
|
||||
else
|
||||
{
|
||||
unsigned int alpha = (unsigned int)src.a + 1; // Shifting by 8 (dividing by 256), so need to take that excess into account
|
||||
out.a = (unsigned char)(((unsigned int)alpha*256 + (unsigned int)dst.a*(256 - alpha)) >> 8);
|
||||
result.a = (unsigned char)(((unsigned int)alpha*256 + (unsigned int)dst.a*(256 - alpha)) >> 8);
|
||||
|
||||
if (out.a > 0)
|
||||
if (result.a > 0)
|
||||
{
|
||||
out.r = (unsigned char)((((unsigned int)src.r*alpha*256 + (unsigned int)dst.r*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8);
|
||||
out.g = (unsigned char)((((unsigned int)src.g*alpha*256 + (unsigned int)dst.g*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8);
|
||||
out.b = (unsigned char)((((unsigned int)src.b*alpha*256 + (unsigned int)dst.b*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8);
|
||||
result.r = (unsigned char)((((unsigned int)src.r*alpha*256 + (unsigned int)dst.r*(unsigned int)dst.a*(256 - alpha))/result.a) >> 8);
|
||||
result.g = (unsigned char)((((unsigned int)src.g*alpha*256 + (unsigned int)dst.g*(unsigned int)dst.a*(256 - alpha))/result.a) >> 8);
|
||||
result.b = (unsigned char)((((unsigned int)src.b*alpha*256 + (unsigned int)dst.b*(unsigned int)dst.a*(256 - alpha))/result.a) >> 8);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(COLORALPHABLEND_FLOAT)
|
||||
if (src.a == 0) out = dst;
|
||||
else if (src.a == 255) out = src;
|
||||
if (src.a == 0) result = dst;
|
||||
else if (src.a == 255) result = src;
|
||||
else
|
||||
{
|
||||
Vector4 fdst = ColorNormalize(dst);
|
||||
@@ -5138,11 +5134,11 @@ Color ColorAlphaBlend(Color dst, Color src, Color tint)
|
||||
fout.z = (fsrc.z*fsrc.w + fdst.z*fdst.w*(1 - fsrc.w))/fout.w;
|
||||
}
|
||||
|
||||
out = (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) };
|
||||
result = (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) };
|
||||
}
|
||||
#endif
|
||||
|
||||
return out;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Get color lerp interpolation between two colors, factor [0.0f..1.0f]
|
||||
|
||||
Reference in New Issue
Block a user