From 23101e3dee59ee6f1e8604a06985a683b81acaf6 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Sun, 13 Jul 2008 22:25:11 +0000 Subject: Bugfix: Triangle AA at low resolutions. svn-id: r33047 --- graphics/VectorRenderer.cpp | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) (limited to 'graphics/VectorRenderer.cpp') diff --git a/graphics/VectorRenderer.cpp b/graphics/VectorRenderer.cpp index 19a4f75058..b5722c2f64 100644 --- a/graphics/VectorRenderer.cpp +++ b/graphics/VectorRenderer.cpp @@ -33,6 +33,8 @@ #include "gui/ThemeRenderer.h" #include "graphics/VectorRenderer.h" +#define VECTOR_RENDERER_FAST_TRIANGLES + namespace Graphics { VectorRenderer *createRenderer(int mode) { @@ -391,6 +393,12 @@ drawRoundedSquare(int x, int y, int r, int w, int h) { template void VectorRendererSpec:: drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) { + // Awesome hack: the AA messes up the last pixel triangles if their width is even + // ...fix the width instead of fixing the AA :p + if (w % 2 == 0) { + w++; h++; + } + if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h) return; @@ -643,7 +651,8 @@ template void VectorRendererSpec:: drawTriangleFast(int x1, int y1, int size, bool inverted, PixelType color, VectorRenderer::FillMode fill_m) { int pitch = Base::surfacePitch(); - int hstep = 0; + int hstep = 0, dy = size; + bool grad = (fill_m == kFillGradient); PixelType *ptr_right = 0, *ptr_left = 0; @@ -656,15 +665,28 @@ drawTriangleFast(int x1, int y1, int size, bool inverted, PixelType color, Vecto pitch = -pitch; } - while (ptr_left != ptr_right) { - colorFill(ptr_left, ptr_right, color); - ptr_left += pitch; - ptr_right += pitch; - if (hstep++ % 3) { - ptr_left++; - ptr_right--; - } - } + if (fill_m == kFillDisabled) { + while (ptr_left < ptr_right) { + *ptr_left = color; + *ptr_right = color; + ptr_left += pitch; + ptr_right += pitch; + if (hstep++ % 2) { + ptr_left++; + ptr_right--; + } + } + } else { + while (ptr_left < ptr_right) { + colorFill(ptr_left, ptr_right, grad ? calcGradient(dy--, size) : color); + ptr_left += pitch; + ptr_right += pitch; + if (hstep++ % 2) { + ptr_left++; + ptr_right--; + } + } + } } /** ROUNDED SQUARE ALGORITHM **/ -- cgit v1.2.3