[Scummvm-cvs-logs] SF.net SVN: scummvm: [32145] scummvm/branches/gsoc2008-gui
Tanoku at users.sourceforge.net
Tanoku at users.sourceforge.net
Fri May 16 22:40:24 CEST 2008
Revision: 32145
http://scummvm.svn.sourceforge.net/scummvm/?rev=32145&view=rev
Author: Tanoku
Date: 2008-05-16 13:40:24 -0700 (Fri, 16 May 2008)
Log Message:
-----------
- Shadows revisited
- Gradients.
Modified Paths:
--------------
scummvm/branches/gsoc2008-gui/dists/msvc9/scummvm.vcproj
scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp
scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h
Modified: scummvm/branches/gsoc2008-gui/dists/msvc9/scummvm.vcproj
===================================================================
--- scummvm/branches/gsoc2008-gui/dists/msvc9/scummvm.vcproj 2008-05-16 20:26:57 UTC (rev 32144)
+++ scummvm/branches/gsoc2008-gui/dists/msvc9/scummvm.vcproj 2008-05-16 20:40:24 UTC (rev 32145)
@@ -1303,10 +1303,24 @@
<File
RelativePath="..\..\graphics\VectorRenderer.cpp"
>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
</File>
<File
RelativePath="..\..\graphics\VectorRenderer.h"
>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ </FileConfiguration>
</File>
<Filter
Name="scaler"
Modified: scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp 2008-05-16 20:26:57 UTC (rev 32144)
+++ scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp 2008-05-16 20:40:24 UTC (rev 32145)
@@ -30,12 +30,33 @@
#include "common/system.h"
#include "common/events.h"
+inline uint32 fp_sqroot(uint32 x) {
+ register uint32 root, remHI, remLO, testDIV, count;
+
+ root = 0;
+ remHI = 0;
+ remLO = x;
+ count = 23;
+
+ do {
+ remHI = (remHI << 2) | (remLO >> 30);
+ remLO <<= 2;
+ root <<= 1;
+ testDIV = (root << 1) + 1;
+
+ if (remHI >= testDIV) {
+ remHI -= testDIV;
+ root++;
+ }
+ } while (count--);
+
+ return root;
+}
+
namespace Graphics {
-inline uint32 fp_sqroot(uint32 x);
-
VectorRenderer *createRenderer() {
- return new VectorRendererSpec<uint16, ColorMasks<565> >;
+ return new VectorRendererAA<uint16, ColorMasks<565> >;
}
@@ -59,19 +80,20 @@
_system->showOverlay();
while (true) { // draw!!
- vr->setFgColor(255, 255, 255);
+ vr->setFgColor(255, 0, 206);
vr->fillSurface();
- vr->setFgColor(255, 0, 0);
+ vr->setFgColor(255, 247, 222);
vr->setBgColor(25, 25, 175);
- vr->setFillMode(VectorRenderer::kForegroundFill);
- vr->setStrokeWidth(6);
+ vr->setGradientColors(206, 121, 99, 173, 40, 8);
+ vr->setFillMode(VectorRenderer::kGradientFill);
+ vr->setStrokeWidth(1);
vr->shadowEnable(1, 1);
vr->drawLine(25, 25, 125, 300);
vr->drawCircle(250, 250, 100);
vr->drawSquare(150, 25, 100, 75);
- vr->drawRoundedSquare(275, 25, 8, 100, 75);
+ vr->drawRoundedSquare(275, 25, 16, 128, 128);
_system->copyRectToOverlay((OverlayColor*)_screen.getBasePtr(0, 0), _screen.w, 0, 0, _screen.w, _screen.w);
_system->updateScreen();
@@ -90,21 +112,21 @@
void VectorRendererSpec<PixelType, PixelFormat>::
drawCircle(int x, int y, int r) {
if (Base::_fillMode != kNoFill && Base::_shadows) {
- drawCircleAlg(x + Base::_shadowXOffset + 1, y + Base::_shadowYOffset + 1, r, 0, true);
+ drawCircleAlg(x + Base::_shadowXOffset + 1, y + Base::_shadowYOffset + 1, r, 0, kForegroundFill);
}
switch(Base::_fillMode) {
case kNoFill:
- drawCircleAlg(x, y, r, _fgColor, false);
+ drawCircleAlg(x, y, r, _fgColor, kNoFill);
break;
case kForegroundFill:
- drawCircleAlg(x, y, r, _fgColor, true);
+ drawCircleAlg(x, y, r, _fgColor, kForegroundFill);
break;
case kBackgroundFill:
- VectorRendererSpec::drawCircleAlg(x, y, r, _bgColor, true);
- drawCircleAlg(x, y, r, _fgColor, false);
+ drawCircleAlg(x, y, r, _fgColor, kForegroundFill);
+ drawCircleAlg(x, y, r - Base::_strokeWidth, _bgColor, kBackgroundFill);
break;
case kGradientFill:
@@ -116,24 +138,26 @@
void VectorRendererSpec<PixelType, PixelFormat>::
drawSquare(int x, int y, int w, int h) {
if (Base::_fillMode != kNoFill && Base::_shadows) {
- drawSquareAlg(x + Base::_shadowXOffset + 1, y + Base::_shadowYOffset + 1, w, h, 0, true);
+ drawSquareShadow(x, y, w, h);
}
switch(Base::_fillMode) {
case kNoFill:
- drawSquareAlg(x, y, w, h, _fgColor, false);
+ drawSquareAlg(x, y, w, h, _fgColor, kNoFill);
break;
case kForegroundFill:
- drawSquareAlg(x, y, w, h, _fgColor, true);
+ drawSquareAlg(x, y, w, h, _fgColor, kForegroundFill);
break;
case kBackgroundFill:
- drawSquareAlg(x, y, w, h, _bgColor, true);
- drawSquareAlg(x, y, w, h, _fgColor, false);
+ drawSquareAlg(x, y, w, h, _bgColor, kBackgroundFill);
+ drawSquareAlg(x, y, w, h, _fgColor, kNoFill);
break;
case kGradientFill:
+ VectorRendererSpec::drawSquareAlg(x, y, w, h, 0, kGradientFill);
+ drawSquareAlg(x, y, w, h, _fgColor, kNoFill);
break;
}
}
@@ -142,37 +166,48 @@
void VectorRendererSpec<PixelType, PixelFormat>::
drawRoundedSquare(int x, int y, int r, int w, int h) {
if (Base::_fillMode != kNoFill && Base::_shadows) {
- drawRoundedSquareAlg(x + Base::_shadowXOffset + 1, y + Base::_shadowYOffset + 1, r, w, h, 0, true);
+ drawRoundedSquareShadow(x, y, r, w, h);
}
switch(Base::_fillMode) {
case kNoFill:
- drawRoundedSquareAlg(x, y, r, w, h, _fgColor, false);
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, kNoFill);
break;
case kForegroundFill:
- drawRoundedSquareAlg(x, y, r, w, h, _fgColor, true);
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, kForegroundFill);
break;
case kBackgroundFill:
- VectorRendererSpec::drawRoundedSquareAlg(x, y, r, w, h, _bgColor, true);
- drawRoundedSquareAlg(x, y, r, w, h, _fgColor, false);
+ VectorRendererSpec::drawRoundedSquareAlg(x, y, r, w, h, _bgColor, kBackgroundFill);
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, kNoFill);
break;
case kGradientFill:
+ if (Base::_strokeWidth > 1) {
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, kForegroundFill);
+ VectorRendererSpec::drawRoundedSquareAlg(x + Base::_strokeWidth/2, y + Base::_strokeWidth/2,
+ r - Base::_strokeWidth/2, w - Base::_strokeWidth, h - Base::_strokeWidth, 0, kGradientFill);
+ } else {
+ VectorRendererSpec::drawRoundedSquareAlg(x, y, r, w, h, 0, kGradientFill);
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, kNoFill);
+ }
break;
}
}
template<typename PixelType, typename PixelFormat>
void VectorRendererSpec<PixelType, PixelFormat>::
-drawSquareAlg(int x, int y, int w, int h, PixelType color, bool fill) {
-
+drawSquareAlg(int x, int y, int w, int h, PixelType color, FillMode fill_m) {
PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x, y);
int pitch = Base::surfacePitch();
+ int max_h = h;
- if (fill) {
+ if (fill_m != kNoFill) {
while (h--) {
+ if (fill_m == kGradientFill)
+ color = calcGradient(max_h - h, max_h);
+
Common::set_to(ptr, ptr + w, color);
ptr += pitch;
}
@@ -194,6 +229,43 @@
}
template<typename PixelType, typename PixelFormat>
+void VectorRendererSpec<PixelType, PixelFormat>::
+drawSquareShadow(int x, int y, int w, int h) {
+ int blur = 8;
+ PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x + w - 1, y + blur);
+ int pitch = Base::surfacePitch();
+ int i, j;
+
+ i = h - blur;
+
+ while (i--) {
+ j = blur;
+ while (j--)
+ blendPixelPtr(ptr + j, 0, ((blur - j) << 8) / blur);
+ ptr += pitch;
+ }
+
+ ptr = (PixelType *)_activeSurface->getBasePtr(x + blur, y + h - 1);
+
+ while (i++ < blur) {
+ j = w - blur;
+ while (j--)
+ blendPixelPtr(ptr + j, 0, ((blur - i) << 8) / blur);
+ ptr += pitch;
+ }
+
+ ptr = (PixelType *)_activeSurface->getBasePtr(x + w, y + h);
+
+ i = 0;
+ while (i++ < blur) {
+ j = blur - 1;
+ while (j--)
+ blendPixelPtr(ptr + j, 0, (((blur - j) * (blur - i)) << 8) / (blur * blur));
+ ptr += pitch;
+ }
+}
+
+template<typename PixelType, typename PixelFormat>
void VectorRendererSpec<PixelType,PixelFormat>::
drawLineAlg(int x1, int y1, int x2, int y2, int dx, int dy, PixelType color) {
PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x1, y1);
@@ -361,29 +433,6 @@
}
}
-inline uint32 fp_sqroot(uint32 x) {
- register uint32 root, remHI, remLO, testDIV, count;
-
- root = 0;
- remHI = 0;
- remLO = x;
- count = 23;
-
- do {
- remHI = (remHI << 2) | (remLO >> 30);
- remLO <<= 2;
- root <<= 1;
- testDIV = (root << 1) + 1;
-
- if (remHI >= testDIV) {
- remHI -= testDIV;
- root++;
- }
- } while (count--);
-
- return root;
-}
-
#define __BE_ALGORITHM() { \
if (f >= 0) { \
y--; \
@@ -416,13 +465,13 @@
template<typename PixelType, typename PixelFormat>
void VectorRendererSpec<PixelType, PixelFormat>::
-drawCircleAlg(int x1, int y1, int r, PixelType color, bool fill) {
+drawCircleAlg(int x1, int y1, int r, PixelType color, FillMode fill_m) {
int f, ddF_x, ddF_y;
int x, y, px, py, sw = 0;
int pitch = Base::surfacePitch();
PixelType *ptr = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
- if (fill == false) {
+ if (fill_m == kNoFill) {
while (sw++ < Base::_strokeWidth) {
__BE_RESET();
r--;
@@ -458,7 +507,13 @@
template<typename PixelType, typename PixelFormat>
void VectorRendererSpec<PixelType, PixelFormat>::
-drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, bool fill) {
+drawRoundedSquareShadow(int x1, int y1, int r, int w, int h) {
+
+}
+
+template<typename PixelType, typename PixelFormat>
+void VectorRendererSpec<PixelType, PixelFormat>::
+drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, FillMode fill_m) {
int f, ddF_x, ddF_y;
int x, y, px, py;
int pitch = Base::surfacePitch();
@@ -470,10 +525,11 @@
PixelType *ptr_br = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + h - r);
PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+ int real_radius = r;
int short_h = h - (2 * r) + 2;
- int real_radius = r;
+ int long_h = h;
- if (fill == false) {
+ if (fill_m == kNoFill) {
while (sw++ < Base::_strokeWidth) {
Common::set_to(ptr_fill + sp + r, ptr_fill + w + 1 + sp - r, color);
Common::set_to(ptr_fill + hp - sp + r, ptr_fill + w + hp + 1 - sp - r, color);
@@ -501,20 +557,34 @@
}
} else {
__BE_RESET();
- while (x++ < y) {
- __BE_ALGORITHM();
- Common::set_to(ptr_tl - x - py, ptr_tr + x - py, color);
- Common::set_to(ptr_tl - y - px, ptr_tr + y - px, color);
+ if (fill_m == kGradientFill) {
+ while (x++ < y) {
+ __BE_ALGORITHM();
+ Common::set_to(ptr_tl - x - py, ptr_tr + x - py, calcGradient(real_radius - y, long_h));
+ Common::set_to(ptr_tl - y - px, ptr_tr + y - px, calcGradient(real_radius - x, long_h));
- Common::set_to(ptr_bl - x + py, ptr_br + x + py, color);
- Common::set_to(ptr_bl - y + px, ptr_br + y + px, color);
+ Common::set_to(ptr_bl - x + py, ptr_br + x + py, calcGradient(long_h - r + y, long_h));
+ Common::set_to(ptr_bl - y + px, ptr_br + y + px, calcGradient(long_h - r + x, long_h));
+ }
+ } else {
+ while (x++ < y) {
+ __BE_ALGORITHM();
- __BE_DRAWCIRCLE(ptr_tr, ptr_tl, ptr_bl, ptr_br, x, y, px, py);
+ Common::set_to(ptr_tl - x - py, ptr_tr + x - py, color);
+ Common::set_to(ptr_tl - y - px, ptr_tr + y - px, color);
+
+ Common::set_to(ptr_bl - x + py, ptr_br + x + py, color);
+ Common::set_to(ptr_bl - y + px, ptr_br + y + px, color);
+
+ __BE_DRAWCIRCLE(ptr_tr, ptr_tl, ptr_bl, ptr_br, x, y, px, py);
+ }
}
ptr_fill += pitch * r;
while (short_h--) {
+ if (fill_m == kGradientFill)
+ color = calcGradient(real_radius++, long_h);
Common::set_to(ptr_fill, ptr_fill + w + 1, color);
ptr_fill += pitch;
}
@@ -545,7 +615,7 @@
template<typename PixelType, typename PixelFormat>
void VectorRendererAA<PixelType, PixelFormat>::
-drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, bool fill) {
+drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, FillMode fill_m) {
int x, y;
int p = Base::surfacePitch(), px, py;
int sw = 0, sp = 0, hp = h * p;
@@ -562,7 +632,7 @@
int short_h = h - 2 * r;
- if (fill == false) {
+ if (fill_m == kNoFill) {
while (sw++ < Base::_strokeWidth) {
Common::set_to(ptr_fill + sp + r, ptr_fill + w + 1 + sp - r, color);
Common::set_to(ptr_fill + hp - sp + r, ptr_fill + w + hp + 1 - sp - r, color);
@@ -614,7 +684,7 @@
template<typename PixelType, typename PixelFormat>
void VectorRendererAA<PixelType, PixelFormat>::
-drawCircleAlg(int x1, int y1, int r, PixelType color, bool fill) {
+drawCircleAlg(int x1, int y1, int r, PixelType color, FillMode fill_m) {
int x, y, sw = 0;
int p = Base::surfacePitch(), px, py;
@@ -624,7 +694,7 @@
PixelType *ptr = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
- if (fill == false) {
+ if (fill_m == kNoFill) {
while (sw++ < Base::_strokeWidth) {
x = r - (sw - 1); y = 0; T = 0;
px = p * x; py = 0;
@@ -662,4 +732,4 @@
}
}
-} // end of namespace Graphics
+} // end of namespace Graphics
\ No newline at end of file
Modified: scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h
===================================================================
--- scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h 2008-05-16 20:26:57 UTC (rev 32144)
+++ scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h 2008-05-16 20:40:24 UTC (rev 32145)
@@ -157,6 +157,8 @@
*/
virtual void setBgColor(uint8 r, uint8 g, uint8 b) = 0;
+ virtual void setGradientColors(uint8 r1, uint8 g1, uint8 b1, uint8 r2, uint8 g2, uint8 b2) = 0;
+
/**
* Sets the active drawing surface. All drawing from this
* point on will be done on that surface.
@@ -298,6 +300,15 @@
this->_bgColor = RGBToColor<PixelFormat>(r, g, b);
}
+ void setGradientColors(uint8 r1, uint8 g1, uint8 b1, uint8 r2, uint8 g2, uint8 b2) {
+ _gradientEnd = RGBToColor<PixelFormat>(r2, g2, b2);
+ _gradientStart = RGBToColor<PixelFormat>(r1, g1, b1);
+
+ _gradientBytes[0] = (_gradientEnd & PixelFormat::kRedMask) - (_gradientStart & PixelFormat::kRedMask);
+ _gradientBytes[1] = (_gradientEnd & PixelFormat::kGreenMask) - (_gradientStart & PixelFormat::kGreenMask);
+ _gradientBytes[2] = (_gradientEnd & PixelFormat::kBlueMask) - (_gradientStart & PixelFormat::kBlueMask);
+ }
+
/**
* @see VectorRenderer::fillSurface()
*/
@@ -342,6 +353,10 @@
putPixel(x, y, color);
}
+ virtual inline void blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha) {
+ *ptr = (PixelType)color;
+ }
+
/*
* "Bresenham's Line Algorithm", as described in Wikipedia.
* Based on the current implementation in "graphics/primitives.cpp".
@@ -350,12 +365,30 @@
* floating point operations and direct access to pixel buffer, assumes no special cases.
*/
virtual void drawLineAlg(int x1, int y1, int x2, int y2, int dx, int dy, PixelType color);
- virtual void drawCircleAlg(int x, int y, int r, PixelType color, bool fill = false);
- virtual void drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, bool fill = false);
- virtual void drawSquareAlg(int x, int y, int w, int h, PixelType color, bool fill = false);
+ virtual void drawCircleAlg(int x, int y, int r, PixelType color, FillMode fill_m);
+ virtual void drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, FillMode fill_m);
+ virtual void drawSquareAlg(int x, int y, int w, int h, PixelType color, FillMode fill_m);
+ virtual void drawSquareShadow(int x, int y, int w, int h);
+ virtual void drawRoundedSquareShadow(int x, int y, int r, int w, int h);
+ inline PixelType calcGradient(int pos, int max, int factor = 1) {
+ PixelType output = 0;
+ pos = (0x1000 * MIN(pos * factor, max)) / max;
+
+ output |= (_gradientStart + (_gradientBytes[0] * pos >> 12)) & PixelFormat::kRedMask;
+ output |= (_gradientStart + (_gradientBytes[1] * pos >> 12)) & PixelFormat::kGreenMask;
+ output |= (_gradientStart + (_gradientBytes[2] * pos >> 12)) & PixelFormat::kBlueMask;
+ output |= ~(PixelFormat::kRedMask | PixelFormat::kGreenMask | PixelFormat::kBlueMask);
+
+ return output;
+ }
+
PixelType _fgColor; /** Foreground color currently being used to draw on the renderer */
PixelType _bgColor; /** Background color currently being used to draw on the renderer */
+
+ PixelType _gradientStart;
+ PixelType _gradientEnd;
+ int _gradientBytes[3];
};
/**
@@ -396,7 +429,7 @@
* @param ptr Pointer to the pixel where we must draw
* @param alpha Intensity of the pixel (0-255).
*/
- inline void blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha);
+ inline virtual void blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha);
/**
* @see VectorRenderer::blendPixel()
@@ -420,9 +453,9 @@
*
* @see VectorRenderer::drawCircleAlg()
*/
- virtual void drawCircleAlg(int x, int y, int r, PixelType color, bool fill = false);
+ virtual void drawCircleAlg(int x, int y, int r, PixelType color, FillMode fill_m);
- virtual void drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, bool fill = false);
+ virtual void drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, FillMode fill_m);
};
} // end of namespace Graphics
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list