diff options
author | David Boddie <david@boddie.org.uk> | 2018-03-24 00:08:37 +0000 |
---|---|---|
committer | David Boddie <david@boddie.org.uk> | 2018-03-24 00:08:37 +0000 |
commit | 811a63300c4a3c25a557a5fdb7ae46256a258f17 (patch) | |
tree | c768977e2adacfebd4e680e8556984e41abbd10f | |
parent | 9daa5b837e2e1f494a95ecd298d5e428ccb76b01 (diff) |
Added a function for drawing on 16-bit displays.
-rw-r--r-- | emu/port/win-x11a.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/emu/port/win-x11a.c b/emu/port/win-x11a.c index 4fdd295a..3670b260 100644 --- a/emu/port/win-x11a.c +++ b/emu/port/win-x11a.c @@ -313,6 +313,33 @@ copy32to32(Rectangle r) } static void +copy16to16(Rectangle r) +{ + int dx, width; + u16int *dp, *wp, *edp, *lp; + + width = Dx(r); + dx = Xsize - width; + dp = (u16int*)(gscreendata + ((r.min.y * Xsize) + r.min.x) * 2); + wp = (u16int*)(xscreendata + ((r.min.y * Xsize) + r.min.x) * 2); + edp = (u16int*)(gscreendata + ((r.max.y * Xsize) + r.max.x) * 2); + + /* The pixel format should be the same as the underlying X display (see + the xtruevisual function) unless a different channel format is + explicitly specified on the command line, so just copy the pixel data + without any processing. */ + + while(dp < edp) { + lp = dp + width; + while(dp < lp){ + *wp++ = *dp++; + } + dp += dx; + wp += dx; + } +} + +static void copy8to32(Rectangle r) { int dx, width; @@ -435,6 +462,17 @@ flushmemscreen(Rectangle r) case 32: copy32to32(r); break; + case 16: + switch(xscreendepth){ + case 16: + copy16to16(r); + break; + default: + fprint(2, "emu: bad display depth %d chan %s xscreendepth %d\n", displaydepth, + chantostr(chanbuf, displaychan), xscreendepth); + cleanexit(0); + } + break; case 8: switch(xscreendepth){ case 24: |