int LoadTexturePNG(char * filename, int index) { texture_pointer2 = texture_pointer + index * 1024 * 1024; // 4 MB reserved for PNG index // here you can add more textures using 'texture_pointer'. It is returned aligned to 16 bytes LoadPNG(&Png_datas[index], filename); free(Png_datas[index].png_in); Png_offset[index] = 0; if(Png_datas[index].bmp_out) { memcpy(texture_pointer2, Png_datas[index].bmp_out, Png_datas[index].wpitch * Png_datas[index].height); free(Png_datas[index].bmp_out); Png_datas[index].bmp_out= texture_pointer2; Png_offset[index] = tiny3d_TextureOffset(Png_datas[index].bmp_out); // get the offset (RSX use offset instead address) return 0; } return -1; }
void LoadTexture() { u32 * texture_mem = tiny3d_AllocTexture(64*1024*1024); // alloc 64MB of space for textures (this pointer can be global) if(!texture_mem) return; // fail! texture_pointer = texture_mem; ResetFont(); texture_pointer = (u32 *) AddFontFromBitmapArray((u8 *) font , (u8 *) texture_pointer, 32, 255, 16, 32, 2, BIT0_FIRST_PIXEL); // here you can add more textures using 'texture_pointer'. It is returned aligned to 16 bytes jpg1.jpg_in= (void *) psl1ght_jpg_bin; jpg1.jpg_size= sizeof(psl1ght_jpg_bin); LoadJPG(&jpg1, NULL); jpg1_offset = 0; if(jpg1.bmp_out) { memcpy(texture_pointer, jpg1.bmp_out, jpg1.wpitch * jpg1.height); free(jpg1.bmp_out); jpg1.bmp_out= texture_pointer; texture_pointer += (jpg1.wpitch/4 * jpg1.height + 3) & ~3; // aligned to 16 bytes (it is u32) and update the pointer jpg1_offset = tiny3d_TextureOffset(jpg1.bmp_out); // get the offset (RSX use offset instead address) } }
void LoadTexture() { int i; u32 * texture_mem = tiny3d_AllocTexture(64*1024*1024); // alloc 64MB of space for textures (this pointer can be global) u32 * texture_pointer; // use to asign texture space without changes texture_mem if(!texture_mem) return; // fail! texture_pointer = texture_mem; Load_PNG(); // copy texture datas from PNG to the RSX memory allocated for textures for(i = 0; i < 8; i++) { texture_ghost_offset[i] = 0; if(texture_ghost[i].bmp_out) { memcpy(texture_pointer, texture_ghost[i].bmp_out, texture_ghost[i].wpitch * texture_ghost[i].height); free(texture_ghost[i].bmp_out); texture_ghost[i].bmp_out= texture_pointer; texture_pointer += (texture_ghost[i].wpitch * texture_ghost[i].height + 3) & ~3; // aligned to 16 bytes (it is u32) and update the pointer texture_ghost_offset[i] = tiny3d_TextureOffset(texture_ghost[i].bmp_out); // get the offset (RSX use offset instead address) } } }
u8 *Alloc( u32 bytes, u32* off ) { if( !Lock() ) return NULL; sysMutexLock( rsxMutex, 0 ); //align bytes = RU( bytes, 4 ); //printf("ptrs.size(): %i\n", (int)ptrs.size() ); //find the first available chunk of memory big enough u32 offset = 0; u32 i = 0; vector<MemItr>::iterator ptr = ptrs.begin(); while( ptr < ptrs.end() ) { //if there is another chunk of allocated memory after this one, check the space between them if( i + 1 < ptrs.size() ) { if( ( ptrs.at( i + 1 ).start - (*ptr).end ) >= bytes ) { //printf("%08x - %08x >= %08x 2\n", ptrs.at( i + 1 ).start, (*ptr).end, bytes ); offset = ptrs.at( i ).end; i++; break; } } //if this is the last texture else if( i == ptrs.size() - 1 ) { if( ( memSize - (*ptr).end ) >= bytes ) { //printf("%08x - %08x >= %08x 1\n", memSize, (*ptr).end, bytes ); offset = (*ptr).end; i++; } else { printf("RsxMem::Alloc() :didnt find enough free space for %08x\n", bytes ); UnLock(); return NULL; } break; } ++ptr; ++i; } MemItr newPtr; newPtr.start = offset; newPtr.end = offset + bytes; ptrs.insert( ptrs.begin() + i, newPtr ); //printf("inserting new chunk in list @ %u\n", i ); if( off ) { *off = tiny3d_TextureOffset( (u8*)memStart + offset ); } u8 *ret = ((u8*)memStart) + offset; UnLock(); return ret; }
u32 Offset( u8 *p ) { return tiny3d_TextureOffset( (u32*)p ); }
u8 * AddFontFromBitmapArray(u8 *font, u8 *texture, u8 first_char, u8 last_char, int w, int h, int bits_per_pixel, int byte_order) { int n, a, b; u8 i; if(font_datas.number_of_fonts >= 8) return texture; font_datas.fonts[font_datas.number_of_fonts].w = w; font_datas.fonts[font_datas.number_of_fonts].h = h; font_datas.fonts[font_datas.number_of_fonts].bh = h; font_datas.fonts[font_datas.number_of_fonts].color_format = TINY3D_TEX_FORMAT_A4R4G4B4; //TINY3D_TEX_FORMAT_A8R8G8B8; font_datas.fonts[font_datas.number_of_fonts].first_char = first_char; font_datas.fonts[font_datas.number_of_fonts].last_char = last_char; font_datas.autocenter =0; font_datas.color = 0xffffffff; font_datas.bkcolor = 0x0; font_datas.sx = w; font_datas.sy = h; font_datas.Z = 0.0f; for(n = 0; n < 256; n++) { font_datas.fonts[font_datas.number_of_fonts].fw[n] = 0; font_datas.fonts[font_datas.number_of_fonts].fy[n] = 0; } if(!font_datas.rsx_text_bk_offset) { texture = (u8 *) ((((long) texture) + 15) & ~15); font_datas.rsx_text_bk_offset = tiny3d_TextureOffset(texture); memset(texture, 255, 8 * 8 * 2); texture += 8 * 8 * 2; texture = (u8 *) ((((long) texture) + 15) & ~15); } for(n = first_char; n <= last_char; n++) { font_datas.fonts[font_datas.number_of_fonts].fw[n] = w; texture = (u8 *) ((((long) texture) + 15) & ~15); if(n == first_char) font_datas.fonts[font_datas.number_of_fonts].rsx_text_offset = tiny3d_TextureOffset(texture); if(n == first_char+1) font_datas.fonts[font_datas.number_of_fonts].rsx_bytes_per_char = tiny3d_TextureOffset(texture) - font_datas.fonts[font_datas.number_of_fonts].rsx_text_offset; for(a = 0; a < h; a++) { for(b = 0; b < w; b++) { i = font[(b * bits_per_pixel)/8]; if(byte_order) i= (i << ((b & (7/bits_per_pixel)) * bits_per_pixel))>> (8-bits_per_pixel); else i >>= (b & (7/bits_per_pixel)) * bits_per_pixel; i = (i & ((1 << bits_per_pixel)-1)) * 255 / ((1 << bits_per_pixel)-1); if(i) {//TINY3D_TEX_FORMAT_A1R5G5B5 //i>>=3; //*((u16 *) texture) = (1<<15) | (i<<10) | (i<<5) | (i); //TINY3D_TEX_FORMAT_A4R4G4B4 i>>=4; *((u16 *) texture) = (i<<12) | 0xfff; } else { texture[0] = texture[1] = 0x0; //texture[2] = 0x0; //texture[3] = 0x0; // alpha } texture+=2; } font += (w * bits_per_pixel) / 8; }
void LoadTexture() { u32 * texture_mem = tiny3d_AllocTexture(64*1024*1024); // alloc 64MB of space for textures (this pointer can be global) u32 * texture_pointer; // use to asign texture space without changes texture_mem if(!texture_mem) exit(0); // fail! texture_pointer = texture_mem; Load_PNG(); if(!png1.bmp_out) exit(0); // fail! ResetFont(); texture_pointer = (u32 *) AddFontFromBitmapArray((u8 *) msx, (u8 *) texture_pointer, 0, 254, 8, 8, 1, BIT7_FIRST_PIXEL); // build AYUV 32 bits map from PNG texture[0].addr = (void *) texture_pointer; texture[0].offset = tiny3d_TextureOffset(texture_pointer); texture[0].w = png1.width; texture[0].h = png1.height; texture[0].stride = png1.wpitch; texture_pointer = (u32 *) build_AYUV_32bits((u8 *)texture_pointer, png1.bmp_out, png1.width, png1.height, png1.wpitch); // build Y 8 bits map from PNG (width * height) * 1 texture[1].addr = (void *) texture_pointer; texture[1].offset = tiny3d_TextureOffset(texture_pointer); texture[1].w = png1.width; texture[1].h = png1.height; texture[1].stride = png1.wpitch/4; texture_pointer = (u32 *) build_Y_8bits((u8 *)texture_pointer, png1.bmp_out, png1.width, png1.height, png1.wpitch); // build U 8 bits map from PNG (width/2 * height/2) * 1 texture[2].addr = (void *) texture_pointer; texture[2].offset = tiny3d_TextureOffset(texture_pointer); texture[2].w = png1.width/2; texture[2].h = png1.height/2; texture[2].stride = texture[2].w; texture_pointer = (u32 *) build_U_8bits((u8 *)texture_pointer, png1.bmp_out, png1.width, png1.height, png1.wpitch); // build V 8 bits map from PNG (width/2 * height/2) * 1 texture[3].addr = (void *) texture_pointer; texture[3].offset = tiny3d_TextureOffset(texture_pointer); texture[3].w = png1.width/2; texture[3].h = png1.height/2; texture[3].stride = texture[3].w; texture_pointer = (u32 *) build_V_8bits((u8 *)texture_pointer, png1.bmp_out, png1.width, png1.height, png1.wpitch); }