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