/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for 
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #                                      
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    Screen.c
    Author:  Copyright  1992 Jason Williams
    Version: 1.00 (23 Mar 1992)
    Purpose: Screen functions (read size, eig factors, etc.)
*/

#include "swis.h"

#include "Desk.Wimp.h"
#include "Desk.SWI.h"
#include "Desk.Screen.h"
#include "Desk.KernelSWIs.h"
#include "Desk.Error2.h"
#include "Desk.Debug.h"

/*
JS 02 Apr 1995
Support for DLLs
*/


int        	Desk_screen_mode  = -1;
Desk_wimp_point Desk_screen_size;
Desk_wimp_point Desk_screen_eig;
Desk_wimp_point Desk_screen_delta;
int        	Desk_screen_bpp;

#ifdef _DLL
int		*Desk_Screen__Ref_mode( void)	{ return &Desk_screen_mode;	}
Desk_wimp_point	*Desk_Screen__Ref_size( void)	{ return &Desk_screen_size;	}
Desk_wimp_point	*Desk_Screen__Ref_eig( void)	{ return &Desk_screen_eig;	}
Desk_wimp_point	*Desk_Screen__Ref_delta( void)	{ return &Desk_screen_delta;	}
int		*Desk_Screen__Ref_bpp( void)	{ return &Desk_screen_bpp;	}

#endif



/*#define ReadModeVar(m, v, r) Desk_SWI2(3, 3, 0x0035, (m), (v), 0,   0, 0, (r))*/

extern Desk_bool Desk_Screen_CacheModeInfo(void)
{
  /*int oldmode = Desk_screen_mode;*/

  /*Desk_SWI2(1, 3, Desk_SWI_OS_Byte, 135,   NULL, NULL, &Desk_screen_mode);*/
  Desk_Error2_CheckOS(
  	_swix( OS_Byte, _IN(0)|_OUT(2), 135, &Desk_screen_mode)
  	);

/*
  if (oldmode == Desk_screen_mode)	{
    Desk_Debug_Printf( Desk_error_PLACE "Desk_Screen_CacheModeInfo, old mode == new mode = %i\n", oldmode);
    return(Desk_bool_FALSE);
  	}
*/
/*
No longer return if old mode==newmode, because on RO3.5 and later, mode
can be a pointer which might not change when mode changes.

Should maybe leave the return in if mode<256...
 */
 

  Desk_OS_ReadModeVariable( -1, Desk_modevar_LOG2BPP, &Desk_screen_bpp);
  Desk_screen_bpp = 1 << Desk_screen_bpp;

  Desk_OS_ReadModeVariable( -1, Desk_modevar_XEIGFACTOR, &Desk_screen_eig.x);
  Desk_OS_ReadModeVariable( -1, Desk_modevar_YEIGFACTOR, &Desk_screen_eig.y);

  Desk_screen_delta.x = 1 << Desk_screen_eig.x;
  Desk_screen_delta.y = 1 << Desk_screen_eig.y;

  Desk_OS_ReadModeVariable( -1, Desk_modevar_XWINDOWLIMIT, &Desk_screen_size.x);
  Desk_screen_size.x = (Desk_screen_size.x + 1) << Desk_screen_eig.x;

  Desk_OS_ReadModeVariable( -1, Desk_modevar_YWINDOWLIMIT, &Desk_screen_size.y);
  Desk_screen_size.y = (Desk_screen_size.y + 1) << Desk_screen_eig.y;

  return(Desk_bool_TRUE);
}
