/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.streams; import java.awt.AWTException; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.util.logging.Level; import java.util.logging.Logger; import webcamstudio.externals.ProcessRenderer; import webcamstudio.mixers.Frame; import webcamstudio.mixers.MasterFrameBuilder; import webcamstudio.mixers.MasterMixer; import webcamstudio.mixers.PreviewFrameBuilder; import webcamstudio.sources.effects.Effect; import webcamstudio.util.Screen; import webcamstudio.util.Tools; import webcamstudio.util.Tools.OS; /** * * @author patrick (modified by karl) */ public class SourceDesktop extends Stream { ProcessRenderer capture = null; Robot defaultCapture = null; Frame frame = null; boolean isPlaying = false; boolean stop = false; OS os = Tools.getOS(); long timeCode = 0; Rectangle area = null; BufferedImage lastPreview = null; protected String[] screenID = Screen.getSources(); protected String desktopN = "0"; protected int deskN = 0; protected int desktopX = 0; protected int desktopY = 0; protected int desktopW = 0; protected int desktopH = 0; protected int windowX = 0; protected int windowY = 0; protected int windowW = 0; protected int windowH = 0; protected String desktopXid = ""; protected String elementXid = ""; protected boolean singleWindow = false; public SourceDesktop() { super(); name = "Desktop"; rate = MasterMixer.getInstance().getRate(); desktopW = Screen.getWidth(screenID[0]); desktopH = Screen.getHeight(screenID[0]); windowX = Screen.getX(screenID[0]); windowY = Screen.getY(screenID[0]); windowW = Screen.getWidth(screenID[0]); windowH = Screen.getHeight(screenID[0]); } @Override public void pause() { isPaused = true; capture.pause(); } @Override public void read() { stop = false; isPlaying = true; rate = this.getRate(); lastPreview = new BufferedImage(captureWidth,captureHeight,BufferedImage.TYPE_INT_ARGB); if (getPreView()){ PreviewFrameBuilder.register(this); } else { MasterFrameBuilder.register(this); } if (os == OS.LINUX) { capture = new ProcessRenderer(this, ProcessRenderer.ACTION.CAPTURE, "desktop", comm); capture.read(); } else { try { defaultCapture = new Robot(); frame = new Frame(desktopW, desktopH, rate); frame.setID(uuid); area = new Rectangle(desktopX, desktopY, desktopW, desktopH); frame.setOutputFormat(x, y, width, height, opacity, volume); frame.setZOrder(zorder); } catch (AWTException ex) { Logger.getLogger(SourceDesktop.class.getName()).log(Level.SEVERE, null, ex); } } } @Override public void stop() { for (int fx = 0; fx < this.getEffects().size(); fx++) { Effect fxT = this.getEffects().get(fx); if (fxT.getName().endsWith("Stretch") || fxT.getName().endsWith("Crop")) { // do nothing. } else { fxT.resetFX(); } } stop = true; isPlaying = false; if (capture != null) { capture.stop(); capture = null; } if (this.getBackFF()){ this.setComm("FF"); } if (getPreView()){ PreviewFrameBuilder.unregister(this); } else { MasterFrameBuilder.unregister(this); } } @Override public boolean needSeek() { return needSeekCTRL=false; } @Override public Frame getFrame() { return nextFrame; } @Override public boolean isPlaying() { return isPlaying; } @Override public void setIsPlaying(boolean setIsPlaying) { isPlaying = setIsPlaying; } @Override public BufferedImage getPreview() { return lastPreview; } @Override public boolean hasAudio() { return false; } @Override public boolean hasVideo() { return true; } @Override public void readNext() { Frame f = null; if (capture != null) { f = capture.getFrame(); if (f != null) { BufferedImage img = f.getImage(); applyEffects(img); } if (f != null) { lastPreview = f.getImage(); } } else if (defaultCapture != null) { f.setImage(defaultCapture.createScreenCapture(area)); f.setOutputFormat(x, y, width, height, opacity, volume); f.setZOrder(zorder); applyEffects(f.getImage()); lastPreview = f.getImage(); } nextFrame=f; } @Override public void play() { isPaused = false; capture.play(); } public String getDesktopN() { return desktopN; } public void setDesktopN(String desktopN) { this.desktopN = desktopN; } public int getDeskN() { return deskN; } public void setDeskN(int desktopN) { this.deskN = desktopN; } public int getDesktopX() { return desktopX; } public String getDesktopXid() { return desktopXid; } public void setDesktopXid(String dXid) { this.desktopXid = dXid; } public String getElementXid() { return elementXid; } public void setElementXid(String eXid) { this.elementXid = eXid; } public boolean getSingleWindow() { return singleWindow; } public void setSingleWindow(boolean sWin) { this.singleWindow = sWin; } /** * @param desktopX the desktopX to set */ public void setDesktopX(int desktopX) { this.desktopX = desktopX; } /** * @return the desktopY */ public int getDesktopY() { return desktopY; } /** * @param desktopY the desktopY to set */ public void setDesktopY(int desktopY) { this.desktopY = desktopY; } public int getDesktopEndX(){ return desktopX + desktopW - 1; } public int getDesktopEndY(){ return desktopY + desktopH - 1; } /** * @return the desktopW */ public int getDesktopW() { return desktopW; } /** * @param desktopW the desktopW to set */ public void setDesktopW(int desktopW) { this.desktopW = desktopW; } /** * @return the desktopH */ public int getDesktopH() { return desktopH; } /** * @param desktopH the desktopH to set */ public void setDesktopH(int desktopH) { this.desktopH = desktopH; } public void setWindowX(int windowX) { this.windowX = windowX; } public int getWindowX() { return this.windowX; } /** * @param windowY */ public void setWindowY(int windowY) { this.windowY = windowY; } /** * @return the desktopY */ public int getWindowY() { return this.windowY; } public int getWindowEndX(){ return windowX + windowW - 1; } public int getWindowEndY(){ return windowY + windowH - 1; } /** * @return the desktopW */ public int getWindowW() { return windowW; } /** * @param windowW */ public void setWindowW(int windowW) { this.windowW = windowW; } /** * @return the desktopH */ public int getWindowH() { return windowH; } /** * @param windowH */ public void setWindowH(int windowH) { this.windowH = windowH; } }