# Copyright 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Classes to do screen capture.""" import logging from PIL import Image from autotest_lib.client.cros.multimedia import image_generator def _unlevel(p): """Unlevel a color value from TV level back to PC level @param p: The color value in one character byte @return: The color value in integer in PC level """ # TV level: 16~236; PC level: 0~255 p = (p - 126) * 128 // 110 + 128 if p < 0: p = 0 elif p > 255: p = 255 return p class CommonChameleonScreenCapturer(object): """A class to capture the screen on Chameleon. Calling its member method capture() captures the screen. """ TAG = 'Chameleon' def __init__(self, chameleon_port): """Initializes the CommonChameleonScreenCapturer objects.""" self._chameleon_port = chameleon_port def capture(self): """Captures the screen. @return An Image object. """ logging.info('Capturing the screen on Chameleon...') image = self._chameleon_port.capture_screen() # unleveling from TV level [16, 235] pmin, pmax = image_generator.ImageGenerator.get_extrema(image) if pmin > 10 and pmax < 240: logging.info(' (TV level: %d %d)', pmin, pmax) image = Image.eval(image, _unlevel) return image class VgaChameleonScreenCapturer(object): """A class to capture the screen on a VGA port of Chameleon. Calling its member method capture() captures the screen. """ TAG = 'Chameleon' def __init__(self, chameleon_port): """Initializes the VgaChameleonScreenCapturer objects.""" self._chameleon_port = chameleon_port def capture(self): """Captures the screen. @return An Image object. """ logging.info('Capturing the screen on a VGA port of Chameleon...') image = self._chameleon_port.capture_screen() # Find the box containing white points on its boundary. boundary = image.convert('L').point( lambda x: 255 if x >= 220 else 0).getbbox() logging.info('Boundary: %r', boundary) image = image.crop(boundary) return image class CrosExternalScreenCapturer(object): """A class to capture the external screen on Chrome OS. Calling its member method capture() captures the screen. """ TAG = 'CrOS-Ext' def __init__(self, display_facade): """Initializes the CrosExternalScreenCapturer objects.""" self._display_facade = display_facade def capture(self): """Captures the screen. @return An Image object. """ logging.info('Capturing the external screen on CrOS...') return self._display_facade.capture_external_screen() class CrosInternalScreenCapturer(object): """A class to capture the internal screen on Chrome OS. Calling its member method capture() captures the screen. """ TAG = 'CrOS-Int' def __init__(self, display_facade): """Initializes the CrosInternalScreenCapturer objects.""" self._display_facade = display_facade def capture(self): """Captures the screen. @return An Image object. """ logging.info('Capturing the internal screen on CrOS...') return self._display_facade.capture_internal_screen() class CrosCalibrationImageCapturer(object): """A class to capture the calibration image on Chrome OS. Calling its member method capture() captures the image. """ TAG = 'Calibration' def __init__(self, display_facade): """Initializes the CrosCalibrationImageCapturer objects.""" self._display_facade = display_facade def capture(self): """Captures the screen. @return An Image object. """ logging.info('Capturing the calibration image on CrOS...') return self._display_facade.capture_calibration_image()