blob: 4a248a9c81468b3609c0bcf19f1e3323443a9d50 [file] [log] [blame]
# 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()