15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gdk/gdk.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GdkRegion* Path::CreateNativeRegion() const {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int point_count = getPoints(NULL, 0);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (point_count <= 1) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: ideally this would return gdk_empty_region, but that returns a
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // region with nothing in it.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SkPoint[]> points(new SkPoint[point_count]);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getPoints(points.get(), point_count);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GdkPoint[]> gdk_points(new GdkPoint[point_count]);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < point_count; ++i) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gdk_points[i].x = SkScalarRound(points[i].fX);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gdk_points[i].y = SkScalarRound(points[i].fY);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gdk_region_polygon(gdk_points.get(), point_count, GDK_EVEN_ODD_RULE);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeRegion Path::IntersectRegions(NativeRegion r1, NativeRegion r2) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkRegion* copy = gdk_region_copy(r1);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gdk_region_intersect(copy, r2);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeRegion Path::CombineRegions(NativeRegion r1, NativeRegion r2) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkRegion* copy = gdk_region_copy(r1);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gdk_region_union(copy, r2);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeRegion Path::SubtractRegion(NativeRegion r1, NativeRegion r2) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkRegion* copy = gdk_region_copy(r1);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gdk_region_subtract(copy, r2);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
56