// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/class.Renderer.html).
pub type Renderer

///|
pub(open) trait IRenderer {
  fn as_renderer(Self) -> Renderer
  fn activate(Self) -> Unit = _
  fn deactivate(Self) -> Unit = _
  fn draw_error_underline(Self, Int, Int, Int, Int) -> Unit = _
  fn draw_glyph(Self, &IFont, Glyph, Double, Double) -> Unit = _
  fn draw_glyph_item(Self, String?, GlyphItem, Int, Int) -> Unit = _
  fn draw_glyphs(Self, &IFont, GlyphString, Int, Int) -> Unit = _
  fn draw_layout(Self, &ILayout, Int, Int) -> Unit = _
  fn draw_layout_line(Self, LayoutLine, Int, Int) -> Unit = _
  fn draw_rectangle(Self, RenderPart, Int, Int, Int, Int) -> Unit = _
  fn draw_trapezoid(
    Self,
    RenderPart,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
  ) -> Unit = _
  fn get_alpha(Self, RenderPart) -> UInt = _
  fn get_color(Self, RenderPart) -> Color? = _
  fn get_layout(Self) -> Layout? = _
  fn get_layout_line(Self) -> LayoutLine? = _
  fn get_matrix(Self) -> Matrix? = _
  fn part_changed(Self, RenderPart) -> Unit = _
  fn set_alpha(Self, RenderPart, UInt) -> Unit = _
  fn set_color(Self, RenderPart, Color?) -> Unit = _
  fn set_matrix(Self, Matrix?) -> Unit = _
}

///|
pub impl IRenderer for Renderer with fn as_renderer(self) {
  self
}

///|
/// Implementation contract for Renderer.begin. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererBegin {
  fn begin(Self, Renderer) -> Unit
}

///|
/// Implementation contract for Renderer.draw_error_underline. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawErrorUnderline {
  fn draw_error_underline(Self, Renderer, Int, Int, Int, Int) -> Unit
}

///|
/// Implementation contract for Renderer.draw_glyph. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawGlyph {
  fn draw_glyph(Self, Renderer, &IFont, Glyph, Double, Double) -> Unit
}

///|
/// Implementation contract for Renderer.draw_glyph_item. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawGlyphItem {
  fn draw_glyph_item(Self, Renderer, String?, GlyphItem, Int, Int) -> Unit
}

///|
/// Implementation contract for Renderer.draw_glyphs. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawGlyphs {
  fn draw_glyphs(Self, Renderer, &IFont, GlyphString, Int, Int) -> Unit
}

///|
/// Implementation contract for Renderer.draw_rectangle. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawRectangle {
  fn draw_rectangle(Self, Renderer, RenderPart, Int, Int, Int, Int) -> Unit
}

///|
/// Implementation contract for Renderer.draw_shape. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawShape {
  fn draw_shape(Self, Renderer, AttrShape, Int, Int) -> Unit
}

///|
/// Implementation contract for Renderer.draw_trapezoid. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererDrawTrapezoid {
  fn draw_trapezoid(
    Self,
    Renderer,
    RenderPart,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
  ) -> Unit
}

///|
/// Implementation contract for Renderer.end. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererEnd {
  fn end(Self, Renderer) -> Unit
}

///|
/// Implementation contract for Renderer.part_changed. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererPartChanged {
  fn part_changed(Self, Renderer, RenderPart) -> Unit
}

///|
/// Implementation contract for Renderer.prepare_run. Self is the retained MoonBit state; the second parameter is the invoked Renderer object.
pub(open) trait VRendererPrepareRun {
  fn prepare_run(Self, Renderer, LayoutRun) -> Unit
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.activate.html).
#borrow(self)
pub extern "c" fn Renderer::activate(self : Renderer) = "moonbit_pango_renderer_activate"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.deactivate.html).
#borrow(self)
pub extern "c" fn Renderer::deactivate(self : Renderer) = "moonbit_pango_renderer_deactivate"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_error_underline.html).
#borrow(self)
pub extern "c" fn Renderer::draw_error_underline(
  self : Renderer,
  x : Int,
  y : Int,
  width : Int,
  height : Int,
) = "moonbit_pango_renderer_draw_error_underline"

///|
#borrow(self_, font)
extern "c" fn moonbit_pango_renderer_draw_glyph(
  self_ : Renderer,
  font : Font,
  glyph : UInt,
  x : Double,
  y : Double,
) = "moonbit_pango_renderer_draw_glyph"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_glyph.html).
pub fn Renderer::draw_glyph(
  self : Renderer,
  font : &IFont,
  glyph : Glyph,
  x : Double,
  y : Double,
) -> Unit {
  moonbit_pango_renderer_draw_glyph(self, font.as_font(), glyph, x, y)
}

///|
#borrow(self_, text, glyph_item)
extern "c" fn moonbit_pango_renderer_draw_glyph_item(
  self_ : Renderer,
  text : @glib.Nullable[Bytes],
  glyph_item : GlyphItem,
  x : Int,
  y : Int,
) = "moonbit_pango_renderer_draw_glyph_item"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_glyph_item.html).
pub fn Renderer::draw_glyph_item(
  self : Renderer,
  text : String?,
  glyph_item : GlyphItem,
  x : Int,
  y : Int,
) -> Unit {
  moonbit_pango_renderer_draw_glyph_item(
    self,
    match text {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    glyph_item,
    x,
    y,
  )
}

///|
#borrow(self_, font, glyphs)
extern "c" fn moonbit_pango_renderer_draw_glyphs(
  self_ : Renderer,
  font : Font,
  glyphs : GlyphString,
  x : Int,
  y : Int,
) = "moonbit_pango_renderer_draw_glyphs"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_glyphs.html).
pub fn Renderer::draw_glyphs(
  self : Renderer,
  font : &IFont,
  glyphs : GlyphString,
  x : Int,
  y : Int,
) -> Unit {
  moonbit_pango_renderer_draw_glyphs(self, font.as_font(), glyphs, x, y)
}

///|
#borrow(self_, layout)
extern "c" fn moonbit_pango_renderer_draw_layout(
  self_ : Renderer,
  layout : Layout,
  x : Int,
  y : Int,
) = "moonbit_pango_renderer_draw_layout"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_layout.html).
pub fn Renderer::draw_layout(
  self : Renderer,
  layout : &ILayout,
  x : Int,
  y : Int,
) -> Unit {
  moonbit_pango_renderer_draw_layout(self, layout.as_layout(), x, y)
}

///|
#borrow(self_, line)
extern "c" fn moonbit_pango_renderer_draw_layout_line(
  self_ : Renderer,
  line : LayoutLine,
  x : Int,
  y : Int,
) = "moonbit_pango_renderer_draw_layout_line"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_layout_line.html).
pub fn Renderer::draw_layout_line(
  self : Renderer,
  line : LayoutLine,
  x : Int,
  y : Int,
) -> Unit {
  moonbit_pango_renderer_draw_layout_line(self, line, x, y)
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_rectangle.html).
#borrow(self)
pub extern "c" fn Renderer::draw_rectangle(
  self : Renderer,
  part : RenderPart,
  x : Int,
  y : Int,
  width : Int,
  height : Int,
) = "moonbit_pango_renderer_draw_rectangle"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.draw_trapezoid.html).
#borrow(self)
pub extern "c" fn Renderer::draw_trapezoid(
  self : Renderer,
  part : RenderPart,
  y1_ : Double,
  x11 : Double,
  x21 : Double,
  y2 : Double,
  x12 : Double,
  x22 : Double,
) = "moonbit_pango_renderer_draw_trapezoid"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.get_alpha.html).
#borrow(self)
pub extern "c" fn Renderer::get_alpha(
  self : Renderer,
  part : RenderPart,
) -> UInt = "moonbit_pango_renderer_get_alpha"

///|
#borrow(self_)
extern "c" fn moonbit_pango_renderer_get_color(
  self_ : Renderer,
  part : RenderPart,
) -> @glib.Nullable[Color] = "moonbit_pango_renderer_get_color"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.get_color.html).
pub fn Renderer::get_color(self : Renderer, part : RenderPart) -> Color? {
  let raw_result = moonbit_pango_renderer_get_color(self, part)
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_pango_renderer_get_layout(
  self_ : Renderer,
) -> @glib.Nullable[Layout] = "moonbit_pango_renderer_get_layout"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.get_layout.html).
pub fn Renderer::get_layout(self : Renderer) -> Layout? {
  let raw_result = moonbit_pango_renderer_get_layout(self)
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_pango_renderer_get_layout_line(
  self_ : Renderer,
) -> @glib.Nullable[LayoutLine] = "moonbit_pango_renderer_get_layout_line"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.get_layout_line.html).
pub fn Renderer::get_layout_line(self : Renderer) -> LayoutLine? {
  let raw_result = moonbit_pango_renderer_get_layout_line(self)
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_pango_renderer_get_matrix(
  self_ : Renderer,
) -> @glib.Nullable[Matrix] = "moonbit_pango_renderer_get_matrix"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.get_matrix.html).
pub fn Renderer::get_matrix(self : Renderer) -> Matrix? {
  let raw_result = moonbit_pango_renderer_get_matrix(self)
  raw_result.to_option()
}

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.part_changed.html).
#borrow(self)
pub extern "c" fn Renderer::part_changed(self : Renderer, part : RenderPart) = "moonbit_pango_renderer_part_changed"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.set_alpha.html).
#borrow(self)
pub extern "c" fn Renderer::set_alpha(
  self : Renderer,
  part : RenderPart,
  alpha : UInt,
) = "moonbit_pango_renderer_set_alpha"

///|
#borrow(self_, color)
extern "c" fn moonbit_pango_renderer_set_color(
  self_ : Renderer,
  part : RenderPart,
  color : @glib.Nullable[Color],
) = "moonbit_pango_renderer_set_color"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.set_color.html).
pub fn Renderer::set_color(
  self : Renderer,
  part : RenderPart,
  color : Color?,
) -> Unit {
  moonbit_pango_renderer_set_color(
    self,
    part,
    match color {
      Some(v) => @glib.Nullable::some(v)
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, matrix)
extern "c" fn moonbit_pango_renderer_set_matrix(
  self_ : Renderer,
  matrix : @glib.Nullable[Matrix],
) = "moonbit_pango_renderer_set_matrix"

///|
/// [Upstream documentation](https://gnome.pages.gitlab.gnome.org/pango/Pango/method.Renderer.set_matrix.html).
pub fn Renderer::set_matrix(self : Renderer, matrix : Matrix?) -> Unit {
  moonbit_pango_renderer_set_matrix(
    self,
    match matrix {
      Some(v) => @glib.Nullable::some(v)
      None => @glib.Nullable::null()
    },
  )
}

///|
impl IRenderer with fn activate(self) -> Unit {
  self.as_renderer().activate()
}

///|
impl IRenderer with fn deactivate(self) -> Unit {
  self.as_renderer().deactivate()
}

///|
impl IRenderer with fn draw_error_underline(self, x, y, width, height) -> Unit {
  self.as_renderer().draw_error_underline(x, y, width, height)
}

///|
impl IRenderer with fn draw_glyph(self, font, glyph, x, y) -> Unit {
  self.as_renderer().draw_glyph(font, glyph, x, y)
}

///|
impl IRenderer with fn draw_glyph_item(self, text, glyph_item, x, y) -> Unit {
  self.as_renderer().draw_glyph_item(text, glyph_item, x, y)
}

///|
impl IRenderer with fn draw_glyphs(self, font, glyphs, x, y) -> Unit {
  self.as_renderer().draw_glyphs(font, glyphs, x, y)
}

///|
impl IRenderer with fn draw_layout(self, layout, x, y) -> Unit {
  self.as_renderer().draw_layout(layout, x, y)
}

///|
impl IRenderer with fn draw_layout_line(self, line, x, y) -> Unit {
  self.as_renderer().draw_layout_line(line, x, y)
}

///|
impl IRenderer with fn draw_rectangle(self, part, x, y, width, height) -> Unit {
  self.as_renderer().draw_rectangle(part, x, y, width, height)
}

///|
impl IRenderer with fn draw_trapezoid(self, part, y1_, x11, x21, y2, x12, x22) -> Unit {
  self.as_renderer().draw_trapezoid(part, y1_, x11, x21, y2, x12, x22)
}

///|
impl IRenderer with fn get_alpha(self, part) -> UInt {
  self.as_renderer().get_alpha(part)
}

///|
impl IRenderer with fn get_color(self, part) -> Color? {
  self.as_renderer().get_color(part)
}

///|
impl IRenderer with fn get_layout(self) -> Layout? {
  self.as_renderer().get_layout()
}

///|
impl IRenderer with fn get_layout_line(self) -> LayoutLine? {
  self.as_renderer().get_layout_line()
}

///|
impl IRenderer with fn get_matrix(self) -> Matrix? {
  self.as_renderer().get_matrix()
}

///|
impl IRenderer with fn part_changed(self, part) -> Unit {
  self.as_renderer().part_changed(part)
}

///|
impl IRenderer with fn set_alpha(self, part, alpha) -> Unit {
  self.as_renderer().set_alpha(part, alpha)
}

///|
impl IRenderer with fn set_color(self, part, color) -> Unit {
  self.as_renderer().set_color(part, color)
}

///|
impl IRenderer with fn set_matrix(self, matrix) -> Unit {
  self.as_renderer().set_matrix(matrix)
}

///|
pub fn Renderer::as_gobject_object(self : Renderer) -> @gobject.Object = "%identity"

///|
pub impl @gobject.IObject for Renderer with fn as_object(self) {
  self.as_gobject_object()
}