146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2004 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Library General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Library General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Library General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner     File added by Alan Buckley (alan_baa@hotmail.com) for RISC OS compatability
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 27 March 2003
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner     Implements Sprite plotting code for wimp display.window
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "kernel.h"
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "swis.h"
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_stdinc.h"
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_riscosvideo.h"
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void WIMP_ReadModeInfo(_THIS);
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PaletteChanged(_THIS);
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Create sprite buffer for screen */
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerunsigned char *WIMP_CreateBuffer(int width, int height, int bpp)
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int size;
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char sprite_name[12] = "display";
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	unsigned char *buffer;
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_kernel_swi_regs regs;
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int bytesPerPixel;
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int bytesPerRow;
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int offsetToSpriteData = 60;
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(bpp)
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 32: bytesPerPixel = 4; break;
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 16: bytesPerPixel = 2; break;
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 8:
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    bytesPerPixel = 1;
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    offsetToSpriteData += 2048; /* Add in size of palette */
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    break;
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	default:
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return NULL;
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bytesPerRow = bytesPerPixel * width;
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ((bytesPerRow & 3) != 0)
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bytesPerRow += 4 - (bytesPerRow & 3);
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	size = bytesPerRow * height;
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	buffer = SDL_malloc( (size_t) size + offsetToSpriteData );
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (!buffer) return NULL;
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   /* Initialise a sprite area */
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	*(unsigned int *)buffer		= size + offsetToSpriteData;
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	*(unsigned int *)(buffer + 8)	= 16;
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[0] = 256+9;
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[1] = (unsigned int)buffer;
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _kernel_swi(OS_SpriteOp, &regs, &regs);
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[0] = 256+15;
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[1] = (unsigned int)buffer;
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[2] = (unsigned int)&sprite_name;
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[3] = 0; /* Palette flag: 0 = no palette */
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[4] = width;
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	regs.r[5] = height;
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (bpp == 8)
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Use old style mode number */
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		regs.r[6] = 28; /* 8bpp 90x90dpi */
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		regs.r[6] = (((bpp == 16) ? 5 : 6) << 27) /* Type 6 = 32bpp sprite, 5 = 16bpp sprite */
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					| (90 << 14) /* Vertical dpi */
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					| (90 << 1)  /* Horizontal dpi */
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					| 1; /* Marker to distinguish between mode selectors and sprite modes */
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   if (_kernel_swi(OS_SpriteOp, &regs, &regs) == NULL)
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   {
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner       if (bpp == 8)
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner       {
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          /* Modify sprite to take into account 256 colour palette */
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          int *sprite = (int *)(buffer + 16);
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          /* Adjust sprite offsets */
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          sprite[0] += 2048;
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          sprite[8] += 2048;
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          sprite[9] += 2048;
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          /* Adjust sprite area next free pointer */
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          (*(int *)(buffer+12)) += 2048;
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          /* Don't need to set up palette as SDL sets up the default
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             256 colour palette */
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*          {
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             int *pal = sprite + 11;
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             unsigned int j;
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             unsigned int entry;
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             for (j = 0; j < 255; j++)
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             {
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                entry = (j << 24) | (j << 16) | (j << 8);
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                *pal++ = entry;
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner                *pal++ = entry;
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             }
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          }
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner       }
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   } else
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   {
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      SDL_free(buffer);
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      buffer = NULL;
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   }
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   return buffer;
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Setup translation buffers for the sprite plotting */
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_SetupPlotInfo(_THIS)
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _kernel_swi_regs regs;
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   int *sprite = ((int *)this->hidden->bank[1])+4;
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[0] = (unsigned int)this->hidden->bank[1];
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[1] = (unsigned int)sprite;
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[2] = -1; /* Current mode */
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[3] = -1; /* Current palette */
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[4] = 0; /* Get size of buffer */
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[5] = 1|2|16; /* R1 - pointer to sprite and can use full palette words */
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[6] = 0;
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[7] = 0;
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   if (this->hidden->pixtrans) SDL_free(this->hidden->pixtrans);
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   this->hidden->pixtrans = 0;
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   /* Get the size required for the buffer */
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _kernel_swi(ColourTrans_GenerateTable, &regs, &regs);
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   if (regs.r[4])
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   {
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      this->hidden->pixtrans = SDL_malloc(regs.r[4]);
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      regs.r[4] = (unsigned int)this->hidden->pixtrans;
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      /* Actually read the buffer */
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      _kernel_swi(ColourTrans_GenerateTable, &regs, &regs);
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   }
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Plot the sprite in the given context */
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PlotSprite(_THIS, int x, int y)
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _kernel_swi_regs regs;
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _kernel_oserror *err;
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[0] =  52 + 512;
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[1] = (unsigned int)this->hidden->bank[1];
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[2] = (unsigned int)this->hidden->bank[1]+16;
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[3] = x;
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[4] = y;
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[5] = 0|32; /* Overwrite screen and pixtrans contains wide colour entries */
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[6] = 0; /* No scale factors i.e. 1:1 */
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   regs.r[7] = (int)this->hidden->pixtrans;
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   if ((err = _kernel_swi(OS_SpriteOp, &regs, &regs)) != 0)
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   {
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      int *p = (int *)this->hidden->pixtrans;
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      printf("OS_SpriteOp failed \n%s\n",err->errmess);
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      printf("pixtrans %d\n", (int)this->hidden->pixtrans);
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner      printf("%x %x %x\n", p[0], p[1], p[2]);
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   }
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Wimp mode has changes so update colour mapping and pixel sizes
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   of windows and the sprites they plot */
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_ModeChanged(_THIS)
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int oldXeig = this->hidden->xeig;
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int oldYeig = this->hidden->yeig;
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	WIMP_ReadModeInfo(this);
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (oldXeig == this->hidden->xeig && oldYeig == this->hidden->yeig)
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Only need to update the palette */
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		WIMP_PaletteChanged(this);
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_kernel_swi_regs regs;
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int window_state[9];
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int extent[4];
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int currWidth, currHeight;
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int newWidth, newHeight;
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Need to resize windows and update the palette */
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		WIMP_SetupPlotInfo(this);
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		window_state[0] = this->hidden->window_handle;
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		regs.r[1] = (unsigned int)window_state;
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_kernel_swi(Wimp_GetWindowState, &regs, &regs);
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		currWidth = window_state[3] - window_state[1];
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		currHeight = window_state[4] - window_state[2];
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		newWidth = (currWidth >> oldXeig) << this->hidden->xeig;
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		newHeight = (currHeight >> oldYeig) << this->hidden->yeig;
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Need to avoid extent getting too small for visible part
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		of window */
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		extent[0] = 0;
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (currHeight <= newHeight)
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			extent[1] = -newHeight;
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			extent[1] = -currHeight;
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (currWidth <= newWidth)
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			extent[2] = newWidth;
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			extent[2] = currWidth;
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		extent[3] = 0;
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		regs.r[0] = this->hidden->window_handle;
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		regs.r[1] = (int)extent;
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_kernel_swi(Wimp_SetExtent, &regs, &regs);
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/*TODO: May need to set flag to resize window on next open */
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Palette has changed so update palettes used for windows sprites */
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PaletteChanged(_THIS)
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	WIMP_SetupPlotInfo(this);
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
266