void CDicomAnalyzerDoc::OnFileSaveAs()
{
CString cstrFormat;
cstrFormat += "JPEG Format(*.jpg)|*.jpg|";
cstrFormat += "|";
CFileDialog Dlg(FALSE,"jpg","*.jpg", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, cstrFormat);
if(Dlg.DoModal()==IDOK){
::SetCursor(::LoadCursor(NULL,IDC_WAIT));
DICOM_SIZE tSize = GetCanvas()->GetSize();
if( tSize.cx == 0.0 || tSize.cy == 0.0)
return;
double fZoomScale = -1.0;
GLint glMaxTexDim = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);
if( tSize.cx > glMaxTexDim || tSize.cy > glMaxTexDim ){
fZoomScale = glMaxTexDim/(tSize.cx > tSize.cy ? tSize.cx : tSize.cy );
tSize.cx *= fZoomScale;
tSize.cy *= fZoomScale;
}
if( !m_pFBO ){
glGenTextures(1, &m_nFBOTextureID);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_nFBOTextureID);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB8, tSize.cx, tSize.cy, 0, GL_RGB, GL_BYTE, 0);
m_pFBO = new FramebufferObject();
m_pFBO->AttachTexture(GL_TEXTURE_RECTANGLE_ARB, m_nFBOTextureID, GL_COLOR_ATTACHMENT0_EXT);
m_pFBO->IsValid();
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
glDisable(GL_TEXTURE_RECTANGLE_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
}
if( m_pFBO && m_nFBOTextureID != 0 ){
GLint nCurrentDrawbuf, nCurrentReadbuf;
glGetIntegerv(GL_DRAW_BUFFER, &nCurrentDrawbuf);
glGetIntegerv(GL_READ_BUFFER, &nCurrentReadbuf);
m_pFBO->Bind();
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
bool isOK = true;
CString cstrInfo;
switch(status) {
case GL_FRAMEBUFFER_COMPLETE_EXT: // Everything's OK
isOK = true;
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\n";
isOK = false;
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
cstrInfo = "ERROR: GL_FRAMEBUFFER_UNSUPPORTED_EXT\n";
isOK = false;
break;
default:
cstrInfo = "Unknown FBO ERROR\n";
isOK = false;
}
if( !isOK )
AfxMessageBox(cstrInfo);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glViewport(0, 0, tSize.cx, tSize.cy);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, tSize.cx, tSize.cy, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
if( fZoomScale > 0.0)
glScaled(fZoomScale, fZoomScale, fZoomScale);
GetCanvas()->OnRender(-1.0);
glLoadIdentity();
//////////////////////////////////////////////////////////////
glScaled(1.0f, 1.0f, 1.0f);
DICOM_SIZE tOldSize = GetScene()->GetOutputBox()->GetSize();
GetScene()->GetOutputBox()->SetSize( tSize.cx, tSize.cy );
GetScene()->GetOutputBox()->OnRender(-1.0);
GetScene()->GetOutputBox()->SetSize(tOldSize.cx, tOldSize.cy);
glDisable(GL_BLEND);
//////////////////////////////////////////////////////////////
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
IplImage* pImage = cvCreateImage(cvSize(tSize.cx, tSize.cy), IPL_DEPTH_8U, 3);
glReadPixels(0,0, tSize.cx, tSize.cy,GL_BGR_EXT, GL_UNSIGNED_BYTE, pImage->imageData);
cvFlip(pImage);
cvSaveImage(Dlg.GetPathName(), pImage);
cvReleaseImage(&pImage);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glUseProgramObjectARB(0);
glViewport(vp[0], vp[1], vp[2], vp[3]);
FramebufferObject::Disable();
glDrawBuffer(nCurrentDrawbuf);
glReadBuffer(nCurrentReadbuf);
SAFE_DELET(m_pFBO);
SAFE_DELET(m_pRenderBuffer);
if( m_nFBOTextureID != 0 ){
glDeleteTextures(1, &m_nFBOTextureID);
m_nFBOTextureID = 0;
}
}
::SetCursor(::LoadCursor(NULL,IDC_ARROW));
}
}