diff options
Diffstat (limited to 'backends/platform/android')
| -rw-r--r-- | backends/platform/android/android.cpp | 149 | ||||
| -rw-r--r-- | backends/platform/android/android.h | 173 | ||||
| -rw-r--r-- | backends/platform/android/events.cpp | 181 | ||||
| -rw-r--r-- | backends/platform/android/gfx.cpp | 814 | ||||
| -rw-r--r-- | backends/platform/android/graphics.cpp | 134 | ||||
| -rw-r--r-- | backends/platform/android/graphics.h | 55 | ||||
| -rw-r--r-- | backends/platform/android/jni.cpp | 8 | ||||
| -rw-r--r-- | backends/platform/android/jni.h | 2 | ||||
| -rw-r--r-- | backends/platform/android/module.mk | 3 | ||||
| -rw-r--r-- | backends/platform/android/org/scummvm/scummvm/ScummVM.java | 1 | ||||
| -rw-r--r-- | backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java | 22 | ||||
| -rw-r--r-- | backends/platform/android/texture.cpp | 476 | ||||
| -rw-r--r-- | backends/platform/android/texture.h | 285 | 
13 files changed, 264 insertions, 2039 deletions
| diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 2ae36c8073..67657b732e 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -60,6 +60,7 @@  #include "backends/platform/android/jni.h"  #include "backends/platform/android/android.h" +#include "backends/platform/android/graphics.h"  const char *android_log_tag = "ScummVM"; @@ -80,62 +81,11 @@ extern "C" {  	}  } -#ifdef ANDROID_DEBUG_GL -static const char *getGlErrStr(GLenum error) { -	switch (error) { -	case GL_INVALID_ENUM: -		return "GL_INVALID_ENUM"; -	case GL_INVALID_VALUE: -		return "GL_INVALID_VALUE"; -	case GL_INVALID_OPERATION: -		return "GL_INVALID_OPERATION"; -	case GL_STACK_OVERFLOW: -		return "GL_STACK_OVERFLOW"; -	case GL_STACK_UNDERFLOW: -		return "GL_STACK_UNDERFLOW"; -	case GL_OUT_OF_MEMORY: -		return "GL_OUT_OF_MEMORY"; -	} - -	static char buf[40]; -	snprintf(buf, sizeof(buf), "(Unknown GL error code 0x%x)", error); - -	return buf; -} - -void checkGlError(const char *expr, const char *file, int line) { -	GLenum error = glGetError(); - -	if (error != GL_NO_ERROR) -		LOGE("GL ERROR: %s on %s (%s:%d)", getGlErrStr(error), expr, file, line); -} -#endif -  OSystem_Android::OSystem_Android(int audio_sample_rate, int audio_buffer_size) :  	_audio_sample_rate(audio_sample_rate),  	_audio_buffer_size(audio_buffer_size),  	_screen_changeid(0), -	_egl_surface_width(0), -	_egl_surface_height(0), -	_htc_fail(true), -	_force_redraw(false), -	_game_texture(0), -	_overlay_texture(0), -	_mouse_texture(0), -	_mouse_texture_palette(0), -	_mouse_texture_rgb(0), -	_mouse_hotspot(), -	_mouse_keycolor(0), -	_use_mouse_palette(false), -	_graphicsMode(0), -	_fullscreen(true), -	_ar_correction(true), -	_show_mouse(false), -	_show_overlay(false), -	_enable_zoning(false), -	_mutexManager(0),  	_mixer(0), -	_shake_offset(0),  	_queuedEventTime(0),  	_event_queue_lock(0),  	_touch_pt_down(), @@ -153,22 +103,14 @@ OSystem_Android::OSystem_Android(int audio_sample_rate, int audio_buffer_size) :  	_fsFactory = new POSIXFilesystemFactory(); -	Common::String mf = getSystemProperty("ro.product.manufacturer"); -  	LOGI("Running on: [%s] [%s] [%s] [%s] [%s] SDK:%s ABI:%s", -			mf.c_str(), +			getSystemProperty("ro.product.manufacturer").c_str(),  			getSystemProperty("ro.product.model").c_str(),  			getSystemProperty("ro.product.brand").c_str(),  			getSystemProperty("ro.build.fingerprint").c_str(),  			getSystemProperty("ro.build.display.id").c_str(),  			getSystemProperty("ro.build.version.sdk").c_str(),  			getSystemProperty("ro.product.cpu.abi").c_str()); - -	mf.toLowercase(); -	/*_htc_fail = mf.contains("htc"); - -	if (_htc_fail) -		LOGI("Enabling HTC workaround");*/  }  OSystem_Android::~OSystem_Android() { @@ -182,9 +124,6 @@ OSystem_Android::~OSystem_Android() {  	_timerManager = 0;  	deleteMutex(_event_queue_lock); - -	delete _mutexManager; -	_mutexManager = 0;  }  void *OSystem_Android::timerThreadFunc(void *arg) { @@ -390,15 +329,7 @@ void OSystem_Android::initBackend() {  	_audio_thread_exit = false;  	pthread_create(&_audio_thread, 0, audioThreadFunc, this); -	initSurface(); -	initViewport(); - -	_game_texture = new GLESFakePalette565Texture(); -	_overlay_texture = new GLES4444Texture(); -	_mouse_texture_palette = new GLESFakePalette5551Texture(); -	_mouse_texture = _mouse_texture_palette; - -	initOverlay(); +	_graphicsManager = new AndroidGraphicsManager();  	// renice this thread to boost the audio thread  	if (setpriority(PRIO_PROCESS, 0, 19) < 0) @@ -406,42 +337,28 @@ void OSystem_Android::initBackend() {  	JNI::setReadyForEvents(true); -	EventsBaseBackend::initBackend(); +	ModularBackend::initBackend();  }  bool OSystem_Android::hasFeature(Feature f) { -	return (f == kFeatureFullscreenMode || -			f == kFeatureAspectRatioCorrection || -			f == kFeatureCursorPalette || -			f == kFeatureVirtualKeyboard || -			f == kFeatureOverlaySupportsAlpha || +	if (f == kFeatureVirtualKeyboard ||  			f == kFeatureOpenUrl ||  			f == kFeatureTouchpadMode ||  			f == kFeatureOnScreenControl || -			f == kFeatureClipboardSupport); +			f == kFeatureClipboardSupport) { +		return true; +	} +	return ModularBackend::hasFeature(f);  }  void OSystem_Android::setFeatureState(Feature f, bool enable) {  	ENTER("%d, %d", f, enable);  	switch (f) { -	case kFeatureFullscreenMode: -		_fullscreen = enable; -		updateScreenRect(); -		break; -	case kFeatureAspectRatioCorrection: -		_ar_correction = enable; -		updateScreenRect(); -		break;  	case kFeatureVirtualKeyboard:  		_virtkeybd_on = enable;  		showVirtualKeyboard(enable);  		break; -	case kFeatureCursorPalette: -		_use_mouse_palette = enable; -		if (!enable) -			disableCursorPalette(); -		break;  	case kFeatureTouchpadMode:  		ConfMan.setBool("touchpad_mouse_mode", enable);  		_touchpad_mode = enable; @@ -451,26 +368,21 @@ void OSystem_Android::setFeatureState(Feature f, bool enable) {  		JNI::showKeyboardControl(enable);  		break;  	default: +		ModularBackend::setFeatureState(f, enable);  		break;  	}  }  bool OSystem_Android::getFeatureState(Feature f) {  	switch (f) { -	case kFeatureFullscreenMode: -		return _fullscreen; -	case kFeatureAspectRatioCorrection: -		return _ar_correction;  	case kFeatureVirtualKeyboard:  		return _virtkeybd_on; -	case kFeatureCursorPalette: -		return _use_mouse_palette;  	case kFeatureTouchpadMode:  		return ConfMan.getBool("touchpad_mouse_mode");  	case kFeatureOnScreenControl:  		return ConfMan.getBool("onscreen_control");  	default: -		return false; +		return ModularBackend::getFeatureState(f);  	}  } @@ -487,26 +399,6 @@ void OSystem_Android::delayMillis(uint msecs) {  	usleep(msecs * 1000);  } -OSystem::MutexRef OSystem_Android::createMutex() { -	assert(_mutexManager); -	return _mutexManager->createMutex(); -} - -void OSystem_Android::lockMutex(MutexRef mutex) { -	assert(_mutexManager); -	_mutexManager->lockMutex(mutex); -} - -void OSystem_Android::unlockMutex(MutexRef mutex) { -	assert(_mutexManager); -	_mutexManager->unlockMutex(mutex); -} - -void OSystem_Android::deleteMutex(MutexRef mutex) { -	assert(_mutexManager); -	_mutexManager->deleteMutex(mutex); -} -  void OSystem_Android::quit() {  	ENTER(); @@ -517,13 +409,6 @@ void OSystem_Android::quit() {  	_timer_thread_exit = true;  	pthread_join(_timer_thread, 0); - -	delete _game_texture; -	delete _overlay_texture; -	delete _mouse_texture_palette; -	delete _mouse_texture_rgb; - -	deinitSurface();  }  void OSystem_Android::setWindowCaption(const char *caption) { @@ -532,12 +417,6 @@ void OSystem_Android::setWindowCaption(const char *caption) {  	JNI::setWindowCaption(caption);  } -void OSystem_Android::displayMessageOnOSD(const char *msg) { -	ENTER("%s", msg); - -	JNI::displayMessageOnOSD(msg); -} -  void OSystem_Android::showVirtualKeyboard(bool enable) {  	ENTER("%d", enable); @@ -563,15 +442,13 @@ void OSystem_Android::getTimeAndDate(TimeDate &td) const {  	td.tm_wday = tm.tm_wday;  } -void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s, -												int priority) { +void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {  	ENTER("");  	JNI::addSysArchivesToSearchSet(s, priority);  } -void OSystem_Android::logMessage(LogMessageType::Type type, -									const char *message) { +void OSystem_Android::logMessage(LogMessageType::Type type, const char *message) {  	switch (type) {  	case LogMessageType::kInfo:  		__android_log_write(ANDROID_LOG_INFO, android_log_tag, message); diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h index d88df6b15f..96219c28de 100644 --- a/backends/platform/android/android.h +++ b/backends/platform/android/android.h @@ -28,25 +28,16 @@  #include "common/fs.h"  #include "common/archive.h"  #include "audio/mixer_intern.h" -#include "graphics/palette.h" -#include "graphics/surface.h" -#include "backends/base-backend.h" +#include "backends/modular-backend.h"  #include "backends/plugins/posix/posix-provider.h"  #include "backends/fs/posix/posix-fs-factory.h" -#include "backends/platform/android/texture.h" -  #include <pthread.h>  #include <android/log.h> -#include <GLES/gl.h> -#include <GLES/glext.h> -  // toggles start  //#define ANDROID_DEBUG_ENTER -//#define ANDROID_DEBUG_GL -//#define ANDROID_DEBUG_GL_CALLS  // toggles end  extern const char *android_log_tag; @@ -63,76 +54,13 @@ extern const char *android_log_tag;  #define ENTER(fmt, args...) do {  } while (false)  #endif -#ifdef ANDROID_DEBUG_GL -extern void checkGlError(const char *expr, const char *file, int line); - -#ifdef ANDROID_DEBUG_GL_CALLS -#define GLCALLLOG(x, before) \ -	do { \ -		if (before) \ -			LOGD("calling '%s' (%s:%d)", x, __FILE__, __LINE__); \ -		else \ -			LOGD("returned from '%s' (%s:%d)", x, __FILE__, __LINE__); \ -	} while (false) -#else -#define GLCALLLOG(x, before) do {  } while (false) -#endif - -#define GLCALL(x) \ -	do { \ -		GLCALLLOG(#x, true); \ -		(x); \ -		GLCALLLOG(#x, false); \ -		checkGlError(#x, __FILE__, __LINE__); \ -	} while (false) - -#define GLTHREADCHECK \ -	do { \ -		assert(pthread_self() == _main_thread); \ -	} while (false) - -#else -#define GLCALL(x) do { (x); } while (false) -#define GLTHREADCHECK do {  } while (false) -#endif - -class MutexManager; - -class OSystem_Android : public EventsBaseBackend, public PaletteManager { +class OSystem_Android : public ModularBackend, Common::EventSource {  private:  	// passed from the dark side  	int _audio_sample_rate;  	int _audio_buffer_size;  	int _screen_changeid; -	int _egl_surface_width; -	int _egl_surface_height; -	bool _htc_fail; - -	bool _force_redraw; - -	// Game layer -	GLESBaseTexture *_game_texture; -	int _shake_offset; -	Common::Rect _focus_rect; - -	// Overlay layer -	GLES4444Texture *_overlay_texture; -	bool _show_overlay; - -	// Mouse layer -	GLESBaseTexture *_mouse_texture; -	GLESBaseTexture *_mouse_texture_palette; -	GLES5551Texture *_mouse_texture_rgb; -	Common::Point _mouse_hotspot; -	uint32 _mouse_keycolor; -	int _mouse_targetscale; -	bool _show_mouse; -	bool _use_mouse_palette; - -	int _graphicsMode; -	bool _fullscreen; -	bool _ar_correction;  	pthread_t _main_thread; @@ -144,70 +72,27 @@ private:  	pthread_t _audio_thread;  	static void *audioThreadFunc(void *arg); -	bool _enable_zoning;  	bool _virtkeybd_on; -	MutexManager *_mutexManager;  	Audio::MixerImpl *_mixer;  	timeval _startTime;  	Common::String getSystemProperty(const char *name) const; -	void initSurface(); -	void deinitSurface(); -	void initViewport(); - -	void initOverlay(); - -#ifdef USE_RGB_COLOR -	void initTexture(GLESBaseTexture **texture, uint width, uint height, -						const Graphics::PixelFormat *format); -#endif -  	void setupKeymapper(); -	void setCursorPaletteInternal(const byte *colors, uint start, uint num); + +protected: +	virtual Common::EventSource *getDefaultEventSource() { return this; }  public:  	OSystem_Android(int audio_sample_rate, int audio_buffer_size);  	virtual ~OSystem_Android();  	virtual void initBackend(); -	void enableZoning(bool enable) { _enable_zoning = enable; } - -	virtual bool hasFeature(Feature f); -	virtual void setFeatureState(Feature f, bool enable); -	virtual bool getFeatureState(Feature f); - -	virtual const GraphicsMode *getSupportedGraphicsModes() const; -	virtual int getDefaultGraphicsMode() const; -	virtual bool setGraphicsMode(int mode); -	virtual int getGraphicsMode() const; - -#ifdef USE_RGB_COLOR -	virtual Graphics::PixelFormat getScreenFormat() const; -	virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; -#endif - -	virtual void initSize(uint width, uint height, -							const Graphics::PixelFormat *format); - -	enum FixupType { -		kClear = 0,		// glClear -		kClearSwap,		// glClear + swapBuffers -		kClearUpdate	// glClear + updateScreen -	}; - -	void clearScreen(FixupType type, byte count = 1); -	void updateScreenRect(); -	virtual int getScreenChangeID() const; - -	virtual int16 getHeight(); -	virtual int16 getWidth(); - -	virtual PaletteManager *getPaletteManager() { -		return this; -	} +	virtual bool hasFeature(OSystem::Feature f); +	virtual void setFeatureState(OSystem::Feature f, bool enable); +	virtual bool getFeatureState(OSystem::Feature f);  public:  	void pushEvent(int type, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6); @@ -230,58 +115,16 @@ private:  	void clipMouse(Common::Point &p);  	void scaleMouse(Common::Point &p, int x, int y, bool deductDrawRect = true, bool touchpadMode = false); -	void updateEventScale(); -	void disableCursorPalette(); - -protected: -	// PaletteManager API -	virtual void setPalette(const byte *colors, uint start, uint num); -	virtual void grabPalette(byte *colors, uint start, uint num) const;  public: -	virtual void copyRectToScreen(const void *buf, int pitch, int x, int y, -									int w, int h); -	virtual void updateScreen(); -	virtual Graphics::Surface *lockScreen(); -	virtual void unlockScreen(); -	virtual void setShakePos(int shakeOffset); -	virtual void fillScreen(uint32 col); -	virtual void setFocusRectangle(const Common::Rect& rect); -	virtual void clearFocusRectangle(); - -	virtual void showOverlay(); -	virtual void hideOverlay(); -	virtual void clearOverlay(); -	virtual void grabOverlay(void *buf, int pitch); -	virtual void copyRectToOverlay(const void *buf, int pitch, -									int x, int y, int w, int h); -	virtual int16 getOverlayHeight(); -	virtual int16 getOverlayWidth(); -	virtual Graphics::PixelFormat getOverlayFormat() const; - -	virtual bool showMouse(bool visible); - -	virtual void warpMouse(int x, int y); -	virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, -								int hotspotY, uint32 keycolor, -								bool dontScale, -								const Graphics::PixelFormat *format); -	virtual void setCursorPalette(const byte *colors, uint start, uint num); -  	virtual void pushEvent(const Common::Event &event);  	virtual bool pollEvent(Common::Event &event);  	virtual uint32 getMillis(bool skipRecord = false);  	virtual void delayMillis(uint msecs); -	virtual MutexRef createMutex(void); -	virtual void lockMutex(MutexRef mutex); -	virtual void unlockMutex(MutexRef mutex); -	virtual void deleteMutex(MutexRef mutex); -  	virtual void quit();  	virtual void setWindowCaption(const char *caption); -	virtual void displayMessageOnOSD(const char *msg);  	virtual void showVirtualKeyboard(bool enable);  	virtual Audio::Mixer *getMixer(); diff --git a/backends/platform/android/events.cpp b/backends/platform/android/events.cpp index 634a84002f..465c6a1531 100644 --- a/backends/platform/android/events.cpp +++ b/backends/platform/android/events.cpp @@ -40,6 +40,7 @@  #define FORBIDDEN_SYMBOL_EXCEPTION_printf  #include "backends/platform/android/android.h" +#include "backends/platform/android/graphics.h"  #include "backends/platform/android/events.h"  #include "backends/platform/android/jni.h" @@ -76,69 +77,6 @@ void OSystem_Android::setupKeymapper() {  #endif  } -void OSystem_Android::warpMouse(int x, int y) { -	ENTER("%d, %d", x, y); - -	Common::Event e; - -	e.type = Common::EVENT_MOUSEMOVE; -	e.mouse.x = x; -	e.mouse.y = y; - -	clipMouse(e.mouse); - -	pushEvent(e); -} - -void OSystem_Android::clipMouse(Common::Point &p) { -	const GLESBaseTexture *tex; - -	if (_show_overlay) -		tex = _overlay_texture; -	else -		tex = _game_texture; - -	p.x = CLIP(p.x, int16(0), int16(tex->width() - 1)); -	p.y = CLIP(p.y, int16(0), int16(tex->height() - 1)); -} - -void OSystem_Android::scaleMouse(Common::Point &p, int x, int y, -									bool deductDrawRect, bool touchpadMode) { -	const GLESBaseTexture *tex; - -	if (_show_overlay) -		tex = _overlay_texture; -	else -		tex = _game_texture; - -	const Common::Rect &r = tex->getDrawRect(); - -	if (touchpadMode) { -		x = x * 100 / _touchpad_scale; -		y = y * 100 / _touchpad_scale; -	} - -	if (deductDrawRect) { -		x -= r.left; -		y -= r.top; -	} - -	p.x = scalef(x, tex->width(), r.width()); -	p.y = scalef(y, tex->height(), r.height()); -} - -void OSystem_Android::updateEventScale() { -	const GLESBaseTexture *tex; - -	if (_show_overlay) -		tex = _overlay_texture; -	else -		tex = _game_texture; - -	_eventScaleY = 100 * 480 / tex->height(); -	_eventScaleX = 100 * 640 / tex->width(); -} -  void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  								int arg4, int arg5, int arg6) {  	Common::Event e; @@ -199,7 +137,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  			else  				e.type = Common::EVENT_RBUTTONUP; -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  			pushEvent(e); @@ -324,7 +262,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  			e.type = Common::EVENT_MOUSEMOVE; -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  			{  				int16 *c; @@ -348,8 +286,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  					*c += f;  			} -			clipMouse(e.mouse); -  			pushEvent(e);  			return; @@ -367,7 +303,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  				return;  			} -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  			pushEvent(e); @@ -375,7 +311,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  		}  	case JE_DOWN: -		_touch_pt_down = getEventManager()->getMousePos(); +		_touch_pt_down = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  		_touch_pt_scroll.x = -1;  		_touch_pt_scroll.y = -1;  		break; @@ -390,13 +326,13 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  				return;  			} -			scaleMouse(e.mouse, arg3 - _touch_pt_scroll.x, -						arg4 - _touch_pt_scroll.y, false, true); +			e.mouse.x = (arg3 - _touch_pt_scroll.x) * 100 / _touchpad_scale; +			e.mouse.y = (arg4 - _touch_pt_scroll.y) * 100 / _touchpad_scale;  			e.mouse += _touch_pt_down; -			clipMouse(e.mouse); +  		} else { -			scaleMouse(e.mouse, arg3, arg4); -			clipMouse(e.mouse); +			e.mouse.x = arg3; +			e.mouse.y = arg4;  		}  		pushEvent(e); @@ -412,10 +348,10 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  		e.type = Common::EVENT_MOUSEMOVE;  		if (_touchpad_mode) { -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  		} else { -			scaleMouse(e.mouse, arg1, arg2); -			clipMouse(e.mouse); +			e.mouse.x = arg1; +			e.mouse.y = arg2;  		}  		{ @@ -457,10 +393,10 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  		e.type = Common::EVENT_MOUSEMOVE;  		if (_touchpad_mode) { -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  		} else { -			scaleMouse(e.mouse, arg1, arg2); -			clipMouse(e.mouse); +			e.mouse.x = arg1; +			e.mouse.y = arg2;  		}  		{ @@ -486,11 +422,9 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  				dptype = Common::EVENT_MOUSEMOVE;  				if (_touchpad_mode) { -					scaleMouse(e.mouse, arg1 - _touch_pt_dt.x, -								arg2 - _touch_pt_dt.y, false, true); +					e.mouse.x = (arg1 - _touch_pt_dt.x) * 100 / _touchpad_scale; +					e.mouse.y = (arg2 - _touch_pt_dt.y) * 100 / _touchpad_scale;  					e.mouse += _touch_pt_down; - -					clipMouse(e.mouse);  				}  				break; @@ -537,7 +471,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  					return;  				} -				e.mouse = getEventManager()->getMousePos(); +				e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  				lockMutex(_event_queue_lock); @@ -562,7 +496,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  		return;  	case JE_BALL: -		e.mouse = getEventManager()->getMousePos(); +		e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  		switch (arg1) {  		case JACTION_DOWN: @@ -578,8 +512,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  			e.mouse.x += arg2 * _trackball_scale / _eventScaleX;  			e.mouse.y += arg3 * _trackball_scale / _eventScaleY; -			clipMouse(e.mouse); -  			break;  		default:  			LOGE("unhandled jaction on system key: %d", arg1); @@ -592,9 +524,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  	case JE_MOUSE_MOVE:  		e.type = Common::EVENT_MOUSEMOVE; - -		scaleMouse(e.mouse, arg1, arg2); -		clipMouse(e.mouse); +		e.mouse.x = arg1; +		e.mouse.y = arg2;  		pushEvent(e); @@ -602,9 +533,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  	case JE_LMB_DOWN:  		e.type = Common::EVENT_LBUTTONDOWN; - -		scaleMouse(e.mouse, arg1, arg2); -		clipMouse(e.mouse); +		e.mouse.x = arg1; +		e.mouse.y = arg2;  		pushEvent(e); @@ -612,9 +542,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  	case JE_LMB_UP:  		e.type = Common::EVENT_LBUTTONUP; - -		scaleMouse(e.mouse, arg1, arg2); -		clipMouse(e.mouse); +		e.mouse.x = arg1; +		e.mouse.y = arg2;  		pushEvent(e); @@ -622,9 +551,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  	case JE_RMB_DOWN:  		e.type = Common::EVENT_RBUTTONDOWN; - -		scaleMouse(e.mouse, arg1, arg2); -		clipMouse(e.mouse); +		e.mouse.x = arg1; +		e.mouse.y = arg2;  		pushEvent(e); @@ -632,9 +560,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  	case JE_RMB_UP:  		e.type = Common::EVENT_RBUTTONUP; - -		scaleMouse(e.mouse, arg1, arg2); -		clipMouse(e.mouse); +		e.mouse.x = arg1; +		e.mouse.y = arg2;  		pushEvent(e); @@ -669,7 +596,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  				break;  			} -			e.mouse = getEventManager()->getMousePos(); +			e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  			break; @@ -692,7 +619,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  		break;  	case JE_JOYSTICK: -		e.mouse = getEventManager()->getMousePos(); +		e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();  		switch (arg1) {  		case JACTION_MULTIPLE: @@ -702,8 +629,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,  			e.mouse.x += arg2 * _joystick_scale / _eventScaleX;  			e.mouse.y += arg3 * _joystick_scale / _eventScaleY; -			clipMouse(e.mouse); -  			break;  		default:  			LOGE("unhandled jaction on joystick: %d", arg1); @@ -745,23 +670,19 @@ bool OSystem_Android::pollEvent(Common::Event &event) {  	if (pthread_self() == _main_thread) {  		if (_screen_changeid != JNI::surface_changeid) { +			_screen_changeid = JNI::surface_changeid; +  			if (JNI::egl_surface_width > 0 && JNI::egl_surface_height > 0) {  				// surface changed -				JNI::deinitSurface(); -				initSurface(); -				initViewport(); -				updateScreenRect(); -				updateEventScale(); - -				// double buffered, flip twice -				clearScreen(kClearUpdate, 2); +				dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->deinitSurface(); +				dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->initSurface();  				event.type = Common::EVENT_SCREEN_CHANGED;  				return true;  			} else {  				// surface lost -				deinitSurface(); +				dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->deinitSurface();  			}  		} @@ -777,24 +698,28 @@ bool OSystem_Android::pollEvent(Common::Event &event) {  	if (_queuedEventTime && (getMillis() > _queuedEventTime)) {  		event = _queuedEvent;  		_queuedEventTime = 0; -		unlockMutex(_event_queue_lock); -		return true; -	} - -	if (_event_queue.empty()) { +		// unlockMutex(_event_queue_lock); +		// return true; +	} else if (_event_queue.empty()) {  		unlockMutex(_event_queue_lock);  		return false; +	} else { +		event = _event_queue.pop();  	} -	event = _event_queue.pop(); -  	unlockMutex(_event_queue_lock); -	if (event.type == Common::EVENT_MOUSEMOVE) { -		const Common::Point &m = getEventManager()->getMousePos(); - -		if (m != event.mouse) -			_force_redraw = true; +	switch (event.type) { +	case Common::EVENT_MOUSEMOVE: +	case Common::EVENT_LBUTTONDOWN: +	case Common::EVENT_LBUTTONUP: +	case Common::EVENT_RBUTTONDOWN: +	case Common::EVENT_RBUTTONUP: +		if (_graphicsManager) +			return dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->notifyMousePosition(event.mouse); +		break; +	default: +		break;  	}  	return true; diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp deleted file mode 100644 index 58c92adbdf..0000000000 --- a/backends/platform/android/gfx.cpp +++ /dev/null @@ -1,814 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#if defined(__ANDROID__) - -// Allow use of stuff in <time.h> -#define FORBIDDEN_SYMBOL_EXCEPTION_time_h - -// Disable printf override in common/forbidden.h to avoid -// clashes with log.h from the Android SDK. -// That header file uses -//   __attribute__ ((format(printf, 3, 4))) -// which gets messed up by our override mechanism; this could -// be avoided by either changing the Android SDK to use the equally -// legal and valid -//   __attribute__ ((format(printf, 3, 4))) -// or by refining our printf override to use a varadic macro -// (which then wouldn't be portable, though). -// Anyway, for now we just disable the printf override globally -// for the Android port -#define FORBIDDEN_SYMBOL_EXCEPTION_printf - -#include "common/endian.h" -#include "graphics/conversion.h" - -#include "backends/platform/android/android.h" -#include "backends/platform/android/jni.h" - -static inline GLfixed xdiv(int numerator, int denominator) { -	assert(numerator < (1 << 16)); -	return (numerator << 16) / denominator; -} - -const OSystem::GraphicsMode *OSystem_Android::getSupportedGraphicsModes() const { -	static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { -		{ "default", "Default", 0 }, -		{ "filter", "Linear filtering", 1 }, -		{ 0, 0, 0 }, -	}; - -	return s_supportedGraphicsModes; -} - -int OSystem_Android::getDefaultGraphicsMode() const { -	return 0; -} - -bool OSystem_Android::setGraphicsMode(int mode) { -	ENTER("%d", mode); - -	if (_game_texture) -		_game_texture->setLinearFilter(mode == 1); - -	if (_overlay_texture) -		_overlay_texture->setLinearFilter(mode == 1); - -	if (_mouse_texture) -		_mouse_texture->setLinearFilter(mode == 1); - -	_graphicsMode = mode; - -	return true; -} - -int OSystem_Android::getGraphicsMode() const { -	return _graphicsMode; -} - -#ifdef USE_RGB_COLOR -Graphics::PixelFormat OSystem_Android::getScreenFormat() const { -	return _game_texture->getPixelFormat(); -} - -Common::List<Graphics::PixelFormat> OSystem_Android::getSupportedFormats() const { -	Common::List<Graphics::PixelFormat> res; -	res.push_back(GLES565Texture::pixelFormat()); -	res.push_back(GLES5551Texture::pixelFormat()); -	res.push_back(GLES8888Texture::pixelFormat()); -	res.push_back(GLES4444Texture::pixelFormat()); -	res.push_back(Graphics::PixelFormat::createFormatCLUT8()); - -	return res; -} - -void OSystem_Android::initTexture(GLESBaseTexture **texture, -									uint width, uint height, -									const Graphics::PixelFormat *format) { -	assert(texture); -	Graphics::PixelFormat format_clut8 = -		Graphics::PixelFormat::createFormatCLUT8(); -	Graphics::PixelFormat format_current; -	Graphics::PixelFormat format_new; - -	if (*texture) -		format_current = (*texture)->getPixelFormat(); -	else -		format_current = Graphics::PixelFormat(); - -	if (format) -		format_new = *format; -	else -		format_new = format_clut8; - -	if (format_current != format_new) { -		if (*texture) -			LOGD("switching pixel format from: %s", -					(*texture)->getPixelFormat().toString().c_str()); - -		delete *texture; - -		if (format_new == GLES565Texture::pixelFormat()) -			*texture = new GLES565Texture(); -		else if (format_new == GLES5551Texture::pixelFormat()) -			*texture = new GLES5551Texture(); -		else if (format_new == GLES8888Texture::pixelFormat()) -			*texture = new GLES8888Texture(); -		else if (format_new == GLES4444Texture::pixelFormat()) -			*texture = new GLES4444Texture(); -		else { -			// TODO what now? -			if (format_new != format_clut8) -				LOGE("unsupported pixel format: %s", -					format_new.toString().c_str()); - -			*texture = new GLESFakePalette565Texture; -		} - -		LOGD("new pixel format: %s", -				(*texture)->getPixelFormat().toString().c_str()); -	} - -	(*texture)->allocBuffer(width, height); -} -#endif - -void OSystem_Android::initSurface() { -	LOGD("initializing surface"); - -	assert(!JNI::haveSurface()); - -	_screen_changeid = JNI::surface_changeid; -	_egl_surface_width = JNI::egl_surface_width; -	_egl_surface_height = JNI::egl_surface_height; - -	assert(_egl_surface_width > 0 && _egl_surface_height > 0); - -	JNI::initSurface(); - -	// Initialize OpenGLES context. -	GLESTexture::initGLExtensions(); - -	if (_game_texture) -		_game_texture->reinit(); - -	if (_overlay_texture) { -		_overlay_texture->reinit(); -		initOverlay(); -	} - -	if (_mouse_texture) -		_mouse_texture->reinit(); -} - -void OSystem_Android::deinitSurface() { -	if (!JNI::haveSurface()) -		return; - -	LOGD("deinitializing surface"); - -	_screen_changeid = JNI::surface_changeid; -	_egl_surface_width = 0; -	_egl_surface_height = 0; - -	// release texture resources -	if (_game_texture) -		_game_texture->release(); - -	if (_overlay_texture) -		_overlay_texture->release(); - -	if (_mouse_texture) -		_mouse_texture->release(); - -	JNI::deinitSurface(); -} - -void OSystem_Android::initViewport() { -	LOGD("initializing viewport"); - -	assert(JNI::haveSurface()); - -	// Turn off anything that looks like 3D ;) -	GLCALL(glDisable(GL_CULL_FACE)); -	GLCALL(glDisable(GL_DEPTH_TEST)); -	GLCALL(glDisable(GL_LIGHTING)); -	GLCALL(glDisable(GL_FOG)); -	GLCALL(glDisable(GL_DITHER)); - -	GLCALL(glShadeModel(GL_FLAT)); -	GLCALL(glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)); - -	GLCALL(glEnable(GL_BLEND)); -	GLCALL(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); - -	GLCALL(glEnableClientState(GL_VERTEX_ARRAY)); -	GLCALL(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); - -	GLCALL(glEnable(GL_TEXTURE_2D)); - -	GLCALL(glViewport(0, 0, _egl_surface_width, _egl_surface_height)); - -	GLCALL(glMatrixMode(GL_PROJECTION)); -	GLCALL(glLoadIdentity()); -	GLCALL(glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1)); -	GLCALL(glMatrixMode(GL_MODELVIEW)); -	GLCALL(glLoadIdentity()); - -	clearFocusRectangle(); -} - -void OSystem_Android::initOverlay() { -	// minimum of 320x200 -	// (surface can get smaller when opening the virtual keyboard on *QVGA*) -	int overlay_width = MAX(_egl_surface_width, 320); -	int overlay_height = MAX(_egl_surface_height, 200); - -	// the 'normal' theme layout uses a max height of 400 pixels. if the -	// surface is too big we use only a quarter of the size so that the widgets -	// don't get too small. if the surface height has less than 800 pixels, this -	// enforces the 'lowres' layout, which will be scaled back up by factor 2x, -	// but this looks way better than the 'normal' layout scaled by some -	// calculated factors -	while (overlay_height > 480) { -		overlay_width /= 2; -		overlay_height /= 2; -	} - -	LOGI("overlay size is %ux%u", overlay_width, overlay_height); - -	_overlay_texture->allocBuffer(overlay_width, overlay_height); -	_overlay_texture->setDrawRect(0, 0, -									_egl_surface_width, _egl_surface_height); -} - -void OSystem_Android::initSize(uint width, uint height, -								const Graphics::PixelFormat *format) { -	ENTER("%d, %d, %p", width, height, format); - -	GLTHREADCHECK; - -#ifdef USE_RGB_COLOR -	initTexture(&_game_texture, width, height, format); -#else -	_game_texture->allocBuffer(width, height); -#endif - -	updateScreenRect(); -	updateEventScale(); - -	// Don't know mouse size yet - it gets reallocated in -	// setMouseCursor.  We need the palette allocated before -	// setMouseCursor however, so just take a guess at the desired -	// size (it's small). -	_mouse_texture_palette->allocBuffer(20, 20); - -	clearScreen(kClear); -} - -void OSystem_Android::clearScreen(FixupType type, byte count) { -	assert(count > 0); - -	bool sm = _show_mouse; -	_show_mouse = false; - -	GLCALL(glDisable(GL_SCISSOR_TEST)); - -	for (byte i = 0; i < count; ++i) { -		// clear screen -		GLCALL(glClearColorx(0, 0, 0, 1 << 16)); -		GLCALL(glClear(GL_COLOR_BUFFER_BIT)); - -		switch (type) { -		case kClear: -			break; - -		case kClearSwap: -			JNI::swapBuffers(); -			break; - -		case kClearUpdate: -			_force_redraw = true; -			updateScreen(); -			break; -		} -	} - -	if (!_show_overlay) -		GLCALL(glEnable(GL_SCISSOR_TEST)); - -	_show_mouse = sm; -	_force_redraw = true; -} - -void OSystem_Android::updateScreenRect() { -	Common::Rect rect(0, 0, _egl_surface_width, _egl_surface_height); - -	_overlay_texture->setDrawRect(rect); - -	uint16 w = _game_texture->width(); -	uint16 h = _game_texture->height(); - -	if (w && h && !_fullscreen) { -		if (_ar_correction && w == 320 && h == 200) -			h = 240; - -		float dpi[2]; -		JNI::getDPI(dpi); - -		float screen_ar; -		if (dpi[0] != 0.0 && dpi[1] != 0.0) { -			// horizontal orientation -			screen_ar = (dpi[1] * _egl_surface_width) / -						(dpi[0] * _egl_surface_height); -		} else { -			screen_ar = float(_egl_surface_width) / float(_egl_surface_height); -		} - -		float game_ar = float(w) / float(h); - -		if (screen_ar > game_ar) { -			rect.setWidth(round(_egl_surface_height * game_ar)); -			rect.moveTo((_egl_surface_width - rect.width()) / 2, 0); -		} else { -			rect.setHeight(round(_egl_surface_width / game_ar)); -			rect.moveTo((_egl_surface_height - rect.height()) / 2, 0); -		} -	} - -	glScissor(rect.left, rect.top, rect.width(), rect.height()); - -	_game_texture->setDrawRect(rect); -} - -int OSystem_Android::getScreenChangeID() const { -	return _screen_changeid; -} - -int16 OSystem_Android::getHeight() { -	return _game_texture->height(); -} - -int16 OSystem_Android::getWidth() { -	return _game_texture->width(); -} - -void OSystem_Android::setPalette(const byte *colors, uint start, uint num) { -	ENTER("%p, %u, %u", colors, start, num); - -#ifdef USE_RGB_COLOR -	assert(_game_texture->hasPalette()); -#endif - -	GLTHREADCHECK; - -	if (!_use_mouse_palette) -		setCursorPaletteInternal(colors, start, num); - -	const Graphics::PixelFormat &pf = _game_texture->getPalettePixelFormat(); -	byte *p = _game_texture->palette() + start * 2; - -	for (uint i = 0; i < num; ++i, colors += 3, p += 2) -		WRITE_UINT16(p, pf.RGBToColor(colors[0], colors[1], colors[2])); -} - -void OSystem_Android::grabPalette(byte *colors, uint start, uint num) const { -	ENTER("%p, %u, %u", colors, start, num); - -#ifdef USE_RGB_COLOR -	assert(_game_texture->hasPalette()); -#endif - -	GLTHREADCHECK; - -	const Graphics::PixelFormat &pf = _game_texture->getPalettePixelFormat(); -	const byte *p = _game_texture->palette_const() + start * 2; - -	for (uint i = 0; i < num; ++i, colors += 3, p += 2) -		pf.colorToRGB(READ_UINT16(p), colors[0], colors[1], colors[2]); -} - -void OSystem_Android::copyRectToScreen(const void *buf, int pitch, -										int x, int y, int w, int h) { -	ENTER("%p, %d, %d, %d, %d, %d", buf, pitch, x, y, w, h); - -	GLTHREADCHECK; - -	_game_texture->updateBuffer(x, y, w, h, buf, pitch); -} - -void OSystem_Android::updateScreen() { -	//ENTER(); - -	GLTHREADCHECK; - -	if (!JNI::haveSurface()) -		return; - -	if (!_force_redraw && -			!_game_texture->dirty() && -			!_overlay_texture->dirty() && -			!_mouse_texture->dirty()) -		return; - -	_force_redraw = false; - -	// clear pointer leftovers in dead areas -	// also, HTC's GLES drivers are made of fail and don't preserve the buffer -	// ( http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html ) -	if ((_show_overlay || _htc_fail) && !_fullscreen) -		clearScreen(kClear); - -	GLCALL(glPushMatrix()); - -	if (_shake_offset != 0 || -			(!_focus_rect.isEmpty() && -			!Common::Rect(_game_texture->width(), -							_game_texture->height()).contains(_focus_rect))) { -		// These are the only cases where _game_texture doesn't -		// cover the entire screen. -		clearScreen(kClear); - -		// Move everything up by _shake_offset (game) pixels -		GLCALL(glTranslatex(0, -_shake_offset << 16, 0)); -	} - -// TODO this doesn't work on those sucky drivers, do it differently -//	if (_show_overlay) -//		GLCALL(glColor4ub(0x9f, 0x9f, 0x9f, 0x9f)); - -	if (_focus_rect.isEmpty()) { -		_game_texture->drawTextureRect(); -	} else { -		GLCALL(glPushMatrix()); - -		GLCALL(glScalex(xdiv(_egl_surface_width, _focus_rect.width()), -						xdiv(_egl_surface_height, _focus_rect.height()), -						1 << 16)); -		GLCALL(glTranslatex(-_focus_rect.left << 16, -							-_focus_rect.top << 16, 0)); -		GLCALL(glScalex(xdiv(_game_texture->width(), _egl_surface_width), -						xdiv(_game_texture->height(), _egl_surface_height), -						1 << 16)); - -		_game_texture->drawTextureRect(); - -		GLCALL(glPopMatrix()); -	} - -	int cs = _mouse_targetscale; - -	if (_show_overlay) { -// TODO see above -//		GLCALL(glColor4ub(0xff, 0xff, 0xff, 0xff)); - -		// ugly, but the modern theme sets a wacko factor, only god knows why -		cs = 1; - -		GLCALL(_overlay_texture->drawTextureRect()); -	} - -	if (_show_mouse && !_mouse_texture->isEmpty()) { -		GLCALL(glPushMatrix()); - -		const Common::Point &mouse = getEventManager()->getMousePos(); - -		// Scale up ScummVM -> OpenGL (pixel) coordinates -		if (_show_overlay) { -			GLCALL(glScalex(xdiv(_egl_surface_width, -									_overlay_texture->width()), -							xdiv(_egl_surface_height, -									_overlay_texture->height()), -							1 << 16)); -		} else { -			const Common::Rect &r = _game_texture->getDrawRect(); - -			GLCALL(glTranslatex(r.left << 16, -								r.top << 16, -								0)); -			GLCALL(glScalex(xdiv(r.width(), _game_texture->width()), -							xdiv(r.height(), _game_texture->height()), -							1 << 16)); -		} - -		GLCALL(glTranslatex((-_mouse_hotspot.x * cs) << 16, -							(-_mouse_hotspot.y * cs) << 16, -							0)); - -		// Note the extra half texel to position the mouse in -		// the middle of the x,y square: -		GLCALL(glTranslatex((mouse.x << 16) | 1 << 15, -							(mouse.y << 16) | 1 << 15, 0)); - -		GLCALL(glScalex(cs << 16, cs << 16, 1 << 16)); - -		_mouse_texture->drawTextureOrigin(); - -		GLCALL(glPopMatrix()); -	} - -	GLCALL(glPopMatrix()); - -	if (!JNI::swapBuffers()) -		LOGW("swapBuffers failed: 0x%x", glGetError()); -} - -Graphics::Surface *OSystem_Android::lockScreen() { -	ENTER(); - -	GLTHREADCHECK; - -	Graphics::Surface *surface = _game_texture->surface(); -	assert(surface->getPixels()); - -	return surface; -} - -void OSystem_Android::unlockScreen() { -	ENTER(); - -	GLTHREADCHECK; - -	assert(_game_texture->dirty()); -} - -void OSystem_Android::setShakePos(int shake_offset) { -	ENTER("%d", shake_offset); - -	if (_shake_offset != shake_offset) { -		_shake_offset = shake_offset; -		_force_redraw = true; -	} -} - -void OSystem_Android::fillScreen(uint32 col) { -	ENTER("%u", col); - -	GLTHREADCHECK; - -	_game_texture->fillBuffer(col); -} - -void OSystem_Android::setFocusRectangle(const Common::Rect& rect) { -	ENTER("%d, %d, %d, %d", rect.left, rect.top, rect.right, rect.bottom); - -	if (_enable_zoning) { -		_focus_rect = rect; -		_force_redraw = true; -	} -} - -void OSystem_Android::clearFocusRectangle() { -	ENTER(); - -	if (_enable_zoning) { -		_focus_rect = Common::Rect(); -		_force_redraw = true; -	} -} - -void OSystem_Android::showOverlay() { -	ENTER(); - -	_show_overlay = true; -	_force_redraw = true; - -	updateEventScale(); - -	warpMouse(_overlay_texture->width() / 2, _overlay_texture->height() / 2); - -	GLCALL(glDisable(GL_SCISSOR_TEST)); -} - -void OSystem_Android::hideOverlay() { -	ENTER(); - -	_show_overlay = false; - -	updateEventScale(); - -	warpMouse(_game_texture->width() / 2, _game_texture->height() / 2); - -	// double buffered, flip twice -	clearScreen(kClearUpdate, 2); - -	GLCALL(glEnable(GL_SCISSOR_TEST)); -} - -void OSystem_Android::clearOverlay() { -	ENTER(); - -	GLTHREADCHECK; - -	_overlay_texture->fillBuffer(0); -} - -void OSystem_Android::grabOverlay(void *buf, int pitch) { -	ENTER("%p, %d", buf, pitch); - -	GLTHREADCHECK; - -	const Graphics::Surface *surface = _overlay_texture->surface_const(); -	assert(surface->format.bytesPerPixel == sizeof(uint16)); - -	byte *dst = (byte *)buf; -	const byte *src = (const byte *)surface->getPixels(); -	uint h = surface->h; - -	do { -		memcpy(dst, src, surface->w * surface->format.bytesPerPixel); -		src += surface->pitch; -		dst += pitch; -	} while (--h); -} - -void OSystem_Android::copyRectToOverlay(const void *buf, int pitch, -										int x, int y, int w, int h) { -	ENTER("%p, %d, %d, %d, %d, %d", buf, pitch, x, y, w, h); - -	GLTHREADCHECK; - -	_overlay_texture->updateBuffer(x, y, w, h, buf, pitch); -} - -int16 OSystem_Android::getOverlayHeight() { -	return _overlay_texture->height(); -} - -int16 OSystem_Android::getOverlayWidth() { -	return _overlay_texture->width(); -} - -Graphics::PixelFormat OSystem_Android::getOverlayFormat() const { -	return _overlay_texture->getPixelFormat(); -} - -bool OSystem_Android::showMouse(bool visible) { -	ENTER("%d", visible); - -	_show_mouse = visible; - -	return true; -} - -void OSystem_Android::setMouseCursor(const void *buf, uint w, uint h, -										int hotspotX, int hotspotY, -										uint32 keycolor, bool dontScale, -										const Graphics::PixelFormat *format) { -	ENTER("%p, %u, %u, %d, %d, %u, %d, %p", buf, w, h, hotspotX, hotspotY, -			keycolor, dontScale, format); - -	GLTHREADCHECK; - -#ifdef USE_RGB_COLOR -	if (format && format->bytesPerPixel > 1) { -		if (_mouse_texture != _mouse_texture_rgb) { -			LOGD("switching to rgb mouse cursor"); - -			assert(!_mouse_texture_rgb); -			_mouse_texture_rgb = new GLES5551Texture(); -			_mouse_texture_rgb->setLinearFilter(_graphicsMode == 1); -		} - -		_mouse_texture = _mouse_texture_rgb; -	} else { -		if (_mouse_texture != _mouse_texture_palette) -			LOGD("switching to paletted mouse cursor"); - -		_mouse_texture = _mouse_texture_palette; - -		delete _mouse_texture_rgb; -		_mouse_texture_rgb = 0; -	} -#endif - -	_mouse_texture->allocBuffer(w, h); - -	if (_mouse_texture == _mouse_texture_palette) { -		assert(keycolor < 256); - -		byte *p = _mouse_texture_palette->palette() + _mouse_keycolor * 2; -		WRITE_UINT16(p, READ_UINT16(p) | 1); - -		_mouse_keycolor = keycolor; - -		p = _mouse_texture_palette->palette() + _mouse_keycolor * 2; -		WRITE_UINT16(p, 0); -	} - -	if (w == 0 || h == 0) -		return; - -	if (_mouse_texture == _mouse_texture_palette) { -		_mouse_texture->updateBuffer(0, 0, w, h, buf, w); -	} else { -		uint16 pitch = _mouse_texture->pitch(); - -		byte *tmp = new byte[pitch * h]; - -		// meh, a 16bit cursor without alpha bits... this is so silly -		if (!crossBlit(tmp, (const byte *)buf, pitch, w * 2, w, h, -						_mouse_texture->getPixelFormat(), -						*format)) { -			LOGE("crossblit failed"); - -			delete[] tmp; - -			_mouse_texture->allocBuffer(0, 0); - -			return; -		} - -		const uint16 *s = (const uint16 *)buf; -		uint16 *d = (uint16 *)tmp; -		for (uint16 y = 0; y < h; ++y, d += pitch / 2 - w) -			for (uint16 x = 0; x < w; ++x, d++) -				if (*s++ == (keycolor & 0xffff)) -					*d = 0; - -		_mouse_texture->updateBuffer(0, 0, w, h, tmp, pitch); - -		delete[] tmp; -	} - -	_mouse_hotspot = Common::Point(hotspotX, hotspotY); -	// TODO: Adapt to the new "do not scale" cursor logic. -	_mouse_targetscale = 1; -} - -void OSystem_Android::setCursorPaletteInternal(const byte *colors, -												uint start, uint num) { -	const Graphics::PixelFormat &pf = -		_mouse_texture_palette->getPalettePixelFormat(); -	byte *p = _mouse_texture_palette->palette() + start * 2; - -	for (uint i = 0; i < num; ++i, colors += 3, p += 2) -		WRITE_UINT16(p, pf.RGBToColor(colors[0], colors[1], colors[2])); - -	p = _mouse_texture_palette->palette() + _mouse_keycolor * 2; -	WRITE_UINT16(p, 0); -} - -void OSystem_Android::setCursorPalette(const byte *colors, -										uint start, uint num) { -	ENTER("%p, %u, %u", colors, start, num); - -	GLTHREADCHECK; - -	if (!_mouse_texture->hasPalette()) { -		LOGD("switching to paletted mouse cursor"); - -		_mouse_texture = _mouse_texture_palette; - -		delete _mouse_texture_rgb; -		_mouse_texture_rgb = 0; -	} - -	setCursorPaletteInternal(colors, start, num); -	_use_mouse_palette = true; -} - -void OSystem_Android::disableCursorPalette() { -	// when disabling the cursor palette, and we're running a clut8 game, -	// it expects the game palette to be used for the cursor -	if (_game_texture->hasPalette()) { -		const byte *src = _game_texture->palette_const(); -		byte *dst = _mouse_texture_palette->palette(); - -		const Graphics::PixelFormat &pf_src = -			_game_texture->getPalettePixelFormat(); -		const Graphics::PixelFormat &pf_dst = -			_mouse_texture_palette->getPalettePixelFormat(); - -		uint8 r, g, b; - -		for (uint i = 0; i < 256; ++i, src += 2, dst += 2) { -			pf_src.colorToRGB(READ_UINT16(src), r, g, b); -			WRITE_UINT16(dst, pf_dst.RGBToColor(r, g, b)); -		} - -		byte *p = _mouse_texture_palette->palette() + _mouse_keycolor * 2; -		WRITE_UINT16(p, 0); -	} -} - -#endif diff --git a/backends/platform/android/graphics.cpp b/backends/platform/android/graphics.cpp new file mode 100644 index 0000000000..c22e9bf326 --- /dev/null +++ b/backends/platform/android/graphics.cpp @@ -0,0 +1,134 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// Allow use of stuff in <time.h> +#define FORBIDDEN_SYMBOL_EXCEPTION_time_h + +// Disable printf override in common/forbidden.h to avoid +// clashes with log.h from the Android SDK. +// That header file uses +//   __attribute__ ((format(printf, 3, 4))) +// which gets messed up by our override mechanism; this could +// be avoided by either changing the Android SDK to use the equally +// legal and valid +//   __attribute__ ((format(printf, 3, 4))) +// or by refining our printf override to use a varadic macro +// (which then wouldn't be portable, though). +// Anyway, for now we just disable the printf override globally +// for the Android port +#define FORBIDDEN_SYMBOL_EXCEPTION_printf + +#include "backends/platform/android/android.h" +#include "backends/platform/android/graphics.h" +#include "backends/platform/android/jni.h" + +// +// AndroidGraphicsManager +// +AndroidGraphicsManager::AndroidGraphicsManager() { +	ENTER(); + +	// Initialize our OpenGL ES context. +	initSurface(); + +} + +AndroidGraphicsManager::~AndroidGraphicsManager() { +	ENTER(); + +	deinitSurface(); +} + +void AndroidGraphicsManager::initSurface() { +	LOGD("initializing surface"); + +	assert(!JNI::haveSurface()); +	JNI::initSurface(); + +	// Notify the OpenGL code about our context. +	// FIXME: Support OpenGL ES 2 contexts +	setContextType(OpenGL::kContextGLES); + +	// We default to RGB565 and RGBA5551 which is closest to the actual output +	// mode we setup. +	notifyContextCreate(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); + +	handleResize(JNI::egl_surface_width, JNI::egl_surface_height); +} + +void AndroidGraphicsManager::deinitSurface() { +	if (!JNI::haveSurface()) +		return; + +	LOGD("deinitializing surface"); + +	notifyContextDestroy(); + +	JNI::deinitSurface(); +} + +void AndroidGraphicsManager::updateScreen() { +	//ENTER(); + +	if (!JNI::haveSurface()) +		return; + +	OpenGLGraphicsManager::updateScreen(); +} + +void AndroidGraphicsManager::displayMessageOnOSD(const char *msg) { +	ENTER("%s", msg); + +	JNI::displayMessageOnOSD(msg); +} + +bool AndroidGraphicsManager::loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format) { +	ENTER("%d, %d, %s", requestedWidth, requestedHeight, format.toString().c_str()); + +	// We get this whenever a new resolution is requested. Since Android is +	// using a fixed output size we do nothing like that here. +	// TODO: Support screen rotation +	return true; +} + +void AndroidGraphicsManager::refreshScreen() { +	//ENTER(); + +	JNI::swapBuffers(); +} + +void *AndroidGraphicsManager::getProcAddress(const char *name) const { +	ENTER("%s", name); + +	// TODO: Support dynamically loaded OpenGL +	return nullptr; +} + +bool AndroidGraphicsManager::notifyMousePosition(Common::Point &mouse) { +	mouse.x = CLIP<int16>(mouse.x, _activeArea.drawRect.left, _activeArea.drawRect.right); +	mouse.y = CLIP<int16>(mouse.y, _activeArea.drawRect.top, _activeArea.drawRect.bottom); + +	setMousePosition(mouse.x, mouse.y); +	mouse = convertWindowToVirtual(mouse.x, mouse.y); + +	return true; +} diff --git a/backends/platform/android/graphics.h b/backends/platform/android/graphics.h new file mode 100644 index 0000000000..1b29b036b1 --- /dev/null +++ b/backends/platform/android/graphics.h @@ -0,0 +1,55 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef ANDROID_GRAPHICS_H +#define ANDROID_GRAPHICS_H + +#include "common/scummsys.h" +#include "backends/graphics/opengl/opengl-graphics.h" + +class AndroidGraphicsManager : public OpenGL::OpenGLGraphicsManager { +public: +	AndroidGraphicsManager(); +	virtual ~AndroidGraphicsManager(); + +	void initSurface(); +	void deinitSurface(); + +	void updateScreen(); + +	void displayMessageOnOSD(const char *msg); + +	bool notifyMousePosition(Common::Point &mouse); +	Common::Point getMousePosition() { return Common::Point(_cursorX, _cursorY); } + +protected: +	void setSystemMousePosition(int x, int y) {} + +	bool loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format); + +	void refreshScreen(); + +	void *getProcAddress(const char *name) const; + +}; + +#endif diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 905423a5a6..5e4c116c82 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -111,8 +111,6 @@ const JNINativeMethod JNI::_natives[] = {  		(void *)JNI::main },  	{ "pushEvent", "(IIIIIII)V",  		(void *)JNI::pushEvent }, -	{ "enableZoning", "(Z)V", -		(void *)JNI::enableZoning },  	{ "setPause", "(Z)V",  		(void *)JNI::setPause },  	{ "getCurrentCharset", "()Ljava/lang/String;", @@ -662,12 +660,6 @@ void JNI::pushEvent(JNIEnv *env, jobject self, int type, int arg1, int arg2,  	_system->pushEvent(type, arg1, arg2, arg3, arg4, arg5, arg6);  } -void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { -	assert(_system); - -	_system->enableZoning(enable); -} -  void JNI::setPause(JNIEnv *env, jobject self, jboolean value) {  	if (!_system)  		return; diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h index aa89174dfc..b6e5df819e 100644 --- a/backends/platform/android/jni.h +++ b/backends/platform/android/jni.h @@ -132,8 +132,6 @@ private:  	static void pushEvent(JNIEnv *env, jobject self, int type, int arg1,  							int arg2, int arg3, int arg4, int arg5, int arg6); -	static void enableZoning(JNIEnv *env, jobject self, jboolean enable); -  	static void setPause(JNIEnv *env, jobject self, jboolean value);  	static jstring getCurrentCharset(JNIEnv *env, jobject self); diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk index de5fe98a53..6a0721b4a9 100644 --- a/backends/platform/android/module.mk +++ b/backends/platform/android/module.mk @@ -2,10 +2,9 @@ MODULE := backends/platform/android  MODULE_OBJS := \  	jni.o \ -	texture.o \  	asset-archive.o \  	android.o \ -	gfx.o \ +	graphics.o \  	events.o  # We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVM.java b/backends/platform/android/org/scummvm/scummvm/ScummVM.java index 37fe76ebda..2784623449 100644 --- a/backends/platform/android/org/scummvm/scummvm/ScummVM.java +++ b/backends/platform/android/org/scummvm/scummvm/ScummVM.java @@ -45,7 +45,6 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {  	// pause the engine and all native threads  	final public native void setPause(boolean pause); -	final public native void enableZoning(boolean enable);  	// Feed an event to ScummVM.  Safe to call from other threads.  	final public native void pushEvent(int type, int arg1, int arg2, int arg3,  										int arg4, int arg5, int arg6); diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java index 7bb0fe8057..f353ceab27 100644 --- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java @@ -53,30 +53,8 @@ public class ScummVMActivity extends Activity {  	};  	private class MyScummVM extends ScummVM { -		private boolean usingSmallScreen() { -			// Multiple screen sizes came in with Android 1.6.  Have -			// to use reflection in order to continue supporting 1.5 -			// devices :( -			DisplayMetrics metrics = new DisplayMetrics(); -			getWindowManager().getDefaultDisplay().getMetrics(metrics); - -			try { -				// This 'density' term is very confusing. -				int DENSITY_LOW = metrics.getClass().getField("DENSITY_LOW").getInt(null); -				int densityDpi = metrics.getClass().getField("densityDpi").getInt(metrics); -				return densityDpi <= DENSITY_LOW; -			} catch (Exception e) { -				return false; -			} -		} -  		public MyScummVM(SurfaceHolder holder) {  			super(ScummVMActivity.this.getAssets(), holder); - -			// Enable ScummVM zoning on 'small' screens. -			// FIXME make this optional for the user -			// disabled for now since it crops too much -			//enableZoning(usingSmallScreen());  		}  		@Override diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp deleted file mode 100644 index f8c09bfb43..0000000000 --- a/backends/platform/android/texture.cpp +++ /dev/null @@ -1,476 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#if defined(__ANDROID__) - -// Allow use of stuff in <time.h> -#define FORBIDDEN_SYMBOL_EXCEPTION_time_h - -// Disable printf override in common/forbidden.h to avoid -// clashes with log.h from the Android SDK. -// That header file uses -//   __attribute__ ((format(printf, 3, 4))) -// which gets messed up by our override mechanism; this could -// be avoided by either changing the Android SDK to use the equally -// legal and valid -//   __attribute__ ((format(printf, 3, 4))) -// or by refining our printf override to use a varadic macro -// (which then wouldn't be portable, though). -// Anyway, for now we just disable the printf override globally -// for the Android port -#define FORBIDDEN_SYMBOL_EXCEPTION_printf - -#include "base/main.h" -#include "graphics/surface.h" - -#include "common/rect.h" -#include "common/array.h" -#include "common/util.h" -#include "common/tokenizer.h" - -#include "backends/platform/android/texture.h" -#include "backends/platform/android/android.h" - -// Supported GL extensions -static bool npot_supported = false; - -static inline GLfixed xdiv(int numerator, int denominator) { -	assert(numerator < (1 << 16)); -	return (numerator << 16) / denominator; -} - -template<class T> -static T nextHigher2(T k) { -	if (k == 0) -		return 1; -	--k; - -	for (uint i = 1; i < sizeof(T) * CHAR_BIT; i <<= 1) -		k = k | k >> i; - -	return k + 1; -} - -void GLESBaseTexture::initGLExtensions() { -	const char *ext_string = -		reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)); - -	LOGI("Extensions: %s", ext_string); - -	Common::StringTokenizer tokenizer(ext_string, " "); -	while (!tokenizer.empty()) { -		Common::String token = tokenizer.nextToken(); - -		if (token == "GL_ARB_texture_non_power_of_two") -			npot_supported = true; -	} -} - -GLESBaseTexture::GLESBaseTexture(GLenum glFormat, GLenum glType, -									Graphics::PixelFormat pixelFormat) : -	_glFormat(glFormat), -	_glType(glType), -	_glFilter(GL_NEAREST), -	_texture_name(0), -	_surface(), -	_texture_width(0), -	_texture_height(0), -	_draw_rect(), -	_all_dirty(false), -	_dirty_rect(), -	_pixelFormat(pixelFormat), -	_palettePixelFormat() -{ -	GLCALL(glGenTextures(1, &_texture_name)); -} - -GLESBaseTexture::~GLESBaseTexture() { -	release(); -} - -void GLESBaseTexture::release() { -	if (_texture_name) { -		LOGD("Destroying texture %u", _texture_name); - -		GLCALL(glDeleteTextures(1, &_texture_name)); -		_texture_name = 0; -	} -} - -void GLESBaseTexture::reinit() { -	GLCALL(glGenTextures(1, &_texture_name)); - -	initSize(); - -	setDirty(); -} - -void GLESBaseTexture::initSize() { -	// Allocate room for the texture now, but pixel data gets uploaded -	// later (perhaps with multiple TexSubImage2D operations). -	GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); -	GLCALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _glFilter)); -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _glFilter)); -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); -	GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, _glFormat, -						_texture_width, _texture_height, -						0, _glFormat, _glType, 0)); -} - -void GLESBaseTexture::setLinearFilter(bool value) { -	if (value) -		_glFilter = GL_LINEAR; -	else -		_glFilter = GL_NEAREST; - -	GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); - -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _glFilter)); -	GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _glFilter)); -} - -void GLESBaseTexture::allocBuffer(GLuint w, GLuint h) { -	_surface.w = w; -	_surface.h = h; -	_surface.format = _pixelFormat; - -	if (w == _texture_width && h == _texture_height) -		return; - -	if (npot_supported) { -		_texture_width = _surface.w; -		_texture_height = _surface.h; -	} else { -		_texture_width = nextHigher2(_surface.w); -		_texture_height = nextHigher2(_surface.h); -	} - -	initSize(); -} - -void GLESBaseTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { -	GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); - -	const GLfixed tex_width = xdiv(_surface.w, _texture_width); -	const GLfixed tex_height = xdiv(_surface.h, _texture_height); -	const GLfixed texcoords[] = { -		0, 0, -		tex_width, 0, -		0, tex_height, -		tex_width, tex_height, -	}; - -	GLCALL(glTexCoordPointer(2, GL_FIXED, 0, texcoords)); - -	const GLshort vertices[] = { -		x, y, -		GLshort(x + w), y, -		x, GLshort(y + h), -		GLshort(x + w), GLshort(y + h) -	}; - -	GLCALL(glVertexPointer(2, GL_SHORT, 0, vertices)); - -	assert(ARRAYSIZE(vertices) == ARRAYSIZE(texcoords)); -	GLCALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAYSIZE(vertices) / 2)); - -	clearDirty(); -} - -const Graphics::PixelFormat &GLESBaseTexture::getPixelFormat() const { -	return _pixelFormat; -} - -GLESTexture::GLESTexture(GLenum glFormat, GLenum glType, -							Graphics::PixelFormat pixelFormat) : -	GLESBaseTexture(glFormat, glType, pixelFormat), -	_pixels(0), -	_buf(0) { -} - -GLESTexture::~GLESTexture() { -	delete[] _buf; -	delete[] _pixels; -} - -void GLESTexture::allocBuffer(GLuint w, GLuint h) { -	GLuint oldw = _surface.w; -	GLuint oldh = _surface.h; - -	GLESBaseTexture::allocBuffer(w, h); - -	_surface.pitch = w * _pixelFormat.bytesPerPixel; - -	if (_surface.w == oldw && _surface.h == oldh) { -		fillBuffer(0); -		return; -	} - -	delete[] _buf; -	delete[] _pixels; - -	_pixels = new byte[w * h * _surface.format.bytesPerPixel]; -	assert(_pixels); - -	_surface.setPixels(_pixels); - -	fillBuffer(0); - -	_buf = new byte[w * h * _surface.format.bytesPerPixel]; -	assert(_buf); -} - -void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, -								const void *buf, int pitch_buf) { -	setDirtyRect(Common::Rect(x, y, x + w, y + h)); - -	const byte *src = (const byte *)buf; -	byte *dst = _pixels + y * _surface.pitch + x * _surface.format.bytesPerPixel; - -	do { -		memcpy(dst, src, w * _surface.format.bytesPerPixel); -		dst += _surface.pitch; -		src += pitch_buf; -	} while (--h); -} - -void GLESTexture::fillBuffer(uint32 color) { -	assert(_surface.getPixels()); - -	if (_pixelFormat.bytesPerPixel == 1 || -			(_pixelFormat.bytesPerPixel == 2 && -			((color & 0xff) == ((color >> 8) & 0xff)))) -		memset(_pixels, color & 0xff, _surface.pitch * _surface.h); -	else if (_pixelFormat.bytesPerPixel == 2) -		Common::fill((uint16 *)_pixels, (uint16 *)(_pixels + _surface.pitch * _surface.h), -						(uint16)color); -	else -		Common::fill((uint32 *)_pixels, (uint32 *)(_pixels + _surface.pitch * _surface.h), -						color); - -	setDirty(); -} - -void GLESTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { -	if (_all_dirty) { -		_dirty_rect.top = 0; -		_dirty_rect.left = 0; -		_dirty_rect.bottom = _surface.h; -		_dirty_rect.right = _surface.w; - -		_all_dirty = false; -	} - -	if (!_dirty_rect.isEmpty()) { -		byte *_tex; - -		int16 dwidth = _dirty_rect.width(); -		int16 dheight = _dirty_rect.height(); - -		if (dwidth == _surface.w) { -			_tex = _pixels + _dirty_rect.top * _surface.pitch; -		} else { -			_tex = _buf; - -			byte *src = _pixels + _dirty_rect.top * _surface.pitch + -						_dirty_rect.left * _surface.format.bytesPerPixel; -			byte *dst = _buf; - -			uint16 l = dwidth * _surface.format.bytesPerPixel; - -			for (uint16 i = 0; i < dheight; ++i) { -				memcpy(dst, src, l); -				src += _surface.pitch; -				dst += l; -			} -		} - -		GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); -		GLCALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - -		GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, -								_dirty_rect.left, _dirty_rect.top, -								dwidth, dheight, _glFormat, _glType, _tex)); -	} - -	GLESBaseTexture::drawTexture(x, y, w, h); -} - -GLES4444Texture::GLES4444Texture() : -	GLESTexture(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, pixelFormat()) { -} - -GLES4444Texture::~GLES4444Texture() { -} - -GLES5551Texture::GLES5551Texture() : -	GLESTexture(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, pixelFormat()) { -} - -GLES5551Texture::~GLES5551Texture() { -} - -GLES565Texture::GLES565Texture() : -	GLESTexture(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pixelFormat()) { -} - -GLES565Texture::~GLES565Texture() { -} - -GLES8888Texture::GLES8888Texture() : -	GLESTexture(GL_RGBA, GL_UNSIGNED_BYTE, pixelFormat()) { -} - -GLES8888Texture::~GLES8888Texture() { -} - -GLESFakePaletteTexture::GLESFakePaletteTexture(GLenum glFormat, GLenum glType, -									Graphics::PixelFormat pixelFormat) : -	GLESBaseTexture(glFormat, glType, pixelFormat), -	_palette(0), -	_pixels(0), -	_buf(0) -{ -	_palettePixelFormat = pixelFormat; -	_fake_format = Graphics::PixelFormat::createFormatCLUT8(); - -	_palette = new uint16[256]; -	assert(_palette); - -	memset(_palette, 0, 256 * 2); -} - -GLESFakePaletteTexture::~GLESFakePaletteTexture() { -	delete[] _buf; -	delete[] _pixels; -	delete[] _palette; -} - -void GLESFakePaletteTexture::allocBuffer(GLuint w, GLuint h) { -	GLuint oldw = _surface.w; -	GLuint oldh = _surface.h; - -	GLESBaseTexture::allocBuffer(w, h); - -	_surface.format = Graphics::PixelFormat::createFormatCLUT8(); -	_surface.pitch = w; - -	if (_surface.w == oldw && _surface.h == oldh) { -		fillBuffer(0); -		return; -	} - -	delete[] _buf; -	delete[] _pixels; - -	_pixels = new byte[w * h]; -	assert(_pixels); - -	// fixup surface, for the outside this is a CLUT8 surface -	_surface.setPixels(_pixels); - -	fillBuffer(0); - -	_buf = new uint16[w * h]; -	assert(_buf); -} - -void GLESFakePaletteTexture::fillBuffer(uint32 color) { -	assert(_surface.getPixels()); -	memset(_surface.getPixels(), color & 0xff, _surface.pitch * _surface.h); -	setDirty(); -} - -void GLESFakePaletteTexture::updateBuffer(GLuint x, GLuint y, GLuint w, -											GLuint h, const void *buf, -											int pitch_buf) { -	setDirtyRect(Common::Rect(x, y, x + w, y + h)); - -	const byte *src = (const byte *)buf; -	byte *dst = _pixels + y * _surface.pitch + x; - -	do { -		memcpy(dst, src, w); -		dst += _surface.pitch; -		src += pitch_buf; -	} while (--h); -} - -void GLESFakePaletteTexture::drawTexture(GLshort x, GLshort y, GLshort w, -										GLshort h) { -	if (_all_dirty) { -		_dirty_rect.top = 0; -		_dirty_rect.left = 0; -		_dirty_rect.bottom = _surface.h; -		_dirty_rect.right = _surface.w; - -		_all_dirty = false; -	} - -	if (!_dirty_rect.isEmpty()) { -		int16 dwidth = _dirty_rect.width(); -		int16 dheight = _dirty_rect.height(); - -		byte *src = _pixels + _dirty_rect.top * _surface.pitch + -					_dirty_rect.left; -		uint16 *dst = _buf; -		uint pitch_delta = _surface.pitch - dwidth; - -		for (uint16 j = 0; j < dheight; ++j) { -			for (uint16 i = 0; i < dwidth; ++i) -				*dst++ = _palette[*src++]; -			src += pitch_delta; -		} - -		GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); - -		GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, -								_dirty_rect.left, _dirty_rect.top, -								dwidth, dheight, _glFormat, _glType, _buf)); -	} - -	GLESBaseTexture::drawTexture(x, y, w, h); -} - -const Graphics::PixelFormat &GLESFakePaletteTexture::getPixelFormat() const { -	return _fake_format; -} - -GLESFakePalette565Texture::GLESFakePalette565Texture() : -	GLESFakePaletteTexture(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, -							GLES565Texture::pixelFormat()) { -} - -GLESFakePalette565Texture::~GLESFakePalette565Texture() { -} - -GLESFakePalette5551Texture::GLESFakePalette5551Texture() : -	GLESFakePaletteTexture(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, -							GLES5551Texture::pixelFormat()) { -} - -GLESFakePalette5551Texture::~GLESFakePalette5551Texture() { -} - -#endif diff --git a/backends/platform/android/texture.h b/backends/platform/android/texture.h deleted file mode 100644 index 4b05dfd5d4..0000000000 --- a/backends/platform/android/texture.h +++ /dev/null @@ -1,285 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef _ANDROID_TEXTURE_H_ -#define _ANDROID_TEXTURE_H_ - -#if defined(__ANDROID__) - -#include <GLES/gl.h> - -#include "graphics/surface.h" -#include "graphics/pixelformat.h" - -#include "common/rect.h" -#include "common/array.h" - -class GLESBaseTexture { -public: -	static void initGLExtensions(); - -protected: -	GLESBaseTexture(GLenum glFormat, GLenum glType, -					Graphics::PixelFormat pixelFormat); - -public: -	virtual ~GLESBaseTexture(); - -	void release(); -	void reinit(); -	void initSize(); - -	void setLinearFilter(bool value); - -	virtual void allocBuffer(GLuint w, GLuint h); - -	virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, -								const void *buf, int pitch_buf) = 0; -	virtual void fillBuffer(uint32 color) = 0; - -	virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); - -	inline void setDrawRect(const Common::Rect &rect) { -		_draw_rect = rect; -	} - -	inline void setDrawRect(int16 w, int16 h) { -		_draw_rect = Common::Rect(w, h); -	} - -	inline void setDrawRect(int16 x1, int16 y1, int16 x2, int16 y2) { -		_draw_rect = Common::Rect(x1, y1, x2, y2); -	} - -	inline const Common::Rect &getDrawRect() const { -		return _draw_rect; -	} - -	inline void drawTextureRect() { -		drawTexture(_draw_rect.left, _draw_rect.top, -					_draw_rect.width(), _draw_rect.height()); -	} - -	inline void drawTextureOrigin() { -			drawTexture(0, 0, _surface.w, _surface.h); -	} - -	inline GLuint width() const { -		return _surface.w; -	} - -	inline GLuint height() const { -		return _surface.h; -	} - -	inline uint16 pitch() const { -		return _surface.pitch; -	} - -	inline bool isEmpty() const { -		return _surface.w == 0 || _surface.h == 0; -	} - -	inline const Graphics::Surface *surface_const() const { -		return &_surface; -	} - -	inline Graphics::Surface *surface() { -		setDirty(); -		return &_surface; -	} - -	virtual const byte *palette_const() const { -		return 0; -	}; - -	virtual byte *palette() { -		return 0; -	}; - -	inline bool hasPalette() const { -		return _palettePixelFormat.bytesPerPixel > 0; -	} - -	inline bool dirty() const { -		return _all_dirty || !_dirty_rect.isEmpty(); -	} - -	virtual const Graphics::PixelFormat &getPixelFormat() const; - -	inline const Graphics::PixelFormat &getPalettePixelFormat() const { -		return _palettePixelFormat; -	} - -protected: -	inline void setDirty() { -		_all_dirty = true; -	} - -	inline void clearDirty() { -		_all_dirty = false; -		_dirty_rect.top = 0; -		_dirty_rect.left = 0; -		_dirty_rect.bottom = 0; -		_dirty_rect.right = 0; -	} - -	inline void setDirtyRect(const Common::Rect& r) { -		if (!_all_dirty) { -			if (_dirty_rect.isEmpty()) -				_dirty_rect = r; -			else -				_dirty_rect.extend(r); -		} -	} - -	GLenum _glFormat; -	GLenum _glType; -	GLint _glFilter; - -	GLuint _texture_name; -	Graphics::Surface _surface; -	GLuint _texture_width; -	GLuint _texture_height; - -	Common::Rect _draw_rect; - -	bool _all_dirty; -	Common::Rect _dirty_rect; - -	Graphics::PixelFormat _pixelFormat; -	Graphics::PixelFormat _palettePixelFormat; -}; - -class GLESTexture : public GLESBaseTexture { -protected: -	GLESTexture(GLenum glFormat, GLenum glType, -				Graphics::PixelFormat pixelFormat); - -public: -	virtual ~GLESTexture(); - -	virtual void allocBuffer(GLuint w, GLuint h); - -	virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, -								const void *buf, int pitch_buf); -	virtual void fillBuffer(uint32 color); - -	virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); - -protected: -	byte *_pixels; -	byte *_buf; -}; - -// RGBA4444 texture -class GLES4444Texture : public GLESTexture { -public: -	GLES4444Texture(); -	virtual ~GLES4444Texture(); - -	static Graphics::PixelFormat pixelFormat() { -		return Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0); -	} -}; - -// RGBA5551 texture -class GLES5551Texture : public GLESTexture { -public: -	GLES5551Texture(); -	virtual ~GLES5551Texture(); - -	static inline Graphics::PixelFormat pixelFormat() { -		return Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0); -	} -}; - -// RGB565 texture -class GLES565Texture : public GLESTexture { -public: -	GLES565Texture(); -	virtual ~GLES565Texture(); - -	static inline Graphics::PixelFormat pixelFormat() { -		return Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); -	} -}; - -// RGBA8888 texture -class GLES8888Texture : public GLESTexture { -public: -	GLES8888Texture(); -	virtual ~GLES8888Texture(); - -	static inline Graphics::PixelFormat pixelFormat() { -		// We assume LE since all Android platforms are LE. -		return Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24); -	} -}; - -class GLESFakePaletteTexture : public GLESBaseTexture { -protected: -	GLESFakePaletteTexture(GLenum glFormat, GLenum glType, -							Graphics::PixelFormat pixelFormat); - -public: -	virtual ~GLESFakePaletteTexture(); - -	virtual void allocBuffer(GLuint w, GLuint h); -	virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, -								const void *buf, int pitch_buf); -	virtual void fillBuffer(uint32 color); - -	virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); - -	virtual const byte *palette_const() const { -		return (byte *)_palette; -	}; - -	virtual byte *palette() { -		setDirty(); -		return (byte *)_palette; -	}; - -	virtual const Graphics::PixelFormat &getPixelFormat() const; - -protected: -	Graphics::PixelFormat _fake_format; -	uint16 *_palette; -	byte *_pixels; -	uint16 *_buf; -}; - -class GLESFakePalette565Texture : public GLESFakePaletteTexture { -public: -	GLESFakePalette565Texture(); -	virtual ~GLESFakePalette565Texture(); -}; - -class GLESFakePalette5551Texture : public GLESFakePaletteTexture { -public: -	GLESFakePalette5551Texture(); -	virtual ~GLESFakePalette5551Texture(); -}; - -#endif -#endif | 
