package com.github.sarxos.webcam.ds.dummy;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.concurrent.atomic.AtomicBoolean;
import com.github.sarxos.webcam.WebcamDevice;
import com.github.sarxos.webcam.WebcamException;
import com.github.sarxos.webcam.WebcamResolution;
/**
* Just a dummy device to be used for test purpose.
*
* @author Bartosz Firyn (sarxos)
**/
public class WebcamDummyDevice implements WebcamDevice {
private final static Dimension[] DIMENSIONS = new Dimension[] {
WebcamResolution.QQVGA.getSize(),
WebcamResolution.QVGA.getSize(),
WebcamResolution.VGA.getSize(),
};
private AtomicBoolean open = new AtomicBoolean(false);
private Dimension resolution = DIMENSIONS[0];
private final String name;
public WebcamDummyDevice(int number) {
this.name = "Dummy Webcam " + number;
}
@Override
public String getName() {
return name;
}
@Override
public Dimension[] getResolutions() {
return DIMENSIONS;
}
@Override
public Dimension getResolution() {
return resolution;
}
@Override
public void setResolution(Dimension size) {
this.resolution = size;
}
byte r = (byte) (Math.random() * Byte.MAX_VALUE);
byte g = (byte) (Math.random() * Byte.MAX_VALUE);
byte b = (byte) (Math.random() * Byte.MAX_VALUE);
private void drawRect(Graphics2D g2, int w, int h) {
int rx = (int) (w * Math.random() / 1.5);
int ry = (int) (h * Math.random() / 1.5);
int rw = (int) (w * Math.random() / 1.5);
int rh = (int) (w * Math.random() / 1.5);
g2.setColor(new Color((int) (Integer.MAX_VALUE * Math.random())));
g2.fillRect(rx, ry, rw, rh);
}
@Override
public BufferedImage getImage() {
if (!isOpen()) {
throw new WebcamException("Webcam is not open");
}
try {
Thread.sleep(1000 / 30);
} catch (InterruptedException e) {
return null;
}
Dimension resolution = getResolution();
int w = resolution.width;
int h = resolution.height;
String s = getName();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage bi = gc.createCompatibleImage(w, h);
Graphics2D g2 = ge.createGraphics(bi);
g2.setBackground(new Color(Math.abs(r++), Math.abs(g++), Math.abs(b++)));
g2.clearRect(0, 0, w, h);
drawRect(g2, w, h);
drawRect(g2, w, h);
drawRect(g2, w, h);
drawRect(g2, w, h);
drawRect(g2, w, h);
Font font = new Font("sans-serif", Font.BOLD, 16);
g2.setFont(font);
FontMetrics metrics = g2.getFontMetrics(font);
int sw = (w - metrics.stringWidth(s)) / 2;
int sh = (h - metrics.getHeight()) / 2 + metrics.getHeight() / 2;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLACK);
g2.drawString(s, sw + 1, sh + 1);
g2.setColor(Color.WHITE);
g2.drawString(s, sw, sh);
g2.dispose();
bi.flush();
return bi;
}
@Override
public void open() {
if (open.compareAndSet(false, true)) {
// ...
}
}
@Override
public void close() {
if (open.compareAndSet(true, false)) {
// ...
}
}
@Override
public void dispose() {
close();
}
@Override
public boolean isOpen() {
return open.get();
}
}