Initial revision
[blender.git] / source / blender / imbuf / intern / divers.c
1 /**
2  *
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  * allocimbuf.c
31  *
32  * $Id$
33  */
34
35 #include "BLI_blenlib.h"
36
37 #include "imbuf.h"
38 #include "imbuf_patch.h"
39 #include "IMB_imbuf_types.h"
40 #include "IMB_imbuf.h"
41
42 #include "IMB_divers.h"
43
44
45 void imb_checkncols(struct ImBuf *ibuf)
46 /*  struct ImBuf *ibuf; */
47 {
48         unsigned int i;
49
50         if (ibuf==0) return;
51         
52         if (IS_amiga(ibuf)){
53                 if (IS_ham(ibuf)){
54                         if (ibuf->depth == 0) ibuf->depth = 6;
55                         ibuf->mincol = 0;
56                         ibuf->maxcol = 1 << (ibuf->depth - 2);
57                         /*printf("%d %d\n", ibuf->maxcol, ibuf->depth);*/
58                         return;
59                 } else if (IS_hbrite(ibuf)){
60                         ibuf->mincol = 0;
61                         ibuf->maxcol = 64;
62                         ibuf->depth = 6;
63                         return;
64                 }
65         }
66
67         if (ibuf->maxcol == 0){
68                 if (ibuf->depth <= 8){
69                         ibuf->mincol = 0;
70                         ibuf->maxcol = (1 << ibuf->depth);
71                         return;
72                 } else if (ibuf->depth == 0){
73                         ibuf->depth = 5;
74                         ibuf->mincol = 0;
75                         ibuf->maxcol = 32;
76                 }
77                 return;
78         } else {
79                 /* ibuf->maxcol is bepalend voor de diepte */
80                 for (i=1 ; ibuf->maxcol > (1 << i); i++);
81                 ibuf->depth = i;
82                 return;
83         }
84 }
85
86
87 void IMB_de_interlace(struct ImBuf *ibuf)
88 {
89         struct ImBuf * tbuf1, * tbuf2;
90 /*      extern rectcpy(); */
91         
92         if (ibuf == 0) return;
93         if (ibuf->flags & IB_fields) return;
94         ibuf->flags |= IB_fields;
95         
96         if (ibuf->rect) {
97                 /* kopieen aanmaken */
98                 tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
99                 tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
100                 
101                 ibuf->x *= 2;   
102 /* Functions need more args :( */
103 /*              rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, rectcpy); */
104 /*              rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, rectcpy); */
105                 IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
106                 IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0);
107         
108                 ibuf->x /= 2;
109 /*              rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, rectcpy); */
110 /*              rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, rectcpy); */
111                 IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
112                 IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0);
113                 
114                 IMB_freeImBuf(tbuf1);
115                 IMB_freeImBuf(tbuf2);
116         }
117         ibuf->y /= 2;
118 }
119