Bug 1354944 - Plug in the generated FFI header. r=jrmuizel
authorKartikaya Gupta <kgupta@mozilla.com>
Tue, 11 Apr 2017 22:17:18 -0400
changeset 352935 199dd7c4179f444782894c0efcb061c89b986779
parent 352934 14070c4d46fd0add1276fc760bc2c457f5c83f5e
child 352936 ea2fd9bd8f7b7250de85c2401cdad1e8fffda69b
push id89185
push userkwierso@gmail.com
push dateFri, 14 Apr 2017 00:33:57 +0000
treeherdermozilla-inbound@945c45613592 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjrmuizel
bugs1354944
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1354944 - Plug in the generated FFI header. r=jrmuizel MozReview-Commit-ID: E6qlCffKH1s
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! */