# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//cobalt/renderer/rasterizer/skia/skia/skia_next.gni")

static_library("common") {
  visibility = [ ":*" ]

  sources = [
    "cobalt_skia_type_conversions.cc",
    "cobalt_skia_type_conversions.h",
    "font.cc",
    "font.h",
    "glyph_buffer.cc",
    "glyph_buffer.h",
    "harfbuzz_font.cc",
    "harfbuzz_font.h",
    "image.cc",
    "image.h",
    "render_tree_node_visitor.cc",
    "render_tree_node_visitor.h",
    "scratch_surface_cache.cc",
    "scratch_surface_cache.h",
    "skottie_animation.cc",
    "skottie_animation.h",
    "software_image.h",
    "text_shaper.cc",
    "text_shaper.h",
    "typeface.cc",
    "typeface.h",
  ]

  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]

  if (use_skia_next) {
    include_dirs = [ skia_include_dir ]
  }

  public_deps = [
    "//base",
    "//cobalt/base",
    "//cobalt/math",
    "//cobalt/render_tree",
    "//cobalt/renderer/rasterizer/skia/skia",
    "//third_party/harfbuzz-ng",
    "//third_party/icu:icuuc",
    "//third_party/ots",
  ]

  deps = [
    "//base:i18n",
    "//cobalt/renderer/backend:renderer_backend",
    "//cobalt/renderer/rasterizer/common",
  ]
}

static_library("hardware_rasterizer") {
  sources = [
    "gl_format_conversions.cc",
    "hardware_image.cc",
    "hardware_image.h",
    "hardware_mesh.cc",
    "hardware_mesh.h",
    "hardware_rasterizer.cc",
    "hardware_rasterizer.h",
    "hardware_resource_provider.cc",
    "hardware_resource_provider.h",
    "vertex_buffer_object.cc",
    "vertex_buffer_object.h",
  ]

  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]

  if (use_skia_next) {
    include_dirs = [ skia_include_dir ]
  }

  deps = [
    ":common",
    "//cobalt/renderer:renderer_headers_only",
    "//cobalt/renderer/backend:renderer_backend",
    "//cobalt/renderer/backend/egl:egl_backend",
    "//cobalt/renderer/rasterizer/common",
    "//starboard:starboard_headers_only",
  ]
}

static_library("software_rasterizer") {
  sources = [
    "software_image.cc",
    "software_mesh.h",
    "software_rasterizer.cc",
    "software_rasterizer.h",
    "software_resource_provider.cc",
    "software_resource_provider.h",
  ]

  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]

  if (use_skia_next) {
    include_dirs = [ skia_include_dir ]
  }

  deps = [ ":common" ]
}
