gradient.cc 2.8 KB
Newer Older
1 2 3 4
// Copyright 2015 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.

5
#include "flutter/lib/ui/painting/gradient.h"
6

7 8
#include "lib/tonic/dart_args.h"
#include "lib/tonic/dart_binding_macros.h"
9
#include "lib/tonic/converter/dart_converter.h"
10
#include "lib/tonic/dart_library_natives.h"
A
Adam Barth 已提交
11

12 13
namespace blink {

14 15
typedef CanvasGradient
    Gradient;  // Because the C++ name doesn't match the Dart name.
A
Adam Barth 已提交
16 17

static void Gradient_constructor(Dart_NativeArguments args) {
18
  DartCallConstructor(&CanvasGradient::Create, args);
A
Adam Barth 已提交
19 20
}

21
IMPLEMENT_WRAPPERTYPEINFO(ui, Gradient);
A
Adam Barth 已提交
22 23

#define FOR_EACH_BINDING(V) \
24
  V(Gradient, initLinear)   \
A
Adam Barth 已提交
25 26 27 28
  V(Gradient, initRadial)

FOR_EACH_BINDING(DART_NATIVE_CALLBACK)

29
void CanvasGradient::RegisterNatives(tonic::DartLibraryNatives* natives) {
30 31
  natives->Register({{"Gradient_constructor", Gradient_constructor, 1, true},
                     FOR_EACH_BINDING(DART_REGISTER_NATIVE)});
A
Adam Barth 已提交
32 33
}

34 35
ftl::RefPtr<CanvasGradient> CanvasGradient::Create() {
  return ftl::MakeRefCounted<CanvasGradient>();
M
Matt Perry 已提交
36 37
}

38 39 40
void CanvasGradient::initLinear(const tonic::Float32List& end_points,
                                const tonic::Int32List& colors,
                                const tonic::Float32List& color_stops,
41
                                SkShader::TileMode tile_mode) {
42 43 44
  FTL_DCHECK(end_points.num_elements() == 4);
  FTL_DCHECK(colors.num_elements() == color_stops.num_elements() ||
             color_stops.data() == nullptr);
45

46 47 48 49
  static_assert(sizeof(SkPoint) == sizeof(float) * 2,
                "SkPoint doesn't use floats.");
  static_assert(sizeof(SkColor) == sizeof(int32_t),
                "SkColor doesn't use int32_t.");
A
Adam Barth 已提交
50

A
Adam Barth 已提交
51
  set_shader(SkGradientShader::MakeLinear(
52
      reinterpret_cast<const SkPoint*>(end_points.data()),
53 54
      reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
      colors.num_elements(), tile_mode));
M
Matt Perry 已提交
55 56
}

57 58
void CanvasGradient::initRadial(double center_x,
                                double center_y,
M
Matt Perry 已提交
59
                                double radius,
60 61
                                const tonic::Int32List& colors,
                                const tonic::Float32List& color_stops,
62
                                SkShader::TileMode tile_mode) {
63
  FTL_DCHECK(colors.num_elements() == color_stops.num_elements() ||
64
             color_stops.data() == nullptr);
M
Matt Perry 已提交
65

66 67
  static_assert(sizeof(SkColor) == sizeof(int32_t),
                "SkColor doesn't use int32_t.");
A
Adam Barth 已提交
68

A
Adam Barth 已提交
69
  set_shader(SkGradientShader::MakeRadial(
70 71 72
      SkPoint::Make(center_x, center_y), radius,
      reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
      colors.num_elements(), tile_mode));
73 74
}

75
CanvasGradient::CanvasGradient() : Shader(nullptr) {}
76

77
CanvasGradient::~CanvasGradient() {}
78

M
Matt Perry 已提交
79
}  // namespace blink