Browse Source

Added: `ImageDrawCircleLines`, `ImageDrawCircleLinesV` (#2713)

This adds `ImageDrawCircleLines()` and `ImageDrawCircleLinesV()` to draw outlines of circles, and updates `ImageDrawCircle()` draw a filled circle to match the effect of `DrawCircle()` and `DrawCircleLines()`.
Rob Loach 2 years ago
parent
commit
2093fdcc53
3 changed files with 36 additions and 5 deletions
  1. 1 1
      examples/textures/textures_image_drawing.c
  2. 2 0
      src/raylib.h
  3. 33 4
      src/rtextures.c

+ 1 - 1
examples/textures/textures_image_drawing.c

@@ -42,7 +42,7 @@ int main(void)
 
     // Draw on the image with a few image draw methods
     ImageDrawPixel(&parrots, 10, 10, RAYWHITE);
-    ImageDrawCircle(&parrots, 10, 10, 5, RAYWHITE);
+    ImageDrawCircleLines(&parrots, 10, 10, 5, RAYWHITE);
     ImageDrawRectangle(&parrots, 5, 20, 10, 10, RAYWHITE);
 
     UnloadImage(cat);       // Unload image from RAM

+ 2 - 0
src/raylib.h

@@ -1287,6 +1287,8 @@ RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX,
 RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color);                          // Draw line within an image (Vector version)
 RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color);               // Draw circle within an image
 RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color);                        // Draw circle within an image (Vector version)
+RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color);          // Draw circle outline within an image
+RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color);                   // Draw circle outline within an image (Vector version)
 RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color);       // Draw rectangle within an image
 RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color);                 // Draw rectangle within an image (Vector version)
 RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color);                                // Draw rectangle within an image

+ 33 - 4
src/rtextures.c

@@ -2716,7 +2716,36 @@ void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color)
 }
 
 // Draw circle within an image
-void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color)
+void ImageDrawCircle(Image* dst, int centerX, int centerY, int radius, Color color)
+{
+    int x = 0, y = radius;
+    int decesionParameter = 3 - 2 * radius;
+
+    while (y >= x)
+    {
+        ImageDrawRectangle(dst, centerX - x, centerY + y, x * 2, 1, color);
+        ImageDrawRectangle(dst, centerX - x, centerY - y, x * 2, 1, color);
+        ImageDrawRectangle(dst, centerX - y, centerY + x, y * 2, 1, color);
+        ImageDrawRectangle(dst, centerX - y, centerY - x, y * 2, 1, color);
+        x++;
+
+        if (decesionParameter > 0) {
+            y--;
+            decesionParameter = decesionParameter + 4 * (x - y) + 10;
+        } else {
+            decesionParameter = decesionParameter + 4 * x + 6;
+        }
+    }
+}
+
+// Draw circle within an image (Vector version)
+void ImageDrawCircleV(Image* dst, Vector2 center, int radius, Color color)
+{
+    ImageDrawCircle(dst, (int)center.x, (int)center.y, radius, color);
+}
+
+// Draw circle outline within an image
+void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color)
 {
     int x = 0, y = radius;
     int decesionParameter = 3 - 2*radius;
@@ -2742,10 +2771,10 @@ void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color col
     }
 }
 
-// Draw circle within an image (Vector version)
-void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color)
+// Draw circle outline within an image (Vector version)
+void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color)
 {
-    ImageDrawCircle(dst, (int)center.x, (int)center.y, radius, color);
+    ImageDrawCircleLines(dst, (int)center.x, (int)center.y, radius, color);
 }
 
 // Draw rectangle within an image