Bug 1354944 - Plug in the generated FFI header. r?jrmuizel draft
authorKartikaya Gupta <kgupta@mozilla.com>
Tue, 11 Apr 2017 18:28:30 -0400
changeset 560721 5a6c331cdd8c4adb797c20c817abd8ee1050200d
parent 560720 2bfa9bfe1bdc642d30e0d7b89f871d013e062dc2
child 623801 d97b77f01da0594075fb62203b1c670db106e8fa
push id53537
push userkgupta@mozilla.com
push dateTue, 11 Apr 2017 22:29:04 +0000
reviewersjrmuizel
bugs1354944
milestone55.0a1
Bug 1354944 - Plug in the generated FFI header. r?jrmuizel MozReview-Commit-ID: 25jH9SVnphl
gfx/webrender_bindings/moz.build
gfx/webrender_bindings/webrender_ffi.h
gfx/webrender_bindings/webrender_ffi_generated.h
--- a/gfx/webrender_bindings/moz.build
+++ b/gfx/webrender_bindings/moz.build
@@ -9,16 +9,17 @@ with Files('**'):
 
 EXPORTS.mozilla.webrender += [
     'RenderBufferTextureHost.h',
     'RendererOGL.h',
     'RenderTextureHost.h',
     'RenderTextureHostOGL.h',
     'RenderThread.h',
     'webrender_ffi.h',
+    'webrender_ffi_generated.h',
     'WebRenderAPI.h',
     'WebRenderTypes.h',
 ]
 
 UNIFIED_SOURCES += [
     'Moz2DImageRenderer.cpp',
     'RenderBufferTextureHost.cpp',
     'RendererOGL.cpp',
--- a/gfx/webrender_bindings/webrender_ffi.h
+++ b/gfx/webrender_bindings/webrender_ffi.h
@@ -57,407 +57,34 @@ WR_DECL_FFI_1(WrWindowId, uint64_t)
 
 WR_DECL_FFI_2(WrPipelineId, uint32_t, uint32_t)
 WR_DECL_FFI_2(WrImageKey, uint32_t, uint32_t)
 WR_DECL_FFI_2(WrFontKey, uint32_t, uint32_t)
 
 #undef WR_DECL_FFI_1
 #undef WR_DECL_FFI_2
 
-// FFI-safe slice of bytes. Use this accross the FFI boundary to pass a temporary
-// view of a buffer of bytes.
-// The canonical gecko equivalent is mozilla::Range<uint8_t>.
-struct WrByteSlice {
-  const uint8_t* buffer;
-  size_t len;
-};
-
 // ----
 // Functions invoked from Rust code
 // ----
 
 bool is_in_compositor_thread();
 bool is_in_main_thread();
 bool is_in_render_thread();
 bool is_glcontext_egl(void* glcontext_ptr);
 void gfx_critical_note(const char* msg);
 void* get_proc_address_from_glcontext(void* glcontext_ptr, const char* procname);
 
 // -----
-// Enums used in C++ code with corresponding enums in Rust code
-// -----
-enum class WrBoxShadowClipMode: uint32_t {
-  None,
-  Outset,
-  Inset,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrImageFormat: uint32_t
-{
-  Invalid = 0,
-  A8      = 1,
-  RGB8    = 2,
-  RGBA8   = 3,
-  RGBAF32 = 4,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrBorderStyle: uint32_t
-{
-  None    = 0,
-  Solid   = 1,
-  Double  = 2,
-  Dotted  = 3,
-  Dashed  = 4,
-  Hidden  = 5,
-  Groove  = 6,
-  Ridge   = 7,
-  Inset   = 8,
-  Outset  = 9,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrImageRendering: uint32_t
-{
-  Auto        = 0,
-  CrispEdges  = 1,
-  Pixelated   = 2,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrExternalImageType: uint32_t
-{
-  NativeTexture, // Currently, we only support gl texture handle.
-  RawData,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrMixBlendMode: uint32_t
-{
-  Normal      = 0,
-  Multiply    = 1,
-  Screen      = 2,
-  Overlay     = 3,
-  Darken      = 4,
-  Lighten     = 5,
-  ColorDodge  = 6,
-  ColorBurn   = 7,
-  HardLight   = 8,
-  SoftLight   = 9,
-  Difference  = 10,
-  Exclusion   = 11,
-  Hue         = 12,
-  Saturation  = 13,
-  Color       = 14,
-  Luminosity  = 15,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrGradientExtendMode : uint32_t
-{
-  Clamp      = 0,
-  Repeat     = 1,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-enum class WrRepeatMode : uint32_t
-{
-  Stretch      = 0,
-  Repeat       = 1,
-  Round        = 2,
-  Space        = 3,
-
-  Sentinel /* this must be last, for IPC serialization purposes */
-};
-
-// -----
 // Typedefs for struct fields and function signatures below.
 // -----
 
 typedef uint64_t WrExternalImageId;
 typedef mozilla::gfx::Point Point2D;    // TODO: get rid of this somehow
 
-// -----
-// Structs used in C++ code with corresponding types in Rust code
-// -----
-
-struct WrItemRange
-{
-  size_t start;
-  size_t length;
-};
-
-struct WrBuiltDisplayListDescriptor {
-  size_t display_list_items_size;
-};
-
-struct WrAuxiliaryListsDescriptor {
-  size_t gradient_stops_size;
-  size_t complex_clip_regions_size;
-  size_t filters_size;
-  size_t glyph_instances_size;
-};
-
-struct WrPoint
-{
-  float x;
-  float y;
-
-  bool operator==(const WrPoint& aRhs) const {
-    return x == aRhs.x && y == aRhs.y;
-  }
-
-  operator mozilla::gfx::Point() const { return mozilla::gfx::Point(x, y); }
-};
-
-struct WrSize
-{
-  float width;
-  float height;
-
-  bool operator==(const WrSize& aRhs) const
-  {
-    return width == aRhs.width && height == aRhs.height;
-  }
-};
-
-struct WrRect
-{
-  float x;
-  float y;
-  float width;
-  float height;
-
-  bool operator==(const WrRect& aRhs) const
-  {
-    return x == aRhs.x && y == aRhs.y &&
-           width == aRhs.width && height == aRhs.height;
-  }
-};
-
-struct WrMatrix
-{
-  float values[16];
-};
-
-struct WrColor
-{
-  float r;
-  float g;
-  float b;
-  float a;
-
-  bool operator==(const WrColor& aRhs) const
-  {
-    return r == aRhs.r && g == aRhs.g &&
-           b == aRhs.b && a == aRhs.a;
-  }
-};
-
-struct WrGlyphInstance
-{
-  uint32_t index;
-  Point2D point;
-
-  bool operator==(const WrGlyphInstance& other) const
-  {
-    return index == other.index &&
-           point == other.point;
-  }
-};
-
-// Note that the type is slightly different than
-// the definition in bindings.rs. WrGlyphInstance
-// versus GlyphInstance, but their layout is the same.
-// So we're really overlapping the types for the same memory.
-struct WrGlyphArray
-{
-  mozilla::gfx::Color color;
-  nsTArray<WrGlyphInstance> glyphs;
-
-  bool operator==(const WrGlyphArray& other) const
-  {
-    if (!(color == other.color) ||
-       (glyphs.Length() != other.glyphs.Length())) {
-      return false;
-    }
-
-    for (size_t i = 0; i < glyphs.Length(); i++) {
-      if (!(glyphs[i] == other.glyphs[i])) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-};
-
-struct WrGradientStop {
-  float offset;
-  WrColor color;
-
-  bool operator==(const WrGradientStop& aRhs) const
-  {
-    return offset == aRhs.offset && color == aRhs.color;
-  }
-};
-
-struct WrBorderSide {
-  WrColor color;
-  WrBorderStyle style;
-
-  bool operator==(const WrBorderSide& aRhs) const
-  {
-    return color == aRhs.color && style == aRhs.style;
-  }
-};
-
-struct WrBorderRadius {
-  WrSize top_left;
-  WrSize top_right;
-  WrSize bottom_left;
-  WrSize bottom_right;
-
-  bool operator==(const WrBorderRadius& aRhs) const
-  {
-    return top_left == aRhs.top_left && top_right == aRhs.top_right &&
-           bottom_left == aRhs.bottom_left && bottom_right == aRhs.bottom_right;
-  }
-};
-
-struct WrBorderWidths {
-  float left;
-  float top;
-  float right;
-  float bottom;
-
-  bool operator==(const WrBorderWidths& aRhs) const
-  {
-    return left == aRhs.left && top == aRhs.top &&
-           right == aRhs.right && bottom == aRhs.bottom;
-  }
-};
-
-struct WrSideOffsets2Du32 {
-  uint32_t top;
-  uint32_t right;
-  uint32_t bottom;
-  uint32_t left;
-
-  bool operator==(const WrSideOffsets2Du32& aRhs) const
-  {
-    return top == aRhs.top && right == aRhs.right &&
-           bottom == aRhs.bottom && left == aRhs.left;
-  }
-};
-
-struct WrSideOffsets2Df32 {
-  float top;
-  float right;
-  float bottom;
-  float left;
-
-  bool operator==(const WrSideOffsets2Df32& aRhs) const
-  {
-    return top == aRhs.top && right == aRhs.right &&
-           bottom == aRhs.bottom && left == aRhs.left;
-  }
-};
-
-struct WrNinePatchDescriptor {
-  uint32_t width;
-  uint32_t height;
-  WrSideOffsets2Du32 slice;
-
-  bool operator==(const WrNinePatchDescriptor& aRhs) const
-  {
-    return width == aRhs.width && height == aRhs.height &&
-           slice == aRhs.slice;
-  }
-};
-
-struct WrImageMask
-{
-  WrImageKey image;
-  WrRect rect;
-  bool repeat;
-
-  bool operator==(const WrImageMask& aRhs) const
-  {
-    return image == aRhs.image && rect == aRhs.rect && repeat == aRhs.repeat;
-  }
-};
-
-struct WrComplexClipRegion
-{
-  WrRect rect;
-  WrBorderRadius radii;
-};
-
-struct WrClipRegion
-{
-  WrRect main;
-  WrItemRange complex;
-  WrImageMask image_mask;
-  bool has_image_mask;
-};
-
-struct WrExternalImage
-{
-  WrExternalImageType type;
-
-  // external texture handle
-  uint32_t handle;
-  // external texture coordinate
-  float u0, v0;
-  float u1, v1;
-
-  // external image buffer
-  const uint8_t* buff;
-  size_t size;
-};
-
-typedef WrExternalImage (*LockExternalImageCallback)(void*, WrExternalImageId);
-typedef void (*UnlockExternalImageCallback)(void*, WrExternalImageId);
-typedef void (*ReleaseExternalImageCallback)(void*, WrExternalImageId);
-
-struct WrExternalImageHandler
-{
-  void* renderer_obj;
-  LockExternalImageCallback lock_func;
-  UnlockExternalImageCallback unlock_func;
-  ReleaseExternalImageCallback release_func;
-};
-
-struct WrImageDescriptor {
-    WrImageFormat format;
-    uint32_t width;
-    uint32_t height;
-    uint32_t stride;
-    bool is_opaque;
-};
-
-struct WrVecU8 {
-    uint8_t *data;
-    size_t length;
-    size_t capacity;
-};
-
-// -----
-// Functions exposed by the webrender API
-// -----
-
 // Some useful defines to stub out webrender binding functions for when we
 // build gecko without webrender. We try to tell the compiler these functions
 // are unreachable in that case, but VC++ emits a warning if it finds any
 // unreachable functions invoked from destructors. That warning gets turned into
 // an error and causes the build to fail. So for wr_* functions called by
 // destructors in C++ classes, use WR_DESTRUCTOR_SAFE_FUNC instead, which omits
 // the unreachable annotation.
 #ifdef MOZ_BUILD_WEBRENDER
@@ -471,283 +98,37 @@ struct WrVecU8 {
 #endif
 
 // Structs defined in Rust, but opaque to C++ code.
 struct WrRenderedEpochs;
 struct WrRenderer;
 struct WrState;
 struct WrAPI;
 
-WR_INLINE void
-wr_renderer_set_external_image_handler(WrRenderer* renderer,
-                                       WrExternalImageHandler* handler)
-WR_FUNC;
-
-WR_INLINE void
-wr_renderer_update(WrRenderer* renderer)
-WR_FUNC;
-
-WR_INLINE void
-wr_renderer_render(WrRenderer* renderer, uint32_t width, uint32_t height)
-WR_FUNC;
-
-// It is the responsibility of the caller to manage the dst_buffer memory
-// and also free it at the proper time.
-WR_INLINE void
-wr_renderer_readback(WrRenderer* renderer,
-                     uint32_t width, uint32_t height,
-                     uint8_t* dst_buffer, size_t buffer_length)
-WR_FUNC;
-
-WR_INLINE void
-wr_renderer_set_profiler_enabled(WrRenderer* renderer, bool enabled)
-WR_FUNC;
-
-WR_INLINE bool
-wr_renderer_current_epoch(WrRenderer* renderer, WrPipelineId pipeline_id,
-                          WrEpoch* out_epoch)
-WR_FUNC;
-
-WR_INLINE void
-wr_renderer_delete(WrRenderer* renderer)
-WR_DESTRUCTOR_SAFE_FUNC;
-
-WR_INLINE WrRenderedEpochs*
-wr_renderer_flush_rendered_epochs(WrRenderer* renderer) WR_FUNC;
-
-WR_INLINE bool
-wr_rendered_epochs_next(WrRenderedEpochs* pipeline_epochs,
-                        WrPipelineId* out_pipeline,
-                        WrEpoch* out_epoch) WR_FUNC;
-
-WR_INLINE void
-wr_rendered_epochs_delete(WrRenderedEpochs* pipeline_epochs) WR_DESTRUCTOR_SAFE_FUNC;
-
-WR_INLINE bool
-wr_window_new(WrWindowId window_id,
-              uint32_t window_width,
-              uint32_t window_height,
-              void* aGLContext,
-              bool enable_profiler,
-              WrAPI** out_api,
-              WrRenderer** out_renderer)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_delete(WrAPI* api)
-WR_DESTRUCTOR_SAFE_FUNC;
-
-WR_INLINE void
-wr_api_add_image(WrAPI* api, WrImageKey key, const WrImageDescriptor* descriptor, const WrByteSlice aSlice)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_add_blob_image(WrAPI* api, WrImageKey key, const WrImageDescriptor* descriptor, const WrByteSlice aSlice)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_add_external_image_handle(WrAPI* api, WrImageKey key,
-                                 const WrImageDescriptor* descriptor,
-                                 uint64_t external_image_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_add_external_image_buffer(WrAPI* api, WrImageKey key,
-                                 const WrImageDescriptor* descriptor,
-                                 uint64_t external_image_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_update_image(WrAPI* api, WrImageKey key,
-                    const WrImageDescriptor* descriptor,
-                    const WrByteSlice bytes)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_delete_image(WrAPI* api, WrImageKey key)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_set_root_pipeline(WrAPI* api, WrPipelineId pipeline_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_set_window_parameters(WrAPI* api, int width, int height)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_set_root_display_list(WrAPI* api, WrEpoch epoch, float w, float h,
-                             WrPipelineId pipeline_id,
-                             WrBuiltDisplayListDescriptor dl_descriptor,
-                             uint8_t *dl_data,
-                             size_t dl_size,
-                             WrAuxiliaryListsDescriptor aux_descriptor,
-                             uint8_t *aux_data,
-                             size_t aux_size)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_clear_root_display_list(WrAPI* api, WrEpoch epoch, WrPipelineId pipeline_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_generate_frame(WrAPI* api)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_send_external_event(WrAPI* api, uintptr_t evt)
-WR_DESTRUCTOR_SAFE_FUNC;
-
-WR_INLINE void
-wr_api_add_raw_font(WrAPI* api, WrFontKey key, uint8_t* font_buffer, size_t buffer_size)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_delete_font(WrAPI* api, WrFontKey key)
-WR_FUNC;
-
-WR_INLINE WrIdNamespace
-wr_api_get_namespace(WrAPI* api)
-WR_FUNC;
-
-WR_INLINE WrState*
-wr_state_new(WrPipelineId pipeline_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_state_delete(WrState* state)
-WR_DESTRUCTOR_SAFE_FUNC;
-
-WR_INLINE void
-wr_dp_begin(WrState* wrState, uint32_t width, uint32_t height)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_end(WrState* wrState)
-WR_FUNC;
-
-WR_INLINE WrClipRegion
-wr_dp_new_clip_region(WrState* wrState,
-                      WrRect main,
-                      const WrComplexClipRegion* complex, size_t complexCount,
-                      const WrImageMask* image_mask)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_stacking_context(WrState *wrState, WrRect bounds,
-                            float opacity, WrMatrix transform,
-                            WrMixBlendMode mixBlendMode)
-WR_FUNC;
-
-//XXX: matrix should use a proper type
-WR_INLINE void
-wr_dp_pop_stacking_context(WrState *wrState)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_scroll_layer(WrState *wrState, WrRect bounds,
-                        WrRect overflow, const WrImageMask *mask)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_pop_scroll_layer(WrState *wrState)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_iframe(WrState* wrState, WrRect bounds, WrClipRegion clip, WrPipelineId layers_id)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_rect(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                WrColor color)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_image(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                 WrSize stretch_size, WrSize tile_spacing,
-                 WrImageRendering filter, WrImageKey key)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_text(WrState* wrState, WrRect bounds, WrClipRegion clip, WrColor color,
-                WrFontKey font_Key, const WrGlyphInstance* glyphs,
-                uint32_t glyph_count, float glyph_size)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_border(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                  WrBorderWidths widths,
-                  WrBorderSide top, WrBorderSide right, WrBorderSide bottom, WrBorderSide left,
-                  WrBorderRadius radius)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_border_image(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                        WrBorderWidths widths,
-                        WrImageKey image, WrNinePatchDescriptor patch, WrSideOffsets2Df32 outset,
-                        WrRepeatMode repeat_horizontal,
-                        WrRepeatMode repeat_vertical)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_border_gradient(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                           WrBorderWidths widths,
-                           WrPoint startPoint, WrPoint endPoint,
-                           const WrGradientStop* stops, size_t stopsCount,
-                           WrGradientExtendMode extendMode,
-                           WrSideOffsets2Df32 outset)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_border_radial_gradient(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                                  WrBorderWidths widths,
-                                  WrPoint center, WrSize radius,
-                                  const WrGradientStop* stops, size_t stopsCount,
-                                  WrGradientExtendMode extendMode,
-                                  WrSideOffsets2Df32 outset)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_linear_gradient(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                           WrPoint startPoint, WrPoint endPoint,
-                           const WrGradientStop* stops, size_t stopsCount,
-                           WrGradientExtendMode extendMode)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_radial_gradient(WrState* wrState, WrRect bounds, WrClipRegion clip,
-                           WrPoint center, WrSize radius,
-                           const WrGradientStop* stops, size_t stopsCount,
-                           WrGradientExtendMode extendMode)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_box_shadow(WrState* wrState, WrRect rect, WrClipRegion clip,
-                      WrRect box_bounds, WrPoint offset, WrColor color,
-                      float blur_radius, float spread_radius, float border_radius,
-                      WrBoxShadowClipMode clip_mode)
-WR_FUNC;
-
-WR_INLINE void
-wr_api_finalize_builder(WrState* wrState,
-                        WrBuiltDisplayListDescriptor* dl_descriptor,
-                        WrVecU8* dl_data,
-                        WrAuxiliaryListsDescriptor* aux_descriptor,
-                        WrVecU8* aux_data)
-WR_FUNC;
-
-WR_INLINE void
-wr_dp_push_built_display_list(WrState* wrState,
-                              WrBuiltDisplayListDescriptor dl_descriptor,
-                              WrVecU8 dl_data,
-                              WrAuxiliaryListsDescriptor aux_descriptor,
-                              WrVecU8 aux_data)
-WR_FUNC;
-
-WR_INLINE void
-wr_vec_u8_free(WrVecU8 dl_data)
-WR_FUNC;
+#include "webrender_ffi_generated.h"
 
 #undef WR_FUNC
 #undef WR_DESTRUCTOR_SAFE_FUNC
 } // extern "C"
 
+struct WrGlyphArray
+{
+  mozilla::gfx::Color color;
+  nsTArray<WrGlyphInstance> glyphs;
+
+  bool operator==(const WrGlyphArray& other) const
+  {
+    if (!(color == other.color) ||
+       (glyphs.Length() != other.glyphs.Length())) {
+      return false;
+    }
+
+    for (size_t i = 0; i < glyphs.Length(); i++) {
+      if (!(glyphs[i] == other.glyphs[i])) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+};
+
 #endif // WR_h
new file mode 100644
--- /dev/null
+++ b/gfx/webrender_bindings/webrender_ffi_generated.h
@@ -0,0 +1,745 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* THIS FILE IS GENERATED! DO NOT MODIFY MANUALLY! See https://github.com/jrmuizel/wr-binding! */
+struct WrVecU8 {
+  uint8_t* data;
+  size_t length;
+  size_t capacity;
+
+  bool operator==(const WrVecU8& aOther) const {
+    return data == aOther.data &&
+      length == aOther.length &&
+      capacity == aOther.capacity;
+  }
+};
+
+enum class WrExternalImageType: uint32_t {
+  NativeTexture = 0,
+  RawData = 1,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrExternalImage {
+  WrExternalImageType image_type;
+  uint32_t handle;
+  float u0;
+  float v0;
+  float u1;
+  float v1;
+  const uint8_t* buff;
+  size_t size;
+
+  bool operator==(const WrExternalImage& aOther) const {
+    return image_type == aOther.image_type &&
+      handle == aOther.handle &&
+      u0 == aOther.u0 &&
+      v0 == aOther.v0 &&
+      u1 == aOther.u1 &&
+      v1 == aOther.v1 &&
+      buff == aOther.buff &&
+      size == aOther.size;
+  }
+};
+
+typedef WrExternalImage (* LockExternalImageCallback)(void*, WrExternalImageId);
+
+typedef void (* ReleaseExternalImageCallback)(void*, WrExternalImageId);
+
+typedef void (* UnlockExternalImageCallback)(void*, WrExternalImageId);
+
+struct WrExternalImageHandler {
+  void* external_image_obj;
+  LockExternalImageCallback lock_func;
+  UnlockExternalImageCallback unlock_func;
+  ReleaseExternalImageCallback release_func;
+
+  bool operator==(const WrExternalImageHandler& aOther) const {
+    return external_image_obj == aOther.external_image_obj &&
+      lock_func == aOther.lock_func &&
+      unlock_func == aOther.unlock_func &&
+      release_func == aOther.release_func;
+  }
+};
+
+struct WrByteSlice {
+  const uint8_t* buffer;
+  size_t len;
+
+  bool operator==(const WrByteSlice& aOther) const {
+    return buffer == aOther.buffer &&
+      len == aOther.len;
+  }
+};
+
+enum class WrImageFormat: uint32_t {
+  Invalid = 0,
+  A8 = 1,
+  RGB8 = 2,
+  RGBA8 = 3,
+  RGBAF32 = 4,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrImageDescriptor {
+  WrImageFormat format;
+  uint32_t width;
+  uint32_t height;
+  uint32_t stride;
+  bool is_opaque;
+
+  bool operator==(const WrImageDescriptor& aOther) const {
+    return format == aOther.format &&
+      width == aOther.width &&
+      height == aOther.height &&
+      stride == aOther.stride &&
+      is_opaque == aOther.is_opaque;
+  }
+};
+
+struct WrAuxiliaryListsDescriptor {
+  size_t gradient_stops_size;
+  size_t complex_clip_regions_size;
+  size_t filters_size;
+  size_t glyph_instances_size;
+
+  bool operator==(const WrAuxiliaryListsDescriptor& aOther) const {
+    return gradient_stops_size == aOther.gradient_stops_size &&
+      complex_clip_regions_size == aOther.complex_clip_regions_size &&
+      filters_size == aOther.filters_size &&
+      glyph_instances_size == aOther.glyph_instances_size;
+  }
+};
+
+struct WrBuiltDisplayListDescriptor {
+  size_t display_list_items_size;
+
+  bool operator==(const WrBuiltDisplayListDescriptor& aOther) const {
+    return display_list_items_size == aOther.display_list_items_size;
+  }
+};
+
+struct WrRect {
+  float x;
+  float y;
+  float width;
+  float height;
+
+  bool operator==(const WrRect& aOther) const {
+    return x == aOther.x &&
+      y == aOther.y &&
+      width == aOther.width &&
+      height == aOther.height;
+  }
+};
+
+struct WrImageMask {
+  WrImageKey image;
+  WrRect rect;
+  bool repeat;
+
+  bool operator==(const WrImageMask& aOther) const {
+    return image == aOther.image &&
+      rect == aOther.rect &&
+      repeat == aOther.repeat;
+  }
+};
+
+struct WrItemRange {
+  size_t start;
+  size_t length;
+
+  bool operator==(const WrItemRange& aOther) const {
+    return start == aOther.start &&
+      length == aOther.length;
+  }
+};
+
+struct WrClipRegion {
+  WrRect main;
+  WrItemRange complex;
+  WrImageMask image_mask;
+  bool has_image_mask;
+
+  bool operator==(const WrClipRegion& aOther) const {
+    return main == aOther.main &&
+      complex == aOther.complex &&
+      image_mask == aOther.image_mask &&
+      has_image_mask == aOther.has_image_mask;
+  }
+};
+
+struct WrSize {
+  float width;
+  float height;
+
+  bool operator==(const WrSize& aOther) const {
+    return width == aOther.width &&
+      height == aOther.height;
+  }
+};
+
+struct WrBorderRadius {
+  WrSize top_left;
+  WrSize top_right;
+  WrSize bottom_left;
+  WrSize bottom_right;
+
+  bool operator==(const WrBorderRadius& aOther) const {
+    return top_left == aOther.top_left &&
+      top_right == aOther.top_right &&
+      bottom_left == aOther.bottom_left &&
+      bottom_right == aOther.bottom_right;
+  }
+};
+
+struct WrComplexClipRegion {
+  WrRect rect;
+  WrBorderRadius radii;
+
+  bool operator==(const WrComplexClipRegion& aOther) const {
+    return rect == aOther.rect &&
+      radii == aOther.radii;
+  }
+};
+
+struct WrMatrix {
+  float values[16];
+
+  bool operator==(const WrMatrix& aOther) const {
+    return values == aOther.values;
+  }
+};
+
+enum class WrMixBlendMode: uint32_t {
+  Normal = 0,
+  Multiply = 1,
+  Screen = 2,
+  Overlay = 3,
+  Darken = 4,
+  Lighten = 5,
+  ColorDodge = 6,
+  ColorBurn = 7,
+  HardLight = 8,
+  SoftLight = 9,
+  Difference = 10,
+  Exclusion = 11,
+  Hue = 12,
+  Saturation = 13,
+  Color = 14,
+  Luminosity = 15,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrColor {
+  float r;
+  float g;
+  float b;
+  float a;
+
+  bool operator==(const WrColor& aOther) const {
+    return r == aOther.r &&
+      g == aOther.g &&
+      b == aOther.b &&
+      a == aOther.a;
+  }
+};
+
+enum class WrImageRendering: uint32_t {
+  Auto = 0,
+  CrispEdges = 1,
+  Pixelated = 2,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrGlyphInstance {
+  uint32_t index;
+  Point2D point;
+
+  bool operator==(const WrGlyphInstance& aOther) const {
+    return index == aOther.index &&
+      point == aOther.point;
+  }
+};
+
+enum class WrBorderStyle: uint32_t {
+  None = 0,
+  Solid = 1,
+  Double = 2,
+  Dotted = 3,
+  Dashed = 4,
+  Hidden = 5,
+  Groove = 6,
+  Ridge = 7,
+  Inset = 8,
+  Outset = 9,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrBorderSide {
+  WrColor color;
+  WrBorderStyle style;
+
+  bool operator==(const WrBorderSide& aOther) const {
+    return color == aOther.color &&
+      style == aOther.style;
+  }
+};
+
+struct WrBorderWidths {
+  float left;
+  float top;
+  float right;
+  float bottom;
+
+  bool operator==(const WrBorderWidths& aOther) const {
+    return left == aOther.left &&
+      top == aOther.top &&
+      right == aOther.right &&
+      bottom == aOther.bottom;
+  }
+};
+
+struct WrSideOffsets2Du32 {
+  uint32_t top;
+  uint32_t right;
+  uint32_t bottom;
+  uint32_t left;
+
+  bool operator==(const WrSideOffsets2Du32& aOther) const {
+    return top == aOther.top &&
+      right == aOther.right &&
+      bottom == aOther.bottom &&
+      left == aOther.left;
+  }
+};
+
+struct WrNinePatchDescriptor {
+  uint32_t width;
+  uint32_t height;
+  WrSideOffsets2Du32 slice;
+
+  bool operator==(const WrNinePatchDescriptor& aOther) const {
+    return width == aOther.width &&
+      height == aOther.height &&
+      slice == aOther.slice;
+  }
+};
+
+enum class WrRepeatMode: uint32_t {
+  Stretch = 0,
+  Repeat = 1,
+  Round = 2,
+  Space = 3,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrSideOffsets2Df32 {
+  float top;
+  float right;
+  float bottom;
+  float left;
+
+  bool operator==(const WrSideOffsets2Df32& aOther) const {
+    return top == aOther.top &&
+      right == aOther.right &&
+      bottom == aOther.bottom &&
+      left == aOther.left;
+  }
+};
+
+enum class WrGradientExtendMode: uint32_t {
+  Clamp = 0,
+  Repeat = 1,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+struct WrGradientStop {
+  float offset;
+  WrColor color;
+
+  bool operator==(const WrGradientStop& aOther) const {
+    return offset == aOther.offset &&
+      color == aOther.color;
+  }
+};
+
+struct WrPoint {
+  float x;
+  float y;
+
+  bool operator==(const WrPoint& aOther) const {
+    return x == aOther.x &&
+      y == aOther.y;
+  }
+};
+
+enum class WrBoxShadowClipMode: uint32_t {
+  None = 0,
+  Outset = 1,
+  Inset = 2,
+
+  Sentinel /* this must be last for serialization purposes. */
+};
+
+/* THIS FILE IS GENERATED! DO NOT MODIFY MANUALLY! See https://github.com/jrmuizel/wr-binding! */
+WR_INLINE void
+wr_vec_u8_free(WrVecU8 v)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_set_external_image_handler(WrRenderer* renderer,
+    WrExternalImageHandler* external_image_handler)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_update(WrRenderer* renderer)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_render(WrRenderer* renderer,
+    uint32_t width,
+    uint32_t height)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_readback(WrRenderer* renderer,
+    uint32_t width,
+    uint32_t height,
+    uint8_t* dst_buffer,
+    size_t buffer_size)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_set_profiler_enabled(WrRenderer* renderer,
+    bool enabled)
+WR_FUNC;
+
+WR_INLINE bool
+wr_renderer_current_epoch(WrRenderer* renderer,
+    WrPipelineId pipeline_id,
+    WrEpoch* out_epoch)
+WR_FUNC;
+
+WR_INLINE void
+wr_renderer_delete(WrRenderer* renderer)
+WR_DESTRUCTOR_SAFE_FUNC;
+
+WR_INLINE WrRenderedEpochs*
+wr_renderer_flush_rendered_epochs(WrRenderer* renderer)
+WR_FUNC;
+
+WR_INLINE bool
+wr_rendered_epochs_next(WrRenderedEpochs* pipeline_epochs,
+    WrPipelineId* out_pipeline,
+    WrEpoch* out_epoch)
+WR_FUNC;
+
+WR_INLINE void
+wr_rendered_epochs_delete(WrRenderedEpochs* pipeline_epochs)
+WR_DESTRUCTOR_SAFE_FUNC;
+
+WR_INLINE bool
+wr_window_new(WrWindowId window_id,
+    uint32_t window_width,
+    uint32_t window_height,
+    void* gl_context,
+    bool enable_profiler,
+    WrAPI** out_api,
+    WrRenderer** out_renderer)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_delete(WrAPI* api)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_add_image(WrAPI* api,
+    WrImageKey image_key,
+    const WrImageDescriptor* descriptor,
+    WrByteSlice bytes)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_add_blob_image(WrAPI* api,
+    WrImageKey image_key,
+    const WrImageDescriptor* descriptor,
+    WrByteSlice bytes)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_add_external_image_handle(WrAPI* api,
+    WrImageKey image_key,
+    const WrImageDescriptor* descriptor,
+    uint64_t external_image_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_add_external_image_buffer(WrAPI* api,
+    WrImageKey image_key,
+    const WrImageDescriptor* descriptor,
+    uint64_t external_image_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_update_image(WrAPI* api,
+    WrImageKey key,
+    const WrImageDescriptor* descriptor,
+    WrByteSlice bytes)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_delete_image(WrAPI* api,
+    WrImageKey key)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_set_root_pipeline(WrAPI* api,
+    WrPipelineId pipeline_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_set_window_parameters(WrAPI* api,
+    int32_t width,
+    int32_t height)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_set_root_display_list(WrAPI* api,
+    WrEpoch epoch,
+    float viewport_width,
+    float viewport_height,
+    WrPipelineId pipeline_id,
+    WrBuiltDisplayListDescriptor dl_descriptor,
+    uint8_t* dl_data,
+    size_t dl_size,
+    WrAuxiliaryListsDescriptor aux_descriptor,
+    uint8_t* aux_data,
+    size_t aux_size)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_clear_root_display_list(WrAPI* api,
+    WrEpoch epoch,
+    WrPipelineId pipeline_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_generate_frame(WrAPI* api)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_send_external_event(WrAPI* api,
+    size_t evt)
+WR_DESTRUCTOR_SAFE_FUNC;
+
+WR_INLINE void
+wr_api_add_raw_font(WrAPI* api,
+    WrFontKey key,
+    uint8_t* font_buffer,
+    size_t buffer_size)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_delete_font(WrAPI* api,
+    WrFontKey key)
+WR_FUNC;
+
+WR_INLINE WrIdNamespace
+wr_api_get_namespace(WrAPI* api)
+WR_FUNC;
+
+WR_INLINE WrState*
+wr_state_new(WrPipelineId pipeline_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_state_delete(WrState* state)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_begin(WrState* state,
+    uint32_t width,
+    uint32_t height)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_end(WrState* state)
+WR_FUNC;
+
+WR_INLINE WrClipRegion
+wr_dp_new_clip_region(WrState* state,
+    WrRect main,
+    const WrComplexClipRegion* complex,
+    size_t complex_count,
+    const WrImageMask* image_mask)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_stacking_context(WrState* state,
+    WrRect bounds,
+    float opacity,
+    WrMatrix transform,
+    WrMixBlendMode mix_blend_mode)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_pop_stacking_context(WrState* state)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_scroll_layer(WrState* state,
+    WrRect bounds,
+    WrRect overflow,
+    const WrImageMask* mask)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_pop_scroll_layer(WrState* state)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_iframe(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrPipelineId pipeline_id)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_rect(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrColor color)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_image(WrState* state,
+    WrRect bounds,
+    WrClipRegion clip,
+    WrSize stretch_size,
+    WrSize tile_spacing,
+    WrImageRendering image_rendering,
+    WrImageKey key)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_text(WrState* state,
+    WrRect bounds,
+    WrClipRegion clip,
+    WrColor color,
+    WrFontKey font_key,
+    const WrGlyphInstance* glyphs,
+    uint32_t glyph_count,
+    float glyph_size)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_border(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrBorderWidths widths,
+    WrBorderSide top,
+    WrBorderSide right,
+    WrBorderSide bottom,
+    WrBorderSide left,
+    WrBorderRadius radius)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_border_image(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrBorderWidths widths,
+    WrImageKey image,
+    WrNinePatchDescriptor patch,
+    WrSideOffsets2Df32 outset,
+    WrRepeatMode repeat_horizontal,
+    WrRepeatMode repeat_vertical)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_border_gradient(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrBorderWidths widths,
+    WrPoint start_point,
+    WrPoint end_point,
+    const WrGradientStop* stops,
+    size_t stops_count,
+    WrGradientExtendMode extend_mode,
+    WrSideOffsets2Df32 outset)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_border_radial_gradient(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrBorderWidths widths,
+    WrPoint center,
+    WrSize radius,
+    const WrGradientStop* stops,
+    size_t stops_count,
+    WrGradientExtendMode extend_mode,
+    WrSideOffsets2Df32 outset)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_linear_gradient(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrPoint start_point,
+    WrPoint end_point,
+    const WrGradientStop* stops,
+    size_t stops_count,
+    WrGradientExtendMode extend_mode)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_radial_gradient(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrPoint center,
+    WrSize radius,
+    const WrGradientStop* stops,
+    size_t stops_count,
+    WrGradientExtendMode extend_mode)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_box_shadow(WrState* state,
+    WrRect rect,
+    WrClipRegion clip,
+    WrRect box_bounds,
+    WrPoint offset,
+    WrColor color,
+    float blur_radius,
+    float spread_radius,
+    float border_radius,
+    WrBoxShadowClipMode clip_mode)
+WR_FUNC;
+
+WR_INLINE void
+wr_api_finalize_builder(WrState* state,
+    WrBuiltDisplayListDescriptor* dl_descriptor,
+    WrVecU8* dl_data,
+    WrAuxiliaryListsDescriptor* aux_descriptor,
+    WrVecU8* aux_data)
+WR_FUNC;
+
+WR_INLINE void
+wr_dp_push_built_display_list(WrState* state,
+    WrBuiltDisplayListDescriptor dl_descriptor,
+    WrVecU8 dl_data,
+    WrAuxiliaryListsDescriptor aux_descriptor,
+    WrVecU8 aux_data)
+WR_FUNC;
+
+/* THIS FILE IS GENERATED! DO NOT MODIFY MANUALLY! See https://github.com/jrmuizel/wr-binding! */