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()
Beispiel #3
0
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;
};