From e465ed0850106a3574d01363874ae49ef7e478c9 Mon Sep 17 00:00:00 2001 From: Dane Madsen Date: Wed, 24 May 2023 17:22:51 +1000 Subject: [PATCH] Added ImageRotate (#3078) * Added ImageRotate * Quick rename of the example * Update ImageRotate by changing doubles to floats and checking code convention * Update API --- examples/Makefile | 1 + examples/textures/textures_image_rotate.c | 79 +++ examples/textures/textures_image_rotate.png | Bin 0 -> 24060 bytes parser/output/raylib_api.json | 15 + parser/output/raylib_api.lua | 9 + parser/output/raylib_api.txt | 498 +++++++++--------- parser/output/raylib_api.xml | 6 +- projects/Geany/raylib.c.tags | 1 + .../raylib_npp_parser/raylib_npp.xml | 6 + .../raylib_npp_parser/raylib_to_parse.h | 1 + src/raylib.h | 1 + src/rtextures.c | 59 +++ 12 files changed, 429 insertions(+), 247 deletions(-) create mode 100644 examples/textures/textures_image_rotate.c create mode 100644 examples/textures/textures_image_rotate.png diff --git a/examples/Makefile b/examples/Makefile index cc9ef2395..c2ea35bf4 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -453,6 +453,7 @@ TEXTURES = \ textures/textures_image_generation \ textures/textures_image_loading \ textures/textures_image_processing \ + textures/textures_image_rotate \ textures/textures_image_text \ textures/textures_to_image \ textures/textures_raw_data \ diff --git a/examples/textures/textures_image_rotate.c b/examples/textures/textures_image_rotate.c new file mode 100644 index 000000000..a590e1e0a --- /dev/null +++ b/examples/textures/textures_image_rotate.c @@ -0,0 +1,79 @@ +/******************************************************************************************* +* +* raylib [textures] example - Image Rotation +* +* Example originally created with raylib 1.0, last time updated with raylib 1.0 +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#define NUM_TEXTURES 3 + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [textures] example - texture rotation"); + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + Image image45 = LoadImage("resources/raylib_logo.png"); + Image image90 = LoadImage("resources/raylib_logo.png"); + Image imageNeg90 = LoadImage("resources/raylib_logo.png"); + + ImageRotate(&image45, 45); + ImageRotate(&image90, 90); + ImageRotate(&imageNeg90, -90); + + Texture2D textures[NUM_TEXTURES] = { 0 }; + + textures[0] = LoadTextureFromImage(image45); + textures[1] = LoadTextureFromImage(image90); + textures[2] = LoadTextureFromImage(imageNeg90); + + int currentTexture = 0; + //--------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) || IsKeyPressed(KEY_RIGHT)) + { + currentTexture = (currentTexture + 1)%NUM_TEXTURES; // Cycle between the textures + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawTexture(textures[currentTexture], screenWidth/2 - textures[currentTexture].width/2, screenHeight/2 - textures[currentTexture].height/2, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + for (int i = 0; i < NUM_TEXTURES; i++) UnloadTexture(textures[i]); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/textures/textures_image_rotate.png b/examples/textures/textures_image_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..64bbc54e496f4587e2609a58cea3ceee637123d1 GIT binary patch literal 24060 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 - + @@ -1685,6 +1685,10 @@ + + + + diff --git a/projects/Geany/raylib.c.tags b/projects/Geany/raylib.c.tags index 4cc6d4605..79a192a14 100644 --- a/projects/Geany/raylib.c.tags +++ b/projects/Geany/raylib.c.tags @@ -202,6 +202,7 @@ ImageDrawText|void|(Image *dst, Vector2 position, const char *text, int fontSize ImageDrawTextEx|void|(Image *dst, Vector2 position, Font font, const char *text, float fontSize, float spacing, Color color);| ImageFlipVertical|void|(Image *image);| ImageFlipHorizontal|void|(Image *image);| +ImageRotate|void|(Image *image, int degrees);| ImageRotateCW|void|(Image *image);| ImageRotateCCW|void|(Image *image);| ImageColorTint|void|(Image *image, Color color);| diff --git a/projects/Notepad++/raylib_npp_parser/raylib_npp.xml b/projects/Notepad++/raylib_npp_parser/raylib_npp.xml index 7e173a936..883183cef 100644 --- a/projects/Notepad++/raylib_npp_parser/raylib_npp.xml +++ b/projects/Notepad++/raylib_npp_parser/raylib_npp.xml @@ -1570,6 +1570,12 @@ + + + + + + diff --git a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h index f20f065e3..c32cdb26e 100644 --- a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h +++ b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h @@ -346,6 +346,7 @@ RLAPI void ImageMipmaps(Image *image); RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI void ImageFlipVertical(Image *image); // Flip image vertically RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint diff --git a/src/raylib.h b/src/raylib.h index 703e70c21..b2b825831 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1268,6 +1268,7 @@ RLAPI void ImageMipmaps(Image *image); RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) RLAPI void ImageFlipVertical(Image *image); // Flip image vertically RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint diff --git a/src/rtextures.c b/src/rtextures.c index eeeebba82..b5e2a7f7a 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -2118,6 +2118,65 @@ void ImageFlipHorizontal(Image *image) } } +// Rotate image in degrees +void ImageRotate(Image *image, int degrees) +{ + // Security check to avoid program crash + if ((image->data == NULL) || (image->width == 0) || (image->height == 0)) return; + + if (image->mipmaps > 1) TRACELOG(LOG_WARNING, "Image manipulation only applied to base mipmap level"); + if (image->format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) TRACELOG(LOG_WARNING, "Image manipulation not supported for compressed formats"); + else + { + float rad = degrees * PI / 180.0f; + float sinRadius = sin(rad); + float cosRadius = cos(rad); + + int width = abs(image->width * cosRadius) + abs(image->height * sinRadius); + int height = abs(image->height * cosRadius) + abs(image->width * sinRadius); + + int bytesPerPixel = GetPixelDataSize(1, 1, image->format); + unsigned char *rotatedData = (unsigned char *)RL_CALLOC(width * height, bytesPerPixel); + + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + float oldX = ((x - width / 2.0f) * cosRadius + (y - height / 2.0f) * sinRadius) + image->width / 2.0f; + float oldY = ((y - height / 2.0f) * cosRadius - (x - width / 2.0f) * sinRadius) + image->height / 2.0f; + + if (oldX >= 0 && oldX < image->width && oldY >= 0 && oldY < image->height) + { + int x1 = (int)floor(oldX); + int y1 = (int)floor(oldY); + int x2 = MIN(x1 + 1, image->width - 1); + int y2 = MIN(y1 + 1, image->height - 1); + + float px = oldX - x1; + float py = oldY - y1; + + for (int i = 0; i < bytesPerPixel; i++) + { + float f1 = ((unsigned char *)image->data)[(y1 * image->width + x1) * bytesPerPixel + i]; + float f2 = ((unsigned char *)image->data)[(y1 * image->width + x2) * bytesPerPixel + i]; + float f3 = ((unsigned char *)image->data)[(y2 * image->width + x1) * bytesPerPixel + i]; + float f4 = ((unsigned char *)image->data)[(y2 * image->width + x2) * bytesPerPixel + i]; + + float val = f1 * (1 - px) * (1 - py) + f2 * px * (1 - py) + f3 * (1 - px) * py + f4 * px * py; + + rotatedData[(y * width + x) * bytesPerPixel + i] = (unsigned char)val; + } + } + } + } + + RL_FREE(image->data); + image->data = rotatedData; + image->width = width; + image->height = height; + } +} + // Rotate image clockwise 90deg void ImageRotateCW(Image *image) {