@@ -143,7 +143,7 @@ bool Graphics::construct(int fontId) {
143143 if (_screen && _screen->create (_w, _h)) {
144144 _drawTarget = _screen;
145145 maSetColor (DEFAULT_BACKGROUND);
146- ANativeWindow_setBuffersGeometry (_app->window , 0 , 0 , WINDOW_FORMAT_RGBA_8888 );
146+ ANativeWindow_setBuffersGeometry (_app->window , 0 , 0 , AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM );
147147 result = true ;
148148 } else {
149149 trace (" Failed to create canvas" );
@@ -157,18 +157,33 @@ bool Graphics::construct(int fontId) {
157157void Graphics::redraw () {
158158 if (_app->window != NULL && !_paused) {
159159 ANativeWindow_Buffer buffer;
160- if (ANativeWindow_lock (_app->window , &buffer, NULL ) < 0 ) {
160+ bool locked = ANativeWindow_lock (_app->window , &buffer, NULL ) == 0 ;
161+ if (!locked) {
161162 trace (" Unable to lock window buffer" );
162163 } else {
163- void *pixels = buffer.bits ;
164- int width = MIN (_w, MIN (buffer.width , _screen->_w ));
165- int height = MIN (_h, MIN (buffer.height , _screen->_h ));
166- for (int y = 0 ; y < height; y++) {
167- pixel_t *line = _screen->getLine (y);
168- memcpy ((pixel_t *)pixels, line, width * sizeof (pixel_t ));
169- pixels = (pixel_t *)pixels + buffer.stride ;
164+ if (buffer.format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) {
165+ ANativeWindow_unlockAndPost (_app->window );
166+ ANativeWindow_setBuffersGeometry (_app->window , 0 , 0 , AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM);
167+ locked = ANativeWindow_lock (_app->window , &buffer, NULL ) == 0 ;
168+ trace (" Restore format %d" , locked);
169+ }
170+ if (buffer.format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) {
171+ ANativeWindow_unlockAndPost (_app->window );
172+ ANativeWindow_setBuffersGeometry (_app->window , 0 , 0 , AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM);
173+ locked = false ;
174+ trace (" Restore format failed" );
175+ }
176+ if (locked) {
177+ void *pixels = buffer.bits ;
178+ int width = MIN (_w, MIN (buffer.width , _screen->_w ));
179+ int height = MIN (_h, MIN (buffer.height , _screen->_h ));
180+ for (int y = 0 ; y < height; y++) {
181+ pixel_t *line = _screen->getLine (y);
182+ memcpy ((pixel_t *)pixels, line, width * sizeof (pixel_t ));
183+ pixels = (pixel_t *)pixels + buffer.stride ;
184+ }
185+ ANativeWindow_unlockAndPost (_app->window );
170186 }
171- ANativeWindow_unlockAndPost (_app->window );
172187 }
173188 }
174189}
0 commit comments