// Copyright 2013 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/gfx/path_x11.h"

#include <X11/Xlib.h>
#include <X11/Xregion.h>
#include <X11/Xutil.h>

#include "base/memory/scoped_ptr.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/gfx/path.h"

namespace gfx {

Region CreateRegionFromSkRegion(const SkRegion& region) {
  Region result = XCreateRegion();

  for (SkRegion::Iterator i(region); !i.done(); i.next()) {
    XRectangle rect;
    rect.x = i.rect().x();
    rect.y = i.rect().y();
    rect.width = i.rect().width();
    rect.height = i.rect().height();
    XUnionRectWithRegion(&rect, result, result);
  }

  return result;
}

Region CreateRegionFromSkPath(const SkPath& path) {
  int point_count = path.getPoints(NULL, 0);
  scoped_ptr<SkPoint[]> points(new SkPoint[point_count]);
  path.getPoints(points.get(), point_count);
  scoped_ptr<XPoint[]> x11_points(new XPoint[point_count]);
  for (int i = 0; i < point_count; ++i) {
    x11_points[i].x = SkScalarRoundToInt(points[i].fX);
    x11_points[i].y = SkScalarRoundToInt(points[i].fY);
  }

  return XPolygonRegion(x11_points.get(), point_count, EvenOddRule);
}

}  // namespace gfx
