< prev index next >
src/java.desktop/share/classes/java/awt/Robot.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 25,34 ****
--- 25,36 ----
package java.awt;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
+ import java.awt.geom.AffineTransform;
+ import java.awt.image.BaseMultiResolutionImage;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
*** 388,397 ****
--- 390,404 ----
* @param x X position of pixel
* @param y Y position of pixel
* @return Color of the pixel
*/
public synchronized Color getPixelColor(int x, int y) {
+ AffineTransform tx = GraphicsEnvironment.
+ getLocalGraphicsEnvironment().getDefaultScreenDevice().
+ getDefaultConfiguration().getDefaultTransform();
+ x = (int) (x * tx.getScaleX());
+ y = (int) (y * tx.getScaleY());
Color color = new Color(peer.getRGBPixel(x, y));
return color;
}
/**
*** 403,417 ****
* @throws SecurityException if {@code readDisplayPixels} permission is not granted
* @see SecurityManager#checkPermission
* @see AWTPermission
*/
public synchronized BufferedImage createScreenCapture(Rectangle screenRect) {
checkScreenCaptureAllowed();
checkValidRect(screenRect);
! BufferedImage image;
DataBufferInt buffer;
WritableRaster raster;
if (screenCapCM == null) {
/*
--- 410,445 ----
* @throws SecurityException if {@code readDisplayPixels} permission is not granted
* @see SecurityManager#checkPermission
* @see AWTPermission
*/
public synchronized BufferedImage createScreenCapture(Rectangle screenRect) {
+ return (BufferedImage) createScreenCapture(screenRect, false);
+ }
+
+ /**
+ * Creates an image containing pixels read from the screen.
+ * This image does not include the mouse cursor.
+ * Returns BufferedImage for Non-HiDPI display and
+ * MultiResolutionImage for HiDPI display with two resolution variants,
+ * Base Image with user specified size and
+ * High Resolution Image with original size.
+ * @param screenRect Rect to capture in screen coordinates
+ * @param isHiDPI Indicates if HiDPI Display
+ * @return The captured image
+ * @throws IllegalArgumentException if {@code screenRect} width and height are not greater than zero
+ * @throws SecurityException if {@code readDisplayPixels} permission is not granted
+ * @see SecurityManager#checkPermission
+ * @see AWTPermission
+ */
+
+ public synchronized Image createScreenCapture(Rectangle screenRect, boolean isHiDPI) {
checkScreenCaptureAllowed();
checkValidRect(screenRect);
! BufferedImage lowResolutionImage;
! BufferedImage highResolutionImage;
DataBufferInt buffer;
WritableRaster raster;
if (screenCapCM == null) {
/*
*** 424,453 ****
/* red mask */ 0x00FF0000,
/* green mask */ 0x0000FF00,
/* blue mask */ 0x000000FF);
}
// need to sync the toolkit prior to grabbing the pixels since in some
// cases rendering to the screen may be delayed
Toolkit.getDefaultToolkit().sync();
!
int pixels[];
- int[] bandmasks = new int[3];
pixels = peer.getRGBPixels(screenRect);
buffer = new DataBufferInt(pixels, pixels.length);
bandmasks[0] = screenCapCM.getRedMask();
bandmasks[1] = screenCapCM.getGreenMask();
bandmasks[2] = screenCapCM.getBlueMask();
! raster = Raster.createPackedRaster(buffer, screenRect.width, screenRect.height, screenRect.width, bandmasks, null);
SunWritableRaster.makeTrackable(buffer);
! image = new BufferedImage(screenCapCM, raster, false, null);
! return image;
}
private static void checkValidRect(Rectangle rect) {
if (rect.width <= 0 || rect.height <= 0) {
throw new IllegalArgumentException("Rectangle width and height must be > 0");
--- 452,539 ----
/* red mask */ 0x00FF0000,
/* green mask */ 0x0000FF00,
/* blue mask */ 0x000000FF);
}
+ int[] bandmasks = new int[3];
+ bandmasks[0] = screenCapCM.getRedMask();
+ bandmasks[1] = screenCapCM.getGreenMask();
+ bandmasks[2] = screenCapCM.getBlueMask();
+
// need to sync the toolkit prior to grabbing the pixels since in some
// cases rendering to the screen may be delayed
Toolkit.getDefaultToolkit().sync();
! AffineTransform tx = GraphicsEnvironment.
! getLocalGraphicsEnvironment().getDefaultScreenDevice().
! getDefaultConfiguration().getDefaultTransform();
! double uiScaleX = tx.getScaleX();
! double uiScaleY = tx.getScaleY();
int pixels[];
+ if (uiScaleX == 1 && uiScaleY == 1) {
pixels = peer.getRGBPixels(screenRect);
buffer = new DataBufferInt(pixels, pixels.length);
bandmasks[0] = screenCapCM.getRedMask();
bandmasks[1] = screenCapCM.getGreenMask();
bandmasks[2] = screenCapCM.getBlueMask();
! raster = Raster.createPackedRaster(buffer, screenRect.width,
! screenRect.height, screenRect.width, bandmasks, null);
SunWritableRaster.makeTrackable(buffer);
! return new BufferedImage(screenCapCM, raster, false, null);
!
! } else {
!
! int x = screenRect.x;
! int y = screenRect.y;
! int width = screenRect.width;
! int height = screenRect.height;
! int pminx = (int) Math.floor(x * uiScaleX);
! int pminy = (int) Math.floor(y * uiScaleY);
! int pmaxx = (int) Math.ceil((x + width) * uiScaleX);
! int pmaxy = (int) Math.ceil((y + height) * uiScaleY);
! int pwidth = pmaxx - pminx;
! int pheight = pmaxy - pminy;
! int temppixels[];
! Rectangle scaledRect = new Rectangle(pminx, pminy, pwidth, pheight);
! temppixels = peer.getRGBPixels(scaledRect);
! // HighResolutionImage
! pixels = temppixels;
! buffer = new DataBufferInt(pixels, pixels.length);
! raster = Raster.createPackedRaster(buffer, scaledRect.width,
! scaledRect.height, scaledRect.width, bandmasks, null);
! SunWritableRaster.makeTrackable(buffer);
!
! highResolutionImage = new BufferedImage(screenCapCM, raster,
! false, null);
!
! // LowResolutionImage
! lowResolutionImage = new BufferedImage(screenRect.width,
! screenRect.height, highResolutionImage.getType());
! Graphics2D g = lowResolutionImage.createGraphics();
! g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
! RenderingHints.VALUE_INTERPOLATION_BILINEAR);
! g.setRenderingHint(RenderingHints.KEY_RENDERING,
! RenderingHints.VALUE_RENDER_QUALITY);
! g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
! RenderingHints.VALUE_ANTIALIAS_ON);
! g.drawImage(highResolutionImage, 0, 0,
! screenRect.width, screenRect.height,
! 0, 0, scaledRect.width, scaledRect.height, null);
! g.dispose();
!
! if (!isHiDPI) {
! return lowResolutionImage;
! } else {
! // MultiResoltuionImage
! return new BaseMultiResolutionImage(
! lowResolutionImage, highResolutionImage);
! }
! }
}
private static void checkValidRect(Rectangle rect) {
if (rect.width <= 0 || rect.height <= 0) {
throw new IllegalArgumentException("Rectangle width and height must be > 0");
< prev index next >