Changed frame numbering to only alter hashes if they are in the filename (not the...
[blender.git] / source / blender / src / screendump.c
index 657305930e549273c761f7abb1b3beb4e93522e6..e793c224fcb6c61486f03168defadd7a0e795676 100644 (file)
@@ -1,15 +1,12 @@
 /**
  * $Id$
  *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  * Making screendumps.
  */
 
 #include <string.h>
 
-#ifdef WIN32
-#include "BLI_winstuff.h"
-#endif
-
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
 
+#include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
 #include "BKE_utildefines.h"
 #include "BKE_global.h"
+#include "BKE_image.h"
 #include "BKE_material.h"
 #include "BKE_sca.h"
 
 #include "BIF_mywindow.h"
 #include "BIF_screen.h"
 #include "BIF_toets.h"
+#include "BIF_interface.h"
+#include "BIF_writeimage.h"
 
 #include "BSE_filesel.h"
 
-#include "render.h"
 #include "mydevice.h"
 
 static unsigned int *dumprect=0;
 static int dumpsx, dumpsy;
 
-void write_screendump(char *name);
-
 void write_screendump(char *name)
 {
        ImBuf *ibuf;
@@ -75,7 +69,13 @@ void write_screendump(char *name)
        if(dumprect) {
 
                strcpy(G.ima, name);
-               BLI_convertstringcode(name, G.sce, G.scene->r.cfra);
+               BLI_convertstringcode(name, G.sce);
+               BLI_convertstringframe(name, G.scene->r.cfra); /* TODO - is this ever used? */
+               
+               /* BKE_add_image_extension() checks for if extension was already set */
+               if(G.scene->r.scemode & R_EXTENSION) 
+                       if(strlen(name)<FILE_MAXDIR+FILE_MAXFILE-5)
+                               BKE_add_image_extension(name, G.scene->r.imtype);
                
                if(saveover(name)) {
                        waitcursor(1);
@@ -83,41 +83,43 @@ void write_screendump(char *name)
                        ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0, 0);
                        ibuf->rect= dumprect;
                        
-                       if(G.scene->r.imtype== R_IRIS) ibuf->ftype= IMAGIC;
-                       else if(G.scene->r.imtype==R_IRIZ) ibuf->ftype= IMAGIC;
-                       else if(G.scene->r.imtype==R_TARGA) ibuf->ftype= TGA;
-                       else if(G.scene->r.imtype==R_RAWTGA) ibuf->ftype= RAWTGA;
-                       else if(G.scene->r.imtype==R_PNG) ibuf->ftype= PNG;
-                       else if(G.scene->r.imtype==R_HAMX) ibuf->ftype= AN_hamx;
-                       else if(ELEM5(G.scene->r.imtype, R_MOVIE, R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90)) {
-                               ibuf->ftype= JPG|G.scene->r.quality;
-                       }
-                       else ibuf->ftype= TGA;  
-
-                       IMB_saveiff(ibuf, name, IB_rect);
+                       if(G.scene->r.planes == 8) IMB_cspace(ibuf, rgb_to_bw);
+                       
+                       BKE_write_ibuf(ibuf, name, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality);
+
                        IMB_freeImBuf(ibuf);
                        
                        waitcursor(0);
                }
                MEM_freeN(dumprect);
-               dumprect= 0;
+               dumprect= NULL;
        }
 }
 
-
-void BIF_screendump(void)
+/* get dump from frontbuffer */
+void BIF_screendump(int fscreen)
 {
-       /* dump pakken van frontbuffer */
+       extern int uiIsMenu(int *x, int *y, int *sizex, int *sizey);
+       int ismenu;
+       static int wasmenu= 0;
        int x=0, y=0;
-       char imstr[32];
+       char imstr[64];
+
+       /* this sets dumpsx/y to zero if ismenu==0 */
+       ismenu= uiIsMenu(&x, &y, &dumpsx, &dumpsy);
        
-       dumpsx= 0;
-       dumpsy= 0;
+       if(wasmenu && !ismenu) {
+               save_image_filesel_str(imstr);
+               strcat(imstr, " (Menu)");
+               activate_fileselect(FILE_SPECIAL, imstr, G.ima, write_screendump);
+               wasmenu= 0;
+               return;
+       }
        
        if(dumprect) MEM_freeN(dumprect);
-       dumprect= 0;
+       dumprect= NULL;
        
-       if (G.qual & LR_SHIFTKEY) {
+       if((G.qual & LR_SHIFTKEY) || fscreen) { /* full screen */
                x= 0;
                y= 0;
                
@@ -126,25 +128,32 @@ void BIF_screendump(void)
                
        } 
        else {
-               if(mywin_inmenu()) {
-                       mywin_getmenu_rect(&x, &y, &dumpsx, &dumpsy);
-               } else {
-                       int win= mywinget();
-
-                       bwin_getsuborigin(win, &x, &y);
-                       bwin_getsize(win, &dumpsx, &dumpsy);
+               if(ismenu==0) { /* a window */
+                       //int win= mywinget();
+
+                       //bwin_getsuborigin(win, &x, &y);
+                       //bwin_getsize(win, &dumpsx, &dumpsy);
+                       x= curarea->totrct.xmin;
+                       y= curarea->totrct.ymin;
+                       dumpsx= curarea->totrct.xmax-x;
+                       dumpsy= curarea->totrct.ymax-y;
                }
        }
        
        if (dumpsx && dumpsy) {
-               save_image_filesel_str(imstr);
                
                dumprect= MEM_mallocN(sizeof(int)*dumpsx*dumpsy, "dumprect");
                glReadBuffer(GL_FRONT);
                glReadPixels(x, y, dumpsx, dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
-       
-               /* filesel openen */
+               glFinish();
+               glReadBuffer(GL_BACK);
                
-               activate_fileselect(FILE_SPECIAL, imstr, G.ima, write_screendump);
-       }       
+               if(ismenu==0) {
+                       wasmenu= 0;
+                       save_image_filesel_str(imstr);
+                       activate_fileselect(FILE_SPECIAL, imstr, G.ima, write_screendump);
+               }
+               else wasmenu= 1;
+       }
+
 }