aboutsummaryrefslogtreecommitdiff
path: root/graphics/surface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/surface.cpp')
-rw-r--r--graphics/surface.cpp51
1 files changed, 34 insertions, 17 deletions
diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index 88bdcfc822..cee8e61438 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -17,9 +17,6 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
*/
#include "common/algorithm.h"
@@ -45,8 +42,10 @@ void Surface::drawLine(int x0, int y0, int x1, int y1, uint32 color) {
Graphics::drawLine(x0, y0, x1, y1, color, plotPoint<byte>, this);
else if (format.bytesPerPixel == 2)
Graphics::drawLine(x0, y0, x1, y1, color, plotPoint<uint16>, this);
+ else if (format.bytesPerPixel == 4)
+ Graphics::drawLine(x0, y0, x1, y1, color, plotPoint<uint32>, this);
else
- error("Surface::drawLine: bytesPerPixel must be 1 or 2");
+ error("Surface::drawLine: bytesPerPixel must be 1, 2, or 4");
}
void Surface::create(uint16 width, uint16 height, const PixelFormat &f) {
@@ -91,12 +90,15 @@ void Surface::hLine(int x, int y, int x2, uint32 color) {
if (format.bytesPerPixel == 1) {
byte *ptr = (byte *)getBasePtr(x, y);
- memset(ptr, (byte)color, x2-x+1);
+ memset(ptr, (byte)color, x2 - x + 1);
} else if (format.bytesPerPixel == 2) {
uint16 *ptr = (uint16 *)getBasePtr(x, y);
- Common::set_to(ptr, ptr + (x2-x+1), (uint16)color);
+ Common::set_to(ptr, ptr + (x2 - x + 1), (uint16)color);
+ } else if (format.bytesPerPixel == 4) {
+ uint32 *ptr = (uint32 *)getBasePtr(x, y);
+ Common::set_to(ptr, ptr + (x2 - x + 1), color);
} else {
- error("Surface::hLine: bytesPerPixel must be 1 or 2");
+ error("Surface::hLine: bytesPerPixel must be 1, 2, or 4");
}
}
@@ -123,10 +125,17 @@ void Surface::vLine(int x, int y, int y2, uint32 color) {
uint16 *ptr = (uint16 *)getBasePtr(x, y);
while (y++ <= y2) {
*ptr = (uint16)color;
- ptr += pitch/2;
+ ptr += pitch / 2;
+ }
+
+ } else if (format.bytesPerPixel == 4) {
+ uint32 *ptr = (uint32 *)getBasePtr(x, y);
+ while (y++ <= y2) {
+ *ptr = color;
+ ptr += pitch / 4;
}
} else {
- error("Surface::vLine: bytesPerPixel must be 1 or 2");
+ error("Surface::vLine: bytesPerPixel must be 1, 2, or 4");
}
}
@@ -148,7 +157,7 @@ void Surface::fillRect(Common::Rect r, uint32 color) {
} else if (format.bytesPerPixel == 4) {
useMemset = false;
} else if (format.bytesPerPixel != 1) {
- error("Surface::fillRect: bytesPerPixel must be 1, 2 or 4");
+ error("Surface::fillRect: bytesPerPixel must be 1, 2, or 4");
}
if (useMemset) {
@@ -162,7 +171,7 @@ void Surface::fillRect(Common::Rect r, uint32 color) {
uint16 *ptr = (uint16 *)getBasePtr(r.left, r.top);
while (height--) {
Common::set_to(ptr, ptr + width, (uint16)color);
- ptr += pitch/2;
+ ptr += pitch / 2;
}
} else {
uint32 *ptr = (uint32 *)getBasePtr(r.left, r.top);
@@ -175,10 +184,10 @@ void Surface::fillRect(Common::Rect r, uint32 color) {
}
void Surface::frameRect(const Common::Rect &r, uint32 color) {
- hLine(r.left, r.top, r.right-1, color);
- hLine(r.left, r.bottom-1, r.right-1, color);
- vLine(r.left, r.top, r.bottom-1, color);
- vLine(r.right-1, r.top, r.bottom-1, color);
+ hLine(r.left, r.top, r.right - 1, color);
+ hLine(r.left, r.bottom - 1, r.right - 1, color);
+ vLine(r.left, r.top, r.bottom - 1, color);
+ vLine(r.right - 1, r.top, r.bottom - 1, color);
}
void Surface::move(int dx, int dy, int height) {
@@ -186,8 +195,8 @@ void Surface::move(int dx, int dy, int height) {
if ((dx == 0 && dy == 0) || height <= 0)
return;
- if (format.bytesPerPixel != 1 && format.bytesPerPixel != 2)
- error("Surface::move: bytesPerPixel must be 1 or 2");
+ if (format.bytesPerPixel != 1 && format.bytesPerPixel != 2 && format.bytesPerPixel != 4)
+ error("Surface::move: bytesPerPixel must be 1, 2, or 4");
byte *src, *dst;
int x, y;
@@ -226,6 +235,10 @@ void Surface::move(int dx, int dy, int height) {
*(uint16 *)dst = *(const uint16 *)src;
src -= 2;
dst -= 2;
+ } else if (format.bytesPerPixel == 4) {
+ *(uint32 *)dst = *(const uint32 *)src;
+ src -= 4;
+ dst -= 4;
}
}
src += pitch + (pitch - dx * format.bytesPerPixel);
@@ -243,6 +256,10 @@ void Surface::move(int dx, int dy, int height) {
*(uint16 *)dst = *(const uint16 *)src;
src += 2;
dst += 2;
+ } else if (format.bytesPerPixel == 4) {
+ *(uint32 *)dst = *(const uint32 *)src;
+ src += 4;
+ dst += 4;
}
}
src += pitch - (pitch + dx * format.bytesPerPixel);