/* * This file is part of LibNSLayout * Licensed under the ISC License, http://opensource.org/licenses/ISC * Copyright 2015 Michael Drake * Copyright 2015 John-Mark Bell */ #ifndef nslayout_nslayout_h_ #define nslayout_nslayout_h_ #ifdef __cplusplus extern "C" { #endif #include #include /** An opaque client-owned replaced element */ typedef void nslayout_replaced; /** A rectangle */ typedef struct nslayout_rect { int x; int y; int w; int h; } nslayout_rect; /** Render list */ typedef struct nslayout_render_list { } nslayout_render_list; /** Render list */ typedef struct nslayout_layout nslayout_layout; /** * A LibNSLayout request * * Passed to the client via nslayout_callback */ typedef struct nslayout_request { /** Request type */ enum type { NSLAYOUT_GET_RESOURCE, NSLAYOUT_CREATE_REPLACED, NSLAYOUT_RENDER, NSLAYOUT_SET_EXTENTS, NSLAYOUT_GET_INTRINSIC_SIZE } type; /** Request's type-specific parameters */ union { struct { const char *url; /**< Absolute URL */ } get_resource; struct { dom_element *element; /**< DOM element */ } create_replaced; struct { nslayout_render_list *list; /**< Render list */ } render; struct { unsigned int width; /**< Document width in px */ unsigned int height; /**< Document height in px */ } set_extents; struct { nslayout_replaced *replaced; /** A replacement object */ } get_intrinsic_size; } request; /** Request's type-specific return values */ union { struct { nslayout_replaced **replaced; /** Replacement object */ } get_resource; struct { nslayout_replaced **replaced; /** Replacement object */ } create_replaced; struct { unsigned int *width; /** Replacement object's width */ unsigned int *height; /** Replacement object's height */ } get_intrinsic_size; } response; } nslayout_request; /** Libnslayout return codes */ typedef enum nslayout_error { NSLAYOUT_OK, NSLAYOUT_NO_MEM } nslayout_error; /** * Initialise LibNSLayout * * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_init(void); /** * Finalise LibNSLayout * * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_fini(void); /** * LibNSLayout client callback function * * \param req The request details. * \param layout The layout we're making a request for. * \param pw The client's private data for this layout. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ typedef nslayout_error (*nslayout_callback)( nslayout_request *req, nslayout_layout *layout, void *pw); /** * Create a Layout object for a given DOM * * \param doc The LibDOM document to build a layout for. * \param css_ctx The LibCSS selection context for the document. * \param media The LibCSS media to use when selecting for this layout. * \param cb The client's private data for this layout. * \param pw The client's private data for this layout. * \param layout Returns a pointer to the created layout object. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_layout_create( dom_document *doc, css_select_ctx *css_ctx, css_media_type *media, nslayout_callback cb, void *pw, nslayout_layout **layout); /** * Destroy a Layout object * * \param layout Returns a pointer to the created layout object. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_layout_destroy( nslayout_layout *layout); /** * Update the viewport for a layout * * Note: Before this is called, the layout engine will create internal * data structures for the document, but will not start to position * things and will not emit render lists. * * \param layout Layout to set viewport for. * \param viewport Viewport dimensions and offset. * \param scale Rendering scale. * \param dpi DPI of render target with viewport. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_update_viewport( nslayout_layout *layout, nslayout_rect *viewport, css_fixed scale, unsigned int dpi); /** * Find the top-most element at a given point, in terms of z-order. * * \param layout Layout to locate an element in. * \param element Updated to area with position relative to viewport. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_element_get_location( nslayout_layout *layout, nslayout_rect *area); /** * Find the top-most element at a given point, in terms of z-order. * * \param layout Layout to find an element in. * \param x Mouse x-coordinate (viewport relative). * \param y Mouse y-coordinate (viewport relative). * \param element Updated to point at the element we found. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_element_at_point( nslayout_layout *layout, unsigned int x, unsigned int y, dom_event_target **element); /** * Mark an element (or part of it) as needing redraw. * * \param layout Layout to indicate redraw is required for. * \param element Element to mark as needing redraw. * \param rel_area Area of element to redraw relative to object's top-left. * May be NULL, to redraw whole element. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_layout_dirty_element( nslayout_layout *layout, dom_element *element, nslayout_rect *rel_area); /** * Mark an area as needing redraw. * * \param layout Layout to indicate redraw is required for. * \param area Area to redraw relative to viewport's top-left. * \return NSLAYOUT_OK on success, appropriate error otherwise. */ nslayout_error nslayout_layout_dirty_area( nslayout_layout *layout, nslayout_rect *area); #ifdef __cplusplus } #endif #endif