00001 #ifndef _PA_Buffer
00002 #define _PA_Buffer
00003
00004
00005
00012 #include "PA9.h"
00013
00014 #include "PA_Interrupt.h"
00015 #include "gif/gif_lib.h"
00016
00017 extern GifFileType* gifinfo;
00018 extern s16 gifwidth, gifheight;
00019 extern u8 PA_nBit[2];
00020
00021
00022 #define PA_RGB8(r,g,b) ((((b)>>3)<<10)|(((g)>>3)<<5)|((r)>>3)|(1 << 15))
00023
00024
00025 typedef struct{
00026 u16 Id;
00027 u32 Length;
00028 u16 Nothing1, Nothing2;
00029 u32 ImageStart;
00030 } BMPHeader0;
00031
00032 typedef struct{
00033 u32 SizeofHeader;
00034 u32 Width, Height;
00035 u16 Colorplanes;
00036 u16 BitsperPixel;
00037 u32 Compression;
00038 u32 SizeofData;
00039 u32 WidthperMeter, HeightperMeter;
00040 u32 NColors, ImportantColors;
00041 } BMP_Headers;
00042
00043
00044 extern u16 PA_oldx[2];
00045 extern u16 PA_oldy[2];
00046 extern u8 PA_drawsize[2];
00047 extern u16 *PA_DrawBg[2];
00048 extern u8 PA_nBit[2];
00049
00050
00051 void PA_Load16bitGif(bool screen, s16 x, s16 y, void *gif);
00052 int DecodeGif(const u8 *userData, u8 *ScreenBuff, u16* Palette, u8 nBits, s16 SWidth);
00053
00054
00055
00073 void PA_Init8bitBg(bool screen, u8 bg_priority);
00074
00075
00087 void PA_Init16bitBg(bool screen, u8 bg_priority);
00088
00089
00090
00108 extern inline void PA_Put8bitPixel(bool screen, s16 x, s16 y, u8 color) {
00109 u16 pos = (x >> 1) + (y << 7);
00110 if (x&1){
00111 PA_DrawBg[screen][pos] &= 255;
00112 PA_DrawBg[screen][pos] |= color << 8;
00113 }
00114 else {
00115 PA_DrawBg[screen][pos] &= 255 << 8;
00116 PA_DrawBg[screen][pos] |= color;
00117 }
00118 }
00119
00120
00139 extern inline void PA_Put2_8bitPixels(bool screen, s16 x, s16 y, u16 colors) { PA_DrawBg[screen][(x >> 1) + (y << 7)] = colors;
00140 }
00141
00162 extern inline void PA_PutDouble8bitPixels(bool screen, s16 x, s16 y, u8 color1, u8 color2) {
00163 PA_Put2_8bitPixels(screen, x, y, color1 + (color2 << 8));
00164 }
00165
00166
00167
00186 extern inline void PA_Put4_8bitPixels(bool screen, s16 x, s16 y, u32 colors) {
00187
00188
00189 }
00190
00191
00206 extern inline u8 PA_Get8bitPixel(bool screen, u8 x, u8 y) {
00207 u16 pos = (x >> 1) + (y << 7);
00208 if (x&1){
00209 return (PA_DrawBg[screen][pos] >> 8);
00210 }
00211 else {
00212 return (PA_DrawBg[screen][pos]);
00213 }
00214 }
00215
00216
00217
00218
00236 extern inline void PA_Put16bitPixel(bool screen, s16 x, s16 y, u16 color) {
00237 PA_DrawBg[screen][x + (y << 8)] = color;
00238 }
00239
00240
00255 #define PA_Get16bitPixel(screen, x, y) PA_DrawBg[screen][x + (y << 8)]
00256
00257
00258
00259
00260
00261
00285 void PA_Draw8bitLine(bool screen, u16 x1, u16 y1, u16 x2, u16 y2, u8 color);
00286
00287
00288
00289
00290
00314 void PA_Draw16bitLine(bool screen, u16 x1, u16 y1, u16 x2, u16 y2, u16 color);
00315
00342 void PA_Draw16bitLineEx(bool screen, s16 basex, s16 basey, s16 endx, s16 endy, u16 color, s8 size);
00343
00344
00345
00346
00370 void PA_Draw16bitRect(bool screen, s16 basex, s16 basey, s16 endx, s16 endy, u16 color);
00371
00372
00384 void PA_8bitDraw(bool screen, u8 color);
00385
00386
00398 void PA_16bitDraw(bool screen, u16 color);
00399
00400
00412 #define PA_SetDrawSize(screen, draw_size) PA_drawsize[screen] = draw_size;
00413
00414
00415
00416
00417
00429 #define PA_Load8bitBitmap(screen, bitmap) DMA_Copy(bitmap, (void*)PA_DrawBg[screen], 256*96, DMA_16NOW);
00430
00442 #define PA_Load16bitBitmap(screen, bitmap) {u32 PA_temp; \
00443 for (PA_temp = 0; PA_temp < 256*192; PA_temp++)\
00444 PA_DrawBg[screen][PA_temp] = bitmap[PA_temp] + (1 << 15);}
00445
00446
00455 #define PA_Clear8bitBg(screen) DMA_Copy(Blank, (void*)PA_DrawBg[screen], 256*96, DMA_16NOW);
00456
00465 #define PA_Clear16bitBg(screen) DMA_Copy(Blank, (void*)PA_DrawBg[screen], 256*192, DMA_16NOW)
00466
00467
00479 extern inline void PA_LoadJpeg(bool screen, void *jpeg) {
00480 REG_IME = 0x00;
00481 JPEG_DecompressImage((u8*)jpeg, PA_DrawBg[screen], 256, 192);
00482 REG_IME = 0x01;
00483 }
00484
00485
00486
00507 void PA_LoadBmpToBuffer(u16 *Buffer, s16 x, s16 y, void *bmp, s16 SWidth);
00508
00509
00527 extern inline void PA_LoadBmpEx(bool screen, s16 x, s16 y, void *bmp){
00528 PA_LoadBmpToBuffer(PA_DrawBg[screen], x, y, bmp, 256);
00529 }
00530
00531
00532
00544 extern inline void PA_LoadBmp(bool screen, void *bmp){
00545 PA_LoadBmpEx(screen, 0, 0, bmp);
00546 }
00547
00559 extern inline void PA_LoadGif(bool screen, void *gif){
00560 if (PA_nBit[screen]) DecodeGif((const u8*)gif, (u8*)PA_DrawBg[screen], (u16*)0x05000000, 1, 256);
00561
00562 else DecodeGif((const u8*)gif, (u8*)PA_DrawBg[screen], (u16*)(0x05000000+(0x400*screen)), 0, 256);
00563 }
00564
00565
00566
00567
00568
00569
00570
00582 extern inline void PA_LoadGBFSImage(bool screen, s16 GBFSImage){
00583 if (PA_CompareText(PA_GBFSfile[GBFSImage].Ext, "bmp")){
00584 PA_LoadBmp(screen, PA_GBFSfile[GBFSImage].File);
00585 }
00586 if (PA_CompareText(PA_GBFSfile[GBFSImage].Ext, "jpg")){
00587 PA_LoadJpeg(screen, PA_GBFSfile[GBFSImage].File);
00588 }
00589 if (PA_CompareText(PA_GBFSfile[GBFSImage].Ext, "gif")){
00590 PA_LoadGif(screen, PA_GBFSfile[GBFSImage].File);
00591 }
00592 }
00593
00594 extern inline void PA_LoadGBFSImageToBuffer(void *Buffer, s16 GBFSImage, s16 Width){
00595 if (PA_CompareText(PA_GBFSfile[GBFSImage].Ext, "bmp")){
00596 PA_LoadBmpToBuffer((u16*)Buffer, 0, 0, (u16*)PA_GBFSfile[GBFSImage].File, Width);
00597 }
00598
00599
00600
00601 if (PA_CompareText(PA_GBFSfile[GBFSImage].Ext, "gif")){
00602 DecodeGif((const u8*)PA_GBFSfile[GBFSImage].File, (u8*)Buffer, (u16*)0x05000000, 1, Width);
00603 }
00604 }
00605
00606 extern inline u16 PA_GetBmpWidth(void *bmp){
00607 u8 *temp = (u8*)bmp;
00608 BMP_Headers *Bmpinfo = (BMP_Headers*)(temp+14);
00609 return Bmpinfo->Width;
00610 }
00611 extern inline u16 PA_GetBmpHeight(void *bmp){
00612 u8 *temp = (u8*)bmp;
00613 BMP_Headers *Bmpinfo = (BMP_Headers*)(temp+14);
00614 return Bmpinfo->Height;
00615 }
00617
00618
00619 extern inline void PA_8bit8x8Image(bool screen, u16 basex, u16 basey, u8* data){
00620 s16 x, y;
00621
00622 for (x = 0; x < 8; x++)
00623 for (y = 0; y < 8; y++)
00624 PA_Put8bitPixel(screen, x + basex, y + basey, data[x + (y << 3)]);
00625 }
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673 #endif
00674
00675