OSDN Git Service

[backup]NyARToolkit
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / rasterfilter / rgb2gs / NyARRasterFilter_Rgb2Gs_AveAdd.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java edition ARToolKit class library.\r
11  * Copyright (C)2008-2009 Ryo Iizuka\r
12  *\r
13  * This program is free software: you can redistribute it and/or modify\r
14  * it under the terms of the GNU General Public License as published by\r
15  * the Free Software Foundation, either version 3 of the License, or\r
16  * (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  *\r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
25  * \r
26  * For further information please contact.\r
27  *      http://nyatla.jp/nyatoolkit/\r
28  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
29  * \r
30  */\r
31 package jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs;\r
32 \r
33 import jp.nyatla.nyartoolkit.NyARException;\r
34 import jp.nyatla.nyartoolkit.core.raster.*;\r
35 import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;\r
36 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
37 \r
38 /**\r
39  * RGBラスタをGrayScaleに変換するフィルタを作成します。\r
40  * このフィルタは、RGB値の平均値を、(R+G+B)/3で算出します。\r
41  *\r
42  */\r
43 public class NyARRasterFilter_Rgb2Gs_AveAdd implements INyARRasterFilter_Rgb2Gs\r
44 {\r
45         IdoThFilterImpl _do_filter_impl;\r
46         public NyARRasterFilter_Rgb2Gs_AveAdd(int i_in_raster_type,int i_out_raster_type) throws NyARException\r
47         {\r
48                 if(!initInstance(i_in_raster_type,i_out_raster_type))\r
49                 {\r
50                         throw new NyARException();\r
51                 }\r
52         }\r
53         public NyARRasterFilter_Rgb2Gs_AveAdd(int i_in_raster_type) throws NyARException\r
54         {\r
55                 if(!initInstance(i_in_raster_type,NyARBufferType.INT1D_GRAY_8))\r
56                 {\r
57                         throw new NyARException();\r
58                 }\r
59         }\r
60         protected boolean initInstance(int i_in_raster_type,int i_out_raster_type)\r
61         {\r
62                 switch(i_out_raster_type){\r
63                 case NyARBufferType.INT1D_GRAY_8:\r
64                         switch (i_in_raster_type){\r
65                         case NyARBufferType.BYTE1D_B8G8R8_24:\r
66                         case NyARBufferType.BYTE1D_R8G8B8_24:\r
67                                 this._do_filter_impl=new doThFilterImpl_BYTE1D_B8G8R8_24();\r
68                                 break;\r
69                         case NyARBufferType.BYTE1D_B8G8R8X8_32:\r
70                                 this._do_filter_impl=new doThFilterImpl_BYTE1D_B8G8R8X8_32();\r
71                                 break;\r
72                         default:\r
73                                 return false;\r
74                         }\r
75                         break;\r
76                 default:\r
77                         return false;\r
78                 }\r
79                 return true;\r
80         }\r
81         \r
82         public void doFilter(INyARRgbRaster i_input, NyARGrayscaleRaster i_output) throws NyARException\r
83         {\r
84                 assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
85                 this._do_filter_impl.doFilter(i_input,i_output,i_input.getSize());\r
86                 return;\r
87         }\r
88         \r
89         /*\r
90          * ここから各種ラスタ向けのフィルタ実装\r
91          *\r
92          */\r
93         interface IdoThFilterImpl\r
94         {\r
95                 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size);\r
96         }\r
97         class doThFilterImpl_BYTE1D_B8G8R8_24 implements IdoThFilterImpl\r
98         {\r
99                 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size)\r
100                 {\r
101                         assert(i_output.isEqualBufferType(NyARBufferType.INT1D_GRAY_8));\r
102                         int[] out_buf = (int[]) i_output.getBuffer();\r
103                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
104                         \r
105                         int bp = 0;\r
106                         for (int y = 0; y < i_size.h; y++) {\r
107                                 for (int x = 0; x < i_size.w; x++) {\r
108                                         out_buf[y*i_size.w+x] = ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff)) / 3;\r
109                                         bp += 3;\r
110                                 }\r
111                         }\r
112                         return;\r
113                 }               \r
114         }\r
115         class doThFilterImpl_BYTE1D_B8G8R8X8_32 implements IdoThFilterImpl\r
116         {\r
117                 public void doFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size)\r
118                 {\r
119                         assert(i_output.isEqualBufferType(NyARBufferType.INT1D_GRAY_8));\r
120                         int[] out_buf = (int[]) i_output.getBuffer();\r
121                         byte[] in_buf = (byte[]) i_input.getBuffer();\r
122 \r
123                         int bp = 0;\r
124                         for (int y = 0; y < i_size.h; y++) {\r
125                                 for (int x = 0; x < i_size.w; x++) {\r
126                                         out_buf[y*i_size.w+x] = ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff)) / 3;\r
127                                         bp += 4;\r
128                                 }\r
129                         }\r
130                 }\r
131         }\r
132         \r
133         \r
134         \r
135 }\r
136 \r
137 \r
138 \r
139 \r
140 \r
141 \r