Removed unused code.
[libopano.git] / src / viewer.c
index 55cc106..043cef8 100644 (file)
 #include <X11/Xatom.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <stdint.h>
 #include "filter.h"
 
 void   PV_ExtractStill( TrformStr *TrPtr );
 void   PV_SetInvMakeParams( struct fDesc *stack, struct MakeParams *mp, Image *im , Image *pn );
-int    SetUpAtan();
-int    SetUpSqrt();
-int    SetUpMweights();
 
 void   DrawWindow();
 void   DrawView(int InterPolator);
 
+int readJPEG ( Image *im, fullPath *sfile );
+
 int                                    panning = FALSE;
 int                                    zooming_in = FALSE;
 int                                    zooming_out = FALSE;
@@ -59,7 +59,6 @@ int                   oldposx, oldposy;
 
 int main( int argc, char** argv )
 {
-       KeySym key;
        XSizeHints hint;
        unsigned long fg, bg;
        int done;
@@ -90,7 +89,6 @@ int main( int argc, char** argv )
        if( depth != 24 )
        {
                PrintError("Depth = %d, must be 24 pixels", (int)depth);
-               exit(0);
        }
        bg = WhitePixel(disp,screen);
        fg = BlackPixel(disp,screen);
@@ -115,14 +113,6 @@ int main( int argc, char** argv )
        pano.hfov               = 360.0;
        pano.format     = _equirectangular;
        
-       // Initialize Look-up tables
-       
-       if( SetUpAtan() || SetUpSqrt() || SetUpMweights() )
-       {
-               PrintError("Could not set up LU Tables");
-               exit(0);
-       }
-
        // Set up viewer window
 
        SetImageDefaults( &view );
@@ -183,16 +173,16 @@ int main( int argc, char** argv )
  
 
 
-       visual  = DefaultVisual(disp, screen);
+    visual  = DefaultVisual(disp, screen);
 
-       ximage = XCreateImage(disp, visual, depth, ZPixmap, 0,
-                                          NULL, view.width, view.height,
-                                          8, 0);
+    ximage = XCreateImage(disp, visual, depth, ZPixmap, 0,
+                   NULL, view.width, view.height,
+                   8, 0);
     memset( *(view.data), 0, view.dataSize);
     ximage->data = (char *)*(view.data);
     ximage->byte_order= MSBFirst;
 
-       
+
 
        done = 0;
        while( done==0)
@@ -338,6 +328,8 @@ _EventLoop:
        XFreeGC(disp,gc);
        XDestroyWindow(disp, win);
        XCloseDisplay(disp);
+
+       return (0);
 }
        
 
@@ -452,7 +444,88 @@ void ThreeToFourBPP( Image *im )
        im->dataSize = im->height * im->bytesPerLine;
 }
 
+static int copy_rgb_to_zpixmap (XImage *dest, const Image *src)
+{
+       uint32_t *src_data;
+
+       uint32_t src_r;
+       uint32_t src_g;
+       uint32_t src_b;
+
+       uint32_t dest_r;
+       uint32_t dest_g;
+       uint32_t dest_b;
+       uint32_t dest_pixel_value;
+
+       uint32_t x;
+       uint32_t y;
+       uint32_t pixel;
+
+       uint32_t dest_r_maxval;
+       uint32_t dest_g_maxval;
+       uint32_t dest_b_maxval;
+
+       uint32_t dest_r_offset;
+       uint32_t dest_g_offset;
+       uint32_t dest_b_offset;
+
+       dest_r_offset = 0;
+       dest_g_offset = 0;
+       dest_b_offset = 0;
+       dest_r_maxval = dest->red_mask;
+       dest_g_maxval = dest->green_mask;
+       dest_b_maxval = dest->blue_mask;
+       for (x = 0; x < dest->depth; x++)
+       {
+               if ((dest_r_maxval & 0x01) == 0)
+               {
+                       dest_r_offset++;
+                       dest_r_maxval >>= 1;
+               }
+               if ((dest_g_maxval & 0x01) == 0)
+               {
+                       dest_g_offset++;
+                       dest_g_maxval >>= 1;
+               }
+               if ((dest_b_maxval & 0x01) == 0)
+               {
+                       dest_b_offset++;
+                       dest_b_maxval >>= 1;
+               }
+       }
 
+       src_data = (uint32_t *) *src->data;
+
+       pixel = 0;
+       for (y = 0; y < dest->height; y++)
+       {
+               for (x = 0; x < dest->width; x++, pixel++)
+               {
+                       int32_t bytenum;
+
+                       src_r = (src_data[pixel] >>  8) & 0xFF;
+                       src_g = (src_data[pixel] >> 16) & 0xFF;
+                       src_b = (src_data[pixel] >> 24) & 0xFF;
+
+                       dest_r = dest_r_maxval * src_r / 0xFF;
+                       dest_g = dest_g_maxval * src_g / 0xFF;
+                       dest_b = dest_b_maxval * src_b / 0xFF;
+
+                       dest_pixel_value = 0
+                               | ((dest_r << dest_r_offset) & dest->red_mask)
+                               | ((dest_g << dest_g_offset) & dest->green_mask)
+                               | ((dest_b << dest_b_offset) & dest->blue_mask);
+
+                       for (bytenum = 0; bytenum < (dest->depth / 8); bytenum++)
+                       {
+                               dest->data[(pixel * dest->bits_per_pixel / 8) + bytenum] = 
+                                       (dest_pixel_value >> (dest->bits_per_pixel - (8 * (bytenum + 1)))) & 0xFF;
+                       }
+               }
+       }
+
+       return (0);
+} /* int copy_rgb_to_zpixmap */
 
 void DrawWindow()
 {
@@ -465,21 +538,21 @@ void DrawWindow()
                myfree((void**)view.data);
                view.width                      = xa.width;
                view.height             = xa.height;
-        view.bytesPerLine      = view.width * view.bitsPerPixel / 8;
-        view.dataSize          = view.bytesPerLine * view.height;
-        view.format                    = 1;
-        view.data              = (unsigned char**)mymalloc( view.dataSize );
-        if(view.data == NULL)
-        {
-             PrintError("Not enough memory");
-             exit(0);
-        }
-
-        ximage = XCreateImage(disp, visual, depth, ZPixmap, 0,
-                                          NULL, view.width, view.height,
-                                          8, 0);
-       ximage->data = (char *)*(view.data);
-       ximage->byte_order= MSBFirst;
+               view.bytesPerLine       = view.width * view.bitsPerPixel / 8;
+               view.dataSize           = view.bytesPerLine * view.height;
+               view.format             = 1;
+               view.data               = (unsigned char**)mymalloc( view.dataSize );
+               if(view.data == NULL)
+               {
+                       PrintError("Not enough memory");
+                       exit(0);
+               }
+
+               ximage = XCreateImage(disp, visual, depth, ZPixmap, 0,
+                               NULL, view.width, view.height,
+                               8, 0);
+               ximage->data = (char *)*(view.data);
+               ximage->byte_order= MSBFirst;
        }
        if( view.format )
        {
@@ -488,8 +561,18 @@ void DrawWindow()
                else
                        DrawView(_bilinear);
        }
-                       
+
+       ximage->data = (char *) malloc (view.dataSize);
+       if (ximage->data == NULL)
+               return;
+       memcpy (ximage->data, *(view.data), view.dataSize);
+
+       copy_rgb_to_zpixmap (ximage, &view);
+
        XPutImage(disp, win, gc, ximage, 0, 0, 0, 0, view.width, view.height);
+
+       free (ximage->data);
+       ximage->data = NULL;
 }
 
 void DrawView(int InterPolator)