gradient.cc 3.1 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
#include "lib/tonic/converter/dart_converter.h"
8 9 10
#include "lib/tonic/dart_args.h"
#include "lib/tonic/dart_binding_macros.h"
#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
fxl::RefPtr<CanvasGradient> CanvasGradient::Create() {
  return fxl::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
  FXL_DCHECK(end_points.num_elements() == 4);
  FXL_DCHECK(colors.num_elements() == color_stops.num_elements() ||
44
             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

51
  set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeLinear(
52
      reinterpret_cast<const SkPoint*>(end_points.data()),
53
      reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
54
      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 63
                                SkShader::TileMode tile_mode,
                                const tonic::Float64List& matrix4) {
64
  FXL_DCHECK(colors.num_elements() == color_stops.num_elements() ||
65
             color_stops.data() == nullptr);
M
Matt Perry 已提交
66

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

70 71 72 73 74 75
  SkMatrix sk_matrix;
  bool has_matrix = matrix4.data() != nullptr;
  if (has_matrix) {
    sk_matrix = ToSkMatrix(matrix4);
  }

76
  set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeRadial(
77 78
      SkPoint::Make(center_x, center_y), radius,
      reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
79
      colors.num_elements(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
80 81
}

82
CanvasGradient::CanvasGradient() = default;
83

84
CanvasGradient::~CanvasGradient() = default;
85

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