浏览代码

Add accelerated horizontal and vertical line drawing.
Change draw rectangle to use drawHline, should speed it a bit
Added conditions in drawLine to use drawHLine/drawVline when it try to
draw a straight line for a small speed boost.

Godzil 3 年之前
父节点
当前提交
2f1fca0780
共有 3 个文件被更改,包括 54 次插入22 次删除
  1. 52 19
      source/display.c
  2. 2 2
      source/include/display.h
  3. 0 1
      source/main.c

+ 52 - 19
source/display.c

@@ -29,6 +29,8 @@ uint32_t windowHeight = 600;
 /***********************************************************************************************************************
  * Functions
  **********************************************************************************************************************/
+#define MAX(_a, _b) ((_a) < (_b)) ? (_b) : (_a)
+#define MIN(_a, _b) ((_a) > (_b)) ? (_b) : (_a)
 
 bool initialiseWindow(bool fullScreen)
 {
@@ -108,6 +110,40 @@ void drawPixel(uint32_t x, uint32_t y, uint32_t colour)
     }
 }
 
+void drawVLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour)
+{
+    uint32_t i;
+    if (y0 > y1) { i = y0; y1 = y0; y0 = i; }
+
+    x = MIN(MAX(x, 0), windowWidth);
+    y0 = MAX(0, y0);
+    y1 = MIN(y1, windowHeight);
+
+    uint32_t *currentPos = &frameBuffer[x + (y0 * windowWidth)];
+
+    for(i = y0; i < y1; i++, currentPos+=windowWidth)
+    {
+        *currentPos = colour;
+    }
+}
+
+void drawHLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour)
+{
+    uint32_t i;
+    if (x0 > x1) { i = x0; x1 = x0; x0 = i; }
+
+    x0 = MAX(0, x0);
+    x1 = MIN(x1, windowWidth);
+    y = MIN(MAX(y, 0), windowHeight);
+
+    uint32_t *currentPos = &frameBuffer[x0 + (y * windowWidth)];
+
+    for(i = x0; i < x1; i++, currentPos++)
+    {
+        *currentPos = colour;
+    }
+}
+
 void clearFrameBuffer(uint32_t colour)
 {
     uint32_t x, y;
@@ -137,14 +173,11 @@ void drawGrid(int spacing, uint32_t colour)
 
 void drawRectangle(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t colour)
 {
-    uint32_t i, j;
-
+    uint32_t j;
+    
     for (j = 0 ; j < h ; j++)
     {
-        for (i = 0 ; i < w ; i++)
-        {
-            drawPixel(x + i, y + j, colour);
-        }
+        drawHLine(x, y + j, x + w, colour);
     }
 }
 
@@ -159,25 +192,25 @@ void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colou
     double incrementX = deltaX / (double)sideLength;
     double incrementY = deltaY / (double)sideLength;
 
-#if 0
     if (deltaX == 0)
     {
-        drawHLine()
+        drawVLine(x0, y0, y1, colour);
     }
-    if (deltaY == 0)
+    else if (deltaY == 0)
     {
-        drawVLine()
+        drawHLine(x0, y0, x1, colour);
     }
-#endif
-
-    double currentX = x0;
-    double currentY = y0;
-
-    for(i = 0 ; i < sideLength ; i++)
+    else
     {
-        drawPixel(round(currentX), round(currentY), colour);
-        currentX += incrementX;
-        currentY += incrementY;
+        double currentX = x0;
+        double currentY = y0;
+
+        for (i = 0 ; i < sideLength ; i++)
+        {
+            drawPixel(round(currentX), round(currentY), colour);
+            currentX += incrementX;
+            currentY += incrementY;
+        }
     }
 }
 

+ 2 - 2
source/include/display.h

@@ -44,8 +44,8 @@ void drawPixel(uint32_t x, uint32_t y, uint32_t colour);
 void clearFrameBuffer(uint32_t colour);
 void drawGrid(int spacing, uint32_t colour);
 void drawRectangle(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t colour);
-//void drawHLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour);
-//void drawVLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour);
+void drawVLine(uint32_t x, uint32_t y0, uint32_t y1, uint32_t colour);
+void drawHLine(uint32_t x0, uint32_t y, uint32_t x1, uint32_t colour);
 void drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colour);
 void drawTriangle(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t colour);
 

+ 0 - 1
source/main.c

@@ -166,7 +166,6 @@ void render()
                      0xFF00FFFF);
     }
 
-
     renderFrameBuffer();
     clearFrameBuffer(0xFF000000);