152 lines
4.0 KiB
Python
152 lines
4.0 KiB
Python
# 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()
|