WAGE: Implement drawBitmap

This commit is contained in:
Eugene Sandulenko 2015-12-18 11:26:33 +01:00
parent e112ffdf48
commit c00bd70f02
2 changed files with 64 additions and 2 deletions

View file

@ -92,11 +92,9 @@ void Design::paint(Graphics::Surface *canvas, Patterns &patterns, bool mask) {
case 20:
drawPolygon(canvas, in, mask, patterns, fillType, borderThickness, borderFillType);
break;
/*
case 24:
drawBitmap(canvas, in, mask);
break;
*/
default:
warning("Unknown type => %d", type);
while (true) {
@ -230,6 +228,68 @@ void Design::drawPolygon(Graphics::Surface *surface, Common::ReadStream &in, boo
free(ypoints);
}
void Design::drawBitmap(Graphics::Surface *surface, Common::ReadStream &in, bool mask) {
int numBytes = in.readSint16BE();
int y1 = in.readSint16BE();
int x1 = in.readSint16BE();
int y2 = in.readSint16BE();
int x2 = in.readSint16BE();
int w = x2 - x1;
int h = y2 - y1;
numBytes -= 10;
int x = 0, y = 0;
while (numBytes) {
int n = in.readSByte();
int count;
int b;
int state;
numBytes--;
if ((n >= 0) && (n <= 127)) { // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
count = n + 1;
state = 1;
} else if ((n >= -127) && (n <= -1)) { // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
b = in.readByte();
numBytes--;
count = -n + 1;
state = 2;
} else { // Else if n is -128, noop.
count = 0;
}
for (int i = 0; i < count; i++) {
byte color;
if (state == 1) {
color = in.readByte();
numBytes--;
} else if (state == 2)
color = b;
for (int c = 0; c < 8; c++) {
if (x1 + x >= 0 && x1 + x < surface->w && y1 + y >= 0 && y1 + y < surface->h)
*((byte *)surface->getBasePtr(x1 + x, y1 + y)) =
(color & (1 << (7 - c % 8))) ?
kColorBlack : kColorWhite;
x++;
if (x == w) {
y++;
if (y == h)
return;
x = 0;
break;
}
}
}
}
}
void Design::patternThickRect(Graphics::Surface *surface, Patterns &patterns, Common::Rect &outer,
Common::Rect &inner, byte borderFillType, byte fillType) {
patternRect(surface, patterns, outer, borderFillType);

View file

@ -87,6 +87,8 @@ private:
Patterns &patterns, byte fillType, byte borderThickness, byte borderFillType);
void drawOval(Graphics::Surface *surface, Common::ReadStream &in, bool mask,
Patterns &patterns, byte fillType, byte borderThickness, byte borderFillType);
void drawBitmap(Graphics::Surface *surface, Common::ReadStream &in, bool mask);
void patternThickRect(Graphics::Surface *surface, Patterns &patterns, Common::Rect &outer,
Common::Rect &inner, byte borderFillType, byte fillType);