glprint.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glprint.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:50:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: glprint.cpp,v 1000.1 2004/06/01 20:50:58 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Peter Meric
  35.  *
  36.  * File Description:
  37.  *    GL-related printing functionality
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/opengl.h>
  41. #include <gui/opengl/glprint.hpp>
  42. #include <gui/print/print.hpp>
  43. #include <gui/print/print_context.hpp>
  44. #include <gui/print/vector_buffer.hpp>
  45. #include <gui/opengl/opengl_print_buffer.hpp>
  46. #include <util/image/image.hpp>
  47. #include <util/image/image_io.hpp>
  48. BEGIN_NCBI_SCOPE
  49.                    
  50. void PrintVec(CFuncPtr* func, const CPrintOptions& opts)
  51. {
  52.     static const size_t MB = 1024 * 1024;
  53.     GLint data_len = 0;
  54.     //
  55.     // GL feedback requires a fixed-size buffer large enough to
  56.     // hold all of the feedback data. If it's not large enough
  57.     // then we have to loop, increasing the buffer size each
  58.     // time by a constant factor (4)
  59.     //
  60.     for (size_t buffer_size = MB; ; buffer_size <<= 2) {
  61.         _TRACE(Warning << "PrintVec(): feedback buffer size: " << buffer_size << " bytes");
  62.         typedef AutoPtr< GLfloat, ArrayDeleter<GLfloat> > TFloatArray;
  63.         TFloatArray glbuf(new GLfloat[buffer_size]);
  64.         glFeedbackBuffer(buffer_size, GL_3D_COLOR, glbuf.get());
  65.         glRenderMode(GL_FEEDBACK);
  66.         // call the GL drawing function
  67.         (*func)();
  68.         // switch back to render mode
  69.         data_len = glRenderMode(GL_RENDER);
  70.         _TRACE(Warning << "PrintVec(): GL data: " << data_len << " bytes");
  71.         if (data_len == 0) {
  72.             _TRACE(Warning << "PrintVec(): no GL data rendered for print");
  73.             break;
  74.         }
  75.         else if (data_len < 0) {
  76.             _TRACE(Warning << "PrintVec(): GL feedback buffer overflow");
  77.             continue;
  78.         }
  79.         CRef<COpenGLPrintBuffer> pbuffer(new COpenGLPrintBuffer());
  80.         CPrintContext ctx;
  81.         ctx.AddBuffer(pbuffer);
  82.         pbuffer->Parse(glbuf.get(), data_len);
  83.         PrintContext(ctx, opts);
  84.         ctx.RemoveBuffer(pbuffer);
  85.         break;
  86.     }
  87. }
  88. void PrintRas(CFuncPtr* func, const CPrintOptions& opts)
  89. {
  90.     const size_t w = opts.GetRasterWidth();
  91.     const size_t h = opts.GetRasterHeight();
  92.     const size_t imgsize = (w * h) << 2;
  93.     typedef unsigned char uchar;
  94.     AutoPtr< uchar, ArrayDeleter<uchar> > imgbuf(new uchar[imgsize]);
  95.     // call the GL drawing function
  96.     (*func)();
  97.     //glReadBuffer(GL_BACK);
  98.     glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, imgbuf.get());
  99.     // create the CImage
  100.     // copy the image data to the CImage buffer, reversing the row order
  101.     CRef<CImage> img(new CImage(w, h, 4));
  102.     unsigned char* imgptr = img->SetData();
  103.     const size_t linesize = w << 2;
  104.     const unsigned char* bufptr = imgbuf.get() + imgsize - linesize;
  105.     for (size_t i = 0; i < h; ++i, imgptr += linesize, bufptr -= linesize)
  106.     {
  107.         memcpy(imgptr, bufptr, linesize);
  108.     }
  109.     CPrintOptions::TOutputFormat fmt = opts.GetOutputFormat();
  110.     CImageIO::EType imgfmt;
  111.     switch (fmt) {
  112.     case CPrintOptions::ePng:
  113.         imgfmt = CImageIO::ePng;
  114.         break;
  115.     case CPrintOptions::eJpeg:
  116.         imgfmt = CImageIO::eJpeg;
  117.         break;
  118.     default:
  119.         _TRACE(Error << "glprint PrintRas(): unsupported image output type");
  120.     }
  121.     CImageIO::WriteImage(*img, opts.GetFilename(), imgfmt);
  122. }
  123. END_NCBI_SCOPE
  124. /*
  125.  * ===========================================================================
  126.  * $Log: glprint.cpp,v $
  127.  * Revision 1000.1  2004/06/01 20:50:58  gouriano
  128.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  129.  *
  130.  * Revision 1.6  2004/05/21 22:27:45  gorelenk
  131.  * Added PCH ncbi_pch.hpp
  132.  *
  133.  * Revision 1.5  2003/08/15 17:08:33  meric
  134.  * Update include paths for print-related files moved from gui/utils to gui/print
  135.  *
  136.  * Revision 1.4  2003/08/06 20:20:20  meric
  137.  * Add diagnostic messages
  138.  * Differentiate buffer overflow from an empty buffer
  139.  *
  140.  * Revision 1.3  2003/07/16 20:43:07  meric
  141.  * Updated comments
  142.  *
  143.  * Revision 1.2  2003/07/15 21:54:43  meric
  144.  * Added PrintRas() - raster image output
  145.  *
  146.  * Revision 1.1  2003/06/25 16:21:33  meric
  147.  * Initial version
  148.  *
  149.  * Revision 1.20  2003/06/24 22:46:45  meric
  150.  * Temporary fix: added includes to allow MSVC++ to compile error/warning-free.
  151.  * These includes are for printing functionality, which will be moved shortly.
  152.  *
  153.  * Revision 1.19  2003/06/19 16:34:21  meric
  154.  * Pass file type parameter to CAppPopup::PopupFile
  155.  *
  156.  * Revision 1.18  2003/06/19 00:54:58  dicuccio
  157.  * Minor reformatting.  Changed LOG_POST() to _TRACE().
  158.  *
  159.  * Revision 1.17  2003/06/18 19:44:40  meric
  160.  * Print: loop to increase size of feedback buffer as necessary
  161.  *
  162.  * Revision 1.16  2003/06/18 17:26:57  meric
  163.  * Final phase of print reorg: print classes now in gui/utils
  164.  *
  165.  * Revision 1.15  2003/06/17 19:34:32  meric
  166.  * Call CAppPopup::PopupFile() instead of CAppPopup::Popup()
  167.  *
  168.  * Revision 1.14  2003/06/17 12:08:42  meric
  169.  * Fixed CVectorOutput to include separate call to SetOutputStream()
  170.  * Remove static keyword from s_Print (anachronism)
  171.  *
  172.  * Revision 1.13  2003/06/16 21:20:31  meric
  173.  * Changed auto_ptr<> to CRef<> on a CObject-derived class (COpenGLPrintBuffer)
  174.  *
  175.  * Revision 1.12  2003/06/16 19:10:59  meric
  176.  * Remove print buffer from print context before the context is destroyed. (this
  177.  * code was 'lost' in the previous update).
  178.  *
  179.  * Revision 1.11  2003/06/16 16:56:10  dicuccio
  180.  * Fix compiler error for MSVC
  181.  *
  182.  * Revision 1.10  2003/06/16 15:59:10  dicuccio
  183.  * Work-in-progress: everything compiles, still much reorganization to be done.
  184.  * Moved generic functionality out of opengl/print/ and into gui/utils (print
  185.  * options, print dialogs, etc.).  Removed interactive state from CGlCanvas.
  186.  * Added hook in CView for opening standard print dialog, and for generic print
  187.  * handling.  Restored log for glcanvas.cpp
  188.  *
  189.  * Revision 1.9  2003/06/13 18:44:04  meric
  190.  * Initialization in x_Init(), which is called by all c'tors
  191.  * Remove print-related functinality from draw(), which can now be
  192.  * overridden freely without affecting the Print() function.
  193.  * Add print functions [ Print(), x_Print() etc ]
  194.  *
  195.  * Revision 1.8  2003/05/22 15:51:06  meric
  196.  * small changes to GL Feedback code (remains commented out)
  197.  *
  198.  * Revision 1.7  2003/05/13 19:25:20  dicuccio
  199.  * Prepare CGlCanvas for printing support (Peter Meric)
  200.  *
  201.  * Revision 1.6  2003/05/06 15:59:44  dicuccio
  202.  * Split CGlCanvas into 2D and 3D versions; moved hardware check into CGlUtils
  203.  *
  204.  * Revision 1.5  2003/03/28 17:16:01  dicuccio
  205.  * Added first support for testing for hardware acceleration
  206.  *
  207.  * Revision 1.4  2003/01/13 13:10:11  dicuccio
  208.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  209.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  210.  *
  211.  * Revision 1.3  2002/11/14 16:24:44  dicuccio
  212.  * Changed to include standard OpenGL headers through 'gui/opengl.h'
  213.  *
  214.  * Revision 1.2  2002/11/08 13:27:45  dicuccio
  215.  * Code clean-up and reformatting.
  216.  *
  217.  * Revision 1.1  2002/11/05 20:21:47  dicuccio
  218.  * Initial revision
  219.  *
  220.  * ===========================================================================
  221.  */