aboutsummaryrefslogtreecommitdiff
path: root/graphics/VectorRenderer.cpp
diff options
context:
space:
mode:
authorVicent Marti2008-07-13 10:50:57 +0000
committerVicent Marti2008-07-13 10:50:57 +0000
commit4cb2b8c3c43d26569960e271ac35e0dd9f4de5b4 (patch)
tree331ccedacdbceddb63d0e15eabd817d9150de80e /graphics/VectorRenderer.cpp
parent4539cdf2188d6461ecdc2fbc485d49eab1fb7311 (diff)
downloadscummvm-rg350-4cb2b8c3c43d26569960e271ac35e0dd9f4de5b4.tar.gz
scummvm-rg350-4cb2b8c3c43d26569960e271ac35e0dd9f4de5b4.tar.bz2
scummvm-rg350-4cb2b8c3c43d26569960e271ac35e0dd9f4de5b4.zip
Improved support for graphics positioning.
More widgets. New triangle drawing function. svn-id: r33027
Diffstat (limited to 'graphics/VectorRenderer.cpp')
-rw-r--r--graphics/VectorRenderer.cpp46
1 files changed, 43 insertions, 3 deletions
diff --git a/graphics/VectorRenderer.cpp b/graphics/VectorRenderer.cpp
index 8856386819..efdaea80c8 100644
--- a/graphics/VectorRenderer.cpp
+++ b/graphics/VectorRenderer.cpp
@@ -399,7 +399,12 @@ drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) {
switch(orient) {
case kTriangleUp:
case kTriangleDown:
- drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), color, Base::_fillMode);
+#ifdef VECTOR_RENDERER_FAST_TRIANGLES
+ if (w == h)
+ drawTriangleFast(x, y, w, (orient == kTriangleDown), color, Base::_fillMode);
+ else
+#endif
+ drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), color, Base::_fillMode);
break;
case kTriangleLeft:
@@ -408,8 +413,14 @@ drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) {
}
if (Base::_strokeWidth > 0)
- if (Base::_fillMode == kFillBackground || Base::_fillMode == kFillGradient)
- drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), _fgColor, kFillDisabled);
+ if (Base::_fillMode == kFillBackground || Base::_fillMode == kFillGradient) {
+#ifdef VECTOR_RENDERER_FAST_TRIANGLES
+ if (w == h)
+ drawTriangleFast(x, y, w, (orient == kTriangleDown), _fgColor, kFillDisabled);
+ else
+#endif
+ drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), _fgColor, kFillDisabled);
+ }
}
/********************************************************************
@@ -616,6 +627,35 @@ drawTriangleVertAlg(int x1, int y1, int w, int h, bool inverted, PixelType color
}
+/** VERTICAL TRIANGLE DRAWING - FAST VERSION FOR SQUARED TRIANGLES */
+template<typename PixelType, typename PixelFormat>
+void VectorRendererSpec<PixelType,PixelFormat>::
+drawTriangleFast(int x1, int y1, int size, bool inverted, PixelType color, VectorRenderer::FillMode fill_m) {
+ int pitch = Base::surfacePitch();
+ int hstep = 0;
+
+ PixelType *ptr_right = 0, *ptr_left = 0;
+
+ if (inverted) {
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x1, y1);
+ ptr_right = (PixelType *)_activeSurface->getBasePtr(x1 + size, y1);
+ } else {
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x1, y1 + size);
+ ptr_right = (PixelType *)_activeSurface->getBasePtr(x1 + size, y1 + size);
+ 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--;
+ }
+ }
+}
+
/** ROUNDED SQUARE ALGORITHM **/
template<typename PixelType, typename PixelFormat>
void VectorRendererSpec<PixelType, PixelFormat>::