[Scummvm-cvs-logs] SF.net SVN: scummvm: [33076] scummvm/branches/gsoc2008-gui

Tanoku at users.sourceforge.net Tanoku at users.sourceforge.net
Tue Jul 15 20:53:22 CEST 2008


Revision: 33076
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33076&view=rev
Author:   Tanoku
Date:     2008-07-15 11:53:22 -0700 (Tue, 15 Jul 2008)

Log Message:
-----------
Tab widget / tab drawing for the renderer. Improved text handling.

Modified Paths:
--------------
    scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp
    scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h
    scummvm/branches/gsoc2008-gui/gui/ThemeDefaultXML.cpp
    scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp
    scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.cpp
    scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.h

Modified: scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.cpp	2008-07-15 18:53:22 UTC (rev 33076)
@@ -352,7 +352,7 @@
 void VectorRendererSpec<PixelType, PixelFormat>::
 drawRoundedSquare(int x, int y, int r, int w, int h) {
 	if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
-		w <= 0 || h <= 0 || x < 0 || y < 0 || r <= 0 || r > 128 || (r << 1) > w || (r << 1) > h)
+		w <= 0 || h <= 0 || x < 0 || y < 0 || (r << 1) > w || (r << 1) > h)
 		return;
 
 	if (Base::_fillMode != kFillDisabled && Base::_shadowOffset
@@ -392,6 +392,25 @@
 
 template<typename PixelType, typename PixelFormat>
 void VectorRendererSpec<PixelType, PixelFormat>::
+drawTab(int x, int y, int r, int w, int h) {
+	if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
+		w <= 0 || h <= 0 || x < 0 || y < 0 || (r << 1) > w || (r << 1) > h)
+		return;
+	
+	switch (Base::_fillMode) {
+		case kFillDisabled:
+			return;
+		
+		case kFillGradient:
+		case kFillForeground:
+		case kFillBackground:
+			drawTabAlg(x, y, w, h, r, (Base::_fillMode == kFillBackground) ? _bgColor : _fgColor, Base::_fillMode);
+			break;
+	}
+}
+
+template<typename PixelType, typename PixelFormat>
+void VectorRendererSpec<PixelType, PixelFormat>::
 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
@@ -421,7 +440,7 @@
 #ifdef VECTOR_RENDERER_FAST_TRIANGLES
 			if (w == h)
 				drawTriangleFast(x, y, w, (orient == kTriangleDown), color, Base::_fillMode);
-			else
+			else 
 #endif
 				drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), color, Base::_fillMode);
 			break;
@@ -445,6 +464,54 @@
 /********************************************************************
  * Aliased Primitive drawing ALGORITHMS - VectorRendererSpec
  ********************************************************************/
+/** TAB ALGORITHM - NON AA */
+template<typename PixelType, typename PixelFormat>
+void VectorRendererSpec<PixelType, PixelFormat>::
+drawTabAlg(int x1, int y1, int w, int h, int r, PixelType color, VectorRenderer::FillMode fill_m) {
+	int f, ddF_x, ddF_y;
+	int x, y, px, py;
+	int pitch = Base::surfacePitch();
+	
+	PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + r);
+	PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + r);
+	PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+
+	int real_radius = r;
+	int short_h = h - (r) + 2;
+	int long_h = h;
+
+	__BE_RESET();
+	PixelType color1, color2;
+	
+	if (fill_m == kFillForeground || fill_m == kFillBackground)
+		color1 = color2 = color;
+	
+	while (x++ < y) {
+		__BE_ALGORITHM();
+		
+		if (fill_m == kFillGradient) {
+			color1 = calcGradient(real_radius - x, long_h);
+			color2 = calcGradient(real_radius - y, long_h);
+		}
+		
+		colorFill(ptr_tl - x - py, ptr_tr + x - py, color2);
+		colorFill(ptr_tl - y - px, ptr_tr + y - px, color1);
+		
+		*(ptr_tr + (y) - (px)) = color;
+		*(ptr_tr + (x) - (py)) = color;
+		*(ptr_tl - (x) - (py)) = color;
+		*(ptr_tl - (y) - (px)) = color;
+	}
+		
+	ptr_fill += pitch * r;
+	while (short_h--) {
+		if (fill_m == kFillGradient)
+			color = calcGradient(real_radius++, long_h);
+		colorFill(ptr_fill, ptr_fill + w + 1, color);
+		ptr_fill += pitch;
+	}
+}
+
 /** SQUARE ALGORITHM **/
 template<typename PixelType, typename PixelFormat>
 void VectorRendererSpec<PixelType, PixelFormat>::

Modified: scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h
===================================================================
--- scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/graphics/VectorRenderer.h	2008-07-15 18:53:22 UTC (rev 33076)
@@ -192,6 +192,19 @@
 	 * @param bevel Amount of bevel. Must be positive.
 	 */
 	virtual void drawBeveledSquare(int x, int y, int w, int h, int bevel) = 0;
+	
+	/**
+	 * Draws a tab-like shape, specially thought for the Tab widget.
+	 * If a radius is given, the tab will have rounded corners. Otherwise,
+	 * the tab will be squared.
+	 *
+	 * @param x Horizontal (X) coordinate for the tab
+	 * @param y Vertical (Y) coordinate for the tab
+	 * @param w Width of the tab
+	 * @param h Height of the tab
+	 * @param r Radius of the corners of the tab (0 for squared tabs).
+	 */
+	virtual void drawTab(int x, int y, int r, int w, int h) = 0;
 
 	/**
 	 * Gets the pixel pitch for the current drawing surface.
@@ -460,6 +473,12 @@
 		stepGetPositions(step, area, x, y, w, h);
 		drawBeveledSquare(x, y, w, h, step.extraData);
 	}
+	
+	void drawCallback_TAB(const Common::Rect &area, const DrawStep &step) {
+		uint16 x, y, w, h;
+		stepGetPositions(step, area, x, y, w, h);
+		drawTab(x, y, stepGetRadius(step, area), w, h);
+	}
 
 	void drawCallback_VOID(const Common::Rect &area, const DrawStep &step) {}
 
@@ -553,6 +572,11 @@
 	 * @see VectorRenderer::drawTriangle()
 	 */
 	void drawTriangle(int x, int y, int base, int height, TriangleOrientation orient);
+	
+	/**
+	 * @see VectorRenderer::drawTab()
+	 */
+	void drawTab(int x, int y, int r, int w, int h);
 
 	void drawBeveledSquare(int x, int y, int w, int h, int bevel) {
 		drawBevelSquareAlg(x, y, w, h, bevel, _fgColor, _bgColor);
@@ -739,6 +763,7 @@
 	virtual void drawTriangleVertAlg(int x, int y, int w, int h, bool inverted, PixelType color, FillMode fill_m);
 	virtual void drawTriangleFast(int x, int y, int size, bool inverted, PixelType color, FillMode fill_m);
 	virtual void drawBevelSquareAlg(int x, int y, int w, int h, int bevel, PixelType top_color, PixelType bottom_color);
+	virtual void drawTabAlg(int x, int y, int w, int h, int r, PixelType color, VectorRenderer::FillMode fill_m);
 
 	/**
 	 * SHADOW DRAWING ALGORITHMS

Modified: scummvm/branches/gsoc2008-gui/gui/ThemeDefaultXML.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/gui/ThemeDefaultXML.cpp	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/gui/ThemeDefaultXML.cpp	2008-07-15 18:53:22 UTC (rev 33076)
@@ -61,6 +61,24 @@
 		"<drawstep func = 'roundedsq' stroke = 1 radius = 4 fill = 'none' fg_color = '255, 255, 255' />"
 	"</drawdata>"
 	
+	"<drawdata id = 'tab_active' cache = false>"
+		"<text vertical_align = 'center' horizontal_align = 'center' color = '255, 255, 255' />"
+		"<drawstep func = 'tab' radius = '8' stroke = '0' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' shadow = 3 />"
+	"</drawdata>"
+	
+	"<drawdata id = 'tab_inactive' cache = false>"
+		"<text vertical_align = 'center' horizontal_align = 'center' color = '255, 255, 255' />"
+		"<drawstep func = 'tab' radius = '8' stroke = '0' fill = 'foreground' fg_color = '206, 121, 99' shadow = 3 />"
+	"</drawdata>"
+	
+	"<drawdata id = 'slider_empty' cache = false>"
+		"<drawstep func = 'roundedsq' stroke = 1 radius = 8 fill = 'none' fg_color = '0, 0, 0' />"
+	"</drawdata>"
+	
+	"<drawdata id = 'slider_full' cache = false>"
+		"<drawstep func = 'roundedsq' stroke = 1 radius = 8 fill = 'gradient' fg_color = '0, 0, 0' gradient_start = '214, 113, 8' gradient_end = '240, 200, 25' />"
+	"</drawdata>"
+	
 	"<drawdata id = 'popup_idle' cache = false>"
 		"<drawstep func = 'square' stroke = 0 fg_color = '0, 0, 0' fill = 'gradient' gradient_start = '214, 113, 8' gradient_end = '240, 200, 25' shadow = 3 />"
 		"<drawstep func = 'triangle' fg_color = '0, 0, 0' fill = 'foreground' width = '12' height = '12' xpos = '-16' ypos = 'center' orientation = 'bottom' />"

Modified: scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/gui/ThemeParser.cpp	2008-07-15 18:53:22 UTC (rev 33076)
@@ -57,6 +57,7 @@
 	_drawFunctions["line"]  = &Graphics::VectorRenderer::drawCallback_LINE;
 	_drawFunctions["triangle"]  = &Graphics::VectorRenderer::drawCallback_TRIANGLE;
 	_drawFunctions["fill"]  = &Graphics::VectorRenderer::drawCallback_FILLSURFACE;
+	_drawFunctions["tab"]  = &Graphics::VectorRenderer::drawCallback_TAB;
 	_drawFunctions["void"]  = &Graphics::VectorRenderer::drawCallback_VOID;
 
 	_defaultStepGlobal = defaultDrawStep();
@@ -199,7 +200,7 @@
 	step.color.g = green;
 	step.color.b = blue;
 	step.color.set = true;
-
+	
 	_theme->addTextStep(parentNode->values["id"], step);
 	return true;
 }
@@ -407,7 +408,7 @@
 		assert(stepNode->values.contains("func"));
 		Common::String functionName = stepNode->values["func"];
 
-		if (functionName == "roundedsq" || functionName == "circle") {
+		if (functionName == "roundedsq" || functionName == "circle" || functionName == "tab") {
 			if (stepNode->values.contains("radius") && stepNode->values["radius"] == "auto") {
 				drawstep->radius = 0xFF;
 			} else {

Modified: scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.cpp
===================================================================
--- scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.cpp	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.cpp	2008-07-15 18:53:22 UTC (rev 33076)
@@ -60,7 +60,8 @@
 	"checkbox_enabled",
 	"checkbox_disabled",
 
-	"tab",
+	"tab_active",
+	"tab_inactive",
 
 	"scrollbar_base",
 	"scrollbar_handle",
@@ -322,7 +323,6 @@
 	drawDDText(dd, r, str);	
 
 	addDirtyRect(r);
-	debugWidgetPosition("BTN", r);
 }
 
 void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) {
@@ -331,8 +331,6 @@
 
 	drawDD(kDDSeparator, r);
 	addDirtyRect(r);
-
-	debugWidgetPosition("Separator", r);
 }
 
 void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) {
@@ -353,7 +351,6 @@
 	drawDDText(checked ? kDDCheckboxEnabled : kDDCheckboxDisabled, r2, str);
 
 	addDirtyRect(r);
-	debugWidgetPosition("Checkbox", r);
 }
 
 void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) {
@@ -368,7 +365,6 @@
 	drawDD(kDDSliderFull, r2);
 
 	addDirtyRect(r);
-	debugWidgetPosition("Slider", r);
 }
 
 void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState sb_state, WidgetStateInfo state) {
@@ -376,9 +372,9 @@
 		return;
 		
 	drawDD(kDDScrollbarBase, r);
+	// TODO: Need to find a scrollbar in the GUI for testing... :p
 	
-
-	debugWidgetPosition("SCB", r);
+	addDirtyRect(r);
 }
 
 void ThemeRenderer::drawDialogBackground(const Common::Rect &r, uint16 hints, WidgetStateInfo state) {
@@ -395,7 +391,7 @@
 		drawDD(kDDDefaultBackground, r);
 	}
 	
-	debugWidgetPosition("Background", r);
+	addDirtyRect(r);
 }
 
 void ThemeRenderer::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state) {
@@ -403,6 +399,7 @@
 		return;
 
 	debugWidgetPosition("Caret", r);
+	addDirtyRect(r);
 }
 
 void ThemeRenderer::drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, WidgetStateInfo state, TextAlign align) {
@@ -418,7 +415,7 @@
 		drawDDText(dd, text, sel);
 	}
 	
-	debugWidgetPosition("Popup Widget", r);
+	addDirtyRect(r);
 }
 
 void ThemeRenderer::drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans) {
@@ -450,14 +447,29 @@
 		break;
 	}
 	
-	debugWidgetPosition("Widget Background", r);
+	addDirtyRect(r);
 }
 
 void ThemeRenderer::drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state) {
 	if (!ready())
 		return;
+		
+	const int tabOffset = 1;
+	
+	for (int i = 0; i < (int)tabs.size(); ++i) {
+		if (i == active)
+			continue;
 
-	debugWidgetPosition("Tab widget", r);
+		Common::Rect tabRect(r.left + i * (tabWidth + tabOffset), r.top, r.left + i * (tabWidth + tabOffset) + tabWidth, r.top + tabHeight);
+		drawDD(kDDTabInactive, tabRect);
+		drawDDText(kDDTabInactive, tabRect, tabs[i]);
+	}
+	
+	if (active >= 0) {
+		Common::Rect tabRect(r.left + active * (tabWidth + tabOffset), r.top, r.left + active * (tabWidth + tabOffset) + tabWidth, r.top + tabHeight);
+		drawDD(kDDTabActive, tabRect);
+		drawDDText(kDDTabActive, tabRect, tabs[active]);
+	}
 }
 
 void ThemeRenderer::drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, TextAlign align, bool inverted, int deltax, bool useEllipsis, FontStyle font) {
@@ -470,11 +482,11 @@
 
 
 void ThemeRenderer::debugWidgetPosition(const char *name, const Common::Rect &r) {
-	// _font->drawString(_screen, name, r.left, r.top, r.width(), 0xFFFF, Graphics::kTextAlignRight, 0, true);
-	// _screen->hLine(r.left, r.top, r.right, 0xFFFF);
-	// _screen->hLine(r.left, r.bottom, r.right, 0xFFFF);
-	// _screen->vLine(r.left, r.top, r.bottom, 0xFFFF);
-	// _screen->vLine(r.right, r.top, r.bottom, 0xFFFF);
+	_font->drawString(_screen, name, r.left, r.top, r.width(), 0xFFFF, Graphics::kTextAlignRight, 0, true);
+	_screen->hLine(r.left, r.top, r.right, 0xFFFF);
+	_screen->hLine(r.left, r.bottom, r.right, 0xFFFF);
+	_screen->vLine(r.left, r.top, r.bottom, 0xFFFF);
+	_screen->vLine(r.right, r.top, r.bottom, 0xFFFF);
 }
 
 void ThemeRenderer::updateScreen() {

Modified: scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.h
===================================================================
--- scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.h	2008-07-15 17:13:06 UTC (rev 33075)
+++ scummvm/branches/gsoc2008-gui/gui/ThemeRenderer.h	2008-07-15 18:53:22 UTC (rev 33076)
@@ -102,7 +102,8 @@
 		kDDCheckboxEnabled,
 		kDDCheckboxDisabled,
 
-		kDDTab,
+		kDDTabActive,
+		kDDTabInactive,
 
 		kDDScrollbarBase,
 		kDDScrollbarHandle,


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