masked_window_targeter.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/wm/core/masked_window_targeter.h"
6
7#include "ui/aura/window.h"
8#include "ui/gfx/path.h"
9
10namespace wm {
11
12MaskedWindowTargeter::MaskedWindowTargeter(aura::Window* masked_window)
13    : masked_window_(masked_window) {
14}
15
16MaskedWindowTargeter::~MaskedWindowTargeter() {}
17
18bool MaskedWindowTargeter::EventLocationInsideBounds(
19    aura::Window* window,
20    const ui::LocatedEvent& event) const {
21  if (window == masked_window_) {
22    gfx::Path mask;
23    if (!GetHitTestMask(window, &mask))
24      return WindowTargeter::EventLocationInsideBounds(window, event);
25
26    gfx::Size size = window->bounds().size();
27    SkRegion clip_region;
28    clip_region.setRect(0, 0, size.width(), size.height());
29
30    gfx::Point point = event.location();
31    if (window->parent())
32      aura::Window::ConvertPointToTarget(window->parent(), window, &point);
33
34    SkRegion mask_region;
35    return mask_region.setPath(mask, clip_region) &&
36           mask_region.contains(point.x(), point.y());
37  }
38
39  return WindowTargeter::EventLocationInsideBounds(window, event);
40}
41
42}  // namespace wm
43