From: Javier S. Pedro Date: Wed, 30 Dec 2009 23:02:20 +0000 (+0100) Subject: initial scaler selector in gui X-Git-Tag: drnoksnes_1_3_0~37 X-Git-Url: http://vcs.maemo.org/git/?p=drnoksnes;a=commitdiff_plain;h=ce77458da4d1b5badb74c82598b7aa0f6d77c9d5 initial scaler selector in gui --- diff --git a/gui/advanced.c b/gui/advanced.c deleted file mode 100644 index 1e09908..0000000 --- a/gui/advanced.c +++ /dev/null @@ -1,108 +0,0 @@ -/* -* This file is part of DrNokSnes -* -* Copyright (C) 2009 Javier S. Pedro -* -* This software is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public License -* as published by the Free Software Foundation; either version 2.1 of -* the License, or (at your option) any later version. -* -* This software 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 -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this software; if not, write to the Free Software -* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -* 02110-1301 USA -* -*/ - -#include -#include - -#if MAEMO_VERSION >= 5 -#include -#include -#else -#include -#endif - -#include "../platform/hgw.h" -#include "plugin.h" - -static GtkDialog* dialog; -#if MAEMO_VERSION >= 5 -static HildonCheckButton* accu_check; -#else -#include -static GtkCheckButton* xsp_check; -#endif - -static void load_settings() -{ -#if MAEMO_VERSION >= 5 - hildon_check_button_set_active(accu_check, - gconf_client_get_bool(gcc, kGConfTransparency, NULL)); -#else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsp_check), - gconf_client_get_bool(gcc, kGConfXSP, NULL)); -#endif -} - -static void save_settings() -{ -#if MAEMO_VERSION >= 5 - gconf_client_set_bool(gcc, kGConfTransparency, - hildon_check_button_get_active(accu_check), NULL); -#else - gconf_client_set_bool(gcc, kGConfXSP, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL); -#endif -} - -static void cb_dialog_response(GtkWidget * button, gint response, gpointer data) -{ - if (response == GTK_RESPONSE_OK) { - save_settings(); - } - - gtk_widget_destroy(GTK_WIDGET(dialog)); -} - -void advanced_dialog(GtkWindow* parent) -{ - dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Advanced settings", - parent, GTK_DIALOG_MODAL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL)); - -#if MAEMO_VERSION >= 5 - accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new( - HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); - gtk_button_set_label(GTK_BUTTON(accu_check), "Accurate graphics"); - gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check), FALSE, FALSE, 0); -#else - xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new()); - GtkWidget* xsp_caption = hildon_caption_new(NULL, - "Use hardware scaling", GTK_WIDGET(xsp_check), NULL, - HILDON_CAPTION_OPTIONAL); - gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption)); -#endif - - load_settings(); - -#if MAEMO_VERSION >= 5 - gtk_window_resize(GTK_WINDOW(dialog), 800, 300); -#else - gtk_window_resize(GTK_WINDOW(dialog), 400, 200); -#endif - - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK (cb_dialog_response), NULL); - - gtk_widget_show_all(GTK_WIDGET(dialog)); -} - diff --git a/gui/drnoksnes.schemas.m4 b/gui/drnoksnes.schemas.m4 index 5179c20..6d79887 100644 --- a/gui/drnoksnes.schemas.m4 +++ b/gui/drnoksnes.schemas.m4 @@ -80,22 +80,20 @@ -ifelse(eval(MAEMO_MAJOR < 5), 1, `dnl - /schemas/apps/maemo/drnoksnes/xsp - /apps/maemo/drnoksnes/xsp + /schemas/apps/maemo/drnoksnes/scaler + /apps/maemo/drnoksnes/scaler drnoksnes - bool - true + string + - Pixel doubling + Scaler - Enable the use of the hardware pixel doubler. Without it, - a slower, lower quality software scaler is used. + Name of the preferred scaler to use. Available scalers depend on + platform. Leave empty to select best scaler available. -', `')dnl /schemas/apps/maemo/drnoksnes/speedhacks /apps/maemo/drnoksnes/speedhacks diff --git a/gui/i18n.h b/gui/i18n.h new file mode 100644 index 0000000..6199aaa --- /dev/null +++ b/gui/i18n.h @@ -0,0 +1,26 @@ +#ifndef __I18N_H__ +#define __I18N_H__ + +#define GETTEXT_PACKAGE "drnoksnes" + +#if CONF_NLS +#include +#define _(String) dgettext(GETTEXT_PACKAGE, String) +#ifdef gettext_noop +#define N_(String) gettext_noop(String) +#else +#define N_(String) (String) +#endif +#else /* NLS is disabled */ +#define _(String) (String) +#define N_(String) (String) +#define textdomain(String) (String) +#define gettext(String) (String) +#define dgettext(Domain,String) (String) +#define dcgettext(Domain,String,Type) (String) +#define bindtextdomain(Domain,Directory) (Domain) +#define bind_textdomain_codeset(Domain,Codeset) (Codeset) +#endif /* CONF_NLS */ + +#endif + diff --git a/gui/plugin.c b/gui/plugin.c index 6c65620..dabe18a 100644 --- a/gui/plugin.c +++ b/gui/plugin.c @@ -44,6 +44,7 @@ #include "../platform/hgw.h" #include "plugin.h" +#include "i18n.h" static GtkWidget * load_plugin(void); static void unload_plugin(void); @@ -172,9 +173,9 @@ static void controls_item_callback(GtkWidget * button, gpointer data) controls_dialog(get_parent_window()); } -static void advanced_item_callback(GtkWidget * button, gpointer data) +static void settings_item_callback(GtkWidget * button, gpointer data) { - advanced_dialog(get_parent_window()); + settings_dialog(get_parent_window()); } static void about_item_callback(GtkWidget * button, gpointer data) @@ -242,12 +243,13 @@ static GtkWidget * load_plugin(void) sound_check = HILDON_CHECK_BUTTON(hildon_check_button_new( HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); - gtk_button_set_label(GTK_BUTTON(sound_check), "Sound"); + gtk_button_set_label(GTK_BUTTON(sound_check), _("Sound")); framerate_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new( HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL)); - hildon_button_set_title(HILDON_BUTTON(framerate_picker), "Target framerate"); + hildon_button_set_title(HILDON_BUTTON(framerate_picker), + _("Target framerate")); HildonTouchSelector* framerate_sel = HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text()); @@ -264,7 +266,7 @@ static GtkWidget * load_plugin(void) display_fps_check = HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT)); gtk_button_set_label(GTK_BUTTON(display_fps_check), - "Show while in game"); + _("Show while in game")); turbo_check = HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT)); gtk_button_set_label(GTK_BUTTON(turbo_check), @@ -424,7 +426,7 @@ static GtkWidget **load_menu(guint *nitems) *nitems = 3; g_signal_connect(G_OBJECT(menu_items[0]), "clicked", - G_CALLBACK(advanced_item_callback), NULL); + G_CALLBACK(settings_item_callback), NULL); g_signal_connect(G_OBJECT(menu_items[1]), "clicked", G_CALLBACK(controls_item_callback), NULL); g_signal_connect(G_OBJECT(menu_items[2]), "clicked", @@ -449,7 +451,7 @@ static GtkWidget **load_menu(guint *nitems) g_signal_connect(G_OBJECT(controls_item), "activate", G_CALLBACK(controls_item_callback), NULL); g_signal_connect(G_OBJECT(advanced_item), "activate", - G_CALLBACK(advanced_item_callback), NULL); + G_CALLBACK(settings_item_callback), NULL); g_signal_connect(G_OBJECT(menu_items[1]), "activate", G_CALLBACK(about_item_callback), NULL); #endif diff --git a/gui/plugin.h b/gui/plugin.h index a883f84..090ff93 100644 --- a/gui/plugin.h +++ b/gui/plugin.h @@ -28,8 +28,8 @@ void save_save_as(GtkWindow* parent); void controls_setup(); void controls_dialog(GtkWindow* parent); -/* advanced.c */ -void advanced_dialog(GtkWindow* parent); +/* settings.c */ +void settings_dialog(GtkWindow* parent); /* about.c */ void about_dialog(GtkWindow* parent); diff --git a/gui/settings.c b/gui/settings.c new file mode 100644 index 0000000..c50a189 --- /dev/null +++ b/gui/settings.c @@ -0,0 +1,182 @@ +/* +* This file is part of DrNokSnes +* +* Copyright (C) 2009 Javier S. Pedro +* +* This software is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License +* as published by the Free Software Foundation; either version 2.1 of +* the License, or (at your option) any later version. +* +* This software 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 +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this software; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +* 02110-1301 USA +* +*/ + +#include +#include + +#if MAEMO_VERSION >= 5 +#include +#include +#include +#include +#else +#include +#endif + +#include "../platform/hgw.h" +#include "plugin.h" +#include "i18n.h" + +struct scaler { + const char * id; + const char * name; +}; + +static struct scaler scalers[] = { +#if MAEMO_VERSION == 5 +#ifdef __arm__ + {"hdarm2x", N_("Simple 2x zoom (fast)")}, +#else + {"hdsoft2x", N_("Simple 2x zoom")}, +#endif /* __arm__ */ + {"hdfill", N_("Fill the entire screen")}, +#elif MAEMO_VERSION == 4 +#ifdef __arm__ + {"xsp", N_("Antialiased 2x zoom (fast)")}, + {"arm2x", N_("Simple 2x zoom")}, +#else + {"soft2x", N_("Simple 2x zoom")}, +#endif /* __arm__ */ +#endif /* MAEMO_VERSION */ + {"none", N_("Original size")}, +}; + +static GtkDialog* dialog; +#if MAEMO_VERSION >= 5 +static HildonCheckButton* accu_check; +static HildonPickerButton* scaler_picker; +#else +static GtkComboBox* scaler_combo; +#endif + +static int find_scaler(const char * id) +{ + +} + +static void fill_scaler_list(GtkWidget* w) +{ + for (int i = 0; i < sizeof(scalers)/sizeof(struct scaler); i++) { +#if MAEMO_VERSION >= 5 + hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(w), + _(scalers[i].name)); +#else + gtk_combo_box_append_text(GTK_COMBO_BOX(w), _(scalers[i].name)); +#endif + } +} + +static void load_settings() +{ +#if MAEMO_VERSION >= 5 + hildon_check_button_set_active(accu_check, + gconf_client_get_bool(gcc, kGConfTransparency, NULL)); +#else + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsp_check), + gconf_client_get_bool(gcc, kGConfXSP, NULL)); +#endif +} + +static void save_settings() +{ +#if MAEMO_VERSION >= 5 + gconf_client_set_bool(gcc, kGConfTransparency, + hildon_check_button_get_active(accu_check), NULL); +#else + gconf_client_set_bool(gcc, kGConfXSP, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xsp_check)), NULL); +#endif +} + +static void cb_dialog_response(GtkWidget * button, gint response, gpointer data) +{ + if (response == GTK_RESPONSE_OK) { + save_settings(); + } + + gtk_widget_destroy(GTK_WIDGET(dialog)); +} + +#if MAEMO_VERSION >= 5 +static void set_button_layout(HildonButton* button, GtkSizeGroup* sizegroup) +{ + hildon_button_add_title_size_group(button, sizegroup); + hildon_button_add_value_size_group(button, sizegroup); + hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0); + hildon_button_set_title_alignment(button, 0.0, 0.5); + hildon_button_set_value_alignment(button, 0.0, 0.5); +} +#endif + +void settings_dialog(GtkWindow* parent) +{ + dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Settings", + parent, GTK_DIALOG_MODAL, + GTK_STOCK_SAVE, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL)); + +#if MAEMO_VERSION >= 5 + GtkSizeGroup * size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + accu_check = HILDON_CHECK_BUTTON(hildon_check_button_new( + HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); + gtk_button_set_label(GTK_BUTTON(accu_check), "Accurate graphics"); + set_button_layout(HILDON_BUTTON(accu_check), size_group); + + scaler_picker = HILDON_PICKER_BUTTON(hildon_picker_button_new( + HILDON_SIZE_FULLSCREEN_WIDTH | HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_VERTICAL)); + hildon_button_set_title(HILDON_BUTTON(scaler_picker), "Zoom"); + set_button_layout(HILDON_BUTTON(scaler_picker), size_group); + + HildonTouchSelector* scaler_sel = + HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text()); + fill_scaler_list(GTK_WIDGET(scaler_sel)); + hildon_picker_button_set_selector(scaler_picker, scaler_sel); + + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(accu_check), + FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(scaler_picker), + FALSE, FALSE, 0); + + g_object_unref(size_group); +#else + xsp_check = GTK_CHECK_BUTTON(gtk_check_button_new()); + GtkWidget* xsp_caption = hildon_caption_new(NULL, + "Use hardware scaling", GTK_WIDGET(xsp_check), NULL, + HILDON_CAPTION_OPTIONAL); + gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(xsp_caption)); +#endif + + load_settings(); + +#if MAEMO_VERSION >= 5 + gtk_window_resize(GTK_WINDOW(dialog), 800, 300); +#else + gtk_window_resize(GTK_WINDOW(dialog), 400, 200); +#endif + + g_signal_connect(G_OBJECT(dialog), "response", + G_CALLBACK (cb_dialog_response), NULL); + + gtk_widget_show_all(GTK_WIDGET(dialog)); +} + diff --git a/platform/hgw.cpp b/platform/hgw.cpp index 33f382e..4617525 100644 --- a/platform/hgw.cpp +++ b/platform/hgw.cpp @@ -87,15 +87,12 @@ void HgwConfig() Settings.Transparency = transparency ? TRUE : FALSE; } -#if CONF_XSP - char xsp = TRUE; - if (hgw_conf_request_bool(hgw, kGConfXSP, &xsp) == HGW_ERR_NONE) { - if (!xsp) { - free(Config.scaler); - Config.scaler = strdup("2x"); - } + char scaler[NAME_MAX]; + if (hgw_conf_request_bool(hgw, kGConfScaler, scaler) == HGW_ERR_NONE + && strlen(scaler) > 0) { + free(Config.scaler); + Config.scaler = strdup(scaler); } -#endif char displayFramerate = FALSE; if (hgw_conf_request_bool(hgw, kGConfDisplayFramerate, &displayFramerate) == HGW_ERR_NONE) { diff --git a/platform/hgw.h b/platform/hgw.h index 6c964a6..20698b5 100644 --- a/platform/hgw.h +++ b/platform/hgw.h @@ -25,7 +25,6 @@ void HgwPollEvents(); #define kGConfDisplayFramerate kGConfPath "/" "display-framerate" #define kGConfDisplayControls kGConfPath "/" "display-controls" #define kGConfSpeedhacks kGConfPath "/" "speedhacks" -#define kGConfXSP kGConfPath "/" "xsp" #define kGConfMapping kGConfPath "/" "mapping" #define kGConfKeysPath kGConfPath "/" "keys" diff --git a/platform/sdlvscalers.cpp b/platform/sdlvscalers.cpp index f6d5efd..bb26e9b 100644 --- a/platform/sdlvscalers.cpp +++ b/platform/sdlvscalers.cpp @@ -137,7 +137,7 @@ protected: m_surface = reinterpret_cast(malloc(w * h * m_Bpp)); } public: - ~SWScaler() + virtual ~SWScaler() { free(m_surface); }; @@ -162,7 +162,7 @@ public: static const Factory factory; - const char * getName() const + virtual const char * getName() const { return "software 2x scaling"; } @@ -236,7 +236,7 @@ class ARMScaler : public Scaler m_surface = reinterpret_cast(malloc(w * h * m_Bpp)); } public: - ~ARMScaler() + virtual ~ARMScaler() { free(m_surface); }; @@ -262,7 +262,7 @@ public: static const Factory factory; - const char * getName() const + virtual const char * getName() const { return "software ARM 2x scaling"; } @@ -843,7 +843,50 @@ public: } }; const HDSW::Factory HDSW::factory; -#endif + +#ifdef __arm__ +class HDARM : public ARMScaler +{ + HDARM(SDL_Surface* screen, int w, int h) + : SWScaler(screen, w, h) + { + hildon_set_non_compositing(true); + } + +public: + ~HDARM() + { + hildon_set_non_compositing(false); + }; + + class Factory : public ScalerFactory + { + const char * getName() const + { + return "hdarm2x"; + } + + bool canEnable(int bpp, int w, int h) const + { + return Config.fullscreen; // This makes sense only in fullscreen + } + + Scaler* instantiate(SDL_Surface* screen, int w, int h) const + { + return new HDARM(screen, w, h); + } + }; + + static const Factory factory; + + const char * getName() const + { + return "compositor disabled and software ARM 2x scaling"; + } +}; +const HDSW::Factory HDSW::factory; +#endif /* __arm__ */ +#endif /* CONF_HD */ #if CONF_XSP class XSPScaler : public Scaler @@ -963,24 +1006,28 @@ const XSPScaler::Factory XSPScaler::factory; static const ScalerFactory* scalers[] = { /* More useful scalers come first */ +#if CONF_HD && defined(__arm__) + &HDARM::factory, /* non-composited arm 2x scaling */ +#endif #if CONF_HD - &HDFillScaler::factory, - &HDSquareScaler::factory, + &HDSquareScaler::factory, /* h-d assisted square scaling */ + &HDSW::factory, /* non-composited soft 2x scaling */ #endif #if CONF_XSP - &XSPScaler::factory, + &XSPScaler::factory, /* n8x0 pixel doubling */ #endif #ifdef __arm__ - &ARMScaler::factory, + &ARMScaler::factory, /* arm 2x scaling */ #endif + &SWScaler::factory, /* soft 2x scaling */ #if CONF_HD - &HDSW::factory, + &HDDummy::factory, /* non composited */ #endif - &SWScaler::factory, + &DummyScaler::factory, /* failsafe */ +/* The following scalers will not be automatically enabled, no matter what */ #if CONF_HD - &HDDummy::factory, + &HDFillScaler::factory, #endif - &DummyScaler::factory, }; /* Entry point functions */