==Sequencer==
[blender.git] / source / blender / imbuf / intern / rectop.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_allocimbuf.h"
43
44 void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, 
45         int desty, int srcx, int srcy, int width, int height)
46 {
47         unsigned int *drect, *srect;
48         float *drectf = NULL;
49         float *srectf = NULL;
50         int tmp, do_float = 0;
51
52         if (dbuf == NULL) return;
53         
54         if (sbuf && sbuf->rect_float && dbuf->rect_float) do_float = 1;
55
56         if (destx < 0){
57                 srcx -= destx ;
58                 width += destx ;
59                 destx = 0;
60         }
61         if (srcx < 0){
62                 destx -= srcx ;
63                 width += destx ;
64                 srcx = 0;
65         }
66         if (desty < 0){
67                 srcy -= desty ;
68                 height += desty ;
69                 desty = 0;
70         }
71         if (srcy < 0){
72                 desty -= srcy ;
73                 height += desty ;
74                 srcy = 0;
75         }
76
77         tmp = dbuf->x - destx;
78         if (width > tmp) width = tmp;
79         tmp = dbuf->y  - desty;
80         if (height > tmp) height = tmp;
81
82         drect = dbuf->rect + desty * dbuf->x + destx;
83         if (do_float) drectf = dbuf->rect_float + desty * dbuf->x + destx;
84         destx = dbuf->x;
85
86         if (sbuf){
87                 tmp = sbuf->x - srcx;
88                 if (width > tmp) width = tmp;
89                 tmp = sbuf->y - srcy;
90                 if (height > tmp) height = tmp;
91
92                 if (width <= 0) return;
93                 if (height <= 0) return;
94
95                 srect = sbuf->rect;
96                 srect += srcy * sbuf->x;
97                 srect += srcx;
98                 if (do_float) {
99                         srectf = sbuf->rect_float;
100                         srectf += srcy * sbuf->x;
101                         srectf += srcx;
102                 }
103                 srcx = sbuf->x;
104         } else{
105                 if (width <= 0) return;
106                 if (height <= 0) return;
107
108                 srect = drect;
109                 srectf = drectf;
110                 srcx = destx;
111         }
112
113         for (;height > 0; height--){
114
115                 memcpy(drect,srect, width * sizeof(int));
116                 drect += destx;
117                 srect += srcx;
118
119                 if (do_float) {
120                         memcpy(drectf,srectf, width * sizeof(float) * 4);
121                         drectf += destx;
122                         srectf += srcx;
123                 }               
124         }
125 }
126
127 void IMB_rectfill(struct ImBuf *drect, float col[4])
128 {
129         int num;
130         unsigned int *rrect = drect->rect;
131         unsigned char *spot;
132
133         num = drect->x * drect->y;
134         for (;num > 0; num--) {
135                 spot = (unsigned char *)rrect;
136                 spot[0] = (int)(col[0]*255);
137                 spot[1] = (int)(col[1]*255);
138                 spot[2] = (int)(col[2]*255);
139                 spot[3] = (int)(col[3]*255);
140                 *rrect++;
141         }
142         if(drect->rect_float) {
143                 float *rrectf = drect->rect_float;
144                 
145                 num = drect->x * drect->y;
146                 for (;num > 0; num--) {
147                         *rrectf++ = col[0];
148                         *rrectf++ = col[1];
149                         *rrectf++ = col[2];
150                         *rrectf++ = col[3];
151                 }
152         }       
153 }
154