summaryrefslogtreecommitdiff
path: root/riscos/buffer.c
diff options
context:
space:
mode:
authorRobert Sprowson <webpages@sprow.co.uk>2015-10-31 18:30:35 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2015-10-31 18:30:35 +0000
commit469147b5936857930015d26111f4e6fdb25a5941 (patch)
treeb66b90d5a74a4d3cabb149afe4a7290d3c4897d7 /riscos/buffer.c
parentc22706b9049c4c85205a8cc9a3dc72a4e4a52be5 (diff)
downloadnetsurf-469147b5936857930015d26111f4e6fdb25a5941.tar.gz
netsurf-469147b5936857930015d26111f4e6fdb25a5941.tar.bz2
Apply Sprow's fix for bug #2336.
I've not been able to test this, but since Sprow was also the original reporter, it seems safe to apply. Bug #2336: Colours rendered incorrectly in 4k and 64k colour modes.
Diffstat (limited to 'riscos/buffer.c')
-rw-r--r--riscos/buffer.c112
1 files changed, 103 insertions, 9 deletions
diff --git a/riscos/buffer.c b/riscos/buffer.c
index e5c73359a..e53156bbc 100644
--- a/riscos/buffer.c
+++ b/riscos/buffer.c
@@ -38,6 +38,11 @@
#define BUFFER_EXCLUSIVE_USER_REDRAW "Only support pure user redraw (faster)"
//#define BUFFER_EMULATE_32BPP "Redirect to a 32bpp sprite and plot with Tinct"
+/** Absent from OSLib
+*/
+#define osspriteop_TYPEEXPANSION ((osspriteop_mode_word) 0xFu)
+#define osspriteop_TYPE16BPP4K ((osspriteop_mode_word) 0x10u)
+
static void ro_gui_buffer_free(void);
@@ -151,28 +156,117 @@ void ro_gui_buffer_open(wimp_draw *redraw)
static const ns_os_vdu_var_list vars = {
os_MODEVAR_LOG2_BPP,
{
+ os_MODEVAR_MODE_FLAGS,
+ os_MODEVAR_NCOLOUR,
os_MODEVAR_XEIG_FACTOR,
os_MODEVAR_YEIG_FACTOR,
os_VDUVAR_END_LIST
}
};
- int xeig, yeig;
- int vals[4];
+ struct {
+ int log2bpp;
+ int flags;
+ int ncolour;
+ int xeig, yeig;
+ } vals;
int type;
- error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals);
+ error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), (int *)&vals);
if (error) {
LOG("Error reading mode properties '%s'", error->errmess);
ro_gui_buffer_free();
return;
}
- type = 1 + vals[0];
- xeig = vals[1];
- yeig = vals[2];
-
- mode = (os_mode)((type << 27) | ((180 >> yeig) << 14) |
- ((180 >> xeig) << 1) | 1);
+ switch (vals.ncolour) {
+ case 1:
+ case 3:
+ case 15:
+ case 63:
+ case 255:
+ /* Paletted modes are pixel packing order agnostic */
+ type = 1 + vals.log2bpp;
+ mode = (os_mode)((type << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ ((180 >> vals.yeig) << osspriteop_YRES_SHIFT) |
+ ((180 >> vals.xeig) << osspriteop_XRES_SHIFT));
+ break;
+ case 4095:
+ /* 16bpp 4k colours */
+ type = osspriteop_TYPE16BPP4K;
+ mode = (os_mode)((osspriteop_TYPEEXPANSION << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ (vals.yeig << 6) |
+ (vals.xeig << 4) |
+ (type << 20) |
+ (vals.flags & 0xFF00));
+ break;
+ case 65535:
+ switch ((vals.flags & 0x3000) >> os_MODE_FLAG_DATA_FORMAT_SHIFT) {
+ case os_MODE_FLAG_DATA_FORMAT_RGB:
+ if (vals.flags & 0xC000) {
+ /* Non VIDC packing order */
+ if (vals.flags & os_MODE_FLAG_FULL_PALETTE)
+ type = osspriteop_TYPE16BPP64K;
+ else
+ type = osspriteop_TYPE16BPP;
+ mode = (os_mode)((osspriteop_TYPEEXPANSION << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ (vals.yeig << 6) |
+ (vals.xeig << 4) |
+ (type << 20) |
+ (vals.flags & 0xFF00));
+ } else {
+ /* VIDC packing order */
+ if (vals.flags & os_MODE_FLAG_FULL_PALETTE)
+ type = osspriteop_TYPE16BPP64K;
+ else
+ type = osspriteop_TYPE16BPP;
+ mode = (os_mode)((type << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ ((180 >> vals.yeig) << osspriteop_YRES_SHIFT) |
+ ((180 >> vals.xeig) << osspriteop_XRES_SHIFT));
+ }
+ break;
+ default:
+ LOG("Unhandled 16bpp format from flags %d", vals.flags);
+ ro_gui_buffer_free();
+ return;
+ }
+ break;
+ case -1:
+ /* 16M colours */
+ switch ((vals.flags & 0x3000) >> os_MODE_FLAG_DATA_FORMAT_SHIFT) {
+ case os_MODE_FLAG_DATA_FORMAT_RGB:
+ if (vals.flags & 0xC000) {
+ /* Non VIDC packing order */
+ type = osspriteop_TYPE32BPP;
+ mode = (os_mode)((osspriteop_TYPEEXPANSION << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ (vals.yeig << 6) |
+ (vals.xeig << 4) |
+ (type << 20) |
+ (vals.flags & 0xFF00));
+ } else {
+ /* VIDC packing order */
+ type = osspriteop_TYPE32BPP;
+ mode = (os_mode)((type << osspriteop_TYPE_SHIFT) |
+ osspriteop_NEW_STYLE |
+ ((180 >> vals.yeig) << osspriteop_YRES_SHIFT) |
+ ((180 >> vals.xeig) << osspriteop_XRES_SHIFT));
+ }
+ break;
+ default:
+ LOG("Unhandled 32bpp data format from flags %d", vals.flags);
+ ro_gui_buffer_free();
+ return;
+ }
+ break;
+ default:
+ LOG("Unhandled NCOLOUR value %d", vals.ncolour);
+ ro_gui_buffer_free();
+ return;
+ }
}
#endif