b39aac59efe222c6fbe1f7d6df17e92d07d32e58
Christian Heimke BlinkenLibJava v.0.1.1 (200...

Christian Heimke authored 13 years ago

1) /* BlinkenLib
Stefan Schuermans removed version information...

Stefan Schuermans authored 13 years ago

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

Christian Heimke authored 13 years ago

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