BlinkenLibJava v.0.1.1 (200...
Christian Heimke authored 13 years ago
|
3) * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
4) * a blinkenarea.org project
5) */
6)
7) package org.blinkenarea.BlinkenLib;
8)
9) import java.awt.*;
10) import org.blinkenarea.BlinkenLib.*;
11)
12) public class BlinkenFrame
13) {
14)
15) private static byte [] BlinkenProtoBlpMagic = {(byte)0xDE, (byte)0xAD, (byte)0xBE, (byte)0xEF};
16) private static byte [] BlinkenProtoEblpMagic = {(byte)0xFE, (byte)0xED, (byte)0xBE, (byte)0xEF};
17) private static byte [] BlinkenProtoMcufMagic = {(byte)0x23, (byte)0x54, (byte)0x26, (byte)0x66};
18)
19) private int height;
20) private int width;
21) private int channels;
22) private int maxval;
23) private int duration;
24) private byte[][] data;
25)
26) public BlinkenFrame( int height, int width, int channels, int maxval, int duration )
27) {
28) if( height < BlinkenConstants.BlinkenHeightMin ) height = BlinkenConstants.BlinkenHeightMin;
29) if( height > BlinkenConstants.BlinkenHeightMax ) height = BlinkenConstants.BlinkenHeightMax;
30) if( width < BlinkenConstants.BlinkenWidthMin ) width = BlinkenConstants.BlinkenWidthMin;
31) if( width > BlinkenConstants.BlinkenWidthMax ) width = BlinkenConstants.BlinkenWidthMax;
32) if( channels < BlinkenConstants.BlinkenChannelsMin ) channels = BlinkenConstants.BlinkenChannelsMin;
33) if( channels > BlinkenConstants.BlinkenChannelsMax ) channels = BlinkenConstants.BlinkenChannelsMax;
34) if( maxval < BlinkenConstants.BlinkenMaxvalMin ) maxval = BlinkenConstants.BlinkenMaxvalMin;
35) if( maxval > BlinkenConstants.BlinkenMaxvalMax ) maxval = BlinkenConstants.BlinkenMaxvalMax;
36) if( duration < BlinkenConstants.BlinkenDurationMin ) duration = BlinkenConstants.BlinkenDurationMin;
37) if( duration > BlinkenConstants.BlinkenDurationMax ) duration = BlinkenConstants.BlinkenDurationMax;
38)
39) this.height = height;
40) this.width = width;
41) this.channels = channels;
42) this.maxval = maxval;
43) this.duration = duration;
44) data = new byte[height][width * channels];
45) }
46)
47) public BlinkenFrame( BlinkenFrame frame )
48) {
49) int y, x, c, i;
50) height = frame.height;
51) width = frame.width;
52) channels = frame.channels;
53) maxval = frame.maxval;
54) duration = frame.duration;
55) data = new byte[height][width * channels];
56) for( y = 0; y < height; y++ )
57) for( x = 0, i = 0; x < width; x++ )
58) for( c = 0; c < channels; c++, i++ )
59) data[y][i] = frame.data[y][i];
60) }
61)
62) public void clear( )
63) {
64) int x, y, c, i;
65) for( y = 0; y < height; y++ )
66) for( x = 0, i = 0; x < width; x++ )
67) for( c = 0; c < channels; c++, i++ )
68) data[y][i] = 0;
69) }
70)
71) public int getHeight( )
72) {
73) return height;
74) }
75)
76) public int getWidth( )
77) {
78) return width;
79) }
80)
81) public int getChannels( )
82) {
83) return channels;
84) }
85)
86) public int getMaxval( )
87) {
88) return maxval;
89) }
90)
91) public int getDuration( )
92) {
93) return duration;
94) }
95)
96) public void setDuration( int duration )
97) {
98) if( duration < BlinkenConstants.BlinkenDurationMin ) duration = BlinkenConstants.BlinkenDurationMin;
99) if( duration > BlinkenConstants.BlinkenDurationMax ) duration = BlinkenConstants.BlinkenDurationMax;
100) this.duration = duration;
101) }
102)
103) public byte getPixel( int y, int x, int c )
104) {
105) if( y < 0 || y >= height ||
106) x < 0 || x >= width ||
107) c < 0 || c >= channels )
108) return 0;
109) return data[y][x * channels + c];
110) }
111)
112) public void setPixel( int y, int x, int c, byte val )
113) {
114) if( y < 0 || y >= height ||
115) x < 0 || x >= width ||
116) c < 0 || c >= channels )
117) return;
118) if( val > maxval )
119) val = (byte)maxval;
120) data[y][x * channels + c] = val;
121) }
122)
123) public Color getColor( int y, int x )
124) {
125) if( y < 0 || y >= height ||
126) x < 0 || x >= width ||
127) channels < 1 )
128) return new Color( 0, 0, 0 );
129) if( channels == 1 )
130) return new Color( (((int)data[y][x * 1 + 0] & 0xFF) * 255 + maxval / 2) / maxval,
131) (((int)data[y][x * 1 + 0] & 0xFF) * 255 + maxval / 2) / maxval,
132) (((int)data[y][x * 1 + 0] & 0xFF) * 255 + maxval / 2) / maxval );
133) if( channels == 2 )
134) return new Color( (((int)data[y][x * 2 + 0] & 0xFF) * 255 + maxval / 2) / maxval,
135) (((int)data[y][x * 2 + 1] & 0xFF) * 255 + maxval / 2) / maxval, 0 );
136) int i = x * channels;
137) return new Color( (((int)data[y][i + 0] & 0xFF) * 255 + maxval / 2) / maxval,
138) (((int)data[y][i + 1] & 0xFF) * 255 + maxval / 2) / maxval,
139) (((int)data[y][i + 2] & 0xFF) * 255 + maxval / 2) / maxval );
140) }
141)
142) public void setColor( int y, int x, Color color )
143) {
144) int alpha, alpha_, c;
145) if( y < 0 || y >= height ||
146) x < 0 || x >= width )
147) return;
148) int i = x * channels;
149) alpha = color.getAlpha( );
150) alpha_ = 255 - alpha;
151) if( channels >= 1 )
152) data[y][i + 0] = (byte)(( ((color.getRed( ) * maxval + 127) / 255) * alpha
153) + ((int)data[y][i + 0] & 0xFF) * alpha_
154) ) / 255);
155) if( channels >= 2 )
156) data[y][i + 1] = (byte)(( ((color.getGreen( ) * maxval + 127) / 255) * alpha
157) + ((int)data[y][i + 1] & 0xFF) * alpha_
158) ) / 255);
159) if( channels >= 3 )
160) data[y][i + 2] = (byte)(( ((color.getBlue( ) * maxval + 127) / 255) * alpha
161) + ((int)data[y][i + 2] & 0xFF) * alpha_
162) ) / 255);
163) for( c = 3; c < channels; c++ )
164) data[y][i + c] = (byte)(( 0
165) + ((int)data[y][i + c] & 0xFF) * alpha_
166) ) / 255);
167) }
168)
169) public void resize( int height, int width, int channels, int maxval )
170) {
171) byte[][] new_data;
172) int y, x, c, i;
173) int emptyY, emptyX, skipY, skipX, rangeY, rangeX, val, div;
174)
175) if( height < BlinkenConstants.BlinkenHeightMin ) height = BlinkenConstants.BlinkenHeightMin;
176) if( height > BlinkenConstants.BlinkenHeightMax ) height = BlinkenConstants.BlinkenHeightMax;
177) if( width < BlinkenConstants.BlinkenWidthMin ) width = BlinkenConstants.BlinkenWidthMin;
178) if( width > BlinkenConstants.BlinkenWidthMax ) width = BlinkenConstants.BlinkenWidthMax;
179) if( channels < BlinkenConstants.BlinkenChannelsMin ) channels = BlinkenConstants.BlinkenChannelsMin;
180) if( channels > BlinkenConstants.BlinkenChannelsMax ) channels = BlinkenConstants.BlinkenChannelsMax;
181) if( maxval < BlinkenConstants.BlinkenMaxvalMin ) maxval = BlinkenConstants.BlinkenMaxvalMin;
182) if( maxval > BlinkenConstants.BlinkenMaxvalMax ) maxval = BlinkenConstants.BlinkenMaxvalMax;
183)
184) if( height == this.height &&
185) width == this.width &&
186) channels == this.channels &&
187) maxval == this.maxval )
188) return;
189)
190) //allocate new data array
191) new_data = new byte[height][width * channels];
192) for( y = 0; y < height; y++ )
193) for( x = 0, i = 0; x < width; x++ )
194) for( c = 0; c < channels; c++, i++ )
195) new_data[y][i] = 0;
196)
197) //get number of pixels to skip / to leave empty in X and Y direction
198) if( height > this.height )
199) {
200) emptyY = (height - this.height) / 2;
201) skipY = 0;
202) rangeY = this.height;
203) }
204) else
205) {
206) emptyY = 0;
207) skipY = (this.height - height) / 2;
208) rangeY = height;
209) }
210) if( width > this.width )
211) {
212) emptyX = (width - this.width) / 2;
213) skipX = 0;
214) rangeX = this.width;
215) }
216) else
217) {
218) emptyX = 0;
219) skipX = (this.width - width) / 2;
220) rangeX = width;
221) }
222)
223) //resize frame with help of calculated parameters
224) for( y = 0; y < rangeY; y++ )
225) {
226) for( x = 0; x < rangeX; x++ )
227) {
228) int srcI = (skipX + x) * this.channels;
229) int destI = (emptyX + x) * channels;
230) if( channels >= this.channels ) //add channels: copy last channel into new channels
231) {
232) for( c = 0; c < this.channels; c++ )
233) new_data[emptyY + y][destI + c] = (byte)((((int)data[skipY + y][srcI + c] & 0xFF) * maxval + this.maxval / 2) / this.maxval);
234) for( ; c < channels; c++ )
|