diff options
| author | Eugene Sandulenko | 2007-11-25 13:33:28 +0000 | 
|---|---|---|
| committer | Eugene Sandulenko | 2007-11-25 13:33:28 +0000 | 
| commit | 7844ad6f2c5499a1dfd9430cd57686ed36d908c9 (patch) | |
| tree | b278b727611302c700069833fadff382013fcd72 | |
| parent | 8151e1672f461f12467dd3b821ce32965a72159a (diff) | |
| download | scummvm-rg350-7844ad6f2c5499a1dfd9430cd57686ed36d908c9.tar.gz scummvm-rg350-7844ad6f2c5499a1dfd9430cd57686ed36d908c9.tar.bz2 scummvm-rg350-7844ad6f2c5499a1dfd9430cd57686ed36d908c9.zip | |
An attempt to implement thick line drawing.
svn-id: r29639
| -rw-r--r-- | engines/scumm/he/wiz_he.cpp | 14 | ||||
| -rw-r--r-- | graphics/primitives.cpp | 55 | ||||
| -rw-r--r-- | graphics/primitives.h | 1 | 
3 files changed, 64 insertions, 6 deletions
| diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp index 164cfef7f8..05052fcd2a 100644 --- a/engines/scumm/he/wiz_he.cpp +++ b/engines/scumm/he/wiz_he.cpp @@ -1789,14 +1789,16 @@ void Wiz::fillWizLine(const WizParameters *params) {  			int x2 = params->box2.right;  			int y2 = params->box2.bottom; +			drawProcP lineP; + +			lineP.imageRect = &imageRect; +			lineP.wizd = wizd; +			lineP.width = w; +  			if (params->processFlags & kWPFThickLine) { -				debug(0, "Unsupported ThickLine (%d, %d)", params->lineUnk1, params->lineUnk2); +				assert (params->lineUnk2 == 1); // Catch untested usage +				Graphics::drawThickLine(x1, y1, x2, y2, params->lineUnk1, color, drawProc, &lineP);  			} else { -				drawProcP lineP; - -				lineP.imageRect = &imageRect; -				lineP.wizd = wizd; -				lineP.width = w;  				Graphics::drawLine(x1, y1, x2, y2, color, drawProc, &lineP);  			} diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp index 9fdcb13b7b..85a0383ea9 100644 --- a/graphics/primitives.cpp +++ b/graphics/primitives.cpp @@ -64,4 +64,59 @@ void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, i  	}  } + +// FIXME: This is a limited version of thick line drawing +// it draws striped lines at some angles. Better algorithm could +// be found here: +// +//   http://homepages.enterprise.net/murphy/thickline/index.html +// +// Feel free to replace it with better implementation +void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, void (*plotProc)(int, int, int, void *), void *data) { +	const bool steep = ABS(y1 - y0) > ABS(x1 - x0); + +	if (steep) { +		SWAP(x0, y0); +		SWAP(x1, y1); +	} + +	float dx = x1 - x0; +	float dy = y1 - y0; +	float d = sqrtf(dx * dx + dy * dy); + +	if (!d) +        return; + +	int thickX = (int)((float)thickness * dy / d / 2); +	int thickY = (int)((float)thickness * dx / d / 2); + +	const int delta_x = ABS(x1 - x0); +	const int delta_y = ABS(y1 - y0); +	const int delta_err = delta_y; +	int x = x0; +	int y = y0; +	int err = 0; + +	const int x_step = (x0 < x1) ? 1 : -1; +	const int y_step = (y0 < y1) ? 1 : -1; + +	if (steep) +		drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); +	else +		drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); + +	while (x != x1) { +		x += x_step; +		err += delta_err; +		if (2 * err > delta_x) { +			y += y_step; +			err -= delta_x; +		} +		if (steep) +			drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); +		else +			drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); +	} +} +  }	// End of namespace Graphics diff --git a/graphics/primitives.h b/graphics/primitives.h index 2bc44d6644..0c96c1545a 100644 --- a/graphics/primitives.h +++ b/graphics/primitives.h @@ -28,6 +28,7 @@  namespace Graphics {  void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data); +void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, void (*plotProc)(int, int, int, void *), void *data);  }	// End of namespace Graphics | 
