Initial revision
[blender.git] / source / blender / imbuf / intern / dither.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  * dither.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 void IMB_dit0(struct ImBuf * ibuf, short ofs, short bits)
43 {
44         int x, y, and, add, pix;
45         uchar *rect;
46
47         rect= (uchar *)ibuf->rect;
48         rect +=ofs;
49
50         bits = 8 - bits;
51         and = ~((1 << bits)-1);
52         add = 1 << (bits - 1);
53         
54         for (y = ibuf->y; y > 0; y--){
55                 for (x = ibuf->x; x > 0; x--) {
56                         pix = *rect + add;
57                         if (pix > 255) pix = 255; 
58                         *rect = pix & and;
59                         rect += 4;
60                 }
61         }
62 }
63
64 void IMB_dit2(struct ImBuf * ibuf, short ofs, short bits)
65 {
66         short x,y,pix,and,add1,add2;
67         uchar *rect;
68         uchar dit[4];
69
70         rect= (uchar *)ibuf->rect;
71         rect +=ofs;
72
73         bits = 8 - bits;
74         and = ~((1<<bits)-1);
75         bits -= 2;
76
77         ofs = 0;
78         
79         switch(ofs){
80         case 3:
81                 break;
82         case 2:
83                 dit[0]=0;
84                 dit[1]=1;
85                 dit[2]=2;
86                 dit[3]=3;
87                 break;
88         case 1:
89                 dit[0]=3;
90                 dit[1]=1;
91                 dit[2]=0;
92                 dit[3]=2;
93                 break;
94         case 0:
95                 dit[0]=0;
96                 dit[1]=2;
97                 dit[2]=3;
98                 dit[3]=1;
99                 break;
100         }
101         
102         if (bits < 0){
103                 dit[0] >>= -bits;
104                 dit[1] >>= -bits;
105                 dit[2] >>= -bits;
106                 dit[3] >>= -bits;
107         } else{
108                 dit[0] <<= bits;
109                 dit[1] <<= bits;
110                 dit[2] <<= bits;
111                 dit[3] <<= bits;
112         }
113
114         for(y=ibuf->y;y>0;y--){
115                 if(y & 1){
116                         add1=dit[0];
117                         add2=dit[1];
118                 }
119                 else{
120                         add1=dit[2];
121                         add2=dit[3];
122                 }
123                 for(x=ibuf->x;x>0;x--){
124                         pix = *rect;
125                         if (x & 1) pix += add1;
126                         else pix += add2;
127
128                         if (pix>255) pix=255;
129                         *rect = pix & and;
130                         rect += 4;
131                 }
132         }
133 }