diff --git a/sww/include/sww/color.h b/sww/include/sww/color.h index 097b452..22abb2e 100644 --- a/sww/include/sww/color.h +++ b/sww/include/sww/color.h @@ -53,7 +53,7 @@ enum { kViolet = Color_RGB(140, 0, 255), // Violet kBlack = Color_RGB(0, 0, 0), // Black - kWhite = Color_RGB(255, 255, 255), // Black + kWhite = Color_RGB(255, 255, 255), // White }; /* r = c1 * (1 - c2.alpha) + c2 * c2.alpha */ diff --git a/sww/source/perf_monitor.c b/sww/source/perf_monitor.c index eeb9427..608f668 100644 --- a/sww/source/perf_monitor.c +++ b/sww/source/perf_monitor.c @@ -9,9 +9,9 @@ swwPerfMonitor *swwPerfMonitor_CreateWithCount(uint32_t value_count) { swwPerfMonitor *o = (swwPerfMonitor *)malloc(sizeof(swwPerfMonitor) + sizeof(float) * value_count); o->cursor = 0; - o->count = 0; + o->count = 1; o->capacity = value_count; - o->average_value = 0.f; + o->sum = 0.000001f; memset(o->values, 0, sizeof(float) * value_count); return o; @@ -21,16 +21,18 @@ void swwPerfMonitor_Destroy(swwPerfMonitor *o) { free(o); } void swwPerfMonitor_Update(swwPerfMonitor *o, float frame_time) { float prev = 0.f; - if (o->count <= o->capacity) { - o->count++; - } else { - prev = o->values[o->cursor]; + if (o->count == o->capacity) { + prev = o->values[(o->cursor + 1) % o->capacity]; } o->cursor = (o->cursor + 1) % o->capacity; o->values[o->cursor] = frame_time; - o->average_value += (frame_time - prev) / o->count; + o->sum += frame_time - prev; + + if (o->count < o->capacity) { + o->count++; + } } void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer, Point2i c, @@ -62,5 +64,4 @@ void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer, Point2i c, (Point2i){minx + w, MAX(maxy - pv, miny)}, kFgColor); } } - // printf("idx: %d, w: %d\n", idx, minx + w); } diff --git a/sww/source/perf_monitor.h b/sww/source/perf_monitor.h index 07343db..0fd12ec 100644 --- a/sww/source/perf_monitor.h +++ b/sww/source/perf_monitor.h @@ -12,7 +12,7 @@ typedef struct { uint32_t cursor; uint32_t capacity; uint32_t count; - float average_value; + float sum; float values[0]; } swwPerfMonitor; @@ -21,7 +21,7 @@ void swwPerfMonitor_Destroy(swwPerfMonitor *o); void swwPerfMonitor_Update(swwPerfMonitor *o, float frame_time); #define swwPerfMonitor_Create() swwPerfMonitor_CreateWithCount(30) -#define swwPerfMonitor_GetAverage(o) (o)->average_value +#define swwPerfMonitor_GetAverage(o) ((o)->sum / (o)->count) /* Draw the PerfMonitor as a layer on the canvas */ void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer, diff --git a/sww/source/renderer/software_renderer.c b/sww/source/renderer/software_renderer.c index 61d98ac..992b982 100644 --- a/sww/source/renderer/software_renderer.c +++ b/sww/source/renderer/software_renderer.c @@ -151,6 +151,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey, uint8_t *p; uint32_t idx = 4 * (width * y + x); + uint32_t offset = 4 * width; if (Color_HasAlpha(color)) { // do alpha-blend uint32_t c; for (; y <= ey; y++) { @@ -160,7 +161,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey, p[1] = (uint8_t)(c >> 8) & 0xff; p[2] = (uint8_t)(c >> 16) & 0xff; p[3] = (uint8_t)(c >> 24) & 0xff; - idx += width; + idx += offset; } } else { for (; y <= ey; y++) { @@ -169,7 +170,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey, p[1] = (uint8_t)(color >> 8) & 0xff; p[2] = (uint8_t)(color >> 16) & 0xff; p[3] = (uint8_t)(color >> 24) & 0xff; - idx += width; + idx += offset; } } } diff --git a/sww/test/shapes.c b/sww/test/shapes.c index 460c88c..9df8881 100644 --- a/sww/test/shapes.c +++ b/sww/test/shapes.c @@ -98,7 +98,7 @@ int main() { while (!swwApp_ShouldExit()) { if (ud.need_render) { swwRenderer_ClearBlack(ud.renderer); - i = (i + 1) % 7; + i = (i + 1) % 8; switch (i) { case 0: { swwRenderer_DrawEllipse(ud.renderer, (Point2i){cw, ch}, 100, 200, @@ -124,7 +124,13 @@ int main() { (Sizei){200, 36}, kOrange + Color_Alpha(0x80), 1); } break; - case 6: + case 6: { + swwRenderer_DrawLine(ud.renderer, (Point2i){120, 20}, + (Point2i){120, 200}, kViolet); + swwRenderer_DrawLine(ud.renderer, (Point2i){20, 120}, + (Point2i){200, 120}, kOrange); + } break; + case 7: default: { swwRenderer_DrawArc(ud.renderer, (Point2i){cw, ch}, 150, 30.f, 90.f, Color_RGB(0x00, 0x00, 0xff), 0);