3732c781d8b5845cef8dbe91bc49ca0a5f88eaa3
Christian Heimke BlinkenLibJava v.0.1.1 (200...

Christian Heimke authored 13 years ago

1) /* BlinkenLib
Christian Heimke BlinkenLibJava v.0.1.4 (200...

Christian Heimke authored 13 years ago

2)  * version 0.1.4 date 2009-11-21
3)  * Copyright (C) 2004-2009: Stefan Schuermans <stefan@schuermans.info>
Christian Heimke 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++ )
Christian Heimke BlinkenLibJava v.0.1.4 (200...

Christian Heimke authored 13 years ago

236) 	    new_data[emptyY + y][destI + c] = new_data[emptyY + y][destI + this.channels - 1];