// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/wm/core/masked_window_targeter.h"

#include "ui/aura/window.h"
#include "ui/gfx/path.h"

namespace wm {

MaskedWindowTargeter::MaskedWindowTargeter(aura::Window* masked_window)
    : masked_window_(masked_window) {
}

MaskedWindowTargeter::~MaskedWindowTargeter() {}

bool MaskedWindowTargeter::EventLocationInsideBounds(
    ui::EventTarget* target,
    const ui::LocatedEvent& event) const {
  aura::Window* window = static_cast<aura::Window*>(target);
  if (window == masked_window_) {
    gfx::Path mask;
    if (!GetHitTestMask(window, &mask))
      return WindowTargeter::EventLocationInsideBounds(window, event);

    gfx::Size size = window->bounds().size();
    SkRegion clip_region;
    clip_region.setRect(0, 0, size.width(), size.height());

    gfx::Point point = event.location();
    if (window->parent())
      aura::Window::ConvertPointToTarget(window->parent(), window, &point);

    SkRegion mask_region;
    return mask_region.setPath(mask, clip_region) &&
           mask_region.contains(point.x(), point.y());
  }

  return WindowTargeter::EventLocationInsideBounds(window, event);
}

}  // namespace wm
