static ExcStatus DecodeImage(BaseStreamInput& in, CIppImage& image, CmdOptions& cmdOpt, IM_TYPE& fmt, double* msec) { IM_ERROR imStatus; if(msec) cmnTimer.Init(); switch(fmt) { case IT_JPEG: { PARAMS_JPEG params_jpeg; params_jpeg.color = IC_UNKNOWN; params_jpeg.comment_size = 0; params_jpeg.dct_scale = 0; params_jpeg.mode = 1; params_jpeg.nthreads = (cmdOpt.nthreads == 0)?1:cmdOpt.nthreads; params_jpeg.sampling = IS_444; params_jpeg.use_qdct = 0; params_jpeg.tmode = (cmdOpt.timing == 1) ? 1 : 0; if(msec) cmnTimer.Start(); imStatus = ReadImageJPEG(in, params_jpeg, image); if(msec) cmnTimer.Stop(); } break; case IT_JPEG2000: { PARAMS_JPEG2K params_jpeg2k; params_jpeg2k.nthreads =(cmdOpt.nthreads == 0)?1:cmdOpt.nthreads; params_jpeg2k.arithmetic = J2K_16; if(msec) cmnTimer.Start(); imStatus = ReadImageJPEG2000(in, params_jpeg2k, image, cmdOpt.verbose_mode); if(msec) cmnTimer.Stop(); } break; case IT_BMP: { PARAMS_BMP params_bmp; int order_c3[3] = { 2, 1, 0 }; int order_c4[4] = { 2, 1, 0, 3}; if(msec) cmnTimer.Start(); imStatus = ReadImageBMP(in, params_bmp, image); if(msec) cmnTimer.Stop(); if(imStatus != IE_OK) break; if(image.NChannels() == 3) { image.SwapChannels(order_c3); image.Color(IC_RGB); } else if(image.NChannels() == 4) { image.SwapChannels(order_c4); image.Color(IC_RGBA); } } break; case IT_PNG: { PARAMS_PNG params_png; if(msec) cmnTimer.Start(); imStatus = ReadImagePNG(in, params_png, image); if(msec) cmnTimer.Stop(); } break; case IT_DICOM: { PARAMS_DICOM params_dicom; params_dicom.nFrames = 1; params_dicom.frameSeek = 0; if(msec) cmnTimer.Start(); imStatus = ReadImageDICOM(in, params_dicom, image, cmdOpt.verbose_mode); if(msec) cmnTimer.Stop(); } break; case IT_JPEGXR: { PARAMS_JPEGXR params_jpegxr; params_jpegxr.threads = cmdOpt.nthreads; params_jpegxr.thread_mode = cmdOpt.jxr_thread_mode; params_jpegxr.bands = cmdOpt.bands; if(msec) cmnTimer.Start(); imStatus = ReadImageJPEGXR(in, params_jpegxr, image); if(msec) cmnTimer.Stop(); } break; case IT_RAW: { PARAMS_RAW params_raw; params_raw.color_format = cmdOpt.color_format; params_raw.data_offset = cmdOpt.data_offset; params_raw.pixel_format = cmdOpt.pixel_format; params_raw.res_height = cmdOpt.res_height; params_raw.res_width = cmdOpt.res_width; if(msec) cmnTimer.Start(); imStatus = ReadImageRAW(in, params_raw, image); if(msec) cmnTimer.Stop(); } break; default: return ExcStatusFail; } if(imStatus != IE_OK) { PrintError(imStatus, fmt, PRINT_DEC); return ExcStatusFail; } if(msec) *msec = cmnTimer.GetTime(CTimer::msec); return ExcStatusOk; } // DecodeImage()
static ExcStatus EncodeImage(CIppImage& image, BaseStreamOutput& out, CmdOptions& cmdOpt, IM_TYPE& fmt, double* msec) { IM_ERROR imStatus; if(msec) cmnTimer.Init(); if(IT_JPEG != fmt && IT_JPEG2000 != fmt) { cmdOpt.lossless = 0; } else { if(image.Precision() > 8) cmdOpt.lossless = 1; } switch(fmt) { case IT_JPEG: { PARAMS_JPEG params_jpeg; if(0 == strncmp(cmdOpt.jmode, "b", 1)) params_jpeg.mode = 1; if(0 == strncmp(cmdOpt.jmode, "e", 1)) params_jpeg.mode = 2; if(0 == strncmp(cmdOpt.jmode, "p", 1)) params_jpeg.mode = 3; if(0 == strncmp(cmdOpt.jmode, "l", 1)) params_jpeg.mode = 4; params_jpeg.comment_size = 0; params_jpeg.huffman_opt = 0; params_jpeg.nthreads = (cmdOpt.nthreads == 0)?1:cmdOpt.nthreads; params_jpeg.point_transform = 0; params_jpeg.predictor = 1; params_jpeg.quality = cmdOpt.jpg_quality; params_jpeg.restart_interval = (cmdOpt.timing == 1) ? 1 : 0; params_jpeg.sampling = (cmdOpt.sampling == IS_444) ? IS_444 : (cmdOpt.sampling == IS_422) ? IS_422 : IS_411; params_jpeg.tmode = (cmdOpt.timing == 1) ? 1 : 0; if(msec) cmnTimer.Start(); imStatus = SaveImageJPEG(image, params_jpeg, out); if(msec) cmnTimer.Stop(); } break; case IT_JPEG2000: { PARAMS_JPEG2K params_jpeg2k; params_jpeg2k.nthreads = (cmdOpt.nthreads == 0)?1:cmdOpt.nthreads; params_jpeg2k.useMCT = (cmdOpt.lossless == 0) ? 1 : 0; params_jpeg2k.quality = cmdOpt.jpg_quality; params_jpeg2k.color = image.Color(); params_jpeg2k.mode = (cmdOpt.lossless == 0) ? Lossy : Lossless; params_jpeg2k.arithmetic = J2K_16; params_jpeg2k.wt = (cmdOpt.lossless == 0) ? WT97 : WT53; if(msec) cmnTimer.Start(); imStatus = SaveImageJPEG2000(image, params_jpeg2k, out); if(msec) cmnTimer.Stop(); } break; case IT_BMP: { PARAMS_BMP params_bmp; if(8 < image.Precision()) { CIppImage reduced(image.Size(), image.NChannels(),8, 1); image.ReduceBits16(reduced, reduced.Step(), reduced.Size()); if(msec) cmnTimer.Start(); imStatus = SaveImageBMP(reduced, params_bmp, out); if(msec) cmnTimer.Stop(); reduced.Free(); } else { if(msec) cmnTimer.Start(); imStatus = SaveImageBMP(image, params_bmp, out); if(msec) cmnTimer.Stop(); } } break; case IT_PNG: { PARAMS_PNG params_png; params_png.filters[0] = cmdOpt.png_filter[0]; params_png.filters[1] = cmdOpt.png_filter[1]; params_png.filters[2] = cmdOpt.png_filter[2]; params_png.filters[3] = cmdOpt.png_filter[3]; params_png.filters[4] = cmdOpt.png_filter[4]; if(msec) cmnTimer.Start(); imStatus = SaveImagePNG(image, params_png, out); if(msec) cmnTimer.Stop(); } break; case IT_JPEGXR: { PARAMS_JPEGXR params_jpegxr; params_jpegxr.quality = cmdOpt.jxr_quality; params_jpegxr.aquality = cmdOpt.jxr_aquality; params_jpegxr.overlap = cmdOpt.overlap; params_jpegxr.bands = cmdOpt.bands; params_jpegxr.bitstream = cmdOpt.bitstream; params_jpegxr.sampling = cmdOpt.sampling; params_jpegxr.trim = cmdOpt.trim; params_jpegxr.bits_shift = cmdOpt.bits_shift; params_jpegxr.alpha_mode = cmdOpt.alpha_mode; params_jpegxr.cmyk_direct = cmdOpt.cmyk_direct; params_jpegxr.tiles_uniform[0] = cmdOpt.tiles_amount[0]; params_jpegxr.tiles_uniform[1] = cmdOpt.tiles_amount[1]; params_jpegxr.tiles_uniform[2] = cmdOpt.tiles_sizes[0]; params_jpegxr.tiles_uniform[3] = cmdOpt.tiles_sizes[1]; if(msec) cmnTimer.Start(); imStatus = SaveImageJPEGXR(image, params_jpegxr, out); if(msec) cmnTimer.Stop(); } break; case IT_RAW: { PARAMS_RAW params_raw; if(msec) cmnTimer.Start(); imStatus = SaveImageRAW(image, params_raw, out); if(msec) cmnTimer.Stop(); } break; default: return ExcStatusFail; } if(imStatus != IE_OK) { PrintError(imStatus, fmt, PRINT_ENC); return ExcStatusFail; } if(msec) *msec = cmnTimer.GetTime(CTimer::msec); return ExcStatusOk; } // EncodeImage()
int __cdecl main(int argc, char* argv[]) { WNDCLASSEX wc={sizeof(WNDCLASSEX), 0, wp, 0, 0, 0, 0, 0, 0, 0, "GLAP301"}; wc.hCursor=LoadCursor(0, IDC_ARROW);; wc.hIcon=LoadIcon(0,IDI_APPLICATION); RegisterClassEx(&wc); RECT wrect={0, 0, W, H}; AdjustWindowRectEx(&wrect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW); HWND win=CreateWindowEx(WS_EX_APPWINDOW, "GLAP301", "Render Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wrect.right-wrect.left, wrect.bottom-wrect.top, 0, 0, 0, 0); ShowWindow(win, SW_SHOWNORMAL); UpdateWindow(win); MSG msg={0, 0, 0, 0, 0, {0, 0}}; CTimer timer; CUIGL GL; GL.Init(W, H, 1, 1, win); WGLPROC(glCreateShader); WGLPROC(glShaderSource); WGLPROC(glCompileShader); WGLPROC(glGetShaderiv); WGLPROC(glGetShaderInfoLog); WGLPROC(glCreateProgram); WGLPROC(glAttachShader); WGLPROC(glLinkProgram); WGLPROC(glUseProgram); WGLPROC(glGenBuffers); WGLPROC(glDeleteBuffers); WGLPROC(glBindBuffer); WGLPROC(glBufferData); WGLPROC(glMapBuffer); WGLPROC(glUnmapBuffer); WGLPROC(glVertexAttribPointer); WGLPROC(glGetAttribLocation); WGLPROC(glEnableVertexAttribArray); WGLPROC(glActiveTexture); WGLPROC(glGetUniformLocation); WGLPROC(glProgramUniform1i); WGLPROC(glProgramUniform3f); WGLPROC(glProgramUniform4f); WGLPROC(glProgramUniformMatrix4fv); GLuint ibo=-1; glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibsize, ib, GL_STATIC_DRAW); GLuint vbo=-1; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, vbsize, vb, GL_STATIC_DRAW); glEnableClientState(GL_VERTEX_ARRAY); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glEnableVertexAttribArray(3); glEnableVertexAttribArray(4); glEnable(GL_DEPTH); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LESS); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); GLuint body_tex=LoadTexture("data\\body_diff.png"); GLuint body_norm=LoadTexture("data\\body_norm.png"); GLuint fur_tex=LoadTexture("data\\fur_diff.png"); GLuint fur_norm=LoadTexture("data\\fur_norm.png"); GLShader sh; glClearColor(0.3f, 0.5f, 0.8f, 1.0f); glClearDepth(1.0f); while(1) { while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message==WM_QUIT) break; } if(gAppState.reloadShaders) { sh.CreateFromFile("data\\model.vs", "data\\model.fs"); gAppState.reloadShaders=false; glVertexAttribPointer(glGetAttribLocation(sh.GetPName(), "i_pos"), 3, GL_FLOAT, GL_FALSE, 4*16, (void*)(0*4)); glVertexAttribPointer(glGetAttribLocation(sh.GetPName(), "i_nor"), 3, GL_FLOAT, GL_FALSE, 4*16, (void*)(3*4)); glVertexAttribPointer(glGetAttribLocation(sh.GetPName(), "i_tan"), 3, GL_FLOAT, GL_FALSE, 4*16, (void*)(10*4)); glVertexAttribPointer(glGetAttribLocation(sh.GetPName(), "i_bin"), 3, GL_FLOAT, GL_FALSE, 4*16, (void*)(13*4)); glVertexAttribPointer(glGetAttribLocation(sh.GetPName(), "i_tex"), 2, GL_FLOAT, GL_FALSE, 4*16, (void*)(6*4)); } glProgramUniform1i(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"sTex"), 0); glProgramUniform1i(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"sNor"), 1); float4x4 wm; wm=float4x4::Scale(0.05) *float4x4::RotY(-sin(mpx), cos(mpx)) *float4x4::RotX(-1, 0) *float4x4::RotX(-sin(mpy*0.3), cos(mpy*0.3)) ; float fov=1.3; float camrx=(mx-W/2.0f)/5000.0; float camry=(my-H/2.0f)/5000.0; float4x4 vpm=float4x4::Projection(0.25, 2000, fov, H/(float)W*fov).Transposed() *float4x4::Translation(0, 0, dz) *float4x4::RotY(0, -1) *float4x4::RotX(sin(camry), cos(camry)) *float4x4::RotY(-sin(camrx), cos(camrx)) ; glProgramUniformMatrix4fv(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"u_wm" ), 1, false, &wm.m00); glProgramUniformMatrix4fv(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"u_vpm"), 1, false, &vpm.m00); double time=timer.GetTime(); float lightPos0[3]={sin(time),0.5, cos(time)}; float lightPos1[3]={sin(-time*0.5),-0.5, cos(time*0.5)};; float lightPos2[3]={camrx*70, camry*70, -3}; float lightCol0[3]={1.0,0.7,0.3}; float lightCol1[3]={0.3,0.7,1.0}; float lightCol2[3]={1.0,1.0,1.0}; glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightPos0"), lightPos0[0], lightPos0[1], lightPos0[2]); glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightPos1"), lightPos1[0], lightPos1[1], lightPos1[2]); glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightPos2"), lightPos2[0], lightPos2[1], lightPos2[2]); glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightCol0"), lightCol0[0], lightCol0[1], lightCol0[2]); glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightCol1"), lightCol1[0], lightCol1[1], lightCol1[2]); glProgramUniform3f(sh.GetPName(), glGetUniformLocation(sh.GetPName(),"lightCol2"), lightCol2[0], lightCol2[1], lightCol2[2]); glDepthMask(true); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); sh.Use(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, body_tex); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, body_norm); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); glDrawElements(GL_TRIANGLES, (4340*3), GL_UNSIGNED_INT, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, fur_tex); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, fur_norm); glDepthMask(false); glEnable(GL_BLEND); glDisable(GL_CULL_FACE); glDrawElements(GL_TRIANGLES, indexcount-(4340*3), GL_UNSIGNED_INT, (void*)(4340*3*4)); GL.FrameEnd(); if(msg.message==WM_QUIT) break; if(gAppState.quitRequested) break; Sleep(10); // prevent 100% CPU consuming } return 0; };