Skip to content

Commit 8fdef00

Browse files
authored
Merge pull request #3 from Brookoko/raster-to-frame
Render raster to window
2 parents ac0d141 + 62387d8 commit 8fdef00

7 files changed

Lines changed: 327 additions & 19 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package labs.introtoprogramming.lab5.graphics;
2+
3+
import java.awt.Color;
4+
import java.awt.Image;
5+
import java.awt.image.BufferedImage;
6+
7+
public class ArrayRaster implements Raster {
8+
9+
private final int width;
10+
private final int height;
11+
12+
private byte[][] red;
13+
private byte[][] green;
14+
private byte[][] blue;
15+
16+
public ArrayRaster(int width, int height) {
17+
this.width = width;
18+
this.height = height;
19+
this.red = new byte[width][height];
20+
this.green = new byte[width][height];
21+
this.blue = new byte[width][height];
22+
}
23+
24+
public Image toImage() {
25+
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
26+
for (int x = 0; x < width; x++) {
27+
for (int y = 0; y < height; y++) {
28+
image.setRGB(x, y, getPixelRGB(x, y));
29+
}
30+
}
31+
return image;
32+
}
33+
34+
public void setPixel(int x, int y, int rgb) {
35+
this.red[x][y] = (byte) ((rgb >> 16) & 0xFF);
36+
this.green[x][y] = (byte) ((rgb >> 8) & 0xFF);
37+
this.blue[x][y] = (byte) (rgb & 0xFF);
38+
}
39+
40+
public void setPixel(int x, int y, byte red, byte green, byte blue) {
41+
this.red[x][y] = red;
42+
this.green[x][y] = green;
43+
this.blue[x][y] = blue;
44+
}
45+
46+
public Color getPixelColor(int x, int y) {
47+
return new Color(red[x][y] & 255, green[x][y] & 255, blue[x][y] & 255);
48+
}
49+
50+
public int getPixelRGB(int x, int y) {
51+
return 0xFF << 24 | ((red[x][y] & 0xFF) << 16) | ((green[x][y] & 0xFF) << 8) | (blue[x][y] & 0xFF);
52+
}
53+
54+
public int getWidth() {
55+
return width;
56+
}
57+
58+
public int getHeight() {
59+
return height;
60+
}
61+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package labs.introtoprogramming.lab5.graphics;
2+
3+
import java.awt.Color;
4+
import java.awt.GraphicsEnvironment;
5+
import java.awt.Image;
6+
import java.awt.image.BufferedImage;
7+
8+
public class BufferedImageRaster implements Raster {
9+
10+
private final BufferedImage image;
11+
12+
public BufferedImageRaster(int width, int height) {
13+
// Image Data Model compatible with default screen device to avoid any conversions while rendering
14+
if (!GraphicsEnvironment.isHeadless()) {
15+
image = GraphicsEnvironment.getLocalGraphicsEnvironment()
16+
.getDefaultScreenDevice()
17+
.getDefaultConfiguration().createCompatibleImage(width, height);
18+
} else {
19+
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
20+
}
21+
}
22+
23+
@Override
24+
public Image toImage() {
25+
return image;
26+
}
27+
28+
@Override
29+
public void setPixel(int x, int y, int rgb) {
30+
image.setRGB(x, y, rgb);
31+
}
32+
33+
@Override
34+
public void setPixel(int x, int y, byte red, byte green, byte blue) {
35+
image.setRGB(x, y, 0xFF << 24 | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF));
36+
}
37+
38+
@Override
39+
public Color getPixelColor(int x, int y) {
40+
return new Color(image.getRGB(x, y));
41+
}
42+
43+
@Override
44+
public int getPixelRGB(int x, int y) {
45+
return image.getRGB(x, y);
46+
}
47+
48+
@Override
49+
public int getWidth() {
50+
return image.getWidth();
51+
}
52+
53+
@Override
54+
public int getHeight() {
55+
return image.getHeight();
56+
}
57+
}
Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
package labs.introtoprogramming.lab5.graphics;
22

3-
public class Raster {
3+
import java.awt.Color;
4+
import java.awt.Image;
45

5-
private final int width;
6-
private final int height;
6+
public interface Raster {
77

8-
private byte[][] red;
9-
private byte[][] green;
10-
private byte[][] blue;
8+
Image toImage();
119

12-
public Raster(int width, int height) {
13-
this.width = width;
14-
this.height = height;
15-
this.red = new byte[width][height];
16-
this.green = new byte[width][height];
17-
this.blue = new byte[width][height];
18-
}
10+
void setPixel(int x, int y, int rgb);
11+
void setPixel(int x, int y, byte red, byte green, byte blue);
1912

20-
public void setPixel(int x, int y, byte red, byte green, byte blue) {
21-
this.red[x][y] = red;
22-
this.green[x][y] = green;
23-
this.blue[x][y] = blue;
24-
}
25-
}
13+
Color getPixelColor(int x, int y);
14+
int getPixelRGB(int x, int y);
15+
16+
int getWidth();
17+
int getHeight();
18+
19+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package labs.introtoprogramming.lab5.gui;
2+
3+
import java.awt.Canvas;
4+
import java.awt.Graphics;
5+
import labs.introtoprogramming.lab5.graphics.Raster;
6+
7+
public class RasterRendererComponent extends Canvas {
8+
9+
private Raster raster;
10+
11+
private int framesRendered = 0;
12+
13+
@Override
14+
public void update(Graphics g) {
15+
g.drawImage(raster.toImage(), 0, 0, this);
16+
framesRendered++;
17+
}
18+
19+
void setRaster(Raster raster) {
20+
this.raster = raster;
21+
}
22+
23+
int getFramesRendered() {
24+
return framesRendered;
25+
}
26+
27+
void resetFramesRendered() {
28+
this.framesRendered = 0;
29+
}
30+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package labs.introtoprogramming.lab5.gui;
2+
3+
import java.awt.Toolkit;
4+
import javax.swing.JFrame;
5+
import labs.introtoprogramming.lab5.graphics.Raster;
6+
7+
public class Window {
8+
9+
private static final int FPS_UPDATE_RATE = 100;
10+
11+
private JFrame frame;
12+
private RasterRendererComponent renderer;
13+
private Toolkit toolkit;
14+
private String title;
15+
16+
private boolean displayFPS = false;
17+
private long prevFPSTimestamp = -1;
18+
19+
public Window() {
20+
System.setProperty("sun.java2d.opengl", "true");
21+
22+
this.toolkit = Toolkit.getDefaultToolkit();
23+
24+
this.frame = new JFrame();
25+
this.frame.setLayout(null);
26+
this.frame.setResizable(false);
27+
28+
this.renderer = new RasterRendererComponent();
29+
this.frame.add(renderer);
30+
31+
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
32+
}
33+
34+
private void updateFPSCounter() {
35+
if (displayFPS && renderer.getFramesRendered() >= FPS_UPDATE_RATE) {
36+
long currentTime = System.currentTimeMillis();
37+
if (prevFPSTimestamp != -1) {
38+
double fps = Math.round(1000.0 / ((double) (currentTime - prevFPSTimestamp) / renderer.getFramesRendered()));
39+
frame.setTitle(title + " " + ((int) fps) + "FPS");
40+
}
41+
prevFPSTimestamp = currentTime;
42+
renderer.resetFramesRendered();
43+
}
44+
}
45+
46+
public void update() {
47+
renderer.repaint();
48+
toolkit.sync();
49+
50+
updateFPSCounter();
51+
}
52+
53+
public void show() {
54+
frame.setVisible(true);
55+
}
56+
57+
public void setDimensions(int width, int height) {
58+
// Centered on the screen
59+
frame.setBounds(getScreenWidth() / 2 - width / 2, getScreenHeight() / 2 - height / 2, width, height);
60+
renderer.setBounds(0, 0, width, height);
61+
}
62+
63+
private int getScreenWidth() {
64+
return toolkit.getScreenSize().width;
65+
}
66+
67+
private int getScreenHeight() {
68+
return toolkit.getScreenSize().height;
69+
}
70+
71+
public void setTitle(String text) {
72+
this.title = text;
73+
frame.setTitle(text);
74+
}
75+
76+
public void setRaster(Raster raster) {
77+
this.renderer.setRaster(raster);
78+
}
79+
80+
public void setDisplayFPS(boolean displayFPS) {
81+
this.displayFPS = displayFPS;
82+
}
83+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package labs.introtoprogramming.lab5.graphics;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.awt.Color;
6+
import java.awt.image.BufferedImage;
7+
import org.junit.Test;
8+
9+
public class ArrayRasterTests {
10+
11+
@Test
12+
public void testSetPixelRGB() {
13+
Raster raster = new ArrayRaster(100, 100);
14+
raster.setPixel(0, 0, 42);
15+
assertEquals(42, raster.getPixelRGB(0, 0) & 0xFFFFFF);
16+
}
17+
18+
@Test
19+
public void testSetPixel() {
20+
Raster raster = new ArrayRaster(100, 100);
21+
raster.setPixel(1, 2, (byte) 1, (byte) 2, (byte) 3);
22+
assertEquals(new Color(1, 2, 3).getRGB(), raster.getPixelRGB(1, 2));
23+
}
24+
25+
@Test
26+
public void testGetPixelColor() {
27+
Raster raster = new ArrayRaster(100, 100);
28+
raster.setPixel(1, 2, (byte) 255, (byte) 0, (byte) 0);
29+
assertEquals(Color.RED, raster.getPixelColor(1, 2));
30+
}
31+
32+
@Test
33+
public void testToImage() {
34+
Raster raster = new ArrayRaster(2, 2);
35+
raster.setPixel(1, 1, Color.RED.getRGB());
36+
assertEquals(Color.RED.getRGB(), ((BufferedImage) raster.toImage()).getRGB(1, 1));
37+
}
38+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package labs.introtoprogramming.lab5.graphics;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.awt.Color;
6+
import java.awt.image.BufferedImage;
7+
import org.junit.Test;
8+
9+
public class BufferedImageRasterTests {
10+
11+
@Test
12+
public void testGetDimensions() {
13+
Raster raster = new BufferedImageRaster(101, 102);
14+
assertEquals(101, raster.getWidth());
15+
assertEquals(102, raster.getHeight());
16+
}
17+
18+
@Test
19+
public void testSetPixelRGB() {
20+
Raster raster = new BufferedImageRaster(100, 100);
21+
raster.setPixel(0, 0, 42);
22+
assertEquals(42, raster.getPixelRGB(0, 0) & 0xFFFFFF);
23+
}
24+
25+
@Test
26+
public void testSetPixel() {
27+
Raster raster = new BufferedImageRaster(100, 100);
28+
raster.setPixel(1, 2, (byte) 1, (byte) 2, (byte) 3);
29+
assertEquals(new Color(1, 2, 3).getRGB(), raster.getPixelRGB(1, 2));
30+
}
31+
32+
@Test
33+
public void testGetPixelColor() {
34+
Raster raster = new BufferedImageRaster(100, 100);
35+
raster.setPixel(1, 2, (byte) 255, (byte) 0, (byte) 0);
36+
assertEquals(Color.RED, raster.getPixelColor(1, 2));
37+
}
38+
39+
@Test
40+
public void testToImage() {
41+
Raster raster = new BufferedImageRaster(2, 2);
42+
raster.setPixel(1, 1, Color.RED.getRGB());
43+
assertEquals(Color.RED.getRGB(), ((BufferedImage) raster.toImage()).getRGB(1, 1));
44+
}
45+
}

0 commit comments

Comments
 (0)