home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / delphi / imagelib / imdibvw2.cp_ / imdibvw2.cp
Text File  |  1995-09-27  |  19KB  |  827 lines

  1. #include <owl\owlpch.h>
  2. #pragma hdrstop
  3. #include <owl\framewin.h>
  4. #include <owl\scroller.h>
  5. #include <owl\opensave.h>
  6. #include <string.h>
  7. #include <dir.h>
  8. #include <time.h>
  9. #include <stdio.h>
  10. #include <io.h>
  11. #include <fcntl.h>
  12. #include <sys\stat.h>
  13. #include "viewdlg.h"
  14. #include "imagevw.h"
  15. #include "imgdib.h"
  16. #include "imglib30.h"
  17.  
  18. #define MAXAPPNAME  20
  19. #define JPG 1
  20. #define PCX 2
  21. #define GIF 3
  22. #define BMP 4
  23. #define PNG 5
  24.  
  25. static const char AppName[] = "ImageViewDIB2";
  26. TGaugeDialog* Gdlg;
  27. TGauge2Dialog* Gdlg2;
  28. short Callback(int i)
  29.  {
  30.     return Gdlg->SetValue(i);
  31.   };
  32. short Callback2(int i)
  33.  {
  34.     return Gdlg2->SetValue(i);
  35.  };
  36.  
  37.  
  38. class TViewWindow : virtual public TWindow {
  39.   public:
  40.         char      FileName[MAXPATH];
  41.         TBitmap*  Bitmap;
  42.         TPalette* Palette;
  43.         TDib*     Dib;
  44.         TBrush*   BkgndBrush;
  45.         long      Rop;
  46.         int       PixelWidth;
  47.         int       PixelHeight;
  48.         WORD      Colors;
  49.         BOOL      Fit;
  50.  
  51.         TViewWindow();
  52.       ~TViewWindow();
  53.  
  54.   protected:
  55.         void      CmOpenJpg();
  56.         void      CmOpenBmp();
  57.         void      CmOpenGif();
  58.         void      CmOpenPcx();
  59.         void      CmOpenPng();
  60.         void      CmImageInfo();
  61.         void      CmFit();
  62.         void      CeFit(TCommandEnabler& ce);
  63.  
  64.         void      Paint(TDC&, BOOL erase, TRect&);
  65.         void      EvSize(UINT sizeType, TSize&);
  66.  
  67.         void      EvPaletteChanged(HWND hWndPalChg);
  68.         BOOL      EvQueryNewPalette();
  69.         void      EvSetFocus(HWND); // should use above when working
  70.         void      EvDestroy();
  71.  
  72.         BOOL      UpdatePalette(BOOL alwaysRepaint);
  73.         void      AdjustScroller();
  74.         void      SetCaption(const char*);
  75.         void      CmSaveToJpg();
  76.         void      CmSaveToBmp();
  77.         void      CmSaveToPng();
  78.         void      CmSaveToGif();
  79.         void      CmSaveToPcx();
  80.         int       ReadFile(const char * filename, const char * filetitle, int type);
  81.         int       WriteFile(const char * filename, int type);
  82.   private:
  83.         DecTransfer DecBuffer;
  84.         ComTransfer ComBuffer;
  85.         EncTransfer EncBuffer;
  86.  
  87.   DECLARE_RESPONSE_TABLE(TViewWindow);
  88. };
  89.  
  90. DEFINE_RESPONSE_TABLE1(TViewWindow, TWindow)
  91.   EV_COMMAND(CM_OPENJPG, CmOpenJpg),
  92.   EV_COMMAND(CM_OPENBMP, CmOpenBmp),
  93.   EV_COMMAND(CM_OPENGIF, CmOpenGif),
  94.   EV_COMMAND(CM_OPENPCX, CmOpenPcx),
  95.   EV_COMMAND(CM_OPENPNG, CmOpenPng),
  96.   EV_COMMAND(CM_INFO, CmImageInfo),
  97.   EV_COMMAND(CM_FIT, CmFit),
  98.   EV_COMMAND(CM_SAVETOJPG, CmSaveToJpg),
  99.   EV_COMMAND(CM_SAVETOBMP, CmSaveToBmp),
  100.   EV_COMMAND(CM_SAVETOPNG, CmSaveToPng),
  101.   EV_COMMAND(CM_SAVETOGIF, CmSaveToGif),
  102.   EV_COMMAND(CM_SAVETOPCX, CmSaveToPcx),
  103.   EV_COMMAND_ENABLE(CM_FIT, CeFit),
  104.   EV_WM_SIZE,
  105.   EV_WM_PALETTECHANGED,
  106.   EV_WM_QUERYNEWPALETTE,
  107.   EV_WM_SETFOCUS,
  108.   EV_WM_DESTROY,
  109. END_RESPONSE_TABLE;
  110.  
  111. //
  112. // Constructor for a TViewWindow, sets scroll styles andconstructs
  113. // the Scroller object.  Also sets the Rop based on whether thedisplay
  114. // is monochrome (two-color) or polychrome.
  115. //
  116. TViewWindow::TViewWindow()
  117.   : TWindow(0, 0, 0)
  118. {
  119.   Attr.Style |= WS_VSCROLL | WS_HSCROLL;
  120.   Bitmap = 0;
  121.   Palette = 0;
  122.   Dib = 0;
  123.   BkgndBrush = new TBrush(::GetSysColor(COLOR_WINDOW));
  124.   Scroller = new TScroller(this, 1, 1, 200, 200);
  125.   Fit = FALSE;
  126.  
  127.   TScreenDC screenDC;
  128.   if (screenDC.GetDeviceCaps(NUMCOLORS) < 3 )
  129.      Rop = NOTSRCCOPY;
  130.   else
  131.      Rop = SRCCOPY;
  132.   memset(&DecBuffer, 0, sizeof(DecBuffer));
  133.   DecBuffer.Res8But = BF_CHECKED;
  134.   DecBuffer.Scl1But = BF_CHECKED;
  135.   DecBuffer.Rad1DBut = BF_CHECKED;
  136.   memset(&EncBuffer, 0, sizeof(EncBuffer));
  137.   EncBuffer.Res8But = BF_CHECKED;
  138.   memset(&ComBuffer, 0, sizeof(ComBuffer));
  139.   strcpy(ComBuffer.Cquality, "75");
  140.   strcpy(ComBuffer.Csmooth, "00");
  141.  
  142.   SetCaption(0);
  143. }
  144.  
  145. TViewWindow::~TViewWindow()
  146. {
  147.   delete Bitmap;
  148.   delete Palette;
  149.   delete Dib;
  150.   delete BkgndBrush;
  151.   delete Scroller;
  152. }
  153.  
  154. //
  155. // Build up a caption based on a filename, and set it into the title.
  156. //
  157. void
  158. TViewWindow::SetCaption(const char* name)
  159. {
  160.   char caption[MAXPATH + MAXAPPNAME + 2 + 1];
  161.   strcpy(FileName, name ? name : "(Untitled)");
  162.   strcpy(caption, GetApplication()->GetName());
  163.   strcat(caption, " - ");
  164.   strcat(caption, FileName);
  165.   if (Parent)
  166.      Parent->SetCaption(caption);
  167. }
  168.  
  169. //
  170. // Toggle Fit member variable & adjust scroller as needed
  171. //
  172. void
  173. TViewWindow::CmFit()
  174. {
  175.   Fit = !Fit;
  176.   AdjustScroller();
  177. }
  178.  
  179. //
  180. // The fit menu item is checked if the Fit member is true
  181. //
  182. void
  183. TViewWindow::CeFit(TCommandEnabler& ce)
  184. {
  185.   ce.SetCheck(Fit ? TCommandEnabler::Checked : TCommandEnabler::Unchecked);
  186. }
  187.  
  188. int TViewWindow::ReadFile(const char * filename, const char * filetitle, int type)
  189. {
  190.   int resolution, option, scale, res;
  191.   unsigned int hdib;
  192.   char message[40];
  193.  
  194.   // If type equal JPEG then get input parameters
  195.   TDecDialog* pDlg = new TDecDialog(this, &DecBuffer);
  196.   if (pDlg->Execute() != IDOK)
  197.         // leave
  198.   return 0;
  199.  
  200.   SetCursor(0, IDC_WAIT);
  201.  
  202.   // Set Bitmap output resolution  - 24, 8, or 4 bit
  203.   if (DecBuffer.Res24But == BF_CHECKED)
  204.      resolution = 24;
  205.   else if (DecBuffer.Res8But == BF_CHECKED)
  206.      resolution = 8;
  207.   else
  208.      resolution = 4;
  209.  
  210.   // Set Color Quantization and dithering methods for output.
  211.   // This is used if Resolution != 24
  212.  
  213.   if (DecBuffer.Rad1But == BF_CHECKED)
  214.      option = 0;
  215.   else
  216.      option = 1;
  217.  
  218.   // Set output Bitmap scale factor either 1/1, 1/2, 1/4, or 1/8
  219.   // of origional size
  220.   if (DecBuffer.Scl1But == BF_CHECKED)
  221.      scale = 1;
  222.   else if (DecBuffer.Scl2But == BF_CHECKED)
  223.      scale = 2;
  224.   else if (DecBuffer.Scl4But == BF_CHECKED)
  225.      scale = 4;
  226.   else
  227.      scale = 8;
  228.  
  229.   // Show progress display modaless dialog box
  230.   if (type == 1)
  231.      sprintf(message, "Decompressing JPG File");
  232.   else if (type == 2)
  233.      sprintf(message, "Decompressing PCX File");
  234.   else if (type == 3)
  235.      sprintf(message, "Decompressing GIF File");
  236.   else if (type == 5)
  237.      sprintf(message, "Decompressing PNG File");
  238.   else
  239.      sprintf(message, "Decompressing BMP File");
  240.   Gdlg = new TGaugeDialog(this);
  241.   Gdlg->SetCaption(message);
  242.   Gdlg->Create();
  243.  
  244.   // password variable - the code is given when you register
  245.   int password = 0;
  246.   res = 0;
  247.   // call the DLL function to read the image in global memory
  248.   switch (type)
  249.     {
  250.      case 1:
  251.         res = rdjpgfiledib(filename, resolution, scale, option, password,
  252.                           &hdib, Callback, 1);
  253.         break;
  254.      case 2:
  255.         res = rdpcxfiledib(filename, resolution, option, password,
  256.                                 &hdib, Callback, 1);
  257.         break;
  258.      case 3:
  259.         res = rdgiffiledib(filename, resolution, option, password,
  260.                                 &hdib, Callback, 1);
  261.         break;
  262.      case 4:
  263.         res = rdbmpfiledib(filename, resolution, option, password,
  264.                                 &hdib, Callback, 1);
  265.         break;
  266.      case 5:
  267.         res = rdpngfiledib(filename, resolution, option, password, &hdib,
  268.                                 Callback, 1);
  269.       break;
  270.     }
  271.  
  272.   // destroy progress display dialog and free global memory
  273.   Gdlg->Destroy();
  274.   delete Gdlg;
  275.   SetCursor(0, IDC_ARROW);
  276.  
  277.   // if success set Bitmap and Palette for Painting
  278.   if (res != 1)
  279.      return 0;
  280.  
  281.   delete Dib;
  282.   Dib = new TDib((HGLOBAL)hdib, AutoDelete);
  283.   delete Palette;
  284.   try {
  285.     Palette = new TPalette(*Dib);
  286.   }
  287.   catch (...) {
  288.           Palette = new TPalette((HPALETTE)::GetStockObject(DEFAULT_PALETTE));
  289.   }
  290.   delete Bitmap;
  291.   Bitmap = new TBitmap(*Dib, Palette);
  292.   PixelWidth = Bitmap->Width();
  293.   PixelHeight = Bitmap->Height();
  294.   UpdatePalette(TRUE);
  295.   AdjustScroller();
  296.   SetCaption(filetitle);
  297.   return 1;
  298. }
  299.  
  300.  
  301. void
  302. TViewWindow::CmOpenJpg()
  303. {
  304.   TOpenSaveDialog::TData data (
  305.         OFN_FILEMUSTEXIST,
  306.         "JPEG Files (*.JPG)|*.jpg|",
  307.         0,
  308.         "",
  309.         "JPG"
  310.   );
  311.   int res = 0;
  312.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  313.   if (tmpdlg->Execute() == IDOK)
  314.     {
  315.      char fileTitle[MAXPATH];
  316.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  317.      res = ReadFile(data.FileName, fileTitle, 1);
  318.      if (!res)
  319.         MessageBox("Error Opening JPG File", "Error", MB_ICONSTOP | MB_OK);
  320.     }
  321.   delete tmpdlg;
  322. }
  323.  
  324. void
  325. TViewWindow::CmOpenGif()
  326. {
  327.   TOpenSaveDialog::TData data (
  328.         OFN_FILEMUSTEXIST,
  329.         "GIF Files (*.GIF)|*.gif|",
  330.         0,
  331.         "",
  332.         "GIF"
  333.   );
  334.   int res = 0;
  335.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  336.   if (tmpdlg->Execute() == IDOK)
  337.     {
  338.      char fileTitle[MAXPATH];
  339.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  340.      res = ReadFile(data.FileName, fileTitle, 3);
  341.      if (!res)
  342.         MessageBox("Error Opening GIF File", "Error", MB_ICONSTOP | MB_OK);
  343.     }
  344.   delete tmpdlg;
  345. }
  346.  
  347. void
  348. TViewWindow::CmOpenPcx()
  349. {
  350.   TOpenSaveDialog::TData data (
  351.         OFN_FILEMUSTEXIST,
  352.         "PCX Files (*.PCX)|*.pcx|",
  353.         0,
  354.         "",
  355.         "PCX"
  356.   );
  357.   int res = 0;
  358.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  359.   if (tmpdlg->Execute() == IDOK)
  360.     {
  361.      char fileTitle[MAXPATH];
  362.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  363.      res = ReadFile(data.FileName, fileTitle, 2);
  364.      if (!res)
  365.         MessageBox("Error Opening PCX File", "Error", MB_ICONSTOP | MB_OK);
  366.     }
  367.   delete tmpdlg;
  368. }
  369.  
  370. void
  371. TViewWindow::CmOpenPng()
  372. {
  373.   TOpenSaveDialog::TData data (
  374.         OFN_FILEMUSTEXIST,
  375.         "PNG Files (*.PNG)|*.png|",
  376.         0,
  377.         "",
  378.         "PNG"
  379.   );
  380.   int res = 0;
  381.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  382.   if (tmpdlg->Execute() == IDOK)
  383.     {
  384.      char fileTitle[MAXPATH];
  385.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  386.      res = ReadFile(data.FileName, fileTitle, 5);
  387.      if (!res)
  388.         MessageBox("Error Opening PNG File", "Error", MB_ICONSTOP | MB_OK);
  389.     }
  390.   delete tmpdlg;
  391. }
  392.  
  393. void
  394. TViewWindow::CmOpenBmp()
  395. {
  396.   TOpenSaveDialog::TData data (
  397.         OFN_FILEMUSTEXIST,
  398.         "Bitmap Files (*.BMP)|*.bmp|",
  399.         0,
  400.         "",
  401.         "BMP"
  402.   );
  403.   int res = 0;
  404.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  405.   if (tmpdlg->Execute() == IDOK)
  406.     {
  407.      char fileTitle[MAXPATH];
  408.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  409.      res = ReadFile(data.FileName, fileTitle, 4);
  410.      if (!res)
  411.         MessageBox("Error Opening BMP File", "Error", MB_ICONSTOP | MB_OK);
  412.     }
  413.   delete tmpdlg;
  414. }
  415.  
  416. void TViewWindow::CmSaveToBmp()
  417. {
  418.  TOpenSaveDialog::TData bmpdata (
  419.         OFN_HIDEREADONLY|OFN_NOREADONLYRETURN,
  420.         "Bmp Files (*.BMP)|*.BMP|",
  421.         0,
  422.         0,
  423.         "*.bmp"
  424.       );
  425.  int res = 0;
  426.  if (Dib )
  427.   {
  428.     TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,bmpdata);
  429.     if (tmpdlg->Execute() == IDOK)
  430.      {
  431.       res = WriteFile(bmpdata.FileName, 4);
  432.       if (!res)
  433.          MessageBox("Error Writing BMP File", "Error", MB_ICONSTOP | MB_OK);
  434.      }
  435.     delete tmpdlg;
  436.   }
  437.     else
  438.       MessageBox("No Image Loaded!", "Error Writing BMP", MB_OK);
  439. }
  440.  
  441. void TViewWindow::CmSaveToJpg()
  442. {
  443.  TOpenSaveDialog::TData jpgdata (
  444.         OFN_HIDEREADONLY|OFN_NOREADONLYRETURN,
  445.         "Jpg Files (*.JPG)|*.JPG|",
  446.         0,
  447.         0,
  448.         "*.jpg"
  449.       );
  450.  int res = 0;
  451.  if (Dib)
  452.   {
  453.     TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,jpgdata);
  454.     if (tmpdlg->Execute() == IDOK)
  455.      {
  456.       res = WriteFile(jpgdata.FileName, 1);
  457.       if (!res)
  458.          MessageBox("Error Writing JPG File", "Error", MB_ICONSTOP | MB_OK);
  459.      }
  460.     delete tmpdlg;
  461.   }
  462.     else
  463.       MessageBox("No Image Loaded!", "Error Writing JPG", MB_OK);
  464. }
  465.  
  466. void TViewWindow::CmSaveToPng()
  467. {
  468.  TOpenSaveDialog::TData jpgdata (
  469.         OFN_HIDEREADONLY|OFN_NOREADONLYRETURN,
  470.         "Png Files (*.PNG)|*.PNG|",
  471.         0,
  472.         0,
  473.         "*.png"
  474.       );
  475.  int res = 0;
  476.  if (Dib)
  477.   {
  478.     TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,jpgdata);
  479.     if (tmpdlg->Execute() == IDOK)
  480.      {
  481.       res = WriteFile(jpgdata.FileName, 5);
  482.       if (!res)
  483.          MessageBox("Error Writing PNG File", "Error", MB_ICONSTOP | MB_OK);
  484.      }
  485.     delete tmpdlg;
  486.   }
  487.     else
  488.       MessageBox("No Image Loaded!", "Error Writing PNG", MB_OK);
  489. }
  490.  
  491. void TViewWindow::CmSaveToGif()
  492. {
  493.  TOpenSaveDialog::TData jpgdata (
  494.         OFN_HIDEREADONLY|OFN_NOREADONLYRETURN,
  495.         "Gif Files (*.GIF)|*.GIF|",
  496.         0,
  497.         0,
  498.         "*.gif"
  499.       );
  500.  int res = 0;
  501.  if (Dib)
  502.   {
  503.     TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,jpgdata);
  504.     if (tmpdlg->Execute() == IDOK)
  505.      {
  506.       res = WriteFile(jpgdata.FileName, 3);
  507.       if (!res)
  508.          MessageBox("Error Writing GIF File", "Error", MB_ICONSTOP | MB_OK);
  509.      }
  510.     delete tmpdlg;
  511.   }
  512.     else
  513.       MessageBox("No Image Loaded!", "Error Writing GIF", MB_OK);
  514. }
  515.  
  516. void TViewWindow::CmSaveToPcx()
  517. {
  518.  TOpenSaveDialog::TData jpgdata (
  519.         OFN_HIDEREADONLY|OFN_NOREADONLYRETURN,
  520.         "Pcx Files (*.PCX)|*.PCX|",
  521.         0,
  522.         0,
  523.         "*.pcx"
  524.       );
  525.  int res = 0;
  526.  if (Dib)
  527.   {
  528.     TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,jpgdata);
  529.     if (tmpdlg->Execute() == IDOK)
  530.      {
  531.       res = WriteFile(jpgdata.FileName, 2);
  532.       if (!res)
  533.          MessageBox("Error Writing PCX File", "Error", MB_ICONSTOP | MB_OK);
  534.      }
  535.     delete tmpdlg;
  536.   }
  537.     else
  538.       MessageBox("No Image Loaded!", "Error Writing PCX", MB_OK);
  539. }
  540.  
  541. int TViewWindow::WriteFile(const char * filename, int type)
  542. {
  543.     HGLOBAL hdib;
  544.     int ret = 0;
  545.     int quality, smooth, resolution;
  546.     char message[20];
  547.     if (type == 1)
  548.      {
  549.       TComDialog* pDlg = new TComDialog(this, &ComBuffer);
  550.  
  551.       // Display the options for writing a JPEG file
  552.       if (pDlg->Execute() != IDOK)
  553.         {
  554.          delete pDlg;
  555.          return 0;
  556.         }
  557.       // Set the quality of the JPEG image.  A higher quality
  558.       // yields a better JPEG image that takes more space.
  559.  
  560.       sscanf(ComBuffer.Cquality, "%d", &quality);
  561.  
  562.       // Set a smoothing factor on the JPEG image.
  563.       sscanf(ComBuffer.Csmooth, "%d", &smooth);
  564.      }
  565.     else
  566.      {
  567.       TEncDialog* pDlg = new TEncDialog(this, &EncBuffer);
  568.       if (pDlg->Execute() != IDOK)
  569.          // leave
  570.          return 0;
  571.  
  572.       SetCursor(0, IDC_WAIT);
  573.  
  574.       // Set Bitmap output resolution  - 24, 8, or 4 bit
  575.       if (EncBuffer.Res24But == BF_CHECKED)
  576.          resolution = 24;
  577.       else if (EncBuffer.Res8But == BF_CHECKED)
  578.          resolution = 8;
  579.       else
  580.          resolution = 4;
  581.      }
  582.     SetCursor(0, IDC_WAIT);
  583.  
  584.     hdib = *Dib;
  585.  
  586.     Gdlg2 = new TGauge2Dialog(this);
  587.     if (type == 1)
  588.       sprintf(message, "Creating JPEG File");
  589.     else if (type == 2)
  590.      sprintf(message, "Creating PCX File");
  591.     else if (type == 3)
  592.       sprintf(message, "Creating GIF FIle");
  593.     else if (type == 4)
  594.       sprintf(message, "Creating BMP File");
  595.     else
  596.       sprintf(message, "Creating PNG File");
  597.     Gdlg2->SetCaption(message);
  598.     Gdlg2->Create();
  599.  
  600.     switch (type)
  601.      {
  602.       case 1:
  603.          ret = wrjpegfiledib(filename, quality, smooth, 0,
  604.                             (unsigned int)hdib, Callback2, 1);
  605.          break;
  606.       case 2:
  607.          ret = wrpcxfiledib(filename, resolution, 0,
  608.                             (unsigned int)hdib, Callback2, 1);
  609.          break;
  610.       case 3:
  611.          ret = wrgiffiledib(filename, resolution, 0,
  612.                         (unsigned int)hdib, Callback2, 1);
  613.          break;
  614.       case 4:
  615.          ret = wrbmpfiledib(filename, resolution, 0,
  616.                             (unsigned int)hdib, Callback2, 1);
  617.          break;
  618.       case 5:
  619.          ret = wrpngfiledib(filename, resolution, 1, 0,
  620.                             (unsigned int)hdib, Callback2, 1);
  621.          break;
  622.      }
  623.  
  624.     Gdlg2->Destroy();
  625.     delete Gdlg2;
  626.     if (ret == 1)
  627.      {
  628.      }
  629.     else
  630.       MessageBox("Error creating File", "Error", MB_OK);
  631.     SetCursor(0, IDC_ARROW);
  632.     if (ret == 1)
  633.       return 1;
  634.     else
  635.       return 0;
  636. }
  637.  
  638. //
  639. // Adjust the Scroller range so that the the origin is the
  640. // upper-most scrollable point and the corner is the
  641. // bottom-most.
  642. //
  643. void
  644. TViewWindow::AdjustScroller()
  645. {
  646.   TRect  clientRect = GetClientRect();
  647.  
  648.   // only show scrollbars when image is larger than
  649.   // the client area and we are not stretching to fit.
  650.   //
  651.   if (Fit)
  652.      Scroller->SetRange(0, 0);
  653.  
  654.   else
  655.     {
  656.      TPoint Range(Max(PixelWidth-clientRect.Width(), 0),
  657.                                     Max(PixelHeight-clientRect.Height(),0));
  658.      Scroller->SetRange(Range.x, Range.y);
  659.     }
  660.   Scroller->ScrollTo(0, 0);
  661.   if (!GetUpdateRect(clientRect, FALSE))
  662.      Invalidate(FALSE);
  663. }
  664.  
  665. //
  666. // Reset scroller range.
  667. //
  668. void
  669. TViewWindow::EvSize(UINT SizeType, TSize& Size)
  670. {
  671.   TWindow::EvSize(SizeType, Size);
  672.   if (SizeType != SIZEICONIC)
  673.     {
  674.      AdjustScroller();
  675.      Invalidate(FALSE);
  676.     }
  677. }
  678.  
  679. //
  680. // Somebody changed the palette. If its not us, then we need toupdate.
  681. //
  682. void
  683. TViewWindow::EvPaletteChanged(HWND hWndPalChg)
  684. {
  685.   if (hWndPalChg != HWindow)
  686.      UpdatePalette(TRUE);    // pass FALSE to UpdateColors()instead of repaint
  687. }
  688.  
  689. //
  690. // We need to re-realize the logical palette each time
  691. // we regain the input focus
  692. //
  693. BOOL
  694. TViewWindow::EvQueryNewPalette()
  695. {
  696.   return UpdatePalette(TRUE);
  697. }
  698.  
  699. //
  700. // Use this message temporarily until the palette msgs get routedto us
  701. //
  702. void
  703. TViewWindow::EvSetFocus(HWND)
  704. {
  705.   UpdatePalette(TRUE);
  706. }
  707.  
  708. void
  709. TViewWindow::EvDestroy()
  710. {
  711.   TWindow::EvDestroy();
  712. }
  713.  
  714. BOOL
  715. TViewWindow::UpdatePalette(BOOL alwaysRepaint)
  716. {
  717.   if (Palette)
  718.     {
  719.      TClientDC clientDC(*this);
  720.      #if !defined(__WIN32__)
  721.         Palette->UnrealizeObject();
  722.      #endif
  723.      clientDC.SelectObject(*Palette, FALSE);
  724.      if (alwaysRepaint)
  725.         Invalidate(FALSE);
  726.      else
  727.         clientDC.UpdateColors();
  728.      return TRUE;
  729.     }
  730.   return FALSE;
  731. }
  732.  
  733. void
  734. TViewWindow::Paint(TDC& dc, BOOL, TRect&)
  735. {
  736.   TRect clientRect = GetClientRect();
  737.   dc.SelectObject(*BkgndBrush);
  738.  
  739.   if (Dib)
  740.     {
  741.      TMemoryDC memoryDC(dc);
  742.      memoryDC.SelectObject(*Bitmap);
  743.      dc.SetStretchBltMode(COLORONCOLOR);
  744.      if (Palette)
  745.       {
  746.         dc.SelectObject(*Palette, FALSE);
  747.         dc.RealizePalette();
  748.         memoryDC.SelectObject(*Palette, FALSE);
  749.       }
  750.  
  751.      TRect imageRect(0,0, PixelWidth, PixelHeight);
  752.      if (Parent->IsIconic())
  753.       {
  754.         dc.StretchBlt(Parent->GetClientRect(), memoryDC,imageRect, Rop);
  755.       }
  756.      else
  757.       {
  758.         clientRect += TPoint((int)Scroller->XPos,(int)Scroller->YPos);
  759.         if (Fit)
  760.           dc.StretchBlt(clientRect, memoryDC,imageRect, Rop);
  761.         else
  762.           dc.BitBlt(imageRect, memoryDC, TPoint(0,0), Rop);
  763.         // Clear borders here for no flicker
  764.         //
  765.         if (!Fit)
  766.          {
  767.           dc.PatBlt(TRect(TPoint(PixelWidth,0),clientRect.BottomRight()));
  768.           dc.PatBlt(TRect(TPoint(0,PixelHeight),clientRect.BottomRight()));
  769.        }
  770.       }
  771.     }
  772.   else
  773.     dc.PatBlt(clientRect, PATCOPY);
  774. }
  775.  
  776.  
  777. void
  778. TViewWindow::CmImageInfo()
  779. {
  780.   TOpenSaveDialog::TData data (
  781.         OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_NOREADONLYRETURN,
  782.         "Image Files (*.*)|*.*|",
  783.         0,
  784.         "",
  785.         ""
  786.   );
  787.   int result, width, height, numcolors, bitspixel, planes;
  788.   char filetype[20], filecomp[20];
  789.   char message[300];
  790.   TFileOpenDialog *tmpdlg = new TFileOpenDialog(this,data);
  791.   if (tmpdlg->Execute() == IDOK)
  792.     {
  793.      char fileTitle[MAXPATH];
  794.      TOpenSaveDialog::GetFileTitle(data.FileName, fileTitle,MAXPATH);
  795.      result = fileinfo(data.FileName, filetype, &width, &height, &bitspixel,
  796.                              &planes, &numcolors, filecomp, 1);
  797.      if (result == 1)
  798.       {
  799.         sprintf(message, "%s %s\nw: %d h: %d\nbits per pixel: %d planes: %d\n colors: %d",
  800.                         filetype, filecomp, width, height, bitspixel, planes, numcolors);
  801.         MessageBox(message, fileTitle, MB_ICONINFORMATION | MB_OK);
  802.       }
  803.     }
  804.   delete tmpdlg;
  805. }
  806.  
  807. //----------------------------------------------------------------------------
  808.  
  809. class TViewApp : public TApplication {
  810.   public:
  811.         TViewApp(const char far* name) : TApplication(name) {}
  812.         void InitMainWindow()
  813.          {
  814.           MainWindow = new TFrameWindow(0, Name, new TViewWindow);
  815.           MainWindow->AssignMenu(JPGMENU);
  816.           MainWindow->SetIcon(this, JPGVIEW);
  817.          }
  818. };
  819.  
  820. //----------------------------------------------------------------------------
  821.  
  822. int
  823. OwlMain(int /*argc*/, char* /*argv*/ [])
  824. {
  825.   return TViewApp(AppName).Run();
  826. }
  827.