aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-03-23 18:42:42 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-03-23 18:42:42 -0700
commit339ae3f79475fd15f2a479a2d65094777b982f03 (patch)
tree9d1c34e53f61bb0333c68ab4fa4da0bc2f38864f
parent3ca9645e0b214fce990f2cf63b9c3294fa6b0179 (diff)
optimize SDL_FillRect
-rw-r--r--src/library_sdl.js21
-rwxr-xr-xtests/runner.py8
-rw-r--r--tests/sdl_canvas.c (renamed from tests/sdl_font.c)20
3 files changed, 23 insertions, 26 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 21c1292e..f2faa028 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -154,6 +154,10 @@ mergeInto(LibraryManager.library, {
return 'rgb(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ')';
},
+ translateColorToCSS: function(rgba) {
+ return 'rgb(' + ((rgba >> 24)&255) + ',' + ((rgba >> 16)&255) + ',' + ((rgba >> 8)&255) + ')';
+ },
+
makeSurface: function(width, height, flags, usePageCanvas, source) {
flags = flags || 0;
var surf = _malloc(14*Runtime.QUANTUM_SIZE); // SDL_Surface has 14 fields of quantum size
@@ -503,21 +507,10 @@ mergeInto(LibraryManager.library, {
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;
+ assert(!surfData.locked); // but we could unlock and re-lock if we must..
var r = SDL.loadRect(rect);
- var data = surfData.image.data;
- var width = surfData.width;
- for (var y = r.y; y < r.y + r.h; y++) {
- var base = y*width*4;
- for (var x = r.x; x < r.x + r.w; x++) {
- var start = x*4 + base;
- data[start] = c1;
- data[start+1] = c2;
- data[start+2] = c3;
- }
- }
+ surfData.ctx.fillStyle = SDL.translateColorToCSS(color);
+ surfData.ctx.fillRect(r.x, r.y, r.w, r.h);
},
SDL_BlitSurface__deps: ['SDL_UpperBlit'],
diff --git a/tests/runner.py b/tests/runner.py
index 7691d41b..bf4161da 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -6375,11 +6375,11 @@ f.close()
shutil.move(os.path.join(self.get_dir(), basename), basename + '.renamedsoitcannotbefound');
self.run_browser('page.html', '', '/report_result?' + str(width))
- def test_sdl_font(self):
- open(os.path.join(self.get_dir(), 'sdl_font.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_font.c')).read()))
+ def test_sdl_canvas(self):
+ open(os.path.join(self.get_dir(), 'sdl_canvas.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_canvas.c')).read()))
- Popen(['python', EMCC, os.path.join(self.get_dir(), 'sdl_font.c'), '-o', 'page.html']).communicate()
- self.run_browser('page.html', '', '/report_result?80')
+ Popen(['python', EMCC, os.path.join(self.get_dir(), 'sdl_canvas.c'), '-o', 'page.html']).communicate()
+ self.run_browser('page.html', '', '/report_result?3900')
def test_sdl_key(self):
open(os.path.join(self.get_dir(), 'pre.js'), 'w').write('''
diff --git a/tests/sdl_font.c b/tests/sdl_canvas.c
index f4f26355..a73c4351 100644
--- a/tests/sdl_font.c
+++ b/tests/sdl_canvas.c
@@ -15,13 +15,6 @@ int main() {
SDL_Color color = { 0xff, 0x99, 0x00, 0x77 };
SDL_Surface *text = TTF_RenderText_Solid(font, "hello orange world", color);
- SDL_LockSurface(text);
- int sum = 0;
- for (int i = 0; i < text->h; i++) {
- sum += *((char*)text->pixels + i*text->w*4 + i*4 + 0);
- }
- printf("Sum: %d\n", sum);
- SDL_UnlockSurface(text);
SDL_Color color2 = { 0xbb, 0, 0xff, 0 };
SDL_Surface *text2 = TTF_RenderText_Solid(font, "a second line, purple", color2);
@@ -32,9 +25,20 @@ int main() {
dest.y = 100;
SDL_BlitSurface (text2, NULL, screen, &dest);
+ // fill stuff
+ SDL_Rect rect = { 200, 200, 175, 125 };
+ SDL_FillRect(screen, &rect, 0x2222ff00);
+
SDL_Flip(screen);
- printf("you should see two lines of text in different colors.\n");
+ SDL_LockSurface(screen);
+ int sum = 0;
+ for (int i = 0; i < screen->h; i++) {
+ sum += *((char*)screen->pixels + i*screen->w*4 + i*4 + 0);
+ }
+ printf("Sum: %d\n", sum);
+
+ printf("you should see two lines of text in different colors and a blue rectangle\n");
SDL_Quit();