aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-03-22 10:40:06 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-03-22 10:40:06 -0700
commit406c106b0cd88375f5f7f9ccdc9feea6e8f834c6 (patch)
tree60e909ad39e6183e87b6f7d01518538a9d43defd
parent809724a0c49f24d672e17f24fd90bdab9d479586 (diff)
save the canvas in preloadedImages, and do canvas blits in IMG_Load etc.
-rwxr-xr-xemcc2
-rw-r--r--src/library_sdl.js16
-rw-r--r--tests/sdl_image.c3
3 files changed, 11 insertions, 10 deletions
diff --git a/emcc b/emcc
index a4263dc6..f4b22097 100755
--- a/emcc
+++ b/emcc
@@ -899,7 +899,7 @@ try:
canvas.height = img.height;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
- preloadedImages['%(filename)s'] = ctx.getImageData(0, 0, canvas.width, canvas.height);
+ preloadedImages['%(filename)s'] = canvas;
window.URL.revokeObjectURL(url);
removeRunDependency();
};
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 1551e83d..ca674049 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -442,8 +442,14 @@ mergeInto(LibraryManager.library, {
assert(!srcrect && !dstrect); // TODO
var srcData = SDL.surfaces[src];
var dstData = SDL.surfaces[dst];
- assert(srcData.width === dstData.width && srcData.height === dstData.height);
- {{{ makeCopyValues('dstData.buffer', 'srcData.buffer', 'srcData.width*srcData.height*4', 'i8', null, 1) }}}
+ assert(!!srcData.locked == !!dstData.locked); // we support the case of both locked or both not locked
+ if (srcData.locked) {
+ // Just support blitting everything
+ 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);
+ }
return 0;
},
@@ -522,10 +528,8 @@ mergeInto(LibraryManager.library, {
var raw = preloadedImages[filename];
assert(raw, 'Cannot find preloaded image ' + filename);
var surf = SDL.makeSurface(raw.width, raw.height, 0);
- // XXX Extremely inefficient!
- for (var i = 0; i < raw.width*raw.height*4; i++) {
- {{{ makeSetValue('SDL.surfaces[surf].buffer', 'i', 'raw.data[i]', 'i8') }}}
- }
+ var surfData = SDL.surfaces[surf];
+ surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height);
return surf;
},
diff --git a/tests/sdl_image.c b/tests/sdl_image.c
index 3f55374f..89bf1122 100644
--- a/tests/sdl_image.c
+++ b/tests/sdl_image.c
@@ -7,8 +7,6 @@ int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface *screen = SDL_SetVideoMode(600, 450, 32, SDL_SWSURFACE);
- if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen);
-
SDL_Surface *image = IMG_Load("screenshot.jpg");
if (!image)
{
@@ -18,7 +16,6 @@ int main() {
SDL_BlitSurface (image, NULL, screen, NULL);
SDL_FreeSurface (image);
- if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
SDL_Flip(screen);
printf("you should see an image.\n");