home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 113
/
EnigmaAmiga113CD.iso
/
software
/
sviluppo
/
quake_src
/
vid_cppcstatic.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-06-17
|
48KB
|
1,651 lines
/*
Copyright (C) 1996-1997 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#pragma amiga-align
#include <exec/exec.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <dos/stdio.h>
#include <dos/dos.h>
#include <utility/tagitem.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/asl.h>
#include <libraries/lowlevel.h>
#include <libraries/Picasso96.h>
#include <cybergraphics/cybergraphics.h>
#include <devices/timer.h>
#include <clib/alib_protos.h>
#include <clib/Picasso96_protos.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/utility.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/cybergraphics.h>
#include <proto/timer.h>
#include <proto/asl.h>
#pragma default-align
#include "amigacompiler.h"
#if defined(__PPC__) && !defined(WOS)
#define ELF
#endif
/* for symbols which are shared between ELF and 68k objects */
#ifdef ELF
#define CNAME(x) _##x
#else
#define CNAME(x) x
#endif
struct Mode_Screen
{
struct Screen *video_screen;
struct Window *video_window;
int bpr;
int wb_int;
int pip_int;
int dbuf_int;
int oldstyle_int;
char pubscreenname[512];
int mode;
int SCREENWIDTH;
int SCREENHEIGHT;
int MAXWIDTH;
int MAXHEIGHT;
int MINDEPTH;
int MAXDEPTH;
int format;
int video_depth;
UWORD *emptypointer;
struct BitMap *video_tmp_bm;
int video_is_native_mode;
int video_is_cyber_mode;
unsigned char *screen;
int video_oscan_height;
int bufnum;
struct RastPort *video_rastport;
struct BitMap *bitmapa;
struct BitMap *bitmapb;
struct BitMap *bitmapc;
struct BitMap *thebitmap;
struct RastPort *video_temprp;
struct ScreenModeRequester *video_smr;
int ham_int;
UBYTE *wbcolors;
UBYTE *transtable;
unsigned long *WBColorTable;
unsigned long *ColorTable;
int pal_changed;
int pen_obtained;
unsigned char *screenb;
unsigned char *screenc;
int numbuffers;
int rtgm_int;
struct ScreenBuffer *Buf1;
struct ScreenBuffer *Buf2;
struct ScreenBuffer *Buf3;
void * (*algo)(struct Mode_Screen *ms,unsigned char *dest,
unsigned char *src, int srcformat,
void *(*hook68k)(unsigned char *data),unsigned char *data);
void (*Internal1)(void);
void (*Internal2)(void);
int onlyptr;
int likecgx;
UBYTE *c2p_compare_buffer; /* AGA c2p extension (phx) */
};
int CNAME(cppc_minwidth);
int CNAME(cppc_minheight);
int CNAME(cppc_maxwidth);
int CNAME(cppc_maxheight);
int CNAME(cppc_mindepth);
int CNAME(cppc_maxdepth);
static int locked=0;
static int lockingmode=1;
extern struct ExecBase *SysBase;
extern struct Library *P96Base;
extern struct Library *RtgBase;
extern struct Library *CyberGfxBase;
extern struct Library *AslBase;
extern struct GfxBase *GfxBase;
extern struct IntuitionBase *IntuitionBase;
#ifdef ELF
struct GfxBase *_GfxBase;
#endif
/* ASL filter M68k(!) function */
extern ULONG CNAME(filterfunc)();
struct Hook filterfunc_hook = {
{NULL, NULL}, (void *)&CNAME(filterfunc), NULL, NULL
};
#ifdef __PPC__
extern void TurboUpdatePPC(unsigned char *,unsigned char *,int,
int,int,int,int);
extern void c2p_8_ppc(UBYTE *,PLANEPTR,UBYTE *,ULONG);
#else
#ifndef _68881 /* 040/060 only */
extern void ASM TurboUpdate68k(REG(a0,unsigned char *),
REG(a1,unsigned char *), REG(d4,int),
REG(d0,int), REG(d1,int),
REG(d2,int), REG(d3,int));
#endif
extern void ASM c2p_8_040(REG(a0,UBYTE *),REG(a1,PLANEPTR),REG(a2,UBYTE *),
REG(d1,ULONG));
#endif
static void error (char *myerror, struct Mode_Screen *ms, ...)
{
va_list aptr;
char text[2048];
int i,depth;
if (myerror!=0) {
va_start (aptr, myerror);
vsprintf (text, myerror, aptr);
va_end (aptr);
}
if (locked) UnlockPubScreen(0,ms->video_screen);
if ((ms->dbuf_int)&&((!ms->oldstyle_int))) {
if (ms->video_screen) {
if (ms->Buf1) {
(((ms->Buf1)->sb_DBufInfo)->dbi_SafeMessage).mn_ReplyPort = NULL;
while (!ChangeScreenBuffer(ms->video_screen, ms->Buf1));
}
if (ms->Buf1) FreeScreenBuffer(ms->video_screen, ms->Buf1);
if (ms->Buf2) FreeScreenBuffer(ms->video_screen, ms->Buf2);
if (ms->Buf3) FreeScreenBuffer(ms->video_screen, ms->Buf3);
}
}
if (ms->likecgx) {
FreeScreenBuffer(ms->video_screen,ms->Buf1);
ms->Buf1=0;
}
if ((ms->wb_int)&&(!(ms->pip_int))&&(ms->pal_changed)) {
struct ColorMap *ColorMap=((ms->video_screen)->ViewPort).ColorMap;
for (i=0;i<256;i++) ReleasePen(ColorMap,ms->transtable[i]);
LoadRGB32(&(((ms->video_window)->WScreen)->ViewPort),ms->WBColorTable);
}
if (ms->video_window) {
if (!(ms->pip_int)) CloseWindow(ms->video_window);
else p96PIP_Close(ms->video_window);
}
ms->video_window=0;
if (!ms->wb_int) {
if (ms->video_screen) CloseScreen(ms->video_screen);
}
ms->video_screen=0;
if (ms->emptypointer) FreeVec(ms->emptypointer);
ms->emptypointer=0;
if (ms->video_depth!=0) {
if (ms->format==PIXFMT_LUT8) {
for (depth = 0; depth < ms->video_depth; depth++) {
if (ms->video_tmp_bm->Planes[depth] != NULL) {
#if 0 /*@@@ ??? Crash on Rearrange? */
FreeRaster (ms->video_tmp_bm->Planes[depth], ms->SCREENWIDTH, 1);
#endif
ms->video_tmp_bm->Planes[depth] = NULL;
}
}
}
}
if (ms->wbcolors) FreeVec(ms->wbcolors);
if (ms->transtable) FreeVec(ms->transtable);
if (ms->WBColorTable) FreeVec(ms->WBColorTable);
if (ms->ColorTable) FreeVec(ms->ColorTable);
ms->wbcolors=0;
ms->transtable=0;
ms->WBColorTable=0;
ms->ColorTable=0;
}
static void Rearrange(struct Mode_Screen *ms)
{
error(0,ms);
}
static int acceptmode(struct Mode_Screen *ms, int mode)
{
DisplayInfoHandle handle;
int nbytes;
int mydepth;
struct DimensionInfo dimsinfo;
int SW,SH;
if ((handle = FindDisplayInfo (mode)) == NULL) {
error ("Can't FindDisplayInfo() for mode %08x", ms,mode);
return 0;
}
if ((nbytes = GetDisplayInfoData (handle, (UBYTE *)&dimsinfo,
sizeof(dimsinfo), DTAG_DIMS,
0)) < 66) {
error ("Can't GetDisplayInfoData() for mode %08x, got %d bytes",
ms,mode, nbytes);
return 0;
}
SW = dimsinfo.Nominal.MaxX-dimsinfo.Nominal.MinX+1;
SH = dimsinfo.Nominal.MaxY-dimsinfo.Nominal.MinY+1;
if (ms->SCREENWIDTH!=SW) return 0;
if (ms->SCREENHEIGHT!=SH) return 0;
if (CyberGfxBase)
mydepth=GetCyberIDAttr(CYBRIDATTR_DEPTH,mode);
else mydepth=16;
if (ms->MINDEPTH>mydepth) return 0;
if (ms->MAXDEPTH<mydepth) return 0;
return 1;
}
static int existsmode(char *envvar,char *base,int modeid, int num)
{
int f;
int id;
char temp[1024];
char temp2[1024];
char tb[1024];
strcpy(temp,base);
strcpy(temp2,envvar);
sprintf(temp,"%s",temp);
if (GetVar(temp,tb,1024,0)!=-1) {
sprintf(temp2,"%s/modeid",temp2);
GetVar(temp2,tb,1024,0);
id=atoi(tb);
if (id==modeid) return 1;
}
for (f=1;f<=num;f++) {
strcpy(temp,base);
sprintf(temp,"%s%i",temp,f);
if (GetVar(temp,tb,1024,0)!=-1) {
strcpy(temp2,envvar);
sprintf(temp2,"%s/modeid%i",temp2,f);
GetVar(temp2,tb,1024,0);
id=atoi(tb);
if (id==modeid) return 1;
}
}
return 0;
}
static APTR LockBitMapTags68k(struct Mode_Screen *ms, unsigned char **screen)
{
APTR video_bitmap_handle;
struct BitMap *bm;
if (ms->bufnum==2) bm=ms->bitmapa;
else if (ms->bufnum==0) bm=ms->bitmapb;
else bm=ms->bitmapc;
if (ms->oldstyle_int) bm=ms->bitmapa;
if (ms->numbuffers==1) bm=ms->bitmapa;
video_bitmap_handle = (APTR)LockBitMapTags (bm,
LBMI_BASEADDRESS, screen,
TAG_DONE);
return video_bitmap_handle;
}
static APTR LockBitMapTags68k_b(struct Mode_Screen *ms,unsigned char **screen)
{
APTR video_bitmap_handle = (APTR)LockBitMapTags (ms->bitmapa,
LBMI_BASEADDRESS, screen,
TAG_DONE);
return video_bitmap_handle;
}
static void UnLockBitMap68k(APTR lock)
{
UnLockBitMap(lock);
}
static void *c2p(struct Mode_Screen *ms,unsigned char *dest,
unsigned char *src, int srcformat,
void *(*hook68k)(unsigned char *data), unsigned char *data)
{
#ifdef __PPC__
c2p_8_ppc(src,dest,ms->c2p_compare_buffer,ms->bpr*ms->SCREENHEIGHT);
#else
c2p_8_040(src,dest,ms->c2p_compare_buffer,ms->bpr*ms->SCREENHEIGHT);
#endif
return NULL;
}
static void *Chunky8(struct Mode_Screen *ms,unsigned char *dest,
unsigned char *src, int srcformat,
void *(*hook68k)(unsigned char *data),
unsigned char *data)
{
unsigned char *screen;
APTR video_bitmap_handle;
if (lockingmode&&(!(ms->pip_int))) {
if (ms->video_is_cyber_mode) {
video_bitmap_handle = (APTR)LockBitMapTags68k (ms,&screen);
if (ms->oldstyle_int&&(ms->bufnum==0))
screen+=(ms->bpr*ms->SCREENHEIGHT);
}
}
else
screen=dest;
#ifdef __PPC__
TurboUpdatePPC(src,screen,ms->bpr,0,0,ms->SCREENWIDTH,ms->SCREENHEIGHT);
#else
#ifdef _68881 /* 030/88x */
/* sorry, no 030 support yet */
#else /* 040/060 */
TurboUpdate68k(src,screen,ms->bpr,0,0,ms->SCREENWIDTH,ms->SCREENHEIGHT);
#endif
#endif
if (lockingmode&&(ms->video_is_cyber_mode) && (!(ms->pip_int)))
UnLockBitMap68k (video_bitmap_handle);
/* @@@ hook function will never be called! */
return NULL;
}
static void *WbChunky8(struct Mode_Screen *ms,unsigned char *dest,
unsigned char *src, int srcformat,
void *(*hook68k)(unsigned char *d),
unsigned char *data)
{
int f;
for (f=0;f<(ms->SCREENWIDTH*ms->SCREENHEIGHT);f++)
src[f]=ms->transtable[src[f]];
WritePixelArray8((ms->video_window)->RPort,(ms->video_window)->BorderLeft,
(ms->video_window)->BorderTop,
(UWORD)((ms->video_window)->BorderLeft+ms->SCREENWIDTH-1),
(UWORD)((ms->video_window)->BorderTop+ms->SCREENHEIGHT-1),
(UBYTE *)src,ms->video_temprp);
/* @@@ hook function will never be called! */
return NULL;
}
void CloseGraphics (struct Mode_Screen *ms,int shutdownlibs)
{
if (ms->onlyptr==0) error(0,ms);
if (ms->video_is_native_mode && ms->c2p_compare_buffer) /* phx */
free(ms->c2p_compare_buffer);
if (shutdownlibs) {
if (P96Base) CloseLibrary(P96Base);
P96Base = NULL;
if (CyberGfxBase) CloseLibrary(CyberGfxBase);
CyberGfxBase = NULL;
if (AslBase) CloseLibrary(AslBase);
AslBase = NULL;
if (GfxBase) CloseLibrary((struct Library *)GfxBase);
GfxBase = NULL;
if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
IntuitionBase = NULL;
}
memset(ms,0,sizeof(struct Mode_Screen));
}
struct Mode_Screen *OpenGraphics (char *title,struct Mode_Screen *ms,
int override)
{
static struct TagItem aslreq[]= {
ASLSM_TitleText, 0,
ASLSM_InitialDisplayID, 0,
ASLSM_MinWidth, 0,
ASLSM_MinHeight, 0,
ASLSM_MaxWidth, 1280,
ASLSM_MaxHeight, 1024,
ASLSM_MinDepth, 8,
ASLSM_MaxDepth, 16,
ASLSM_PropertyMask, 0,
ASLSM_PropertyFlags, 0,
ASLSM_FilterFunc, 0,
0,0
};
struct TagItem aslreqtags[]= {
0,0
};
static struct BitMap video_tmp_bm = {
0, 0, 0, 0, 0, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
};
static struct RastPort video_rastport[3];
static struct RastPort video_temprp;
static void *thehook=(void *)(&filterfunc_hook);
int i;
int mode;
struct ScreenReq *sreq=0;
APTR video_bitmap_handle;
int video_depth;
struct BitMap *bitmap;
ULONG propertymask, idcmp, wflags, width, pixfmt;
struct Rectangle rect;
char reqtitle[256];
int depth, nbytes;
DisplayInfoHandle handle;
struct DisplayInfo dispinfo;
struct DimensionInfo dimsinfo;
int mode_num;
float resize_int;
char tb[1024];
char realid[1024];
char title2[512];
char wb[512];
char pip[512];
char dbuf[512];
char modeid3[512];
char oldstyle[512];
char psn[512];
char pubscreenname[512];
char pipnoclear[512];
char modeid2[512];
char ham[512];
char likecgx[512];
int likecgx_int=0;
int wb_int=0;
int pip_int=0;
int dbuf_int=0;
int oldstyle_int=0;
int pipnoclear_int=0;
int ham_int=ms->ham_int;
int reqwidth;
int reqheight;
UWORD *emptypointer;
int SCREENWIDTH=320;
int SCREENHEIGHT=200;
int different;
int bpr;
struct ScreenModeRequester *video_smr = NULL;
BOOL video_is_native_mode = FALSE;
BOOL video_is_cyber_mode = FALSE;
int mydepth=8;
int numbuffers=1;
unsigned char *screen=0;
unsigned char *screenb=0;
unsigned char *screenc=0;
int video_oscan_height;
int mode2_changed;
struct Screen *video_screen=ms->video_screen;
struct Window *video_window=ms->video_window;
BPTR mylock;
locked=0;
ms->onlyptr=0;
if (override==3)
{
ms->Internal1=0; /* No input handler support here! */
ms->Internal2=0; /* Outdated Code */
ms->onlyptr=1;
return ms;
}
sprintf(title2,"%s%s","ENV:",title);
mylock = Lock(title2,ACCESS_READ);
if (!mylock) UnLock(CreateDir(title2));
else UnLock(mylock);
sprintf(title2,"%s%s","ENVARC:",title);
mylock = Lock(title2,ACCESS_READ);
if (!mylock) UnLock(CreateDir(title2));
else UnLock(mylock);
strcpy(title2,title);
if (video_window || video_screen) Rearrange(ms);
else {
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
ms->video_smr=0;
ms->emptypointer=0;
ms->video_screen=0;
ms->video_window=0;
ms->video_depth=0;
ms->transtable=0;
ms->wbcolors=0;
ms->WBColorTable=0;
ms->ColorTable=0;
}
SCREENWIDTH=ms->SCREENWIDTH;
SCREENHEIGHT=ms->SCREENHEIGHT;
reqwidth=SCREENWIDTH;
reqheight=SCREENHEIGHT;
different=0;
ms->Internal1=0; /* No input handler support here! */
ms->Internal2=0; /* Outdated Code */
if ((AslBase = OpenLibrary ("asl.library", 37L)) != 0) {
video_smr = (void *)AllocAslRequest(ASL_ScreenModeRequest, aslreqtags);
ms->video_smr=video_smr;
if (!video_smr) {
error ("AllocAslRequest failed!\n",ms);
return 0;
}
}
else {
error("asl.library V37 could not be opened\n",ms);
return(0);
}
if (GfxBase==0) {
if ((GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library",36)) == 0) {
error("graphics.library V36 could not be opened\n",ms);
return(0);
}
#ifdef ELF
_GfxBase = GfxBase; /* to make it visible for the 68k part */
#endif
}
if (IntuitionBase==0) {
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",36)) == 0) {
error("intuition.library V36 could not be opened\n",ms);
return 0;
}
}
if (RtgBase=OpenLibrary("Picasso96/rtg.library",0)) {
CloseLibrary(RtgBase);
if (P96Base==0)
P96Base = OpenLibrary("Picasso96API.library",0);
}
if (CyberGfxBase==0)
CyberGfxBase = OpenLibrary ("cybergraphics.library", 0);
propertymask =DIPF_IS_DUALPF | DIPF_IS_PF2PRI | DIPF_IS_HAM;
sprintf(reqtitle,title2);
strcpy(title2,"ENV:");
strcat(title2,reqtitle);
strcpy(modeid2,"ENVARC:");
strcat(modeid2,reqtitle);
strcpy(modeid3,title2);
strcpy(wb,title2);
strcpy(dbuf,title2);
strcpy(ham,title2);
strcpy(pip,title2);
strcpy(oldstyle,title2);
strcpy(psn,title2);
strcpy(pipnoclear,title2);
strcpy(likecgx,title2);
strcat(likecgx,"/resize");
strcat(modeid2,"/modeid");
strcat(ham,"/ham");
strcat(wb,"/wb");
strcat(dbuf,"/dbuf");
strcat(pip,"/pip");
strcat(oldstyle,"/oldstyle");
strcat(title2,"/modeid");
strcat(psn,"/pubscreenname");
strcat(pipnoclear,"/pipnoclear");
if (GetVar(dbuf,tb,1024,0)!=-1) {
dbuf_int=atoi(tb);
}
lockingmode=1;
if (GetVar("env:lockingmode",tb,1024,0)!=-1)
lockingmode=atoi(tb);
resize_int=1.0;
if (GetVar(likecgx,tb,1024,0)!=-1)
resize_int=atof(tb);
likecgx_int=1;
if (GetVar(ham,tb,1024,0)!=-1)
ham_int=atoi(tb);
if (GetVar(oldstyle,tb,1024,0)!=-1) {
oldstyle_int=atoi(tb);
if (oldstyle_int) dbuf_int=1;
}
if (GetVar(wb,tb,1024,0)!=-1) {
wb_int=atoi(tb);
if (wb_int) dbuf_int=0;
}
if ((GetVar(pip,tb,1024,0)!=-1)&&(P96Base)) {
pip_int=atoi(tb);
if (pip_int) dbuf_int=0;
if (pip_int) wb_int=1;
}
if ((GetVar(pipnoclear,tb,1024,0)!=-1)&&(P96Base)) {
pipnoclear_int=atoi(tb);
if (pipnoclear_int) pip_int=1;
if (pipnoclear_int) dbuf_int=0;
if (pip_int) wb_int=1;
}
strcpy(pubscreenname,"Workbench");
if (GetVar(psn,tb,1024,0)!=-1)
strcpy(pubscreenname,tb);
mode2_changed=0;
mode_num=-1;
if ((GetVar(title2,tb,1024,0)!=-1)&&(override!=1)) {
char modeid[512];
int f=0;
mode2_changed=2;
strcpy(modeid,title2);
mode=atoi(tb);
if ((!acceptmode(ms,mode))&&(override==2)) {
mode=0;
mode2_changed=1;
while (f<20) {
int found;
mode_num=f+1;
sprintf(realid,"%s%i",modeid,f+1);
found=GetVar(realid,tb,1024,0);
mode=0;
if (found==-1) break;
mode=atoi(tb);
if (!acceptmode(ms,mode))
mode=0;
else goto found;
f++;
}
}
if (!mode) goto request;
found:
mode2_changed=2;
}
else {
char help[100];
request:
sprintf(help," %dx%d",SCREENWIDTH,SCREENHEIGHT);
strcat(reqtitle, help);
aslreq[0].ti_Data=(ULONG)reqtitle;
aslreq[1].ti_Data=mode;
aslreq[2].ti_Data=ms->SCREENWIDTH;
aslreq[3].ti_Data=ms->SCREENHEIGHT;
aslreq[4].ti_Data=ms->MAXWIDTH;
aslreq[5].ti_Data=ms->MAXHEIGHT;
aslreq[6].ti_Data=ms->MINDEPTH;
aslreq[7].ti_Data=ms->MAXDEPTH;
aslreq[8].ti_Data=propertymask;
aslreq[10].ti_Data=(ULONG)thehook;
CNAME(cppc_minwidth)=ms->SCREENWIDTH;
CNAME(cppc_minheight)=ms->SCREENHEIGHT;
CNAME(cppc_maxwidth)=ms->MAXWIDTH;
CNAME(cppc_maxheight)=ms->MAXHEIGHT;
CNAME(cppc_mindepth)=ms->MINDEPTH;
CNAME(cppc_maxdepth)=ms->MAXDEPTH;
if (!AslRequest (video_smr, aslreq)) {
error ("AslRequest() failed",ms);
return 0;
}
mode = video_smr->sm_DisplayID;
if (mode2_changed==0) {
char modeid[512];
FILE *fil;
sprintf(modeid,"%i",mode);
//SetVar(title2,modeid,1024,0);
//SetVar(modeid2,modeid,1024,0);
fil=fopen(title2,"w");
fprintf(fil,modeid);
fclose(fil);
fil=fopen(modeid2,"w");
fprintf(fil,modeid);
fclose(fil);
}
else if (mode2_changed==1) {
int num;
char modeid[512];
FILE *fil;
if (strcmp(realid,"modeid20")==0) num=20;
else num=mode_num;
if (existsmode(modeid3,title2,mode,mode_num)) goto out;
sprintf(title2,"%s%i",title2,num);
sprintf(modeid2,"%s%i",modeid2,num);
sprintf(modeid,"%i",mode);
//SetVar(title2,modeid,1024,0);
//SetVar(modeid2,modeid,1024,0);
fil=fopen(title2,"w");
fprintf(fil,modeid);
fclose(fil);
fil=fopen(modeid2,"w");
fprintf(fil,modeid);
fclose(fil);
}
}
out:
ms->ham_int=ham_int;
ms->wb_int=wb_int;
ms->pip_int=pip_int;
ms->dbuf_int=dbuf_int;
ms->oldstyle_int=oldstyle_int;
ms->likecgx=likecgx_int;
if (ms->pip_int) {
strcpy(ms->pubscreenname,"Workbench");
strcpy(pubscreenname,ms->pubscreenname);
}
else strcpy(ms->pubscreenname,pubscreenname);
ms->rtgm_int=0;
ms->mode=mode;
if (wb_int) {
locked=1;
video_screen=LockPubScreen(pubscreenname);
}
if ((handle = FindDisplayInfo (mode)) == NULL) {
error ("Can't FindDisplayInfo() for mode %08x", ms,mode);
return 0;
}
if ((nbytes = GetDisplayInfoData (handle, (UBYTE *)&dispinfo,
sizeof(struct DisplayInfo), DTAG_DISP,
0)) < 40 ) {
error ("Can't GetDisplayInfoData() for mode %08x, got %d bytes",
ms,mode, nbytes);
return 0;
}
if ((nbytes = GetDisplayInfoData (handle, (UBYTE *)&dimsinfo,
sizeof(dimsinfo), DTAG_DIMS,
0)) < 66) {
error ("Can't GetDisplayInfoData() for mode %08x, got %d bytes",
ms,mode, nbytes);
return 0;
}
if ((ms->dbuf_int)&&(ms->oldstyle_int)) numbuffers=2;
else if (ms->dbuf_int) numbuffers=3;
else numbuffers=1;
ms->numbuffers=numbuffers;
ms->SCREENWIDTH=SCREENWIDTH;
ms->SCREENHEIGHT=SCREENHEIGHT;
video_oscan_height = dimsinfo.MaxOScan.MaxY - dimsinfo.MaxOScan.MinY + 1;
ms->video_oscan_height=video_oscan_height;
video_is_cyber_mode = 0;
if (CyberGfxBase != NULL)
video_is_cyber_mode = IsCyberModeID (mode);
video_is_native_mode = ((GfxBase->LibNode.lib_Version < 39 ||
(dispinfo.PropertyFlags & DIPF_IS_EXTRAHALFBRITE) != 0 ||
(dispinfo.PropertyFlags & DIPF_IS_AA) != 0 ||
(dispinfo.PropertyFlags & DIPF_IS_ECS) != 0 ||
(dispinfo.PropertyFlags & DIPF_IS_DBUFFER) != 0) &&
!video_is_cyber_mode &&
(dispinfo.PropertyFlags & DIPF_IS_FOREIGN) == 0);
if (!video_is_native_mode) {
ham_int=0;
ms->ham_int=0;
}
else {
pip_int=0;
pipnoclear_int=0;
ms->pip_int=0;
if (wb_int) {
video_is_native_mode=0;
ham_int=0;
ms->ham_int=0;
}
}
video_depth = 8;
ms->video_depth=video_depth;
ms->video_is_cyber_mode=video_is_cyber_mode;
ms->video_is_native_mode=video_is_native_mode;
SCREENWIDTH= dimsinfo.Nominal.MaxX-dimsinfo.Nominal.MinX+1;
SCREENHEIGHT=dimsinfo.Nominal.MaxY-dimsinfo.Nominal.MinY+1;
if (video_is_cyber_mode) {
mydepth=GetCyberIDAttr(CYBRIDATTR_DEPTH,mode);
SCREENWIDTH=GetCyberIDAttr(CYBRIDATTR_WIDTH,mode);
SCREENHEIGHT=GetCyberIDAttr(CYBRIDATTR_HEIGHT,mode);
}
if (!(video_is_native_mode)) {
if (reqwidth<SCREENWIDTH) {
SCREENWIDTH=reqwidth;
SCREENHEIGHT=reqheight;
different=1;
}
}
ms->SCREENWIDTH=SCREENWIDTH;
ms->SCREENHEIGHT=SCREENHEIGHT;
rect.MinX = 0;
rect.MinY = 0;
if ((ms->ham_int)&&(ms->video_is_native_mode)) rect.MaxX = 2*SCREENWIDTH-1;
else rect.MaxX = SCREENWIDTH - 1;
rect.MaxY = SCREENHEIGHT - 1;
ms->format=-1;
if (video_is_native_mode) {
ms->c2p_compare_buffer = malloc(SCREENWIDTH*SCREENHEIGHT); /* phx */
if (!ham_int) ms->format=PIXFMT_LUT8;
else ms->format=PIXFMT_RGB15;
if (ms->format==PIXFMT_RGB15) {
for (i = 0; i < numbuffers; i++) {
InitRastPort (&video_rastport[i]);
}
ms->video_rastport=video_rastport;
if (wb_int) video_screen=IntuitionBase->FirstScreen;
else {
if (SCREENWIDTH<640) mode=mode|HIRESHAM_KEY;
else mode=mode|SUPERHAM_KEY;
if ((ms->dbuf_int)&&(ms->oldstyle_int)) {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, 2*SCREENWIDTH,
SA_Height, 2*SCREENHEIGHT,
SA_Depth, 8,
SA_Title, FALSE,
SA_Quiet, TRUE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
else {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, 2*SCREENWIDTH,
SA_Height, SCREENHEIGHT,
SA_Depth, 8,
SA_Title, FALSE,
SA_Quiet, TRUE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
}
ms->video_screen=video_screen;
}
else {
for (i = 0; i < numbuffers; i++)
InitRastPort (&video_rastport[i]);
ms->video_rastport=video_rastport;
if (wb_int) video_screen=IntuitionBase->FirstScreen;
else {
if ((ms->dbuf_int)&&(ms->oldstyle_int)) {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, SCREENWIDTH,
SA_Height, 2*SCREENHEIGHT,
SA_Depth, 8,
SA_Title, FALSE,
SA_Quiet, TRUE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
else {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, SCREENWIDTH,
SA_Height, SCREENHEIGHT,
SA_Depth, 8,
SA_Quiet, TRUE,
SA_Title, FALSE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
}
ms->video_screen=video_screen;
}
}
else {
if (wb_int) video_screen=IntuitionBase->FirstScreen;
else {
if ((ms->dbuf_int)&&(ms->oldstyle_int)) {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, SCREENWIDTH,
SA_Height, 2*SCREENHEIGHT,
SA_Depth, mydepth,
SA_Quiet, TRUE,
SA_ShowTitle,FALSE,
SA_Draggable,FALSE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
else {
if ((video_screen = OpenScreenTags (NULL,
SA_DisplayID, mode,
SA_DClip, (ULONG)&rect,
SA_Width, SCREENWIDTH,
SA_Height, SCREENHEIGHT,
SA_Depth, mydepth,
SA_Quiet, TRUE,
SA_Title, FALSE,
TAG_DONE, 0)) == NULL) {
error ("OpenScreen() failed",ms);
return 0;
}
}
}
ms->video_screen=video_screen;
}
ms->SCREENWIDTH=SCREENWIDTH;
ms->SCREENHEIGHT=SCREENHEIGHT;
if (CyberGfxBase&&(video_is_cyber_mode)) {
video_bitmap_handle = (APTR)LockBitMapTags (video_screen->ViewPort.RasInfo->BitMap,
LBMI_WIDTH, &width,
LBMI_DEPTH, &depth,
LBMI_PIXFMT, &pixfmt,
LBMI_BYTESPERROW, &bpr,
LBMI_BASEADDRESS, &screen,
TAG_DONE);
if (wb_int==0)
ms->bpr=bpr;
UnLockBitMap (video_bitmap_handle);
ms->screen=screen;
if (pixfmt==PIXFMT_LUT8) ms->format=PIXFMT_LUT8;
else if (pixfmt==PIXFMT_RGB16) ms->format=PIXFMT_RGB16;
else if (pixfmt==PIXFMT_BGR16) ms->format=PIXFMT_BGR16;
else if (pixfmt==PIXFMT_RGB16PC) ms->format=PIXFMT_RGB16PC;
else if (pixfmt==PIXFMT_BGR16PC) ms->format=PIXFMT_BGR16PC;
else if (pixfmt==PIXFMT_RGB15) ms->format=PIXFMT_RGB15;
else {
error("Unsupported Screen format",ms);
return 0;
}
if ((ms->dbuf_int)&&(ms->oldstyle_int)) {
screenb=screen+SCREENHEIGHT*(ms->bpr);
screenc=0;
ms->screenb=screenb;
ms->screenc=screenc;
}
if (wb_int==1) {
if (pixfmt==PIXFMT_LUT8) bpr=SCREENWIDTH;
else bpr=SCREENWIDTH*2;
ms->bpr=bpr;
}
}
if (ms->format==-1) {
error("Unsupported Screen format",ms);
return 0;
}
idcmp = IDCMP_RAWKEY;
wflags = WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_NOCAREREFRESH |
WFLG_SIMPLE_REFRESH;
idcmp |= IDCMP_MOUSEMOVE | IDCMP_DELTAMOVE | IDCMP_MOUSEBUTTONS;
wflags |= WFLG_REPORTMOUSE;
if (!pip_int) {
if (wb_int) {
if ((video_window = OpenWindowTags (NULL,
WA_Left, 0,
WA_Top, 0,
WA_InnerWidth, SCREENWIDTH,
WA_InnerHeight, SCREENHEIGHT,
WA_IDCMP, idcmp,
WA_DragBar, TRUE,
WA_RMBTrap, TRUE,
WA_DepthGadget,TRUE,
WA_Flags, wflags,
WA_CustomScreen, video_screen,
WA_PubScreenName,(ULONG)pubscreenname,
TAG_DONE)) == NULL) {
error ("OpenWindow() failed",ms);
return 0;
}
}
else {
if ((ms->dbuf_int)&&(ms->oldstyle_int)) {
int w;
if ((ms->video_is_native_mode)&&(ms->ham_int)) w=2*SCREENWIDTH;
else w=SCREENWIDTH;
if ((video_window = OpenWindowTags (NULL,
WA_Left, 0,
WA_Top, 0,
WA_Width, w,
WA_Height, 2*SCREENHEIGHT,
WA_IDCMP, idcmp,
WA_Flags, wflags,
WA_Borderless, TRUE,
WA_DepthGadget,0,
WA_CloseGadget,0,
WA_DragBar,0,
WA_SizeGadget,0,
WA_CustomScreen, video_screen,
WA_DepthGadget,TRUE,
WA_PubScreenName,(ULONG)pubscreenname,
TAG_DONE)) == NULL) {
error ("OpenWindow() failed",ms);
return 0;
}
}
else {
int w;
if ((ms->video_is_native_mode)&&(ms->ham_int)) w=2*SCREENWIDTH;
else w=SCREENWIDTH;
if ((video_window = OpenWindowTags (NULL,
WA_Left, 0,
WA_Top, 0,
WA_InnerWidth, w,
WA_InnerHeight, SCREENHEIGHT,
WA_IDCMP, idcmp,
WA_Flags, wflags,
WA_CustomScreen, video_screen,
WA_Borderless, TRUE,
WA_DepthGadget,0,
WA_CloseGadget,0,
WA_DragBar,0,
WA_SizeGadget,0,
WA_PubScreenName,(ULONG)pubscreenname,
TAG_DONE)) == NULL) {
error ("OpenWindow() failed",ms);
return 0;
}
}
}
}
else {
struct TagItem piptags[]= {
P96PIP_SourceFormat, 0,
P96PIP_SourceWidth, 0,
P96PIP_SourceHeight, 0,
WA_Title, (ULONG)"PIP",
WA_Flags,0,
WA_Activate,TRUE,
WA_RMBTrap, TRUE,
WA_Width, 0,
WA_Height, 0,
WA_DragBar,TRUE,
WA_DepthGadget,TRUE,
WA_IDCMP,0,
WA_NewLookMenus,TRUE,
WA_PubScreenName, 0,
P96PIP_AllowCropping,TRUE,
TAG_DONE,0
};
APTR vbhandle;
vbhandle = (APTR)LockBitMapTags (video_screen->ViewPort.RasInfo->BitMap,
LBMI_PIXFMT, (ULONG)&pixfmt,
TAG_DONE);
UnLockBitMap (vbhandle);
piptags[0].ti_Data=(ULONG)RGBFB_CLUT;
piptags[1].ti_Data=(ULONG)SCREENWIDTH;
piptags[2].ti_Data=(ULONG)SCREENHEIGHT;
piptags[4].ti_Data=wflags;
piptags[7].ti_Data=SCREENWIDTH;
piptags[8].ti_Data=SCREENHEIGHT;
piptags[11].ti_Data=idcmp;
piptags[13].ti_Data=(ULONG)pubscreenname;
piptags[7].ti_Data=SCREENWIDTH*resize_int;
piptags[8].ti_Data=SCREENHEIGHT*resize_int;
if (video_screen->Width+20<piptags[7].ti_Data) piptags[7].ti_Data=video_screen->Width;
if (video_screen->Height+20<piptags[8].ti_Data) piptags[8].ti_Data=video_screen->Height;
ms->format=PIXFMT_LUT8;
if (mydepth==8)
{
ms->format=PIXFMT_LUT8;
pixfmt=PIXFMT_LUT8;
}
if (pixfmt==PIXFMT_RGB16)
{
piptags[0].ti_Data=RGBFB_R5G6B5;
ms->format=pixfmt=PIXFMT_RGB16;
}
else if (pixfmt==PIXFMT_RGB16PC)
{
piptags[0].ti_Data=RGBFB_R5G6B5PC;
ms->format=pixfmt=PIXFMT_RGB16PC;
}
else if (pixfmt==PIXFMT_BGR16PC)
{
piptags[0].ti_Data=RGBFB_B5G6R5PC;
ms->format=pixfmt=PIXFMT_BGR16PC;
}
else
{
piptags[0].ti_Data=RGBFB_CLUT;
ms->format=pixfmt=PIXFMT_LUT8;
}
piptags[13].ti_Data=(ULONG)pubscreenname;
video_window = p96PIP_OpenTagList(piptags);
if (!(video_window)) {
UnlockPubScreen(0,video_screen);
strcpy(pubscreenname,"Workbench");
video_screen=LockPubScreen(pubscreenname);
piptags[13].ti_Data=(ULONG)pubscreenname;
video_window = p96PIP_OpenTagList(piptags);
}
if (video_window) {
struct TagItem gtTags[] = { {P96PIP_SourceBitMap,0},{TAG_DONE, 0} };
struct RenderInfo renderinfo;
LONG lock;
gtTags[0].ti_Data = (ULONG)&bitmap;
p96PIP_GetTagList(video_window, gtTags);
lock = p96LockBitMap(bitmap, (UBYTE *) &renderinfo, sizeof(struct RenderInfo));
screen = (unsigned char *) renderinfo.Memory;
p96UnlockBitMap(bitmap, lock);
bpr=p96GetBitMapAttr(bitmap,P96BMA_BYTESPERROW);
ms->bpr=bpr;
if (!(pipnoclear_int)) memset(screen,0,SCREENWIDTH*SCREENHEIGHT*p96GetBitMapAttr(bitmap,P96BMA_BYTESPERPIXEL));
}
else {
error("Could not initialize PIP\n",ms,0);
return 0;
}
}
ms->video_window=video_window;
ms->video_tmp_bm=&video_tmp_bm;
if (wb_int) UnlockPubScreen(0,video_screen);
locked=0;
InitBitMap (&video_tmp_bm, video_depth, SCREENWIDTH, 1);
video_temprp=*(video_window->RPort);
ms->video_temprp=&video_temprp;
for (depth = 0; depth < video_depth; depth++) {
video_tmp_bm.Planes[depth]=AllocRaster(SCREENWIDTH,1);
if (video_tmp_bm.Planes[depth] == 0) {
error ("AllocRaster() failed",ms);
return 0;
}
}
video_temprp.Layer = NULL;
video_temprp.BitMap = &video_tmp_bm;
ms->wbcolors=(UBYTE *)AllocVec(1024,MEMF_FAST|MEMF_CLEAR);
if (!(ms->wbcolors)) {
error("Out of memory",ms);
return 0;
}
ms->pen_obtained=0;
ms->transtable=(UBYTE *)AllocVec(256*sizeof(UBYTE),MEMF_FAST|MEMF_CLEAR);
ms->WBColorTable=(unsigned long *)AllocVec(770*sizeof(unsigned long),MEMF_FAST|MEMF_CLEAR);
ms->ColorTable=(unsigned long *)AllocVec(770*sizeof(unsigned long),MEMF_FAST|MEMF_CLEAR);
if (!(ms->transtable)) {
error("Out of memory",ms);
return 0;
}
if (!(ms->WBColorTable)) {
error("Out of memory",ms);
return 0;
}
if (!(ms->ColorTable)) {
error("Out of memory",ms);
return 0;
}
ms->WBColorTable[0] = 0x01000000;
ms->WBColorTable[3*256+1] = 0;
GetRGB32(((video_screen)->ViewPort).ColorMap,0,256,ms->WBColorTable+1);
ms->pal_changed=0;
emptypointer=(UWORD *)AllocVec(sizeof(UWORD)*6,MEMF_CHIP|MEMF_CLEAR);
ms->emptypointer=emptypointer;
if (!emptypointer) {
error("Not enough memory!\n",ms);
return 0;
}
SetPointer (video_window, emptypointer, 1, 16, 0, 0);
ms->bufnum=0;
if (video_smr) {
FreeAslRequest(video_smr);
video_smr=0;
}
if (ms->dbuf_int) {
ms->bitmapa=(&((ms->video_screen)->RastPort))->BitMap;
if (video_is_native_mode) {
if (ham_int) {
if (ms->oldstyle_int) {
ULONG *ppr;
ppr=(ULONG *)(ms->bitmapa)->Planes[6];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xBBBBBBBB;
ppr=(ULONG *)(ms->bitmapa)->Planes[7];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xEEEEEEEE;
ms->bitmapb=0;
ms->bitmapc=0;
ms->screen=(ms->bitmapa)->Planes[0];
ms->screenb=(ms->screen)+(SCREENWIDTH/4)*SCREENHEIGHT;
ms->screenc=0;
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
}
else {
ULONG *ppr;
ms->Buf1 = AllocScreenBuffer(ms->video_screen, NULL, SB_SCREEN_BITMAP);
if (!(ms->Buf1)) {
error("ScreenBuffer allocation failed",ms);
return 0;
}
ms->Buf2 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf2)) {
error("ScreenBuffer 2 allocation failed",ms);
return 0;
}
ms->Buf3 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf3)) {
error("ScreenBuffer 3 allocation failed",ms);
return 0;
}
ms->bitmapa=(ms->Buf1)->sb_BitMap;
ms->bitmapb=(ms->Buf2)->sb_BitMap;
ms->bitmapc=(ms->Buf3)->sb_BitMap;
ms->screen=(ms->bitmapa)->Planes[0];
ms->screenb=(ms->bitmapb)->Planes[0];
ms->screenc=(ms->bitmapc)->Planes[0];
ppr=(ULONG *)(ms->bitmapa)->Planes[6];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xBBBBBBBB;
ppr=(ULONG *)(ms->bitmapa)->Planes[7];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xEEEEEEEE;
if (numbuffers>1) {
ppr=(ULONG *)(ms->bitmapb)->Planes[6];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xBBBBBBBB;
ppr=(ULONG *)(ms->bitmapb)->Planes[7];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xEEEEEEEE;
if (numbuffers>2) {
ppr=(ULONG *)(ms->bitmapc)->Planes[6];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xBBBBBBBB;
ppr=(ULONG *)(ms->bitmapc)->Planes[7];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xEEEEEEEE;
}
}
}
}
else {
if (ms->oldstyle_int) {
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
ms->bitmapb=0;
ms->bitmapc=0;
ms->screen=(ms->bitmapa)->Planes[0];
ms->screenb=(ms->screen)+(SCREENWIDTH/8)*SCREENHEIGHT;
ms->screenc=0;
}
else {
ms->Buf1 = AllocScreenBuffer(ms->video_screen, NULL, SB_SCREEN_BITMAP);
if (!(ms->Buf1)) {
error("ScreenBuffer allocation failed",ms);
return 0;
}
ms->Buf2 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf2)) {
error("ScreenBuffer 2 allocation failed",ms);
return 0;
}
ms->Buf3 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf3)) {
error("ScreenBuffer 3 allocation failed",ms);
return 0;
}
ms->bitmapa=(ms->Buf1)->sb_BitMap;
ms->bitmapb=(ms->Buf2)->sb_BitMap;
ms->bitmapc=(ms->Buf3)->sb_BitMap;
ms->screen=(ms->bitmapa)->Planes[0];
ms->screenb=(ms->bitmapb)->Planes[0];
ms->screenc=(ms->bitmapc)->Planes[0];
}
}
}
else {
if (ms->oldstyle_int) {
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
ms->bitmapb=0;
ms->bitmapc=0;
}
else {
ms->Buf1 = AllocScreenBuffer(ms->video_screen, NULL, SB_SCREEN_BITMAP);
if (!(ms->Buf1)) {
error("ScreenBuffer allocation failed",ms);
return 0;
}
ms->Buf2 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf2)) {
error("ScreenBuffer 2 allocation failed",ms);
return 0;
}
ms->Buf3 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf3)) {
error("ScreenBuffer 3 allocation failed",ms);
return 0;
}
ms->bitmapa=(ms->Buf1)->sb_BitMap;
ms->bitmapb=(ms->Buf2)->sb_BitMap;
ms->bitmapc=(ms->Buf3)->sb_BitMap;
video_bitmap_handle = (APTR)LockBitMapTags(ms->bitmapb,
LBMI_BASEADDRESS, &screenb,
TAG_DONE);
UnLockBitMap (video_bitmap_handle);
video_bitmap_handle = (APTR)LockBitMapTags (ms->bitmapc,
LBMI_BASEADDRESS, &screenc,
TAG_DONE);
UnLockBitMap (video_bitmap_handle);
ms->screenb=screenb;
ms->screenc=screenc;
}
}
if (ms->oldstyle_int) {
video_rastport[0].BitMap = ms->bitmapa;
ms->thebitmap=ms->bitmapa;
SetAPen (&video_rastport[0], (1 << 8) - 1);
SetBPen (&video_rastport[0], 0);
SetDrMd (&video_rastport[0], JAM2);
}
else {
video_rastport[0].BitMap = ms->bitmapa;
video_rastport[1].BitMap = ms->bitmapb;
video_rastport[2].BitMap = ms->bitmapc;
ms->thebitmap=ms->bitmapa;
for (i=0;i<2;i++) {
SetAPen (&video_rastport[i], (1 << 8) - 1);
SetBPen (&video_rastport[i], 0);
SetDrMd (&video_rastport[i], JAM2);
}
}
}
else {
ms->bitmapa=((ms->video_window)->RPort)->BitMap;
if (video_is_native_mode) {
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
ms->bitmapb=0;
ms->bitmapc=0;
ms->screen=(ms->bitmapa)->Planes[0];
if (ms->ham_int) {
ULONG *ppr;
ppr=(ULONG *)(ms->bitmapa)->Planes[6];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xBBBBBBBB;
ppr=(ULONG *)(ms->bitmapa)->Planes[7];
for (depth=0;depth<((SCREENWIDTH*SCREENHEIGHT)/16);depth++)
*ppr++=0xEEEEEEEE;
}
}
else {
ms->Buf1=0;
ms->Buf2=0;
ms->Buf3=0;
ms->bitmapb=0;
ms->bitmapc=0;
}
video_rastport[0].BitMap = ms->bitmapa;
ms->thebitmap=ms->bitmapa;
SetAPen (&video_rastport[0], (1 << 8) - 1);
SetBPen (&video_rastport[0], 0);
SetDrMd (&video_rastport[0], JAM2);
}
if (ms->pip_int) {
struct TagItem gtTags[] = { {P96PIP_SourceBitMap,0},{TAG_DONE, 0} };
struct RenderInfo renderinfo;
LONG lock;
gtTags[0].ti_Data = (ULONG)&bitmap;
p96PIP_GetTagList(video_window, gtTags);
lock = p96LockBitMap(bitmap, (UBYTE *) &renderinfo, sizeof(struct RenderInfo));
screen = (unsigned char *) renderinfo.Memory;
p96UnlockBitMap(bitmap, lock);
ms->screen=screen;
if (!(pipnoclear_int)) memset(screen,0,SCREENWIDTH*SCREENHEIGHT*p96GetBitMapAttr(bitmap,P96BMA_BYTESPERPIXEL));
}
if (ms->bpr==0) {
if (ms->format==PIXFMT_LUT8) ms->bpr=ms->SCREENWIDTH;
else ms->bpr=2*(ms->SCREENWIDTH);
}
if (different&&(ms->video_is_cyber_mode)) {
UnLockBitMap(LockBitMapTags (ms->bitmapa,
LBMI_BYTESPERROW, &bpr,
TAG_DONE));
ms->bpr=bpr;
}
if (!ms->video_is_cyber_mode) likecgx_int=0;
if ((ms->wb_int)&&(!P96Base)) likecgx_int=1;
if (ms->pip_int) likecgx_int=0;
if (ms->format==PIXFMT_LUT8) likecgx_int=0;
if (!(ms->wb_int)) likecgx_int=0;
ms->likecgx=likecgx_int;
if (likecgx_int) {
ms->Buf1 = AllocScreenBuffer(ms->video_screen, NULL, 0);
if (!(ms->Buf1)) {
error("Back Screen Buffer allocation failed",ms);
return 0;
}
ms->bitmapa=(ms->Buf1)->sb_BitMap;
video_bitmap_handle = (APTR)LockBitMapTags (ms->bitmapa,
LBMI_BASEADDRESS, &(ms->screen),
LBMI_BYTESPERROW,&(ms->bpr),
TAG_DONE);
UnLockBitMap (video_bitmap_handle);
}
if (pixfmt==PIXFMT_LUT8) ms->video_depth=8;
else if (pixfmt==PIXFMT_RGB16) ms->video_depth=16;
else if (pixfmt==PIXFMT_BGR16) ms->video_depth=16;
else if (pixfmt==PIXFMT_RGB16PC) ms->video_depth=16;
else if (pixfmt==PIXFMT_BGR16PC) ms->video_depth=16;
else if (pixfmt==PIXFMT_RGB15) ms->video_depth=15;
if ((ms->video_depth==15)&&(ms->video_is_native_mode)) ms->video_depth=16;
return(ms);
}
void LoadColors(struct Mode_Screen *ms, ULONG Table[])
{
struct TagItem EmptyTags[] = {
TAG_DONE,0
};
int i,r,g,b;
struct ViewPort *VPort;
struct Window *Window;
struct ColorMap *ColorMap;
Window=ms->video_window;
ColorMap = Window->WScreen->ViewPort.ColorMap;
VPort = &Window->WScreen->ViewPort;
if ((!(ms->wb_int))||(ms->pip_int)) {
LoadRGB32(VPort,Table);
return;
}
if (!(ms->pen_obtained)) {
ms->WBColorTable[0] = 0x01000000;
ms->WBColorTable[3*256+1] = 0;
GetRGB32(ColorMap,0,256,ms->WBColorTable+1);
for (i=0;i<(3*256+2);i++)
ms->ColorTable[i] = ms->WBColorTable[i];
for (i=0; i<256; i++) {
r = Table[3*i+1];
g = Table[3*i+2];
b = Table[3*i+3];
r=r&0xFF000000;
g=g&0xFF000000;
b=b&0xFF000000;
ms->transtable[i] = ObtainBestPenA(ColorMap,r,g,b,EmptyTags);
}
}
for (i=0; i<256; i++) {
ms->ColorTable[3*ms->transtable[i]+1] = Table[3*i+1];
ms->ColorTable[3*ms->transtable[i]+2] = Table[3*i+2];
ms->ColorTable[3*ms->transtable[i]+3] = Table[3*i+3];
}
LoadRGB32(VPort,ms->ColorTable);
ms->pen_obtained = TRUE;
ms->pal_changed=1;
}
void DoubleBufferOld(struct Mode_Screen *ms)
{
struct ViewPort *vp = &((ms->video_screen)->ViewPort);
int bufnum=ms->bufnum;
if (bufnum == 0) {
vp->RasInfo->RyOffset = ms->SCREENHEIGHT;
ScrollVPort(vp);
WaitBOVP(vp);
ms->bufnum = 1-ms->bufnum;
}
else {
vp->RasInfo->RyOffset = 0;
ScrollVPort(vp);
WaitBOVP(vp);
ms->bufnum = 1-ms->bufnum;
}
}
void DoubleBuffer(struct Mode_Screen *ms)
{
struct ViewPort *vp = &((ms->video_screen)->ViewPort);
if (ms->dbuf_int==0) return;
if (ms->oldstyle_int) {
DoubleBufferOld(ms);
return;
}
if (ms->bufnum == 0) {
ms->thebitmap=ms->bitmapb;
(ms->Buf2)->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort = NULL;
while (!ChangeScreenBuffer(ms->video_screen, ms->Buf2));
ms->bufnum = 1;
}
else if (ms->bufnum==1) {
ms->thebitmap=ms->bitmapc;
(ms->Buf3)->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort = NULL;
while (!ChangeScreenBuffer(ms->video_screen, ms->Buf3));
ms->bufnum=2;
}
else {
ms->thebitmap=ms->bitmapa;
(ms->Buf1)->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort = NULL;
while (!ChangeScreenBuffer(ms->video_screen, ms->Buf1));
ms->bufnum=0;
}
}
#ifdef __PPC__
int ChunkyInit(struct Mode_Screen *ms,int srcformat)
#else
int ChunkyInit68k(struct Mode_Screen *ms,int srcformat)
#endif
{
if (ms->video_is_native_mode) ms->algo=c2p;
if (ms->wb_int) ms->algo=WbChunky8;
else ms->algo=Chunky8;
return 1;
}