aboutsummaryrefslogtreecommitdiff
path: root/src/library_sdl.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-03-22 11:06:57 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-03-22 11:06:57 -0700
commit49ea19d7525d8ab126917594ec86aac51dad684d (patch)
tree0c0a49f5f58243081d7f572dfdd4eeb6548986ea /src/library_sdl.js
parent40136f51eac6ecb0dd7df09beef4833ecd2cb345 (diff)
beginnings of rects in SDL blitting
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r--src/library_sdl.js36
1 files changed, 27 insertions, 9 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 59625089..8123f1fe 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -136,6 +136,15 @@ mergeInto(LibraryManager.library, {
])
},
+ loadRect: function(rect) {
+ return {
+ x: {{{ makeGetValue('rect + SDL.structs.Rect.x', '0', 'i32') }}},
+ y: {{{ makeGetValue('rect + SDL.structs.Rect.y', '0', 'i32') }}},
+ w: {{{ makeGetValue('rect + SDL.structs.Rect.w', '0', 'i32') }}},
+ h: {{{ makeGetValue('rect + SDL.structs.Rect.h', '0', 'i32') }}}
+ };
+ },
+
makeSurface: function(width, height, flags, usePageCanvas) {
flags = flags || 0;
var surf = _malloc(14*Runtime.QUANTUM_SIZE); // SDL_Surface has 14 fields of quantum size
@@ -439,34 +448,43 @@ mergeInto(LibraryManager.library, {
},
SDL_UpperBlit: function(src, srcrect, dst, dstrect) {
- assert(!srcrect && !dstrect); // TODO
var srcData = SDL.surfaces[src];
var dstData = SDL.surfaces[dst];
- assert(!!srcData.locked == !!dstData.locked); // we support the case of both locked or both not locked
+ assert(!srcData.locked && !dstData.locked); // SDL does not allow blitting on locked surfaces
if (srcData.locked) {
// Just support blitting everything
+ assert(!srcrect && !dstrect);
assert(srcData.width === dstData.width && srcData.height === dstData.height);
{{{ makeCopyValues('dstData.buffer', 'srcData.buffer', 'srcData.width*srcData.height*4', 'i8', null, 1) }}}
} else {
- dstData.ctx.drawImage(srcData.canvas, 0, 0, srcData.width, srcData.height, 0, 0, dstData.width, dstData.height);
+ var sr, dr;
+ if (srcrect) {
+ sr = SDL.loadRect(srcrect);
+ } else {
+ sr = { x: 0, y: 0, w: srcData.width, h: srcData.height };
+ }
+ if (dstrect) {
+ dr = SDL.loadRect(dstrect);
+ } else {
+ dr = { x: 0, y: 0, w: -1, h: -1 };
+ }
+ dstData.ctx.drawImage(srcData.canvas, sr.x, sr.y, sr.w, sr.h, dr.x, dr.y, sr.w, sr.h);
}
return 0;
},
SDL_FillRect: function(surf, rect, color) {
+ console.log('WARNING: SDL_FillRect not optimized yet');
var surfData = SDL.surfaces[surf];
var c1 = color & 0xff;
var c2 = (color >> 8) & 0xff;
var c3 = (color >> 16) & 0xff;
- var rx = {{{ makeGetValue('rect + SDL.structs.Rect.x', '0', 'i16') }}};
- var ry = {{{ makeGetValue('rect + SDL.structs.Rect.y', '0', 'i16') }}};
- var rw = {{{ makeGetValue('rect + SDL.structs.Rect.w', '0', 'i16') }}};
- var rh = {{{ makeGetValue('rect + SDL.structs.Rect.h', '0', 'i16') }}};
+ var r = SDL.loadRect(rect);
var data = surfData.image.data;
var width = surfData.width;
- for (var y = ry; y < ry + rh; y++) {
+ for (var y = r.y; y < r.y + r.h; y++) {
var base = y*width*4;
- for (var x = rx; x < rx + rw; x++) {
+ for (var x = r.x; x < r.x + r.w; x++) {
var start = x*4 + base;
data[start] = c1;
data[start+1] = c2;