OSDN Git Service

[リリース]NyARToolkit 1.0.0
[nyartoolkit-and/nyartoolkit-and.git] / sample / jmf / jp / nyatla / nyartoolkit / jmf / utils / JmfNyARRaster_RGB.java
1 /**\r
2  * RGB形式のJMFバッファをラップするNyARRasterです。\r
3  * JMFから得たラスタデータのピクセル並び順を考慮します。\r
4  * (c)2008 A虎@nyatla.jp\r
5  * airmail(at)ebony.plala.or.jp\r
6  * http://nyatla.jp/\r
7  */\r
8 package jp.nyatla.nyartoolkit.jmf.utils;\r
9 \r
10 \r
11 import javax.media.format.RGBFormat;\r
12 import java.awt.Dimension;\r
13 import jp.nyatla.nyartoolkit.NyARException;\r
14 import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
15 \r
16 \r
17 public class JmfNyARRaster_RGB implements NyARRaster\r
18 {\r
19     public final static int PIXEL_ORDER_RGB=1;\r
20     public final static int PIXEL_ORDER_BGR=2;\r
21     protected int pix_type;\r
22     private int red_idx;\r
23     private int green_idx;\r
24     private int blue_idx;\r
25     protected byte[] ref_buf;\r
26     protected int width=0;\r
27     protected int height=0;\r
28 \r
29     /**\r
30      * RGB形式のJMFバッファをラップするオブジェクトをつくります。\r
31      * 生成直後のオブジェクトはデータを持ちません。\r
32      * メンバ関数はsetBufferを実行後に使用可能になります。\r
33      */\r
34     public JmfNyARRaster_RGB(int i_width,int i_height)\r
35     {\r
36         ref_buf=null;\r
37         width=i_width;\r
38         height=i_height;\r
39     }\r
40     /**\r
41      * フォーマットを解析して、インスタンスのフォーマットプロパティを初期化します。\r
42      * \r
43      * @param i_buffer\r
44      * @throws NyARException\r
45      */\r
46     protected void initFormatProperty(RGBFormat i_fmt) throws NyARException\r
47     {\r
48         //データサイズの確認\r
49         Dimension s=i_fmt.getSize();\r
50         if(width!=s.width || height !=s.height){\r
51             throw new NyARException();\r
52         }\r
53         //データ配列の確認\r
54         red_idx  =i_fmt.getRedMask()-1;\r
55         green_idx=i_fmt.getGreenMask()-1;\r
56         blue_idx =i_fmt.getBlueMask()-1;\r
57         \r
58         //色配列の特定\r
59         if(red_idx==0 && blue_idx==2){\r
60             pix_type=PIXEL_ORDER_RGB;\r
61         }else if(red_idx==2 && blue_idx==0){\r
62             pix_type=PIXEL_ORDER_BGR;\r
63         }else{\r
64             throw new NyARException("Unknown pixel order.");\r
65         }       \r
66     }\r
67     /**\r
68      * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。\r
69      * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。\r
70      * @param i_buffer\r
71      * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。\r
72      * @return\r
73      * i_bufferをラップしたオブジェクトを返します。\r
74      * @throws NyARException\r
75      */\r
76     public void setBuffer(javax.media.Buffer i_buffer) throws NyARException\r
77     {\r
78         initFormatProperty((RGBFormat)i_buffer.getFormat());\r
79         ref_buf=(byte[])i_buffer.getData();\r
80     }\r
81     public int getPixelTotal(int i_x,int i_y)\r
82     {\r
83         int bp=(i_x+i_y*width)*3;\r
84         byte[] ref=this.ref_buf;\r
85         return (ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
86     }\r
87     public void getPixelTotalRowLine(int i_row,int[] o_line)\r
88     {\r
89         final byte[] ref=this.ref_buf;\r
90         int bp=(i_row+1)*this.width*3-3;\r
91         for(int i=this.width-1;i>=0;i--){\r
92             o_line[i]=(ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
93             bp-=3;\r
94         }\r
95     }    \r
96     public int getWidth()\r
97     {\r
98         return width;\r
99     }\r
100     public int getHeight()\r
101     {\r
102         return height;\r
103     }\r
104     public void getPixel(int i_x,int i_y,int[] i_rgb)\r
105     {\r
106         int bp=(i_x+i_y*this.width)*3;\r
107         byte[] ref=this.ref_buf;\r
108         i_rgb[0]=(ref[bp+this.red_idx] & 0xff);//R\r
109         i_rgb[1]=(ref[bp+this.green_idx] & 0xff);//G\r
110         i_rgb[2]=(ref[bp+this.blue_idx] & 0xff);//B\r
111     }\r
112     /**\r
113      * ピクセルの順序タイプを返します。\r
114      * @return\r
115      * その値\r
116      */\r
117     public int getPixelOrder()\r
118     {\r
119         return pix_type;\r
120     }\r
121     /**\r
122      * データを持っているかを返します。\r
123      * @return\r
124      */\r
125     public boolean hasData()\r
126     {\r
127         return ref_buf!=null;\r
128     }\r
129     public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb)\r
130     {\r
131         int ri=this.red_idx;\r
132         int bi=this.green_idx;\r
133         int gi=this.blue_idx;\r
134         int width=this.width;\r
135         byte[] ref=this.ref_buf;\r
136         int bp;\r
137         for(int i=i_num-1;i>=0;i--){\r
138             bp=(i_x[i]+i_y[i]*width)*3;\r
139             o_rgb[i*3+0]=(ref[bp+ri] & 0xff);//R\r
140             o_rgb[i*3+1]=(ref[bp+gi] & 0xff);//G\r
141             o_rgb[i*3+2]=(ref[bp+bi] & 0xff);//B\r
142         }       \r
143         return;\r
144     }\r
145 }\r