initial scaler selector in gui
authorJavier S. Pedro <maemo@javispedro.com>
Wed, 30 Dec 2009 23:02:20 +0000 (00:02 +0100)
committerJavier S. Pedro <maemo@javispedro.com>
Wed, 30 Dec 2009 23:02:20 +0000 (00:02 +0100)
gui/advanced.c [deleted file]
gui/drnoksnes.schemas.m4
gui/i18n.h [new file with mode: 0644]
gui/plugin.c
gui/plugin.h
gui/settings.c [new file with mode: 0644]
platform/hgw.cpp
platform/hgw.h
platform/sdlvscalers.cpp

diff --git a/gui/advanced.c b/gui/advanced.c
deleted file mode 100644 (file)
index 1e09908..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
-* This file is part of DrNokSnes
-*
-* Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
-*
-* 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 <gtk/gtk.h>
-#include <hildon/hildon-helper.h>
-
-#if MAEMO_VERSION >= 5
-#include <hildon/hildon-gtk.h>
-#include <hildon/hildon-check-button.h>
-#else
-#include <hildon/hildon-caption.h>
-#endif
-
-#include "../platform/hgw.h"
-#include "plugin.h"
-
-static GtkDialog* dialog;
-#if MAEMO_VERSION >= 5
-static HildonCheckButton* accu_check;
-#else
-#include <hildon/hildon-caption.h>
-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));
-}
-
index 5179c20..6d79887 100644 (file)
         </long>
       </locale>
     </schema>
-ifelse(eval(MAEMO_MAJOR < 5), 1, `dnl
     <schema>
-     <key>/schemas/apps/maemo/drnoksnes/xsp</key>
-      <applyto>/apps/maemo/drnoksnes/xsp</applyto>
+     <key>/schemas/apps/maemo/drnoksnes/scaler</key>
+      <applyto>/apps/maemo/drnoksnes/scaler</applyto>
       <owner>drnoksnes</owner>
-      <type>bool</type>
-      <default>true</default>
+      <type>string</type>
+      <default></default>
       <locale name="C">
-        <short>Pixel doubling</short>
+        <short>Scaler</short>
         <long>
-          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.
         </long>
       </locale>
     </schema>
-', `')dnl
     <schema>
      <key>/schemas/apps/maemo/drnoksnes/speedhacks</key>
       <applyto>/apps/maemo/drnoksnes/speedhacks</applyto>
diff --git a/gui/i18n.h b/gui/i18n.h
new file mode 100644 (file)
index 0000000..6199aaa
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef __I18N_H__
+#define __I18N_H__
+
+#define GETTEXT_PACKAGE "drnoksnes"
+
+#if CONF_NLS
+#include <libintl.h>
+#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
+
index 6c65620..dabe18a 100644 (file)
@@ -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
index a883f84..090ff93 100644 (file)
@@ -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 (file)
index 0000000..c50a189
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+* This file is part of DrNokSnes
+*
+* Copyright (C) 2009 Javier S. Pedro <maemo@javispedro.com>
+*
+* 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 <gtk/gtk.h>
+#include <hildon/hildon-helper.h>
+
+#if MAEMO_VERSION >= 5
+#include <hildon/hildon-gtk.h>
+#include <hildon/hildon-check-button.h>
+#include <hildon/hildon-picker-button.h>
+#include <hildon/hildon-touch-selector.h>
+#else
+#include <hildon/hildon-caption.h>
+#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));
+}
+
index 33f382e..4617525 100644 (file)
@@ -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) {
index 6c964a6..20698b5 100644 (file)
@@ -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"
 
index f6d5efd..bb26e9b 100644 (file)
@@ -137,7 +137,7 @@ protected:
                m_surface = reinterpret_cast<uint8*>(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<uint8*>(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 */