1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/path_x11.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <X11/Xlib.h>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <X11/Xregion.h>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <X11/Xutil.h>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/skia/include/core/SkRegion.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/path.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace gfx {
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)Region CreateRegionFromSkRegion(const SkRegion& region) {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Region result = XCreateRegion();
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (SkRegion::Iterator i(region); !i.done(); i.next()) {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    XRectangle rect;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    rect.x = i.rect().x();
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    rect.y = i.rect().y();
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    rect.width = i.rect().width();
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    rect.height = i.rect().height();
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    XUnionRectWithRegion(&rect, result, result);
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return result;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRegion CreateRegionFromSkPath(const SkPath& path) {
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int point_count = path.getPoints(NULL, 0);
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SkPoint[]> points(new SkPoint[point_count]);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  path.getPoints(points.get(), point_count);
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<XPoint[]> x11_points(new XPoint[point_count]);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < point_count; ++i) {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    x11_points[i].x = SkScalarRoundToInt(points[i].fX);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    x11_points[i].y = SkScalarRoundToInt(points[i].fY);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return XPolygonRegion(x11_points.get(), point_count, EvenOddRule);
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace gfx
46