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