/** * 建立 src 图像的亮度,饱和度版本 * * @param src 源图像 * @param saturation 饱合度 -100(灰度图像) 至 100(高彩色比图像) * @param brightness 亮度 -100(全黑) 至 100(全白) */ image_p create_saturation_brightness_image(image_p src, int saturation, int brightness) { uint32_t y,x; image_p pimg; uint16_t *p16,*psrc16; uint32_t *p32,*psrc32; if(saturation<-100 || saturation>100) { nge_print("create_gray_image arg 'saturation' must between -100 to 100!"); return NULL; } if(brightness<-100 || brightness>100) { nge_print("create_gray_image arg 'brightness' must between -100 to 100!"); return NULL; } CHECK_AND_UNSWIZZLE(src); pimg = image_create(src->w, src->h, src->dtype); if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32_t *)pimg->data; psrc32 = (uint32_t *)src->data; for(y=0;y<src->h;y++) { p32 += src->texw; psrc32 += src->texw; for(x=0;x<src->w;x++) { *(p32 + x) = (uint32_t)get_saturation_brightness_color(pimg->dtype, *(psrc32 + x), saturation, brightness); } } } else if (src->dtype == DISPLAY_PIXEL_FORMAT_4444) { p16 = (uint16_t *)pimg->data; psrc16 = (uint16_t *)src->data; for(y=0;y<src->h;y++) { p16 += src->texw; psrc16 += src->texw; for(x=0;x<src->w;x++) { *(p16 + x) = (uint16_t)get_saturation_brightness_color(pimg->dtype, *(psrc16 + x), saturation, brightness); } } } CHECK_AND_SWIZZLE(src); return pimg; }
static void dir_scan(const char* path,const char* file,file_travel_cb callback,void* user_data) { struct stat s; DIR *dir; struct dirent *dt; char dirname[256]; dir_desc_t dir_entry; memset(dirname, 0, 256); strncpy(dirname,path,256); if(stat(file, &s) < 0){ nge_print("stat error!\n"); return; } if(S_ISDIR(s.st_mode)){ strcpy(dirname+strlen(dirname), file); strcpy(dirname+strlen(dirname), "/"); if((dir = opendir(file)) == NULL){ nge_print("opendir %s error!\n",file); return; } if(chdir(file) < 0) { nge_print("chdir error!\n"); return; } while((dt = readdir(dir)) != NULL){ if(dt->d_name[0] == '.'){ continue; } dir_scan(dirname,dt->d_name, callback,user_data); } if(chdir("..") < 0){ nge_print("chdir error!\n"); return; } closedir(dir); memset(&dir_entry,0,sizeof(dir_desc_t)); sprintf(dir_entry.name,"%s",dirname); if(dir_entry.name[strlen(dir_entry.name)-1]=='/'){ dir_entry.name[strlen(dir_entry.name)-1]= 0; if((strcmp(dir_entry.name,file)==0)&&(strlen(dir_entry.name)==strlen(file))){ //current dir ommited return; } dir_entry.flag = FIO_F_DIR; callback(&dir_entry,user_data); } }else{ memset(&dir_entry,0,sizeof(dir_desc_t)); sprintf(dir_entry.name,"%s%s",dirname,file); dir_entry.flag = FIO_F_FILE; callback(&dir_entry,user_data); } }
/** * 建立 src 图像的亮度,饱和度版本 * * @param src 源图像 * @param saturation 饱合度 -100(灰度图像) 至 100(高彩色比图像) * @param brightness 亮度 -100(全黑) 至 100(全白) */ image_p create_saturation_brightness_image(image_p src, int saturation, int brightness) { uint32 y,x; uint8 recover = 0; image_p pimg; uint16 *p16,*psrc16; uint32 *p32,*psrc32; if(saturation<-100 || saturation>100) { nge_print("create_gray_image arg 'saturation' must between -100 to 100!"); return NULL; } if(brightness<-100 || brightness>100) { nge_print("create_gray_image arg 'brightness' must between -100 to 100!"); return NULL; } if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } pimg = image_create(src->w, src->h, src->dtype); for(y=0;y<src->h;y++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32 *)pimg->data + y*src->texw; psrc32 = (uint32 *)src->data + y*src->texw; } else { p16 = (uint16 *)pimg->data + y*src->texw; psrc16 = (uint16 *)src->data + y*src->texw; } for(x=0;x<src->w;x++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { *(p32 + x) = (uint32)get_saturation_brightness_color(pimg->dtype, *(psrc32 + x), saturation, brightness); } else { *(p16 + x) = (uint16)get_saturation_brightness_color(pimg->dtype, *(psrc16 + x), saturation, brightness); } } } if(recover) swizzle_swap(src); return pimg; }
void Java_org_libnge_nge2_NGE2_nativeSetContext(JNIEnv* env, jobject thiz,jint w,jint h) { NGE_SetScreenContext("NGE2A",w,h,32,1); nge_print("screenW:%d,screenH:%d",w,h); screen = GetScreenContext(); }
void Java_org_libnge_nge2_NGE2_nativeInitialize(JNIEnv* env, jobject thiz ) { if(sInstant == NULL) sInstant = LoadApp(); sInstant->Init(); nge_print("nge2 init normaly.\n"); }
void Java_org_libnge_nge2_NGE2_nativePause(JNIEnv* env, jobject thiz ) { // do nothing for now nge_print("Paused.\n"); sPaused = 1; sResume = 0; sInstant->Pause(); }
void Java_org_libnge_nge2_NGE2_nativeResetContext(JNIEnv* env, jobject thiz ) { //if(sResume) { nge_print("nge2 reset graphics.\n"); nge_graphics_reset(); //sResume = 0; //} }
void Java_org_libnge_nge2_NGE2_nativeResume(JNIEnv* env, jobject thiz ) { sPaused = 0; sResume = 1; nge_print("Resume.\n"); sInstant->Resume(); }
void Java_org_libnge_nge2_NGE2_nativeSetWorkPath(JNIEnv* env, jobject thiz,jstring packname) { screen = GetScreenContext(); char* name = jstringTostring(env, packname); chdir(name); nge_print("nge2 set workpath:%s.\n",name); memset(screen->pathname,0,256); strncpy(screen->pathname,name,256); if(name) free(name); }
int init() { //初始化NGE分为VIDEO,AUDIO,这里是只初始化VIDEO,如果初始化所有用INIT_VIDEO|INIT_AUDIO,或者INIT_ALL NGE_Init(INIT_VIDEO); //初始化按键处理btn_down是按下响应,后面是弹起时的响应,0是让nge处理home消息(直接退出),填1就是让PSP系统处理 //home消息,通常填1正常退出(1.50版的自制程序需要填0) #ifdef NGE_INPUT_BUTTON_SUPPORT InitInput(btn_down,NULL,1); #endif //最后一个参数是psp swizzle优化,通常填1 p_bg = image_load(RES_PATH("images/demo0.jpg"),DISPLAY_PIXEL_FORMAT_8888,1); if(p_bg == NULL) { nge_print("can not open file\n"); } p_logo = image_load(RES_PATH("images/nge2logo.png"),DISPLAY_PIXEL_FORMAT_4444,1); if(p_logo == NULL) { nge_print("can not open file\n"); } //创建一个半透明的图片遮罩color logomask1 = CreateColor(255,255,255,128,p_logo->dtype); //随便创建一个图片遮罩color logomask2 = CreateColor(100,100,100,255,p_logo->dtype); return 0; }
/** * 建立 src 图像的灰度版本 * * @param src 源图像 * @param gray 灰度 0 到 100, 0 为源图像, 100 为纯灰色图像 */ image_p create_gray_image(image_p src, int gray) { uint32 y,x; uint8 recover = 0; image_p pimg; uint16 *p16,*psrc16; uint32 *p32,*psrc32; if(gray<0 || gray>100) { nge_print("create_gray_image arg 'gray' must between 0 to 100!"); return NULL; } if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } pimg = image_create(src->w, src->h, src->dtype); for(y=0;y<src->h;y++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32 *)pimg->data + y*src->texw; psrc32 = (uint32 *)src->data + y*src->texw; } else { p16 = (uint16 *)pimg->data + y*src->texw; psrc16 = (uint16 *)src->data + y*src->texw; } for(x=0;x<src->w;x++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { *(p32 + x) = (uint32)get_gray_color(pimg->dtype, *(psrc32 + x), gray); } else { *(p16 + x) = (uint16)get_gray_color(pimg->dtype, *(psrc16 + x), gray); } } } if(recover) swizzle_swap(src); return pimg; }
int init() { //初始化NGE分为VIDEO,AUDIO,这里是只初始化VIDEO,如果初始化所有用INIT_VIDEO|INIT_AUDIO,或者INIT_ALL NGE_Init(INIT_VIDEO); //初始化按键处理btn_down是按下响应,后面是弹起时的响应,0是让nge处理home消息(直接退出),填1就是让PSP系统处理 //home消息,通常填1正常退出(1.50版的自制程序需要填0) #ifdef NGE_INPUT_BUTTON_SUPPORT InitInput(btn_down,NULL,1); #endif //最后一个参数是psp swizzle优化,通常填1 p_logo = image_load(RES_PATH("images/nge2logo.png"),DISPLAY_PIXEL_FORMAT_8888,1); if(p_logo == NULL) { nge_print("can not open file\n"); } p_par = image_load(RES_PATH("par/particles.png"),DISPLAY_PIXEL_FORMAT_8888,1); if(p_par == NULL) { nge_print("can not open file\n"); } //设置sprite子图 mParticle = (sprite_p)malloc(sizeof(sprite_t)); memset(mParticle,0,sizeof(sprite_t)); mParticle->sprite_image = p_par; mParticle->sprite_clip.left= 0.0f; mParticle->sprite_clip.top= 0.0f; mParticle->sprite_clip.right= 32.0f; mParticle->sprite_clip.bottom = 32.0f; mParticle->sprite_center.x = 16.0f; mParticle->sprite_center.y = 16.0f; mParticleSys = new hgeParticleSystem(RES_PATH("par/particle1.psi"), mParticle); mParticleSys->MoveTo(480.0f/2, 272.0f/2,0); mParticleSys->Fire(); timer = timer_create(); timer->start(timer); return 0; }
/** * 建立 src 图像的灰度版本 * * @param src 源图像 * @param gray 灰度 0 到 100, 0 为源图像, 100 为纯灰色图像 */ image_p create_gray_image(image_p src, int gray) { uint32_t y,x; image_p pimg; uint16_t *p16 = NULL,*psrc16 = NULL; uint32_t *p32 = NULL,*psrc32 = NULL; if(gray<0 || gray>100) { nge_print("create_gray_image arg 'gray' must between 0 to 100!"); return NULL; } CHECK_AND_UNSWIZZLE(src); pimg = image_create(src->w, src->h, src->dtype); for(y=0;y<src->h;y++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32_t *)pimg->data + y*src->texw; psrc32 = (uint32_t *)src->data + y*src->texw; } else { p16 = (uint16_t *)pimg->data + y*src->texw; psrc16 = (uint16_t *)src->data + y*src->texw; } for(x=0;x<src->w;x++) { if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { *(p32 + x) = (uint32_t)get_gray_color(pimg->dtype, *(psrc32 + x), gray); } else { *(p16 + x) = (uint16_t)get_gray_color(pimg->dtype, *(psrc16 + x), gray); } } } CHECK_AND_SWIZZLE(src); return pimg; }
image_p image_load_bmp_buf(const char* mbuf,int bsize, int displaymode) { image_p pimage = NULL; uint8_t *pdata,*data,*line; int dsize,w,h,texw,texh,bpb,size,x,y,done = 0; uint32_t* p32; uint16_t* p16; uint16_t color16; uint32_t color32; PBITMAPFILEHEADER pbfh = (PBITMAPFILEHEADER)mbuf; PBITMAPINFOHEADER pbih; if(pbfh->bfType !=0x4d42){ nge_print("not bmp file\n"); return 0; } pbih = (PBITMAPINFOHEADER)(mbuf+sizeof(BITMAPFILEHEADER)); dsize = sizeof(BITMAPFILEHEADER)+pbih->biSize; pdata = (uint8_t*)mbuf+dsize; w = pbih->biWidth; h = pbih->biHeight; texw = roundpower2(w); texh = roundpower2(h); bpb = 4; if(displaymode != DISPLAY_PIXEL_FORMAT_8888){ bpb = 2; } //int biSizeImage = ((((pbih->biWidth * pbih->biBitCount) + 31) & ~31) / 8) * pbih->biHeight; size = texw * texh * bpb; data = (uint8_t*)malloc(size); memset(data,0,size); p32 = (uint32_t*)data; p16 = (uint16_t*) p32; line = NULL; if(pbih->biBitCount == 24){ for (y = h;y>0;y--){ line = pdata+(y-1)*w*3; for (x=0;x<w;x++){ switch(displaymode) { case DISPLAY_PIXEL_FORMAT_8888: color32 = MAKE_RGBA_8888(line[2],line[1],line[0],0xff); *(p32+x) = color32; break; case DISPLAY_PIXEL_FORMAT_565: color16 = MAKE_RGBA_565(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_5551: color16 = MAKE_RGBA_5551(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_4444: color16 = MAKE_RGBA_4444(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; } line+=3; } p32 += texw; p16 += texw; } done = 1; } else if(pbih->biBitCount == 32){ for (y = h;y>0;y--){ line = pdata+(y-1)*w*4; for (x=0;x<w;x++){ switch(displaymode) { case DISPLAY_PIXEL_FORMAT_8888: color32 = MAKE_RGBA_8888(line[2],line[1],line[0],0xff); *(p32+x) = color32; break; case DISPLAY_PIXEL_FORMAT_565: color16 = MAKE_RGBA_565(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_5551: color16 = MAKE_RGBA_5551(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_4444: color16 = MAKE_RGBA_4444(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; } line+=4; } p32 += texw; p16 += texw; } done = 1; } if (done){ pimage = (image_p)malloc(sizeof(image_t)); memset(pimage,0,sizeof(image_t)); pimage->data = (uint8_t *)data; pimage->w = w; pimage->h = h; pimage->texw = texw; pimage->texh = texh; pimage->bpb = bpb; pimage->dtype = displaymode; pimage->rcentrex = pimage->w*1.0f/2; pimage->rcentrey = pimage->h*1.0f/2; pimage->mode = GET_PSM_COLOR_MODE(displaymode); pimage->mask = CreateColor(255,255,255,255,displaymode); pimage->texid = image_tid++; } return pimage; }
void Java_org_libnge_nge2_NGE2_nativeFinalize(JNIEnv* env, jobject thiz ) { //sInstant->Fini(); nge_print("nge2 finished normaly.\n"); }
image_p create_contrast_image(image_p src, int contrast){ uint32 y,x; uint8 recover = 0; image_p pimg; uint16 *p16,*psrc16; uint32 *p32,*psrc32; sint16 r,g,b,a; sint32 col; uint8 colmap[255]; if(contrast<-100 || contrast>100) { nge_print("create_contrast_image arg 'contrast' must between -100 to 100!"); return NULL; } contrast+=100; if(contrast == 100) return image_clone(src); if(src->swizzle ==1){ unswizzle_swap(src); recover = 1; } for(x=0;x<256;x++){ if(contrast < 100){ colmap[x] = max(0, min((int)(x - 128) * (contrast / 100) + 128, 255)); } else{ colmap[x] = max(0, min((int)(x - 128) * ((contrast - 100) * 1.28) + 128, 255)); } } pimg = image_create(src->w, src->h, src->dtype); for(y=0;y<src->h;y++) { for(x=0;x<src->w;x++){ if(src->dtype == DISPLAY_PIXEL_FORMAT_8888) { p32 = (uint32 *)pimg->data + y*src->texw; psrc32 = (uint32 *)src->data + y*src->texw; } else { p16 = (uint16 *)pimg->data + y*src->texw; psrc16 = (uint16 *)src->data + y*src->texw; } if(src->dtype == DISPLAY_PIXEL_FORMAT_4444){ col = *(psrc16 + x); GET_RGBA_4444(col, r,g,b,a); if(a > 0) { r = colmap[r]; g = colmap[g]; b = colmap[b]; } *(p16 + x) = MAKE_RGBA_4444(r,g,b,a); } } } if(recover) swizzle_swap(src); return pimg; }
void Java_org_libnge_nge2_NGE2_nativeStart(JNIEnv* env, jobject thiz ) { nge_print("start.\n"); sInstant->Start(); }