summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/en/Messages4
-rw-r--r--!NetSurf/Resources/fr/Messages4
-rw-r--r--riscos/buffer.c27
-rw-r--r--riscos/font.c14
-rw-r--r--riscos/gui.h3
-rw-r--r--riscos/menus.c81
-rw-r--r--riscos/options.h7
-rw-r--r--riscos/window.c28
8 files changed, 142 insertions, 26 deletions
diff --git a/!NetSurf/Resources/en/Messages b/!NetSurf/Resources/en/Messages
index 0d97b1d8c..c23ba0af4 100644
--- a/!NetSurf/Resources/en/Messages
+++ b/!NetSurf/Resources/en/Messages
@@ -50,6 +50,10 @@ ToolButtons:Buttons
ToolAddress:Address bar
ToolThrob:Throbber
ToolStatus:Status bar
+Render:Render
+RenderText:Blend text to background
+RenderAnims:Buffer animations
+RenderAll:Buffer all rendering
OptDefault:Set as default
Window:Window
WindowSave:Set as default position
diff --git a/!NetSurf/Resources/fr/Messages b/!NetSurf/Resources/fr/Messages
index f3fc31918..c7973f32f 100644
--- a/!NetSurf/Resources/fr/Messages
+++ b/!NetSurf/Resources/fr/Messages
@@ -50,6 +50,10 @@ ToolButtons:Boutons
ToolAddress:Barre d'adresse
ToolThrob:Pulseur
ToolStatus:Barre d'état
+Render:Render
+RenderText:Blend text to background
+RenderAnims:Buffer animations
+RenderAll:Buffer all rendering
OptDefault:Définir par défaut
Window:Fenêtre
WindowSave:Définir comme position par défaut
diff --git a/riscos/buffer.c b/riscos/buffer.c
index aaa74f390..1a8dafd85 100644
--- a/riscos/buffer.c
+++ b/riscos/buffer.c
@@ -66,6 +66,7 @@ void ro_gui_buffer_open(wimp_draw *redraw) {
os_coord sprite_size;
int bpp, word_size;
osbool palette;
+ os_error *error;
/* Close any open buffer
*/
@@ -92,8 +93,11 @@ void ro_gui_buffer_open(wimp_draw *redraw) {
buffer_size = sizeof(osspriteop_area) + sizeof(osspriteop_header) +
(word_size * sprite_size.y);
if (palette) buffer_size += ((1 << (1 << bpp)) << 3);
- if (!(buffer = (osspriteop_area *)malloc(buffer_size))) return;
-
+ buffer = malloc(buffer_size);
+ if (!buffer) {
+ LOG(("Buffer memory allocation failed."));
+ return;
+ }
/* Fill in the sprite area details
*/
buffer->size = buffer_size + 1;
@@ -104,9 +108,10 @@ void ro_gui_buffer_open(wimp_draw *redraw) {
/* Fill in the sprite header details
*/
sprintf(name, "buffer");
- if (xosspriteop_get_sprite_user_coords(osspriteop_NAME, buffer,
+ if ((error = xosspriteop_get_sprite_user_coords(osspriteop_NAME, buffer,
name, palette,
- clipping.x0, clipping.y0, clipping.x1, clipping.y1)) {
+ clipping.x0, clipping.y0, clipping.x1, clipping.y1))) {
+// LOG(("Grab error '%s'", error->errmess));
free(buffer);
buffer = NULL;
return;
@@ -114,8 +119,9 @@ void ro_gui_buffer_open(wimp_draw *redraw) {
/* Allocate OS_SpriteOp save area
*/
- if (xosspriteop_read_save_area_size(osspriteop_NAME, buffer,
- (osspriteop_id)name, &size)) {
+ if ((error = xosspriteop_read_save_area_size(osspriteop_NAME, buffer,
+ (osspriteop_id)name, &size))) {
+// LOG(("Save area error '%s'", error->errmess));
free(buffer);
buffer = NULL;
return;
@@ -129,15 +135,16 @@ void ro_gui_buffer_open(wimp_draw *redraw) {
/* Switch output to sprite
*/
- if (xosspriteop_switch_output_to_sprite(osspriteop_NAME, buffer,
+ if ((error = xosspriteop_switch_output_to_sprite(osspriteop_NAME, buffer,
(osspriteop_id)name, save_area,
- 0, (int *)&context1, (int *)&context2, (int *)&context3)) {
+ 0, (int *)&context1, (int *)&context2, (int *)&context3))) {
+// LOG(("Switching error '%s'", error->errmess));
free(save_area);
free(buffer);
buffer = NULL;
return;
}
-
+
/* Move the origin such that (x0, y0) becomes (0, 0). To do this
we use VDU 29,(1 << 16) - x0; (1 << 16) - y0; because RISC OS
is so insanely legacy driven.
@@ -158,7 +165,7 @@ void ro_gui_buffer_close(void) {
/* Check we have an open buffer
*/
if (!buffer) return;
-
+
/* Remove any redirection and origin hacking
*/
xosspriteop_switch_output_to_sprite(osspriteop_PTR,
diff --git a/riscos/font.c b/riscos/font.c
index aa6c14307..6e2064438 100644
--- a/riscos/font.c
+++ b/riscos/font.c
@@ -16,6 +16,7 @@
#include <assert.h>
#include <stdio.h>
#include "oslib/font.h"
+#include "oslib/os.h"
#include "netsurf/css/css.h"
#include "netsurf/desktop/gui.h"
#include "netsurf/render/font.h"
@@ -648,13 +649,18 @@ void nsfont_paint(struct font_data *data, const char *text,
{
os_error *error;
unsigned int flags;
+ const int var_input[3] = {136, 137, -1}; /* XOrig, YOrig, Terminator */
+ int var_output[3];
+ bool background_blending = option_background_blending;
flags = font_OS_UNITS | font_GIVEN_FONT | font_KERN;
if (trfm != NULL)
flags |= font_GIVEN_TRFM;
/* font background blending (RO3.7+) */
- if (option_background_blending) {
+ if (ro_gui_current_redraw_gui)
+ background_blending = ro_gui_current_redraw_gui->option.background_blending;
+ if (background_blending) {
int version;
/* Font manager versions below 3.35 complain
@@ -669,6 +675,12 @@ void nsfont_paint(struct font_data *data, const char *text,
assert(data != NULL);
assert(text != NULL);
+ /* adjust by the origin */
+ xos_read_vdu_variables((const os_vdu_var_list *)&var_input, (int *)&var_output);
+ xpos += var_output[0];
+ ypos += var_output[1];
+
+
switch (data->ftype) {
case FONTTYPE_UFONT:
flags |= font_GIVEN_LENGTH;
diff --git a/riscos/gui.h b/riscos/gui.h
index 4a1736a4a..64d48dee5 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -86,6 +86,9 @@ struct gui_window {
bool filter_sprites; /**< Images should be smoothed. */
bool animate_images; /**< Animations should run. */
bool background_images; /**< Display background images. */
+ bool background_blending; /**< Perform background blending on text. */
+ bool buffer_animations; /**< Use screen buffering for animations. */
+ bool buffer_everything; /**< Use screen buffering for everything. */
} option;
struct gui_window *prev; /**< Previous in linked list. */
diff --git a/riscos/menus.c b/riscos/menus.c
index 9bb3bb5b1..0ac547a65 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -46,6 +46,7 @@ static void translate_menu(wimp_menu *menu);
static void ro_gui_menu_prepare_images(void);
static void ro_gui_menu_prepare_window(void);
static void ro_gui_menu_prepare_toolbars(void);
+static void ro_gui_menu_prepare_render(void);
static void ro_gui_menu_prepare_help(int forced);
static void ro_gui_menu_objectinfo(wimp_message_menu_warning *warning);
static void ro_gui_menu_object_reload(void);
@@ -202,6 +203,18 @@ static wimp_MENU(4) toolbar_menu = {
};
+/* Render submenu
+*/
+static wimp_MENU(3) render_menu = {
+ { "Render" }, 7,2,7,0, 300, 44, 0,
+ {
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "RenderText" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "RenderAnims" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "RenderAll" } }
+ }
+};
+
+
/* Window submenu
*/
static wimp_MENU(4) window_menu = {
@@ -217,12 +230,13 @@ static wimp_MENU(4) window_menu = {
/* View submenu
*/
-static wimp_MENU(4) view_menu = {
+static wimp_MENU(5) view_menu = {
{ "View" }, 7,2,7,0, 300, 44, 0,
{
{ wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "ScaleView" } },
{ wimp_MENU_GIVE_WARNING, (wimp_menu *)&image_menu, DEFAULT_FLAGS, { "Images" } },
- { wimp_MENU_GIVE_WARNING | wimp_MENU_SEPARATE, (wimp_menu *)&toolbar_menu, DEFAULT_FLAGS, { "Toolbars" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)&toolbar_menu, DEFAULT_FLAGS, { "Toolbars" } },
+ { wimp_MENU_GIVE_WARNING | wimp_MENU_SEPARATE, (wimp_menu *)&render_menu, DEFAULT_FLAGS, { "Render" } },
{ wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "OptDefault" } }
}
};
@@ -382,6 +396,7 @@ static wimp_menu *browser_navigate_menu = (wimp_menu *)&navigate_menu;
static wimp_menu *browser_view_menu = (wimp_menu *)&view_menu;
static wimp_menu *browser_image_menu = (wimp_menu *)&image_menu;
static wimp_menu *browser_toolbar_menu = (wimp_menu *)&toolbar_menu;
+static wimp_menu *browser_render_menu = (wimp_menu *)&render_menu;
static wimp_menu *browser_window_menu = (wimp_menu *)&window_menu;
static wimp_menu *browser_utilities_menu = (wimp_menu *)&utilities_menu;
static wimp_menu *browser_hotlist_menu = (wimp_menu *)&hotlist_util_menu;
@@ -414,6 +429,7 @@ void ro_gui_menus_init(void)
translate_menu(browser_view_menu);
translate_menu(browser_image_menu);
translate_menu(browser_toolbar_menu);
+ translate_menu(browser_render_menu);
translate_menu(browser_window_menu);
translate_menu(browser_utilities_menu);
translate_menu(browser_hotlist_menu);
@@ -445,14 +461,14 @@ void ro_gui_menus_init(void)
void translate_menu(wimp_menu *menu)
{
unsigned int i = 0;
- char *indirected_text;
+ const char *indirected_text;
/* We can't just blindly set something as indirected as if we use
the fallback messages text (ie the pointer we gave), we overwrite
this data when setting the pointer to the indirected text we
already had.
*/
- indirected_text = (char *)messages_get(menu->title_data.text);
+ indirected_text = messages_get(menu->title_data.text);
if (indirected_text != menu->title_data.text) {
menu->title_data.indirected_text.text = indirected_text;
menu->entries[0].menu_flags |= wimp_MENU_TITLE_INDIRECTED;
@@ -461,7 +477,7 @@ void translate_menu(wimp_menu *menu)
/* items */
do {
- indirected_text = (char *)messages_get(menu->entries[i].data.text);
+ indirected_text = messages_get(menu->entries[i].data.text);
if (indirected_text != menu->entries[i].data.text) {
menu->entries[i].icon_flags |= wimp_ICON_INDIRECTED;
menu->entries[i].data.indirected_text.text = indirected_text;
@@ -740,7 +756,6 @@ void ro_gui_menu_selection(wimp_selection *selection)
if (selection->items[2] >= 1) {
ro_gui_menu_prepare_images();
gui_window_redraw_window(current_gui);
-// content_broadcast(c, CONTENT_MSG_REDRAW, 0);
}
break;
case 2: /* Toolbars -> */
@@ -771,7 +786,20 @@ void ro_gui_menu_selection(wimp_selection *selection)
}
ro_gui_menu_prepare_toolbars();
break;
- case 3: /* Make default */
+ case 3: /* Render -> */
+ if (selection->items[2] == 0) {
+ current_gui->option.background_blending =
+ !current_gui->option.background_blending;
+ gui_window_redraw_window(current_gui);
+ }
+ if (selection->items[2] == 1) current_gui->option.buffer_animations =
+ !current_gui->option.buffer_animations;
+ if (selection->items[2] == 2) current_gui->option.buffer_everything =
+ !current_gui->option.buffer_everything;
+ ro_gui_menu_prepare_render();
+
+ break;
+ case 4: /* Make default */
ro_gui_window_default_options(current_gui->bw);
ro_gui_save_options();
break;
@@ -1031,6 +1059,11 @@ void ro_gui_menu_browser_warning(wimp_message_menu_warning *warning)
error = xwimp_create_sub_menu(browser_toolbar_menu,
warning->pos.x, warning->pos.y);
break;
+ case 3: /* Render -> */
+ ro_gui_menu_prepare_render();
+ error = xwimp_create_sub_menu(browser_render_menu,
+ warning->pos.x, warning->pos.y);
+ break;
}
break;
@@ -1243,7 +1276,7 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
static void ro_gui_menu_prepare_images(void) {
if (current_menu != browser_menu) return;
- /* We don't currently have any local options so we update from the global ones
+ /* Set the options according to the local values
*/
browser_image_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
if (current_gui->option.background_images) browser_image_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
@@ -1257,6 +1290,38 @@ static void ro_gui_menu_prepare_images(void) {
/**
+ * Update render menu status
+ */
+static void ro_gui_menu_prepare_render(void) {
+ if (current_menu != browser_menu) return;
+
+ /* Set the options according to the local values
+ */
+ browser_render_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
+ browser_render_menu->entries[1].icon_flags &= ~wimp_ICON_SHADED;
+ browser_render_menu->entries[2].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_gui->option.background_blending) {
+ browser_render_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
+ } else {
+ browser_render_menu->entries[0].menu_flags &= ~wimp_MENU_TICKED;
+ }
+ if (current_gui->option.buffer_everything) {
+ browser_render_menu->entries[1].icon_flags |= wimp_ICON_SHADED;
+ browser_render_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
+ browser_render_menu->entries[2].menu_flags |= wimp_MENU_TICKED;
+ } else {
+ browser_render_menu->entries[1].icon_flags &= ~wimp_ICON_SHADED;
+ browser_render_menu->entries[2].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_gui->option.buffer_animations) {
+ browser_render_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
+ } else {
+ browser_render_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
+ }
+ }
+}
+
+
+/**
* Update window menu status
*/
static void ro_gui_menu_prepare_window(void) {
diff --git a/riscos/options.h b/riscos/options.h
index be1769d15..8e6f1d4fa 100644
--- a/riscos/options.h
+++ b/riscos/options.h
@@ -44,6 +44,7 @@ extern int option_minimum_gif_delay;
extern bool option_background_images;
extern bool option_background_blending;
extern bool option_buffer_animations;
+extern bool option_buffer_everything;
#define EXTRA_OPTION_DEFINE \
bool option_use_mouse_gestures = false;\
@@ -73,7 +74,8 @@ bool option_window_size_clone = true; \
int option_minimum_gif_delay = 10; \
bool option_background_images = true; \
bool option_background_blending = true; \
-bool option_buffer_animations = true;
+bool option_buffer_animations = true; \
+bool option_buffer_everything = false;
#define EXTRA_OPTION_TABLE \
{ "use_mouse_gestures", OPTION_BOOL, &option_use_mouse_gestures },\
@@ -103,6 +105,7 @@ bool option_buffer_animations = true;
{ "minimum_gif_delay", OPTION_INTEGER, &option_minimum_gif_delay }, \
{ "background_images", OPTION_BOOL, &option_background_images }, \
{ "background_blending", OPTION_BOOL, &option_background_blending }, \
-{ "buffer_animations", OPTION_BOOL, &option_buffer_animations }
+{ "buffer_animations", OPTION_BOOL, &option_buffer_animations }, \
+{ "buffer_everything", OPTION_BOOL, &option_buffer_animations }
#endif
diff --git a/riscos/window.c b/riscos/window.c
index 684192ab6..c524ce128 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -392,7 +392,7 @@ void ro_gui_window_redraw(struct gui_window *g, wimp_draw *redraw)
bool clear_background = false;
struct content *c = g->bw->current_content;
os_error *error;
-
+
/* Set the current redraw gui_window to get options from
*/
ro_gui_current_redraw_gui = g;
@@ -410,6 +410,9 @@ void ro_gui_window_redraw(struct gui_window *g, wimp_draw *redraw)
return;
}
while (more) {
+ if (ro_gui_current_redraw_gui->option.buffer_everything) {
+// ro_gui_buffer_open(redraw);
+ }
if (clear_background) {
error = xcolourtrans_set_gcol(os_COLOUR_WHITE,
colourtrans_SET_BG,
@@ -434,12 +437,15 @@ void ro_gui_window_redraw(struct gui_window *g, wimp_draw *redraw)
redraw->clip.y1 - 1,
g->option.scale);
}
-
+ if (ro_gui_current_redraw_gui->option.buffer_everything) {
+// ro_gui_buffer_close();
+ }
error = xwimp_get_rectangle(redraw, &more);
if (error) {
LOG(("xwimp_get_rectangle: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
+ ro_gui_current_redraw_gui = NULL;
return;
}
}
@@ -493,8 +499,12 @@ void gui_window_update_box(struct gui_window *g,
clear_background = true;
while (more) {
+ if (ro_gui_current_redraw_gui->option.buffer_everything)
+ ro_gui_buffer_open(&update);
if (data->redraw.full_redraw) {
- if (option_buffer_animations) ro_gui_buffer_open(&update);
+ if ((ro_gui_current_redraw_gui->option.buffer_animations) &&
+ (!ro_gui_current_redraw_gui->option.buffer_everything))
+ ro_gui_buffer_open(&update);
if (clear_background) {
error = xcolourtrans_set_gcol(os_COLOUR_WHITE,
colourtrans_SET_BG,
@@ -515,8 +525,6 @@ void gui_window_update_box(struct gui_window *g,
update.clip.x0, update.clip.y0,
update.clip.x1 - 1, update.clip.y1 - 1,
g->option.scale);
- if (option_buffer_animations) ro_gui_buffer_close();
-
} else {
assert(data->redraw.object);
content_redraw(data->redraw.object,
@@ -535,11 +543,15 @@ void gui_window_update_box(struct gui_window *g,
g->option.scale);
}
+ if ((ro_gui_current_redraw_gui->option.buffer_animations) ||
+ (ro_gui_current_redraw_gui->option.buffer_everything))
+ ro_gui_buffer_close();
error = xwimp_get_rectangle(&update, &more);
if (error) {
LOG(("xwimp_get_rectangle: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
+ ro_gui_current_redraw_gui = NULL;
return;
}
}
@@ -1565,6 +1577,9 @@ void ro_gui_window_clone_options(struct browser_window *new_bw,
new_gui->option.filter_sprites = option_filter_sprites;
new_gui->option.animate_images = option_animate_images;
new_gui->option.background_images = option_background_images;
+ new_gui->option.background_blending = option_background_blending;
+ new_gui->option.buffer_animations = option_buffer_animations;
+ new_gui->option.buffer_everything = option_buffer_everything;
} else {
new_gui->option = old_gui->option;
}
@@ -1612,6 +1627,9 @@ void ro_gui_window_default_options(struct browser_window *bw) {
option_dither_sprites = gui->option.dither_sprites;
option_filter_sprites = gui->option.filter_sprites;
option_animate_images = gui->option.animate_images;
+ option_background_blending = gui->option.background_blending;
+ option_buffer_animations = gui->option.buffer_animations;
+ option_buffer_everything = gui->option.buffer_everything;
/* Set up the toolbar
*/