2 * RGB形式のJMFバッファをラップするNyARRasterです。
\r
3 * JMFから得たラスタデータのピクセル並び順を考慮します。
\r
4 * (c)2008 A虎@nyatla.jp
\r
5 * airmail(at)ebony.plala.or.jp
\r
8 package jp.nyatla.nyartoolkit.jmf.utils;
\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
17 public class JmfNyARRaster_RGB implements NyARRaster
\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
30 * RGB形式のJMFバッファをラップするオブジェクトをつくります。
\r
31 * 生成直後のオブジェクトはデータを持ちません。
\r
32 * メンバ関数はsetBufferを実行後に使用可能になります。
\r
34 public JmfNyARRaster_RGB(int i_width,int i_height)
\r
41 * フォーマットを解析して、インスタンスのフォーマットプロパティを初期化します。
\r
44 * @throws NyARException
\r
46 protected void initFormatProperty(RGBFormat i_fmt) throws NyARException
\r
49 Dimension s=i_fmt.getSize();
\r
50 if(width!=s.width || height !=s.height){
\r
51 throw new NyARException();
\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
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
64 throw new NyARException("Unknown pixel order.");
\r
68 * javax.media.Bufferを分析して、その分析結果をNyARRasterに適合する形で保持します。
\r
69 * 関数実行後に外部でi_bufferの内容変更した場合には、再度setBuffer関数を呼び出してください。
\r
71 * RGB形式のデータを格納したjavax.media.Bufferオブジェクトを指定してください。
\r
73 * i_bufferをラップしたオブジェクトを返します。
\r
74 * @throws NyARException
\r
76 public void setBuffer(javax.media.Buffer i_buffer) throws NyARException
\r
78 initFormatProperty((RGBFormat)i_buffer.getFormat());
\r
79 ref_buf=(byte[])i_buffer.getData();
\r
81 public int getPixelTotal(int i_x,int i_y)
\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
87 public void getPixelTotalRowLine(int i_row,int[] o_line)
\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
96 public int getWidth()
\r
100 public int getHeight()
\r
104 public void getPixel(int i_x,int i_y,int[] i_rgb)
\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
117 public int getPixelOrder()
\r
125 public boolean hasData()
\r
127 return ref_buf!=null;
\r
129 public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb)
\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
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