#include "fxlib.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #include "MonochromeLib.h" #include "revolution.h" #include "image.h" #define STORAGE '\\','\\','f','l','s','0','\\' #define SD '\\','\\','c','r','d','0','\\' #define EXTEND '*','.','b','m','p' #define MEMORY SD #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define SCROLL_WIDTH 6 float zoomlevels[5]; int nzooms=0; float zoom_max; float zoom_min; float zoom; void setzoomlimits() { int i; int f=0; zoom_max=zoom; for(i=0;izoom) { f=1; zoom_max=zoomlevels[i]; } f=0; zoom_min=zoom; for(i=nzooms-1;i>=0 && !f;i--) if(zoomlevels[i]zoom) ins=i; else if(zoomlevels[i]==zoom) return; if(ins>=0) { for(i=nzooms-1;i>=ins;i--) zoomlevels[i+1]=zoomlevels[i]; zoomlevels[ins]=zoom; } else zoomlevels[nzooms]=zoom; nzooms++; } Clear() { Bdisp_AllClr_VRAM(); locate(1,1); PrintRev(" mViewer GX "); } WaitKey() { unsigned int key=0; while(!key) GetKey(&key); } PrintN(int n) { char tmp[16]; sprintf(tmp, "%ld", n); Print(tmp); } max(int a, int b) { if(a>b) return a; return b; } min(int a, int b) { if(a 1.0) ? zoom : 1.0; nzooms=0; zxmin=zxmax*(float)SCREEN_WIDTH; zymin=zymax*(float)SCREEN_HEIGHT; addzoomlevel(0.0125); addzoomlevel(1.0); addzoomlevel(zxmax); addzoomlevel(zymax); addzoomlevel((zxmin>zymin) ? zymin : zxmin); setzoomlimits(); e=1; m=0; // Binary-Events e: // * -> refresh // 2 -> scroll up // 4 -> scroll down // 8 -> scroll left // 16 -> scroll right // 32 -> zoom // 64 -> dezoom rstep=0; lstep=0; ustep=0; dstep=0; istep=0.0;ostep=0.0; // for progressive zoom & scrolling torelease=0; // forbids action repeat before key is released: bit1=keyCTRL | bit2=keyC zwidth=(int)(dheader.width/zoom), zheight=(int)(dheader.height)/zoom; // actual (zoomed) image dimensions zwidthold=zwidth, zheightold=zheight; // keeps previous (zoomed) image dimensions if(dheader.bits!=1) { ML_set_contrast(contrast2); GrayLinkBuffers(buffer1, buffer2); GrayInit(3273, 1454); } while(IsKeyUp(KEY_CTRL_EXIT) && !res) { step=max(1.0F,(int)(1.0F/zoom)); if(!(e&2)) ustep=step; else ustep+=step; if(!(e&4)) dstep=step; else dstep+=step; if(!(e&8)) lstep=step; else lstep+=step; if(!(e&16)) rstep=step; else rstep+=step; if(!(e&32)) istep=0.0; else istep+=0.01; if(!(e&64)) ostep=0.0; else ostep+=0.01; if(e || m) { if(!e) m=0; if(e&2 ) y0-=ustep; if(e&4 ) y0+=dstep; if(e&8 ) x0-=lstep; if(e&16 ) x0+=rstep; if(e&32){//zoom in //if(zoom-istep<1.0) istep=zoom-1.0; //if(zoom-istep<0.025) istep=zoom-0.025; if(zoom-istepzoom_max) ostep=zoom_max-zoom; zoom+=ostep; if(zoom>=zoom_max) { setzoomlimits(); ostep=0; } zwidthold=zwidth; zheightold=zheight; zwidth=(int)(dheader.width/zoom); zheight=(int)(dheader.height/zoom); x0 = (x0-SCREEN_WIDTH/2)*zwidth/zwidthold+SCREEN_WIDTH/2; y0 = (y0-SCREEN_HEIGHT/2)*zheight/zheightold+SCREEN_HEIGHT/2; } if(e) m=1; x0 = (x0+zwidth < SCREEN_WIDTH ) ? (SCREEN_WIDTH - zwidth ): x0; y0 = (y0+zheight < SCREEN_HEIGHT) ? (SCREEN_HEIGHT - zheight): y0; if(y0>0) y0=0; if(x0>0) x0=0; if(y0>0) y0=0; if(x0>0) x0=0; if(dheader.bits!=1) { memset(offbuffer1,0,1024); memset(offbuffer2,0,1024); } // else // if(dheader.widthSCREEN_WIDTH) trunk=1; if(m && dheader.height/zoom>SCREEN_HEIGHT) { if(dheader.bits==1) { Bdisp_DrawLineVRAM(SCREEN_WIDTH-1,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1-SCROLL_WIDTH); Bdisp_DrawLineVRAM(SCREEN_WIDTH-SCROLL_WIDTH,0,SCREEN_WIDTH-SCROLL_WIDTH,SCREEN_HEIGHT-1-SCROLL_WIDTH*trunk); for(i=1;iSCREEN_WIDTH) { if(dheader.bits==1) { Bdisp_DrawLineVRAM(0,SCREEN_HEIGHT-1,SCREEN_WIDTH-1-SCROLL_WIDTH*trunk,SCREEN_HEIGHT-1); Bdisp_DrawLineVRAM(0,SCREEN_HEIGHT-SCROLL_WIDTH,SCREEN_WIDTH-1-SCROLL_WIDTH*trunk,SCREEN_HEIGHT-SCROLL_WIDTH); for(i=1;i SCREEN_HEIGHT) e|=2; if(!IsKeyUp(KEY_CTRL_LEFT) && IsKeyUp(KEY_CHAR_5) && x0<0) e|=16; if(!IsKeyUp(KEY_CTRL_RIGHT) && IsKeyUp(KEY_CHAR_5) && x0+zwidth > SCREEN_WIDTH) e|=8; if(!IsKeyUp(KEY_CHAR_MULT)) e|=32; if(!IsKeyUp(KEY_CHAR_DIV)) e|=64; if(!(e&64) && !(e&32)) setzoomlimits(); if (!IsKeyUp(KEY_CHAR_PLUS)) { if(dheader.bits!=1) { if(contrast2ML_CONTRAST_MIN) { contrast2--; ML_set_contrast(contrast2); } } else { if(contrast1>ML_CONTRAST_MIN) { contrast1--; ML_set_contrast(contrast1); } } } if(!(torelease&4) && (!IsKeyUp(KEY_CHAR_2) || !IsKeyUp(KEY_CHAR_1) || !IsKeyUp(KEY_CHAR_3) || !IsKeyUp(KEY_CTRL_DOWN) && !IsKeyUp(KEY_CHAR_5))) { y0-=(int)(SCREEN_HEIGHT); torelease|=4; e|=1; } if(!(torelease&8) && (!IsKeyUp(KEY_CHAR_8) || !IsKeyUp(KEY_CHAR_7) || !IsKeyUp(KEY_CHAR_9) || !IsKeyUp(KEY_CTRL_UP) && !IsKeyUp(KEY_CHAR_5))) { y0+=(int)(SCREEN_HEIGHT); torelease|=8; e|=1; } if(!(torelease&16) && (!IsKeyUp(KEY_CHAR_4) || !IsKeyUp(KEY_CHAR_7) || !IsKeyUp(KEY_CHAR_1) || !IsKeyUp(KEY_CTRL_LEFT) && !IsKeyUp(KEY_CHAR_5))) { x0+=(int)(SCREEN_WIDTH); torelease|=16; e|=1; } if(!(torelease&32) && (!IsKeyUp(KEY_CHAR_6) || !IsKeyUp(KEY_CHAR_3) || !IsKeyUp(KEY_CHAR_9) || !IsKeyUp(KEY_CTRL_RIGHT) && !IsKeyUp(KEY_CHAR_5))) { x0-=(int)(SCREEN_WIDTH); torelease|=32; e|=1; } if(torelease) // no-repeat actions { if((IsKeyUp(KEY_CHAR_5)) || (IsKeyUp(KEY_CHAR_2) && IsKeyUp(KEY_CHAR_1) && IsKeyUp(KEY_CHAR_3) && IsKeyUp(KEY_CTRL_DOWN))) torelease &= ~4; if((IsKeyUp(KEY_CHAR_5)) || (IsKeyUp(KEY_CHAR_8) && IsKeyUp(KEY_CHAR_7) && IsKeyUp(KEY_CHAR_9) && IsKeyUp(KEY_CTRL_UP))) torelease &= ~8; if((IsKeyUp(KEY_CHAR_5)) || (IsKeyUp(KEY_CHAR_4) && IsKeyUp(KEY_CHAR_1) && IsKeyUp(KEY_CHAR_7) && IsKeyUp(KEY_CTRL_LEFT))) torelease &= ~16; if((IsKeyUp(KEY_CHAR_5)) || (IsKeyUp(KEY_CHAR_6) && IsKeyUp(KEY_CHAR_3) && IsKeyUp(KEY_CHAR_9) && IsKeyUp(KEY_CTRL_RIGHT))) torelease &= ~32; } if(!IsKeyUp(KEY_CHAR_LPAR)) res=-1; if(!IsKeyUp(KEY_CHAR_RPAR)) res=1; } if(dheader.bits!=1 && !res) { GrayEnd(); Reset_Calc(); ML_set_contrast(contrast1); } /* if(dheader.bits!=1) { if(buffer1) { free(buffer1); buffer1=0; } if(buffer2) { free(buffer1); buffer2=0; } if(offbuffer1) { free(offbuffer1); offbuffer1=0; } if(offbuffer2) { free(offbuffer1); offbuffer2=0; } }*/ free(image); } else Error("in BMP data"); // if(dheader.indexedcolors) // free(palette); } else Error("Invalid compression"); } else Error("in BMP data header"); } else Error("This is no BMP file"); } else Error("This is no BMP file"); Bfile_CloseFile(fichier); return res; } FileName(unsigned char nom[], FONTCHARACTER file[]) { sprintf(nom, "%c%c%c%c%c%c%c%c%c%c%c%c%c", file[0], file[1], file[2], file[3], file[4], file[5], file[6], file[7], file[8], file[9], file[10], file[11], file[12]); } int AddIn_main(int isAppli, unsigned short OptionNum) { unsigned nombreDeFichiers = 1, *taille = 0; int fileHandle, i, j; FILE_INFO fileInfo; FONTCHARACTER foundFile[13], *liste = 0, storage[]={MEMORY,EXTEND,0}; unsigned int key; memclean(4096); while(1) { ML_set_contrast(ML_CONTRAST_NORMAL); Clear(); locate(2, 3);Print("F1: Storage memory"); locate(2, 4);Print("F2: SD Card"); locate(1,8); PrintRev("STO"); Print(" "); PrintRev("SDC"); GetKey(&key); switch(key) { case KEY_CTRL_F1: explorer("\\\\fls0\\"); break; case KEY_CTRL_F2: explorer("\\\\crd0\\"); break; } } return 1; } #pragma section _BR_Size unsigned long BR_Size; #pragma section #pragma section _TOP int InitializeSystem(int isAppli, unsigned short OptionNum) { return INIT_ADDIN_APPLICATION(isAppli, OptionNum); } #pragma section