1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-23 03:23:54 +00:00

More direct pixel functions.

This commit is contained in:
Nicolay Korslund 2010-09-19 12:36:19 +02:00
parent 593ac7b240
commit a05046026e
3 changed files with 53 additions and 1 deletions

View file

@ -7,7 +7,34 @@
using namespace Mangle::Rend2D; using namespace Mangle::Rend2D;
// This is a really crappy and slow implementation const SpriteData *SDL_Sprite::lock()
{
// Make sure we aren't already locked
assert(!data.pixels);
// Lock the surface and set up the data structure
SDL_LockSurface(surface);
data.pixels = surface->pixels;
data.w = surface->w;
data.h = surface->h;
data.pitch = surface->pitch;
data.bypp = surface->format->BytesPerPixel;
return &data;
}
void SDL_Sprite::unlock()
{
if(data.pixels)
{
SDL_UnlockSurface(surface);
data.pixels = NULL;
}
}
// This is a really crappy and slow implementation, only intended for
// testing purposes. Use lock/unlock for faster pixel drawing.
void SDL_Sprite::pixel(int x, int y, int color) void SDL_Sprite::pixel(int x, int y, int color)
{ {
SDL_LockSurface(surface); SDL_LockSurface(surface);
@ -83,6 +110,7 @@ SDL_Sprite::SDL_Sprite(SDL_Surface *s, bool autoDelete)
: surface(s), autoDel(autoDelete) : surface(s), autoDel(autoDelete)
{ {
assert(surface != NULL); assert(surface != NULL);
data.pixels = NULL;
} }
SDL_Sprite::~SDL_Sprite() SDL_Sprite::~SDL_Sprite()

View file

@ -37,10 +37,16 @@ namespace Mangle
// Set one pixel // Set one pixel
void pixel(int x, int y, int value); void pixel(int x, int y, int value);
const SpriteData *lock();
void unlock();
private: private:
// The SDL surface // The SDL surface
SDL_Surface* surface; SDL_Surface* surface;
// Used for locking
SpriteData data;
// If true, delete this surface when the canvas is destructed // If true, delete this surface when the canvas is destructed
bool autoDel; bool autoDel;
}; };

View file

@ -5,6 +5,17 @@ namespace Mangle
{ {
namespace Rend2D namespace Rend2D
{ {
/**
A pointer to sprite data for direct drawing. Only to be used
while the corresponding sprite is locked.
*/
struct SpriteData
{
void *pixels; // Pixel data
int w, h; // Width and height
int pitch, bypp; // Pitch (bytes) and bytes per pixel
};
/** /**
A Sprite is either a bitmap to be drawn or an output of area A Sprite is either a bitmap to be drawn or an output of area
for blitting other bitmaps, or both. They are created by the for blitting other bitmaps, or both. They are created by the
@ -33,6 +44,13 @@ namespace Mangle
/// format. This is not expected to be fast, and in some /// format. This is not expected to be fast, and in some
/// implementations may not work at all. /// implementations may not work at all.
virtual void pixel(int x, int y, int value) {} virtual void pixel(int x, int y, int value) {}
/// Lock sprite for direct drawing, and return a struct
/// containing the necessary pointer. When finished, unlock the
/// sprite with unlock(). May return NULL, if so then direct
/// drawing is not possible.
virtual const SpriteData *lock() { return NULL; }
virtual void unlock() {}
}; };
} }
} }