merge trunk 17122:17213
[blender.git] / source / blender / imbuf / intern / dither.c
1 /**
2  *
3  * ***** BEGIN GPL 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.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  * dither.c
28  *
29  * $Id$
30  */
31
32 #include "BLI_blenlib.h"
33
34 #include "imbuf.h"
35 #include "imbuf_patch.h"
36 #include "IMB_imbuf_types.h"
37 #include "IMB_imbuf.h"
38
39 void IMB_dit0(struct ImBuf * ibuf, short ofs, short bits)
40 {
41         int x, y, and, add, pix;
42         uchar *rect;
43
44         rect= (uchar *)ibuf->rect;
45         rect +=ofs;
46
47         bits = 8 - bits;
48         and = ~((1 << bits)-1);
49         add = 1 << (bits - 1);
50         
51         for (y = ibuf->y; y > 0; y--){
52                 for (x = ibuf->x; x > 0; x--) {
53                         pix = *rect + add;
54                         if (pix > 255) pix = 255; 
55                         *rect = pix & and;
56                         rect += 4;
57                 }
58         }
59 }
60
61 void IMB_dit2(struct ImBuf * ibuf, short ofs, short bits)
62 {
63         short x,y,pix,and,add1,add2;
64         uchar *rect;
65         uchar dit[4];
66
67         rect= (uchar *)ibuf->rect;
68         rect +=ofs;
69
70         bits = 8 - bits;
71         and = ~((1<<bits)-1);
72         bits -= 2;
73
74         ofs = 0;
75         
76         switch(ofs){
77         case 3:
78                 break;
79         case 2:
80                 dit[0]=0;
81                 dit[1]=1;
82                 dit[2]=2;
83                 dit[3]=3;
84                 break;
85         case 1:
86                 dit[0]=3;
87                 dit[1]=1;
88                 dit[2]=0;
89                 dit[3]=2;
90                 break;
91         case 0:
92                 dit[0]=0;
93                 dit[1]=2;
94                 dit[2]=3;
95                 dit[3]=1;
96                 break;
97         }
98         
99         if (bits < 0){
100                 dit[0] >>= -bits;
101                 dit[1] >>= -bits;
102                 dit[2] >>= -bits;
103                 dit[3] >>= -bits;
104         } else{
105                 dit[0] <<= bits;
106                 dit[1] <<= bits;
107                 dit[2] <<= bits;
108                 dit[3] <<= bits;
109         }
110
111         for(y=ibuf->y;y>0;y--){
112                 if(y & 1){
113                         add1=dit[0];
114                         add2=dit[1];
115                 }
116                 else{
117                         add1=dit[2];
118                         add2=dit[3];
119                 }
120                 for(x=ibuf->x;x>0;x--){
121                         pix = *rect;
122                         if (x & 1) pix += add1;
123                         else pix += add2;
124
125                         if (pix>255) pix=255;
126                         *rect = pix & and;
127                         rect += 4;
128                 }
129         }
130 }