forked from KolibriOS/kolibrios
Kolibri Native UI for NSFB - much faster and stable! But without keyboard yet
git-svn-id: svn://kolibrios.org@3621 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
7736817a6a
commit
67a60882fd
41
programs/network/netsurf/include/cursor.h
Normal file
41
programs/network/netsurf/include/cursor.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the *internal* interface for the cursor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CURSOR_H
|
||||||
|
#define CURSOR_H 1
|
||||||
|
|
||||||
|
struct nsfb_cursor_s {
|
||||||
|
bool plotted;
|
||||||
|
nsfb_bbox_t loc;
|
||||||
|
|
||||||
|
/* current cursor image */
|
||||||
|
const nsfb_colour_t *pixel;
|
||||||
|
int bmp_width;
|
||||||
|
int bmp_height;
|
||||||
|
int bmp_stride;
|
||||||
|
int hotspot_x;
|
||||||
|
int hotspot_y;
|
||||||
|
|
||||||
|
/* current saved image */
|
||||||
|
nsfb_bbox_t savloc;
|
||||||
|
nsfb_colour_t *sav;
|
||||||
|
int sav_size;
|
||||||
|
int sav_width;
|
||||||
|
int sav_height;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Plot the cursor saving the image underneath. */
|
||||||
|
bool nsfb_cursor_plot(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
|
||||||
|
|
||||||
|
/** Clear the cursor restoring the image underneath */
|
||||||
|
bool nsfb_cursor_clear(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
|
||||||
|
|
||||||
|
#endif /* CURSOR_H */
|
112
programs/network/netsurf/include/libnsbmp.h
Normal file
112
programs/network/netsurf/include/libnsbmp.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006 Richard Wilson <richard.wilson@netsurf-browser.org>
|
||||||
|
* Copyright 2008 Sean Fox <dyntryx@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of NetSurf's libnsbmp, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* BMP file decoding (interface).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef libnsbmp_h_
|
||||||
|
#define libnsbmp_h_
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* bmp flags */
|
||||||
|
#define BMP_NEW 0
|
||||||
|
#define BMP_OPAQUE (1 << 0) /** image is opaque (as opposed to having an alpha mask) */
|
||||||
|
#define BMP_CLEAR_MEMORY (1 << 1) /** memory should be wiped */
|
||||||
|
|
||||||
|
/* error return values */
|
||||||
|
typedef enum {
|
||||||
|
BMP_OK = 0,
|
||||||
|
BMP_INSUFFICIENT_MEMORY = 1,
|
||||||
|
BMP_INSUFFICIENT_DATA = 2,
|
||||||
|
BMP_DATA_ERROR = 3
|
||||||
|
} bmp_result;
|
||||||
|
|
||||||
|
/* encoding types */
|
||||||
|
typedef enum {
|
||||||
|
BMP_ENCODING_RGB = 0,
|
||||||
|
BMP_ENCODING_RLE8 = 1,
|
||||||
|
BMP_ENCODING_RLE4 = 2,
|
||||||
|
BMP_ENCODING_BITFIELDS = 3
|
||||||
|
} bmp_encoding;
|
||||||
|
|
||||||
|
/* API for Bitmap callbacks
|
||||||
|
*/
|
||||||
|
typedef void* (*bmp_bitmap_cb_create)(int width, int height, unsigned int state);
|
||||||
|
typedef void (*bmp_bitmap_cb_destroy)(void *bitmap);
|
||||||
|
typedef unsigned char* (*bmp_bitmap_cb_get_buffer)(void *bitmap);
|
||||||
|
typedef size_t (*bmp_bitmap_cb_get_bpp)(void *bitmap);
|
||||||
|
|
||||||
|
/* The Bitmap callbacks function table
|
||||||
|
*/
|
||||||
|
typedef struct bmp_bitmap_callback_vt_s {
|
||||||
|
bmp_bitmap_cb_create bitmap_create; /**< Create a bitmap. */
|
||||||
|
bmp_bitmap_cb_destroy bitmap_destroy; /**< Free a bitmap. */
|
||||||
|
bmp_bitmap_cb_get_buffer bitmap_get_buffer; /**< Return a pointer to the pixel data in a bitmap. */
|
||||||
|
bmp_bitmap_cb_get_bpp bitmap_get_bpp; /**< Find the width of a pixel row in bytes. */
|
||||||
|
} bmp_bitmap_callback_vt;
|
||||||
|
|
||||||
|
typedef struct bmp_image {
|
||||||
|
bmp_bitmap_callback_vt bitmap_callbacks; /**< callbacks for bitmap functions */
|
||||||
|
uint8_t *bmp_data; /** pointer to BMP data */
|
||||||
|
uint32_t width; /** width of BMP (valid after _analyse) */
|
||||||
|
uint32_t height; /** heigth of BMP (valid after _analyse) */
|
||||||
|
bool decoded; /** whether the image has been decoded */
|
||||||
|
void *bitmap; /** decoded image */
|
||||||
|
/** Internal members are listed below
|
||||||
|
*/
|
||||||
|
uint32_t buffer_size; /** total number of bytes of BMP data available */
|
||||||
|
bmp_encoding encoding; /** pixel encoding type */
|
||||||
|
uint32_t bitmap_offset; /** offset of bitmap data */
|
||||||
|
uint16_t bpp; /** bits per pixel */
|
||||||
|
uint32_t colours; /** number of colours */
|
||||||
|
uint32_t *colour_table; /** colour table */
|
||||||
|
bool limited_trans; /** whether to use bmp's limited transparency */
|
||||||
|
uint32_t trans_colour; /** colour to display for "transparent" pixels when
|
||||||
|
* using limited transparency */
|
||||||
|
bool reversed; /** scanlines are top to bottom */
|
||||||
|
bool ico; /** image is part of an ICO, mask follows */
|
||||||
|
bool opaque; /** true if the bitmap does not contain an alpha channel */
|
||||||
|
uint32_t mask[4]; /** four bitwise mask */
|
||||||
|
int32_t shift[4]; /** four bitwise shifts */
|
||||||
|
uint32_t transparent_index; /** colour representing "transparency" in the bitmap */
|
||||||
|
} bmp_image;
|
||||||
|
|
||||||
|
typedef struct ico_image {
|
||||||
|
bmp_image bmp;
|
||||||
|
struct ico_image *next;
|
||||||
|
} ico_image;
|
||||||
|
|
||||||
|
typedef struct ico_collection {
|
||||||
|
bmp_bitmap_callback_vt bitmap_callbacks; /**< callbacks for bitmap functions */
|
||||||
|
uint16_t width; /** width of largest BMP */
|
||||||
|
uint16_t height; /** heigth of largest BMP */
|
||||||
|
/** Internal members are listed below
|
||||||
|
*/
|
||||||
|
uint8_t *ico_data; /** pointer to ICO data */
|
||||||
|
uint32_t buffer_size; /** total number of bytes of ICO data available */
|
||||||
|
ico_image *first;
|
||||||
|
} ico_collection;
|
||||||
|
|
||||||
|
void bmp_create(bmp_image *bmp, bmp_bitmap_callback_vt *bitmap_callbacks);
|
||||||
|
void ico_collection_create(ico_collection *ico,
|
||||||
|
bmp_bitmap_callback_vt *bitmap_callbacks);
|
||||||
|
bmp_result bmp_analyse(bmp_image *bmp, size_t size, uint8_t *data);
|
||||||
|
bmp_result bmp_decode(bmp_image *bmp);
|
||||||
|
bmp_result bmp_decode_trans(bmp_image *bmp, uint32_t transparent_colour);
|
||||||
|
void bmp_finalise(bmp_image *bmp);
|
||||||
|
|
||||||
|
bmp_result ico_analyse(ico_collection *ico, size_t size, uint8_t *data);
|
||||||
|
bmp_image *ico_find(ico_collection *ico, uint16_t width, uint16_t height);
|
||||||
|
void ico_finalise(ico_collection *ico);
|
||||||
|
|
||||||
|
#endif
|
161
programs/network/netsurf/include/libnsfb.h
Normal file
161
programs/network/netsurf/include/libnsfb.h
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the exported interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSFB_H
|
||||||
|
#define _LIBNSFB_H 1
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct nsfb_palette_s nsfb_palette_t;
|
||||||
|
typedef struct nsfb_cursor_s nsfb_cursor_t;
|
||||||
|
typedef struct nsfb_s nsfb_t;
|
||||||
|
typedef struct nsfb_event_s nsfb_event_t;
|
||||||
|
|
||||||
|
/** co-ordinate for plotting operations */
|
||||||
|
typedef struct nsfb_point_s {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
} nsfb_point_t;
|
||||||
|
|
||||||
|
/** bounding box for plotting operations */
|
||||||
|
typedef struct nsfb_bbox_s {
|
||||||
|
int x0;
|
||||||
|
int y0;
|
||||||
|
int x1;
|
||||||
|
int y1;
|
||||||
|
} nsfb_bbox_t;
|
||||||
|
|
||||||
|
/** The type of framebuffer surface. */
|
||||||
|
enum nsfb_type_e {
|
||||||
|
NSFB_SURFACE_NONE = 0, /**< No surface */
|
||||||
|
NSFB_SURFACE_RAM, /**< RAM surface */
|
||||||
|
NSFB_SURFACE_SDL, /**< SDL surface */
|
||||||
|
NSFB_SURFACE_LINUX, /**< Linux framebuffer surface */
|
||||||
|
NSFB_SURFACE_VNC, /**< VNC surface */
|
||||||
|
NSFB_SURFACE_ABLE, /**< ABLE framebuffer surface */
|
||||||
|
NSFB_SURFACE_X, /**< X windows surface */
|
||||||
|
NSFB_SURFACE_KOLIBRI
|
||||||
|
};
|
||||||
|
|
||||||
|
enum nsfb_format_e {
|
||||||
|
NSFB_FMT_ANY = 0, /* No specific format - use surface default */
|
||||||
|
NSFB_FMT_XBGR8888, /* 32bpp Blue Green Red */
|
||||||
|
NSFB_FMT_XRGB8888, /* 32bpp Red Green Blue */
|
||||||
|
NSFB_FMT_ABGR8888, /* 32bpp Alpga Blue Green Red */
|
||||||
|
NSFB_FMT_ARGB8888, /* 32bpp Alpga Red Green Blue */
|
||||||
|
NSFB_FMT_RGB888, /* 24 bpp Alpga Red Green Blue */
|
||||||
|
NSFB_FMT_ARGB1555, /* 16 bpp 555 */
|
||||||
|
NSFB_FMT_RGB565, /* 16 bpp 565 */
|
||||||
|
NSFB_FMT_I8, /* 8bpp indexed */
|
||||||
|
NSFB_FMT_I4, /* 4bpp indexed */
|
||||||
|
NSFB_FMT_I1, /* black and white */
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Select frontend type from a name.
|
||||||
|
*
|
||||||
|
* @param name The name to select a frontend.
|
||||||
|
* @return The surface type or NSFB_SURFACE_NONE if frontend with specified
|
||||||
|
* name was not available
|
||||||
|
*/
|
||||||
|
enum nsfb_type_e nsfb_type_from_name(const char *name);
|
||||||
|
|
||||||
|
/** Create a nsfb context.
|
||||||
|
*
|
||||||
|
* This creates a framebuffer surface context.
|
||||||
|
*
|
||||||
|
* @param surface_type The type of surface to create a context for.
|
||||||
|
*/
|
||||||
|
nsfb_t *nsfb_new(const enum nsfb_type_e surface_type);
|
||||||
|
|
||||||
|
/** Initialise selected surface context.
|
||||||
|
*
|
||||||
|
* @param nsfb The context returned from ::nsfb_init
|
||||||
|
*/
|
||||||
|
int nsfb_init(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/** Free nsfb context.
|
||||||
|
*
|
||||||
|
* This shuts down and releases all resources associated with an nsfb context.
|
||||||
|
*
|
||||||
|
* @param nsfb The context returned from ::nsfb_new to free
|
||||||
|
*/
|
||||||
|
int nsfb_free(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/** Claim an area of screen to be redrawn.
|
||||||
|
*
|
||||||
|
* Informs the nsfb library that an area of screen will be directly
|
||||||
|
* updated by the user program. This is neccisarry so the library can
|
||||||
|
* ensure the soft cursor plotting is correctly handled. After the
|
||||||
|
* update has been perfomed ::nsfb_update should be called.
|
||||||
|
*
|
||||||
|
* @param box The bounding box of the area which might be altered.
|
||||||
|
*/
|
||||||
|
int nsfb_claim(nsfb_t *nsfb, nsfb_bbox_t *box);
|
||||||
|
|
||||||
|
/** Update an area of screen which has been redrawn.
|
||||||
|
*
|
||||||
|
* Informs the nsfb library that an area of screen has been directly
|
||||||
|
* updated by the user program. Some surfaces only show the update on
|
||||||
|
* notification. The area updated does not neccisarrily have to
|
||||||
|
* corelate with a previous ::nsfb_claim bounding box, however if the
|
||||||
|
* redrawn area is larger than the claimed area pointer plotting
|
||||||
|
* artifacts may occour.
|
||||||
|
*
|
||||||
|
* @param box The bounding box of the area which has been altered.
|
||||||
|
*/
|
||||||
|
int nsfb_update(nsfb_t *nsfb, nsfb_bbox_t *box);
|
||||||
|
|
||||||
|
/** Obtain the geometry of a nsfb context.
|
||||||
|
*
|
||||||
|
* @param width a variable to store the framebuffer width in or NULL
|
||||||
|
* @param height a variable to store the framebuffer height in or NULL
|
||||||
|
* @param format a variable to store the framebuffer format in or NULL
|
||||||
|
*/
|
||||||
|
int nsfb_get_geometry(nsfb_t *nsfb, int *width, int *height, enum nsfb_format_e *format);
|
||||||
|
|
||||||
|
/** Alter the geometry of a surface
|
||||||
|
*
|
||||||
|
* @param nsfb The context to alter.
|
||||||
|
* @param width The new display width.
|
||||||
|
* @param height The new display height.
|
||||||
|
* @param format The desired surface format.
|
||||||
|
*/
|
||||||
|
int nsfb_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format);
|
||||||
|
|
||||||
|
/** Set parameters a surface
|
||||||
|
*
|
||||||
|
* Some surface types can take additional parameters for
|
||||||
|
* attributes. For example the linux surface uses this to allow the
|
||||||
|
* setting of a different output device
|
||||||
|
*
|
||||||
|
* @param nsfb The surface to alter.
|
||||||
|
* @param parameters The parameters for the surface.
|
||||||
|
*/
|
||||||
|
int nsfb_set_parameters(nsfb_t *nsfb, const char *parameters);
|
||||||
|
|
||||||
|
/** Obtain the buffer memory base and stride.
|
||||||
|
*
|
||||||
|
* @param nsfb The context to read.
|
||||||
|
*/
|
||||||
|
int nsfb_get_buffer(nsfb_t *nsfb, uint8_t **ptr, int *linelen);
|
||||||
|
|
||||||
|
/** Dump the surface to fd in PPM format
|
||||||
|
*/
|
||||||
|
bool nsfb_dump(nsfb_t *nsfb, int fd);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* tab-width: 8
|
||||||
|
* End:
|
||||||
|
*/
|
48
programs/network/netsurf/include/libnsfb_cursor.h
Normal file
48
programs/network/netsurf/include/libnsfb_cursor.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the exported interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSFB_CURSOR_H
|
||||||
|
#define _LIBNSFB_CURSOR_H 1
|
||||||
|
|
||||||
|
/** Initialise the cursor.
|
||||||
|
*/
|
||||||
|
bool nsfb_cursor_init(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/** Set cursor parameters.
|
||||||
|
*
|
||||||
|
* Set a cursor bitmap, the cursor will be shown at the location set by
|
||||||
|
* nsfb_cursor_loc_set. The pixel data may be referenced untill the cursor
|
||||||
|
* is altered or cleared
|
||||||
|
*
|
||||||
|
* @param nsfb The frambuffer context
|
||||||
|
* @param pixel The cursor bitmap data
|
||||||
|
* @param bmp_width The width of the cursor bitmap
|
||||||
|
* @param bmp_height The height of the cursor bitmap
|
||||||
|
* @param bmp_stride The cursor bitmap's row stride
|
||||||
|
* @param hotspot_x Coordinate within cursor image to place over cursor loc
|
||||||
|
* @param hotspot_y Coordinate within cursor image to place over cursor loc
|
||||||
|
*
|
||||||
|
* (hot_spot_x, hot_spot_y) is from top left. (0, 0) means top left pixel of
|
||||||
|
* cursor bitmap is to be rendered over the cursor location.
|
||||||
|
*/
|
||||||
|
bool nsfb_cursor_set(nsfb_t *nsfb, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, int hotspot_x, int hotspot_y);
|
||||||
|
|
||||||
|
/** Set cursor location.
|
||||||
|
*
|
||||||
|
* @param nsfb The frambuffer context.
|
||||||
|
* @param loc The location of the cursor
|
||||||
|
*/
|
||||||
|
bool nsfb_cursor_loc_set(nsfb_t *nsfb, const nsfb_bbox_t *loc);
|
||||||
|
|
||||||
|
/** get the cursor location */
|
||||||
|
bool nsfb_cursor_loc_get(nsfb_t *nsfb, nsfb_bbox_t *loc);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
219
programs/network/netsurf/include/libnsfb_event.h
Normal file
219
programs/network/netsurf/include/libnsfb_event.h
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the exported interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSFB_EVENT_H
|
||||||
|
#define _LIBNSFB_EVENT_H 1
|
||||||
|
|
||||||
|
enum nsfb_event_type_e {
|
||||||
|
NSFB_EVENT_NONE,
|
||||||
|
NSFB_EVENT_CONTROL,
|
||||||
|
NSFB_EVENT_KEY_DOWN,
|
||||||
|
NSFB_EVENT_KEY_UP,
|
||||||
|
NSFB_EVENT_MOVE_RELATIVE,
|
||||||
|
NSFB_EVENT_MOVE_ABSOLUTE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** keycodes which mostly map to ascii chars */
|
||||||
|
enum nsfb_key_code_e {
|
||||||
|
NSFB_KEY_UNKNOWN = 0,
|
||||||
|
NSFB_KEY_BACKSPACE = 8,
|
||||||
|
NSFB_KEY_TAB = 9,
|
||||||
|
NSFB_KEY_LF = 10,
|
||||||
|
NSFB_KEY_CLEAR = 12,
|
||||||
|
NSFB_KEY_RETURN = 13,
|
||||||
|
NSFB_KEY_PAUSE = 19,
|
||||||
|
NSFB_KEY_ESCAPE = 27,
|
||||||
|
NSFB_KEY_SPACE = 32,
|
||||||
|
NSFB_KEY_EXCLAIM = 33,
|
||||||
|
NSFB_KEY_QUOTEDBL = 34,
|
||||||
|
NSFB_KEY_HASH = 35,
|
||||||
|
NSFB_KEY_DOLLAR = 36,
|
||||||
|
NSFB_KEY_AMPERSAND = 38,
|
||||||
|
NSFB_KEY_QUOTE = 39,
|
||||||
|
NSFB_KEY_LEFTPAREN = 40,
|
||||||
|
NSFB_KEY_RIGHTPAREN = 41,
|
||||||
|
NSFB_KEY_ASTERISK = 42,
|
||||||
|
NSFB_KEY_PLUS = 43,
|
||||||
|
NSFB_KEY_COMMA = 44,
|
||||||
|
NSFB_KEY_MINUS = 45,
|
||||||
|
NSFB_KEY_PERIOD = 46,
|
||||||
|
NSFB_KEY_SLASH = 47,
|
||||||
|
NSFB_KEY_0 = 48,
|
||||||
|
NSFB_KEY_1 = 49,
|
||||||
|
NSFB_KEY_2 = 50,
|
||||||
|
NSFB_KEY_3 = 51,
|
||||||
|
NSFB_KEY_4 = 52,
|
||||||
|
NSFB_KEY_5 = 53,
|
||||||
|
NSFB_KEY_6 = 54,
|
||||||
|
NSFB_KEY_7 = 55,
|
||||||
|
NSFB_KEY_8 = 56,
|
||||||
|
NSFB_KEY_9 = 57,
|
||||||
|
NSFB_KEY_COLON = 58,
|
||||||
|
NSFB_KEY_SEMICOLON = 59,
|
||||||
|
NSFB_KEY_LESS = 60,
|
||||||
|
NSFB_KEY_EQUALS = 61,
|
||||||
|
NSFB_KEY_GREATER = 62,
|
||||||
|
NSFB_KEY_QUESTION = 63,
|
||||||
|
NSFB_KEY_AT = 64,
|
||||||
|
NSFB_KEY_LEFTBRACKET = 91,
|
||||||
|
NSFB_KEY_BACKSLASH = 92,
|
||||||
|
NSFB_KEY_RIGHTBRACKET = 93,
|
||||||
|
NSFB_KEY_CARET = 94,
|
||||||
|
NSFB_KEY_UNDERSCORE = 95,
|
||||||
|
NSFB_KEY_BACKQUOTE = 96,
|
||||||
|
NSFB_KEY_a = 97,
|
||||||
|
NSFB_KEY_b = 98,
|
||||||
|
NSFB_KEY_c = 99,
|
||||||
|
NSFB_KEY_d = 100,
|
||||||
|
NSFB_KEY_e = 101,
|
||||||
|
NSFB_KEY_f = 102,
|
||||||
|
NSFB_KEY_g = 103,
|
||||||
|
NSFB_KEY_h = 104,
|
||||||
|
NSFB_KEY_i = 105,
|
||||||
|
NSFB_KEY_j = 106,
|
||||||
|
NSFB_KEY_k = 107,
|
||||||
|
NSFB_KEY_l = 108,
|
||||||
|
NSFB_KEY_m = 109,
|
||||||
|
NSFB_KEY_n = 110,
|
||||||
|
NSFB_KEY_o = 111,
|
||||||
|
NSFB_KEY_p = 112,
|
||||||
|
NSFB_KEY_q = 113,
|
||||||
|
NSFB_KEY_r = 114,
|
||||||
|
NSFB_KEY_s = 115,
|
||||||
|
NSFB_KEY_t = 116,
|
||||||
|
NSFB_KEY_u = 117,
|
||||||
|
NSFB_KEY_v = 118,
|
||||||
|
NSFB_KEY_w = 119,
|
||||||
|
NSFB_KEY_x = 120,
|
||||||
|
NSFB_KEY_y = 121,
|
||||||
|
NSFB_KEY_z = 122,
|
||||||
|
NSFB_KEY_DELETE = 127,
|
||||||
|
|
||||||
|
NSFB_KEY_KP0 = 256,
|
||||||
|
NSFB_KEY_KP1 = 257,
|
||||||
|
NSFB_KEY_KP2 = 258,
|
||||||
|
NSFB_KEY_KP3 = 259,
|
||||||
|
NSFB_KEY_KP4 = 260,
|
||||||
|
NSFB_KEY_KP5 = 261,
|
||||||
|
NSFB_KEY_KP6 = 262,
|
||||||
|
NSFB_KEY_KP7 = 263,
|
||||||
|
NSFB_KEY_KP8 = 264,
|
||||||
|
NSFB_KEY_KP9 = 265,
|
||||||
|
NSFB_KEY_KP_PERIOD = 266,
|
||||||
|
NSFB_KEY_KP_DIVIDE = 267,
|
||||||
|
NSFB_KEY_KP_MULTIPLY = 268,
|
||||||
|
NSFB_KEY_KP_MINUS = 269,
|
||||||
|
NSFB_KEY_KP_PLUS = 270,
|
||||||
|
NSFB_KEY_KP_ENTER = 271,
|
||||||
|
NSFB_KEY_KP_EQUALS = 272,
|
||||||
|
|
||||||
|
NSFB_KEY_UP = 273,
|
||||||
|
NSFB_KEY_DOWN = 274,
|
||||||
|
NSFB_KEY_RIGHT = 275,
|
||||||
|
NSFB_KEY_LEFT = 276,
|
||||||
|
NSFB_KEY_INSERT = 277,
|
||||||
|
NSFB_KEY_HOME = 278,
|
||||||
|
NSFB_KEY_END = 279,
|
||||||
|
NSFB_KEY_PAGEUP = 280,
|
||||||
|
NSFB_KEY_PAGEDOWN = 281,
|
||||||
|
|
||||||
|
/* Function keys */
|
||||||
|
NSFB_KEY_F1 = 282,
|
||||||
|
NSFB_KEY_F2 = 283,
|
||||||
|
NSFB_KEY_F3 = 284,
|
||||||
|
NSFB_KEY_F4 = 285,
|
||||||
|
NSFB_KEY_F5 = 286,
|
||||||
|
NSFB_KEY_F6 = 287,
|
||||||
|
NSFB_KEY_F7 = 288,
|
||||||
|
NSFB_KEY_F8 = 289,
|
||||||
|
NSFB_KEY_F9 = 290,
|
||||||
|
NSFB_KEY_F10 = 291,
|
||||||
|
NSFB_KEY_F11 = 292,
|
||||||
|
NSFB_KEY_F12 = 293,
|
||||||
|
NSFB_KEY_F13 = 294,
|
||||||
|
NSFB_KEY_F14 = 295,
|
||||||
|
NSFB_KEY_F15 = 296,
|
||||||
|
|
||||||
|
/* Key state modifier keys */
|
||||||
|
NSFB_KEY_NUMLOCK = 300,
|
||||||
|
NSFB_KEY_CAPSLOCK = 301,
|
||||||
|
NSFB_KEY_SCROLLOCK = 302,
|
||||||
|
NSFB_KEY_RSHIFT = 303,
|
||||||
|
NSFB_KEY_LSHIFT = 304,
|
||||||
|
NSFB_KEY_RCTRL = 305,
|
||||||
|
NSFB_KEY_LCTRL = 306,
|
||||||
|
NSFB_KEY_RALT = 307,
|
||||||
|
NSFB_KEY_LALT = 308,
|
||||||
|
NSFB_KEY_RMETA = 309,
|
||||||
|
NSFB_KEY_LMETA = 310,
|
||||||
|
NSFB_KEY_LSUPER = 311,
|
||||||
|
NSFB_KEY_RSUPER = 312,
|
||||||
|
NSFB_KEY_MODE = 313,
|
||||||
|
NSFB_KEY_COMPOSE = 314,
|
||||||
|
|
||||||
|
/* Miscellaneous function keys */
|
||||||
|
NSFB_KEY_HELP = 315,
|
||||||
|
NSFB_KEY_PRINT = 316,
|
||||||
|
NSFB_KEY_SYSREQ = 317,
|
||||||
|
NSFB_KEY_BREAK = 318,
|
||||||
|
NSFB_KEY_MENU = 319,
|
||||||
|
NSFB_KEY_POWER = 320,
|
||||||
|
NSFB_KEY_EURO = 321,
|
||||||
|
NSFB_KEY_UNDO = 322,
|
||||||
|
|
||||||
|
/* mouse buttons */
|
||||||
|
NSFB_KEY_MOUSE_1 = 401,
|
||||||
|
NSFB_KEY_MOUSE_2 = 402,
|
||||||
|
NSFB_KEY_MOUSE_3 = 403,
|
||||||
|
NSFB_KEY_MOUSE_4 = 404,
|
||||||
|
NSFB_KEY_MOUSE_5 = 405,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
enum nsfb_control_e {
|
||||||
|
NSFB_CONTROL_NONE,
|
||||||
|
NSFB_CONTROL_TIMEOUT, /* timeout event */
|
||||||
|
NSFB_CONTROL_QUIT, /* surface handler quit event */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nsfb_event_s {
|
||||||
|
enum nsfb_event_type_e type;
|
||||||
|
union {
|
||||||
|
enum nsfb_key_code_e keycode;
|
||||||
|
enum nsfb_control_e controlcode;
|
||||||
|
struct {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int z;
|
||||||
|
} vector;
|
||||||
|
} value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Process input events.
|
||||||
|
*
|
||||||
|
* Gather events from a frontend.
|
||||||
|
*
|
||||||
|
* @param nsfb The library handle.
|
||||||
|
* @param event The event structure to fill.
|
||||||
|
* @param timeout The number of milliseconds to wait for input, -1 is wait
|
||||||
|
* forever, 0 returns immediately.
|
||||||
|
* @return If the /a event structure is updated true else false.
|
||||||
|
*/
|
||||||
|
bool nsfb_event(nsfb_t *nsfb, nsfb_event_t *event, int timeout);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* tab-width: 8
|
||||||
|
* End:
|
||||||
|
*/
|
169
programs/network/netsurf/include/libnsfb_plot.h
Normal file
169
programs/network/netsurf/include/libnsfb_plot.h
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the exported plotter interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSFB_PLOT_H
|
||||||
|
#define _LIBNSFB_PLOT_H 1
|
||||||
|
|
||||||
|
/** representation of a colour.
|
||||||
|
*
|
||||||
|
* The colour value comprises of four components arranged in the order ABGR:
|
||||||
|
* bits 24-31 are the alpha value and represent the opacity. 0 is
|
||||||
|
* transparent i.e. there would be no change in the target surface if
|
||||||
|
* this colour were to be used and 0xFF is opaque.
|
||||||
|
*
|
||||||
|
* bits 16-23 are the Blue component of the colour.
|
||||||
|
*
|
||||||
|
* bits 8-15 are the Green component of the colour.
|
||||||
|
*
|
||||||
|
* bits 0-7 are the Red component of the colour.
|
||||||
|
*/
|
||||||
|
typedef uint32_t nsfb_colour_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of plot operation
|
||||||
|
*/
|
||||||
|
typedef enum nsfb_plot_optype_e {
|
||||||
|
NFSB_PLOT_OPTYPE_NONE = 0, /**< No operation */
|
||||||
|
NFSB_PLOT_OPTYPE_SOLID, /**< Solid colour */
|
||||||
|
NFSB_PLOT_OPTYPE_PATTERN, /**< Pattern plot */
|
||||||
|
} nsfb_plot_optype_t;
|
||||||
|
|
||||||
|
/** pen colour and raster operation for plotting primatives. */
|
||||||
|
typedef struct nsfb_plot_pen_s {
|
||||||
|
nsfb_plot_optype_t stroke_type; /**< Stroke plot type */
|
||||||
|
int stroke_width; /**< Width of stroke, in pixels */
|
||||||
|
nsfb_colour_t stroke_colour; /**< Colour of stroke */
|
||||||
|
uint32_t stroke_pattern;
|
||||||
|
nsfb_plot_optype_t fill_type; /**< Fill plot type */
|
||||||
|
nsfb_colour_t fill_colour; /**< Colour of fill */
|
||||||
|
} nsfb_plot_pen_t;
|
||||||
|
|
||||||
|
/** path operation type. */
|
||||||
|
typedef enum nsfb_plot_pathop_type_e {
|
||||||
|
NFSB_PLOT_PATHOP_MOVE,
|
||||||
|
NFSB_PLOT_PATHOP_LINE,
|
||||||
|
NFSB_PLOT_PATHOP_QUAD,
|
||||||
|
NFSB_PLOT_PATHOP_CUBIC,
|
||||||
|
} nsfb_plot_pathop_type_t;
|
||||||
|
|
||||||
|
/** path element */
|
||||||
|
typedef struct nsfb_plot_pathop_s {
|
||||||
|
nsfb_plot_pathop_type_t operation;
|
||||||
|
nsfb_point_t point;
|
||||||
|
} nsfb_plot_pathop_t;
|
||||||
|
|
||||||
|
/** Sets a clip rectangle for subsequent plots.
|
||||||
|
*
|
||||||
|
* Sets a clipping area which constrains all subsequent plotting operations.
|
||||||
|
* The clipping area must lie within the framebuffer visible screen or false
|
||||||
|
* will be returned and the new clipping area not set.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_set_clip(nsfb_t *nsfb, nsfb_bbox_t *clip);
|
||||||
|
|
||||||
|
/** Get the previously set clipping region.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_get_clip(nsfb_t *nsfb, nsfb_bbox_t *clip);
|
||||||
|
|
||||||
|
/** Clears plotting area to a flat colour.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_clg(nsfb_t *nsfb, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots a rectangle outline.
|
||||||
|
*
|
||||||
|
* The line can be solid, dotted or dashed. Top left corner at (x0,y0) and
|
||||||
|
* rectangle has given width and height.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_rectangle(nsfb_t *nsfb, nsfb_bbox_t *rect, int line_width, nsfb_colour_t c, bool dotted, bool dashed);
|
||||||
|
|
||||||
|
/** Plots a filled rectangle. Top left corner at (x0,y0), bottom
|
||||||
|
* right corner at (x1,y1). Note: (x0,y0) is inside filled area,
|
||||||
|
* but (x1,y1) is below and to the right. See diagram below.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_rectangle_fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots a line.
|
||||||
|
*
|
||||||
|
* Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
|
||||||
|
* width/thickness.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_line(nsfb_t *nsfb, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** Plots a number of lines.
|
||||||
|
*
|
||||||
|
* Draw a series of lines.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_lines(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** Plots a number of connected lines.
|
||||||
|
*
|
||||||
|
* Draw a series of connected lines.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_polylines(nsfb_t *nsfb, int pointc, const nsfb_point_t *points, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** Plots a filled polygon.
|
||||||
|
*
|
||||||
|
* Plots a filled polygon with straight lines between points. The lines around
|
||||||
|
* the edge of the ploygon are not plotted. The polygon is filled with a
|
||||||
|
* non-zero winding rule.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t fill);
|
||||||
|
|
||||||
|
/** Plot an ellipse.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_ellipse(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plot a filled ellipse.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_ellipse_fill(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots an arc.
|
||||||
|
*
|
||||||
|
* around (x,y), from anticlockwise from angle1 to angle2. Angles are measured
|
||||||
|
* anticlockwise from horizontal, in degrees.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_arc(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots an alpha blended pixel.
|
||||||
|
*
|
||||||
|
* plots an alpha blended pixel.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c);
|
||||||
|
|
||||||
|
bool nsfb_plot_cubic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
bool nsfb_plot_quadratic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
bool nsfb_plot_path(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** copy an area of screen
|
||||||
|
*
|
||||||
|
* Copy an area of the display.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_copy(nsfb_t *srcfb, nsfb_bbox_t *srcbox, nsfb_t *dstfb, nsfb_bbox_t *dstbox);
|
||||||
|
|
||||||
|
/** Plot bitmap.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_bitmap(nsfb_t *nsfb, const nsfb_bbox_t *loc, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, bool alpha);
|
||||||
|
|
||||||
|
/** Plot an 8 bit glyph.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_glyph8(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
|
||||||
|
|
||||||
|
|
||||||
|
/** Plot an 1 bit glyph.
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_glyph1(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/* read rectangle into buffer */
|
||||||
|
bool nsfb_plot_readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer);
|
||||||
|
|
||||||
|
#endif /* _LIBNSFB_PLOT_H */
|
48
programs/network/netsurf/include/libnsfb_plot_util.h
Normal file
48
programs/network/netsurf/include/libnsfb_plot_util.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the exported interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSFB_PLOT_UTIL_H
|
||||||
|
#define _LIBNSFB_PLOT_UTIL_H 1
|
||||||
|
|
||||||
|
|
||||||
|
/* alpha blend two pixels together */
|
||||||
|
static inline nsfb_colour_t
|
||||||
|
nsfb_plot_ablend(nsfb_colour_t pixel, nsfb_colour_t scrpixel)
|
||||||
|
{
|
||||||
|
int opacity = pixel >> 24;
|
||||||
|
int transp = 0x100 - opacity;
|
||||||
|
uint32_t rb, g;
|
||||||
|
|
||||||
|
rb = ((pixel & 0xFF00FF) * opacity +
|
||||||
|
(scrpixel & 0xFF00FF) * transp) >> 8;
|
||||||
|
g = ((pixel & 0x00FF00) * opacity +
|
||||||
|
(scrpixel & 0x00FF00) * transp) >> 8;
|
||||||
|
|
||||||
|
return (rb & 0xFF00FF) | (g & 0xFF00);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool nsfb_plot_clip(const nsfb_bbox_t * clip, nsfb_bbox_t * rect);
|
||||||
|
|
||||||
|
bool nsfb_plot_clip_ctx(nsfb_t *nsfb, nsfb_bbox_t * rect);
|
||||||
|
|
||||||
|
bool nsfb_plot_clip_line(const nsfb_bbox_t * clip, nsfb_bbox_t * line);
|
||||||
|
|
||||||
|
bool nsfb_plot_clip_line_ctx(nsfb_t *nsfb, nsfb_bbox_t * line);
|
||||||
|
|
||||||
|
/** Obtain a bounding box which is the superset of two source boxes.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool nsfb_plot_add_rect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2, nsfb_bbox_t *result);
|
||||||
|
|
||||||
|
/** Find if two boxes intersect. */
|
||||||
|
bool nsfb_plot_bbox_intersect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2);
|
||||||
|
|
||||||
|
#endif /* _LIBNSFB_PLOT_UTIL_H */
|
108
programs/network/netsurf/include/libnsgif.h
Normal file
108
programs/network/netsurf/include/libnsgif.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2004 Richard Wilson <richard.wilson@netsurf-browser.org>
|
||||||
|
* Copyright 2008 Sean Fox <dyntryx@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of NetSurf's libnsgif, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* Progressive animated GIF file decoding (interface).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBNSGIF_H_
|
||||||
|
#define _LIBNSGIF_H_
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/* Error return values
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
GIF_WORKING = 1,
|
||||||
|
GIF_OK = 0,
|
||||||
|
GIF_INSUFFICIENT_FRAME_DATA = -1,
|
||||||
|
GIF_FRAME_DATA_ERROR = -2,
|
||||||
|
GIF_INSUFFICIENT_DATA = -3,
|
||||||
|
GIF_DATA_ERROR = -4,
|
||||||
|
GIF_INSUFFICIENT_MEMORY = -5,
|
||||||
|
GIF_FRAME_NO_DISPLAY = -6,
|
||||||
|
GIF_END_OF_FRAME = -7
|
||||||
|
} gif_result;
|
||||||
|
|
||||||
|
/* The GIF frame data
|
||||||
|
*/
|
||||||
|
typedef struct gif_frame {
|
||||||
|
bool display; /**< whether the frame should be displayed/animated */
|
||||||
|
unsigned int frame_delay; /**< delay (in cs) before animating the frame */
|
||||||
|
/** Internal members are listed below
|
||||||
|
*/
|
||||||
|
unsigned int frame_pointer; /**< offset (in bytes) to the GIF frame data */
|
||||||
|
bool virgin; /**< whether the frame has previously been used */
|
||||||
|
bool opaque; /**< whether the frame is totally opaque */
|
||||||
|
bool redraw_required; /**< whether a forcable screen redraw is required */
|
||||||
|
unsigned char disposal_method; /**< how the previous frame should be disposed; affects plotting */
|
||||||
|
bool transparency; /**< whether we acknoledge transparency */
|
||||||
|
unsigned char transparency_index; /**< the index designating a transparent pixel */
|
||||||
|
unsigned int redraw_x; /**< x co-ordinate of redraw rectangle */
|
||||||
|
unsigned int redraw_y; /**< y co-ordinate of redraw rectangle */
|
||||||
|
unsigned int redraw_width; /**< width of redraw rectangle */
|
||||||
|
unsigned int redraw_height; /**< height of redraw rectangle */
|
||||||
|
} gif_frame;
|
||||||
|
|
||||||
|
/* API for Bitmap callbacks
|
||||||
|
*/
|
||||||
|
typedef void* (*gif_bitmap_cb_create)(int width, int height);
|
||||||
|
typedef void (*gif_bitmap_cb_destroy)(void *bitmap);
|
||||||
|
typedef unsigned char* (*gif_bitmap_cb_get_buffer)(void *bitmap);
|
||||||
|
typedef void (*gif_bitmap_cb_set_opaque)(void *bitmap, bool opaque);
|
||||||
|
typedef bool (*gif_bitmap_cb_test_opaque)(void *bitmap);
|
||||||
|
typedef void (*gif_bitmap_cb_modified)(void *bitmap);
|
||||||
|
|
||||||
|
/* The Bitmap callbacks function table
|
||||||
|
*/
|
||||||
|
typedef struct gif_bitmap_callback_vt {
|
||||||
|
gif_bitmap_cb_create bitmap_create; /**< Create a bitmap. */
|
||||||
|
gif_bitmap_cb_destroy bitmap_destroy; /**< Free a bitmap. */
|
||||||
|
gif_bitmap_cb_get_buffer bitmap_get_buffer; /**< Return a pointer to the pixel data in a bitmap. */
|
||||||
|
/** Members below are optional
|
||||||
|
*/
|
||||||
|
gif_bitmap_cb_set_opaque bitmap_set_opaque; /**< Sets whether a bitmap should be plotted opaque. */
|
||||||
|
gif_bitmap_cb_test_opaque bitmap_test_opaque; /**< Tests whether a bitmap has an opaque alpha channel. */
|
||||||
|
gif_bitmap_cb_modified bitmap_modified; /**< The bitmap image has changed, so flush any persistant cache. */
|
||||||
|
} gif_bitmap_callback_vt;
|
||||||
|
|
||||||
|
/* The GIF animation data
|
||||||
|
*/
|
||||||
|
typedef struct gif_animation {
|
||||||
|
gif_bitmap_callback_vt bitmap_callbacks; /**< callbacks for bitmap functions */
|
||||||
|
unsigned char *gif_data; /**< pointer to GIF data */
|
||||||
|
unsigned int width; /**< width of GIF (may increase during decoding) */
|
||||||
|
unsigned int height; /**< heigth of GIF (may increase during decoding) */
|
||||||
|
unsigned int frame_count; /**< number of frames decoded */
|
||||||
|
unsigned int frame_count_partial; /**< number of frames partially decoded */
|
||||||
|
gif_frame *frames; /**< decoded frames */
|
||||||
|
int decoded_frame; /**< current frame decoded to bitmap */
|
||||||
|
void *frame_image; /**< currently decoded image; stored as bitmap from bitmap_create callback */
|
||||||
|
int loop_count; /**< number of times to loop animation */
|
||||||
|
gif_result current_error; /**< current error type, or 0 for none*/
|
||||||
|
/** Internal members are listed below
|
||||||
|
*/
|
||||||
|
unsigned int buffer_position; /**< current index into GIF data */
|
||||||
|
unsigned int buffer_size; /**< total number of bytes of GIF data available */
|
||||||
|
unsigned int frame_holders; /**< current number of frame holders */
|
||||||
|
unsigned int background_index; /**< index in the colour table for the background colour */
|
||||||
|
unsigned int aspect_ratio; /**< image aspect ratio (ignored) */
|
||||||
|
unsigned int colour_table_size; /**< size of colour table (in entries) */
|
||||||
|
bool global_colours; /**< whether the GIF has a global colour table */
|
||||||
|
unsigned int *global_colour_table; /**< global colour table */
|
||||||
|
unsigned int *local_colour_table; /**< local colour table */
|
||||||
|
} gif_animation;
|
||||||
|
|
||||||
|
void gif_create(gif_animation *gif, gif_bitmap_callback_vt *bitmap_callbacks);
|
||||||
|
gif_result gif_initialise(gif_animation *gif, size_t size, unsigned char *data);
|
||||||
|
gif_result gif_decode_frame(gif_animation *gif, unsigned int frame);
|
||||||
|
void gif_finalise(gif_animation *gif);
|
||||||
|
|
||||||
|
#endif
|
49
programs/network/netsurf/include/nsfb.h
Normal file
49
programs/network/netsurf/include/nsfb.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the internal interface for the libnsfb graphics library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NSFB_H
|
||||||
|
#define _NSFB_H 1
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
/** NS Framebuffer context
|
||||||
|
*/
|
||||||
|
struct nsfb_s {
|
||||||
|
int width; /**< Visible width. */
|
||||||
|
int height; /**< Visible height. */
|
||||||
|
|
||||||
|
char *parameters;
|
||||||
|
|
||||||
|
enum nsfb_format_e format; /**< Framebuffer format */
|
||||||
|
int bpp; /**< Bits per pixel - distinct from format */
|
||||||
|
|
||||||
|
uint8_t *ptr; /**< Base of video memory. */
|
||||||
|
int linelen; /**< length of a video line. */
|
||||||
|
|
||||||
|
struct nsfb_palette_s *palette; /**< palette for index modes */
|
||||||
|
nsfb_cursor_t *cursor; /**< cursor */
|
||||||
|
|
||||||
|
struct nsfb_surface_rtns_s *surface_rtns; /**< surface routines. */
|
||||||
|
void *surface_priv; /**< surface opaque data. */
|
||||||
|
|
||||||
|
nsfb_bbox_t clip; /**< current clipping rectangle for plotters */
|
||||||
|
struct nsfb_plotter_fns_s *plotter_fns; /**< Plotter methods */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* tab-width: 8
|
||||||
|
* End:
|
||||||
|
*/
|
231
programs/network/netsurf/include/palette.h
Normal file
231
programs/network/netsurf/include/palette.h
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 Michael Drake <tlsa@netsurf-browser.org>
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* This is the *internal* interface for the cursor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PALETTE_H
|
||||||
|
#define PALETTE_H 1
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "libnsfb.h"
|
||||||
|
#include "libnsfb_plot.h"
|
||||||
|
|
||||||
|
enum nsfb_palette_type_e {
|
||||||
|
NSFB_PALETTE_EMPTY, /**< empty palette object */
|
||||||
|
NSFB_PALETTE_NSFB_8BPP, /**< libnsfb's own 8bpp palette */
|
||||||
|
NSFB_PALETTE_OTHER /**< any other palette */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nsfb_palette_s {
|
||||||
|
enum nsfb_palette_type_e type; /**< Palette type */
|
||||||
|
uint8_t last; /**< Last used palette index */
|
||||||
|
nsfb_colour_t data[256]; /**< Palette for index modes */
|
||||||
|
|
||||||
|
bool dither; /**< Whether to use error diffusion */
|
||||||
|
struct {
|
||||||
|
int width; /**< Length of error value buffer ring*/
|
||||||
|
int current; /**< Current pos in ring buffer*/
|
||||||
|
int *data; /**< Ring buffer error values */
|
||||||
|
int data_len; /**< Max size of ring */
|
||||||
|
} dither_ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Create an empty palette object. */
|
||||||
|
bool nsfb_palette_new(struct nsfb_palette_s **palette, int width);
|
||||||
|
|
||||||
|
/** Free a palette object. */
|
||||||
|
void nsfb_palette_free(struct nsfb_palette_s *palette);
|
||||||
|
|
||||||
|
/** Init error diffusion for a plot. */
|
||||||
|
void nsfb_palette_dither_init(struct nsfb_palette_s *palette, int width);
|
||||||
|
|
||||||
|
/** Finalise error diffusion after a plot. */
|
||||||
|
void nsfb_palette_dither_fini(struct nsfb_palette_s *palette);
|
||||||
|
|
||||||
|
/** Generate libnsfb 8bpp default palette. */
|
||||||
|
void nsfb_palette_generate_nsfb_8bpp(struct nsfb_palette_s *palette);
|
||||||
|
|
||||||
|
/** Find best palette match for given colour. */
|
||||||
|
static inline uint8_t nsfb_palette_best_match(struct nsfb_palette_s *palette,
|
||||||
|
nsfb_colour_t c, int *r_error, int *g_error, int *b_error)
|
||||||
|
{
|
||||||
|
uint8_t best_col = 0;
|
||||||
|
|
||||||
|
nsfb_colour_t palent;
|
||||||
|
int col;
|
||||||
|
int dr, dg, db; /* delta red, green blue values */
|
||||||
|
|
||||||
|
int cur_distance;
|
||||||
|
int best_distance = INT_MAX;
|
||||||
|
|
||||||
|
switch (palette->type) {
|
||||||
|
case NSFB_PALETTE_NSFB_8BPP:
|
||||||
|
/* Index into colour cube part */
|
||||||
|
dr = ((( c & 0xFF) * 5) + 128) / 256;
|
||||||
|
dg = ((((c >> 8) & 0xFF) * 7) + 128) / 256;
|
||||||
|
db = ((((c >> 16) & 0xFF) * 4) + 128) / 256;
|
||||||
|
col = 40 * dr + 5 * dg + db;
|
||||||
|
|
||||||
|
palent = palette->data[col];
|
||||||
|
dr = ( c & 0xFF) - ( palent & 0xFF);
|
||||||
|
dg = ((c >> 8) & 0xFF) - ((palent >> 8 ) & 0xFF);
|
||||||
|
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
|
||||||
|
cur_distance = (dr * dr) + (dg * dg) + (db * db);
|
||||||
|
|
||||||
|
best_col = col;
|
||||||
|
best_distance = cur_distance;
|
||||||
|
*r_error = dr;
|
||||||
|
*g_error = dg;
|
||||||
|
*b_error = db;
|
||||||
|
|
||||||
|
/* Index into grayscale part */
|
||||||
|
col = (( c & 0xFF) +
|
||||||
|
((c >> 8) & 0xFF) +
|
||||||
|
((c >> 16) & 0xFF) + (45 / 2)) / (15 * 3) - 1 + 240;
|
||||||
|
palent = palette->data[col];
|
||||||
|
|
||||||
|
dr = ( c & 0xFF) - ( palent & 0xFF);
|
||||||
|
dg = ((c >> 8) & 0xFF) - ((palent >> 8) & 0xFF);
|
||||||
|
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
|
||||||
|
cur_distance = (dr * dr) + (dg * dg) + (db * db);
|
||||||
|
if (cur_distance < best_distance) {
|
||||||
|
best_distance = cur_distance;
|
||||||
|
best_col = col;
|
||||||
|
*r_error = dr;
|
||||||
|
*g_error = dg;
|
||||||
|
*b_error = db;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSFB_PALETTE_OTHER:
|
||||||
|
/* Try all colours in palette */
|
||||||
|
for (col = 0; col <= palette->last; col++) {
|
||||||
|
palent = palette->data[col];
|
||||||
|
|
||||||
|
dr = ( c & 0xFF) - ( palent & 0xFF);
|
||||||
|
dg = ((c >> 8) & 0xFF) - ((palent >> 8) & 0xFF);
|
||||||
|
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
|
||||||
|
cur_distance = (dr * dr) + (dg * dg) + (db * db);
|
||||||
|
if (cur_distance < best_distance) {
|
||||||
|
best_distance = cur_distance;
|
||||||
|
best_col = col;
|
||||||
|
*r_error = dr;
|
||||||
|
*g_error = dg;
|
||||||
|
*b_error = db;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return best_col;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Find best palette match for given colour, with error diffusion. */
|
||||||
|
static inline uint8_t nsfb_palette_best_match_dither(
|
||||||
|
struct nsfb_palette_s *palette, nsfb_colour_t c)
|
||||||
|
{
|
||||||
|
int r, g, b;
|
||||||
|
int current;
|
||||||
|
int error;
|
||||||
|
int width = palette->dither_ctx.width;
|
||||||
|
uint8_t best_col_index;
|
||||||
|
|
||||||
|
if (palette == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (palette->dither == false)
|
||||||
|
return nsfb_palette_best_match(palette, c, &r, &g, &b);
|
||||||
|
|
||||||
|
current = palette->dither_ctx.current;
|
||||||
|
|
||||||
|
/* Get RGB components of colour, and apply error */
|
||||||
|
r = ( c & 0xFF) + palette->dither_ctx.data[current ];
|
||||||
|
g = ((c >> 8) & 0xFF) + palette->dither_ctx.data[current + 1];
|
||||||
|
b = ((c >> 16) & 0xFF) + palette->dither_ctx.data[current + 2];
|
||||||
|
|
||||||
|
/* Clamp new RGB components to range */
|
||||||
|
if (r < 0) r = 0;
|
||||||
|
if (r > 255) r = 255;
|
||||||
|
if (g < 0) g = 0;
|
||||||
|
if (g > 255) g = 255;
|
||||||
|
if (b < 0) b = 0;
|
||||||
|
if (b > 255) b = 255;
|
||||||
|
|
||||||
|
/* Reset error diffusion slots to 0 */
|
||||||
|
palette->dither_ctx.data[current ] = 0;
|
||||||
|
palette->dither_ctx.data[current + 1] = 0;
|
||||||
|
palette->dither_ctx.data[current + 2] = 0;
|
||||||
|
|
||||||
|
/* Rebuild colour from modified components */
|
||||||
|
c = r + (g << 8) + (b << 16);
|
||||||
|
|
||||||
|
/* Get best match for pixel, and find errors for each component */
|
||||||
|
best_col_index = nsfb_palette_best_match(palette, c, &r, &g, &b);
|
||||||
|
|
||||||
|
/* Advance one set of error diffusion slots */
|
||||||
|
current += 3;
|
||||||
|
if (current >= width)
|
||||||
|
current = 0;
|
||||||
|
palette->dither_ctx.current = current;
|
||||||
|
|
||||||
|
/* Save errors
|
||||||
|
*
|
||||||
|
* [*]-[N]
|
||||||
|
* / | \
|
||||||
|
* [l]-[m]-[r]
|
||||||
|
*/
|
||||||
|
error = current;
|
||||||
|
|
||||||
|
/* Error for [N] (next) */
|
||||||
|
if (error != 0) {
|
||||||
|
/* The pixel exists */
|
||||||
|
palette->dither_ctx.data[error ] += r * 7 / 16;
|
||||||
|
palette->dither_ctx.data[error + 1] += g * 7 / 16;
|
||||||
|
palette->dither_ctx.data[error + 2] += b * 7 / 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
error += width - 2 * 3;
|
||||||
|
if (error >= width)
|
||||||
|
error -= width;
|
||||||
|
/* Error for [l] (below, left) */
|
||||||
|
if (error >= 0 && error != 3) {
|
||||||
|
/* The pixel exists */
|
||||||
|
palette->dither_ctx.data[error ] += r * 3 / 16;
|
||||||
|
palette->dither_ctx.data[error + 1] += g * 3 / 16;
|
||||||
|
palette->dither_ctx.data[error + 2] += b * 3 / 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
error += 3;
|
||||||
|
if (error >= width)
|
||||||
|
error -= width;
|
||||||
|
/* Error for [m] (below, middle) */
|
||||||
|
palette->dither_ctx.data[error ] += r * 5 / 16;
|
||||||
|
palette->dither_ctx.data[error + 1] += g * 5 / 16;
|
||||||
|
palette->dither_ctx.data[error + 2] += b * 5 / 16;
|
||||||
|
|
||||||
|
error += 3;
|
||||||
|
if (error >= width)
|
||||||
|
error -= width;
|
||||||
|
/* Error for [r] (below, right) */
|
||||||
|
if (error != 0) {
|
||||||
|
/* The pixel exists */
|
||||||
|
palette->dither_ctx.data[error ] += r / 16;
|
||||||
|
palette->dither_ctx.data[error + 1] += g / 16;
|
||||||
|
palette->dither_ctx.data[error + 2] += b / 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
return best_col_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PALETTE_H */
|
124
programs/network/netsurf/include/plot.h
Normal file
124
programs/network/netsurf/include/plot.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/** Clears plotting area to a flat colour (if needed)
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_clg_t)(nsfb_t *nsfb, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots a rectangle outline. The line can be solid, dotted or
|
||||||
|
* dashed. Top left corner at (x0,y0) and rectangle has given
|
||||||
|
* width and height.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_rectangle_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, int line_width, nsfb_colour_t c, bool dotted, bool dashed);
|
||||||
|
|
||||||
|
/** Plots a line using a given pen.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_line_t)(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** Plots a filled polygon with straight lines between points.
|
||||||
|
* The lines around the edge of the ploygon are not plotted. The
|
||||||
|
* polygon is filled with the non-zero winding rule.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_polygon_t)(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t fill);
|
||||||
|
|
||||||
|
/** Plots a filled rectangle. Top left corner at (x0,y0), bottom
|
||||||
|
* right corner at (x1,y1). Note: (x0,y0) is inside filled area,
|
||||||
|
* but (x1,y1) is below and to the right. See diagram below.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_fill_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Clipping operations.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_clip_t)(nsfb_t *nsfb, nsfb_bbox_t *clip);
|
||||||
|
|
||||||
|
/** Plots an arc, around (x,y), from anticlockwise from angle1 to
|
||||||
|
* angle2. Angles are measured anticlockwise from horizontal, in
|
||||||
|
* degrees.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_arc_t)(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plots a point.
|
||||||
|
*
|
||||||
|
* Plot a single alpha blended pixel.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_point_t)(nsfb_t *nsfb, int x, int y, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plot an ellipse.
|
||||||
|
*
|
||||||
|
* plot an ellipse outline, note if teh bounding box is square this will plot a
|
||||||
|
* circle.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_ellipse_t)(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Plot a filled ellipse.
|
||||||
|
*
|
||||||
|
* plot a filled ellipse, note if the bounding box is square this will plot a
|
||||||
|
* circle.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_ellipse_fill_t)(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
|
||||||
|
|
||||||
|
|
||||||
|
/** Plot bitmap
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_bitmap_t)(nsfb_t *nsfb, const nsfb_bbox_t *loc, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, bool alpha);
|
||||||
|
|
||||||
|
|
||||||
|
/** Copy an area of screen
|
||||||
|
*
|
||||||
|
* Copy an area of the display.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_copy_t)(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox);
|
||||||
|
|
||||||
|
|
||||||
|
/** Plot an 8 bit per pixel glyph.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_glyph8_t)(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
|
||||||
|
|
||||||
|
|
||||||
|
/** Plot an 1 bit per pixel glyph.
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_glyph1_t)(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
|
||||||
|
|
||||||
|
/** Read rectangle of screen into buffer
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_readrect_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer);
|
||||||
|
|
||||||
|
/** Plot quadratic bezier spline
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_quadratic_bezier_t)(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** Plot cubic bezier spline
|
||||||
|
*/
|
||||||
|
typedef bool (nsfb_plotfn_cubic_bezier_t)(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
typedef bool (nsfb_plotfn_polylines_t)(nsfb_t *nsfb, int pointc, const nsfb_point_t *points, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** plot path */
|
||||||
|
typedef bool (nsfb_plotfn_path_t)(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen);
|
||||||
|
|
||||||
|
/** plotter function table. */
|
||||||
|
typedef struct nsfb_plotter_fns_s {
|
||||||
|
nsfb_plotfn_clg_t *clg;
|
||||||
|
nsfb_plotfn_rectangle_t *rectangle;
|
||||||
|
nsfb_plotfn_line_t *line;
|
||||||
|
nsfb_plotfn_polygon_t *polygon;
|
||||||
|
nsfb_plotfn_fill_t *fill;
|
||||||
|
nsfb_plotfn_clip_t *get_clip;
|
||||||
|
nsfb_plotfn_clip_t *set_clip;
|
||||||
|
nsfb_plotfn_ellipse_t *ellipse;
|
||||||
|
nsfb_plotfn_ellipse_fill_t *ellipse_fill;
|
||||||
|
nsfb_plotfn_arc_t *arc;
|
||||||
|
nsfb_plotfn_bitmap_t *bitmap;
|
||||||
|
nsfb_plotfn_point_t *point;
|
||||||
|
nsfb_plotfn_copy_t *copy;
|
||||||
|
nsfb_plotfn_glyph8_t *glyph8;
|
||||||
|
nsfb_plotfn_glyph1_t *glyph1;
|
||||||
|
nsfb_plotfn_readrect_t *readrect;
|
||||||
|
nsfb_plotfn_quadratic_bezier_t *quadratic;
|
||||||
|
nsfb_plotfn_cubic_bezier_t *cubic;
|
||||||
|
nsfb_plotfn_path_t *path;
|
||||||
|
nsfb_plotfn_polylines_t *polylines;
|
||||||
|
} nsfb_plotter_fns_t;
|
||||||
|
|
||||||
|
|
||||||
|
bool select_plotters(nsfb_t *nsfb);
|
||||||
|
|
65
programs/network/netsurf/include/surface.h
Normal file
65
programs/network/netsurf/include/surface.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/* libnsfb framebuffer surface support */
|
||||||
|
|
||||||
|
#include "libnsfb.h"
|
||||||
|
#include "libnsfb_plot.h"
|
||||||
|
#include "nsfb.h"
|
||||||
|
|
||||||
|
/* surface default options */
|
||||||
|
typedef int (nsfb_surfacefn_defaults_t)(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/* surface init */
|
||||||
|
typedef int (nsfb_surfacefn_init_t)(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/* surface finalise */
|
||||||
|
typedef int (nsfb_surfacefn_fini_t)(nsfb_t *nsfb);
|
||||||
|
|
||||||
|
/* surface set geometry */
|
||||||
|
typedef int (nsfb_surfacefn_geometry_t)(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format);
|
||||||
|
|
||||||
|
/* surface set parameters */
|
||||||
|
typedef int (nsfb_surfacefn_parameters_t)(nsfb_t *nsfb, const char *parameters);
|
||||||
|
|
||||||
|
/* surface input */
|
||||||
|
typedef bool (nsfb_surfacefn_input_t)(nsfb_t *nsfb, nsfb_event_t *event, int timeout);
|
||||||
|
|
||||||
|
/* surface area claim */
|
||||||
|
typedef int (nsfb_surfacefn_claim_t)(nsfb_t *nsfb, nsfb_bbox_t *box);
|
||||||
|
|
||||||
|
/* surface area update */
|
||||||
|
typedef int (nsfb_surfacefn_update_t)(nsfb_t *nsfb, nsfb_bbox_t *box);
|
||||||
|
|
||||||
|
/* surface cursor display */
|
||||||
|
typedef int (nsfb_surfacefn_cursor_t)(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
|
||||||
|
|
||||||
|
typedef struct nsfb_surface_rtns_s {
|
||||||
|
nsfb_surfacefn_defaults_t *defaults;
|
||||||
|
nsfb_surfacefn_init_t *initialise;
|
||||||
|
nsfb_surfacefn_fini_t *finalise;
|
||||||
|
nsfb_surfacefn_geometry_t *geometry;
|
||||||
|
nsfb_surfacefn_parameters_t *parameters;
|
||||||
|
nsfb_surfacefn_input_t *input;
|
||||||
|
nsfb_surfacefn_claim_t *claim;
|
||||||
|
nsfb_surfacefn_update_t *update;
|
||||||
|
nsfb_surfacefn_cursor_t *cursor;
|
||||||
|
} nsfb_surface_rtns_t;
|
||||||
|
|
||||||
|
void _nsfb_register_surface(const enum nsfb_type_e type, const nsfb_surface_rtns_t *rtns, const char *name);
|
||||||
|
|
||||||
|
|
||||||
|
/* macro which adds a builtin command with no argument limits */
|
||||||
|
#define NSFB_SURFACE_DEF(__name, __type, __rtns) \
|
||||||
|
static void __name##_register_surface(void) __attribute__((constructor)); \
|
||||||
|
void __name##_register_surface(void) { \
|
||||||
|
_nsfb_register_surface(__type, __rtns, #__name); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Obtain routines for a surface
|
||||||
|
*
|
||||||
|
* Obtain a vlist of methods for a surface type.
|
||||||
|
*
|
||||||
|
* @param type The surface type.
|
||||||
|
* @return A vtable of routines which teh caller must deallocate or
|
||||||
|
* NULL on error
|
||||||
|
*/
|
||||||
|
nsfb_surface_rtns_t *nsfb_surface_get_rtns(enum nsfb_type_e type);
|
||||||
|
|
@ -40,7 +40,8 @@ enum nsfb_type_e {
|
|||||||
NSFB_SURFACE_LINUX, /**< Linux framebuffer surface */
|
NSFB_SURFACE_LINUX, /**< Linux framebuffer surface */
|
||||||
NSFB_SURFACE_VNC, /**< VNC surface */
|
NSFB_SURFACE_VNC, /**< VNC surface */
|
||||||
NSFB_SURFACE_ABLE, /**< ABLE framebuffer surface */
|
NSFB_SURFACE_ABLE, /**< ABLE framebuffer surface */
|
||||||
NSFB_SURFACE_X /**< X windows surface */
|
NSFB_SURFACE_X, /**< X windows surface */
|
||||||
|
NSFB_SURFACE_KOLIBRI
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nsfb_format_e {
|
enum nsfb_format_e {
|
||||||
|
383
programs/network/netsurf/libnsfb/src/surface/kolibri.c
Normal file
383
programs/network/netsurf/libnsfb/src/surface/kolibri.c
Normal file
@ -0,0 +1,383 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 SoUrcerer sourcerer@bk.ru
|
||||||
|
*
|
||||||
|
* This file is part of libnsfb, http://www.netsurf-browser.org/
|
||||||
|
* Licenced under the MIT License,
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "libnsfb.h"
|
||||||
|
#include "libnsfb_event.h"
|
||||||
|
#include "libnsfb_plot.h"
|
||||||
|
#include "libnsfb_plot_util.h"
|
||||||
|
|
||||||
|
#include "nsfb.h"
|
||||||
|
#include "surface.h"
|
||||||
|
#include "palette.h"
|
||||||
|
#include "plot.h"
|
||||||
|
#include "cursor.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <menuet/os.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char * pixels;
|
||||||
|
|
||||||
|
inline void f65(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
|
||||||
|
{
|
||||||
|
asm("pusha");
|
||||||
|
asm ("nop"::"D"(0), "c"(w*65536+h), "d"(x*65536+y), "b"(d));
|
||||||
|
asm ("xor %eax, %eax");
|
||||||
|
asm ("movl %eax, %ebp");
|
||||||
|
asm ("pushl $32");
|
||||||
|
asm ("popl %esi");
|
||||||
|
asm ("int $0x40"::"a"(65));
|
||||||
|
asm("popa");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void kolibri_redraw(nsfb_t *nsfb){
|
||||||
|
|
||||||
|
__menuet__window_redraw(1);
|
||||||
|
__menuet__define_window(100,100,nsfb->width,nsfb->height,0x43000080,0x800000FF,0x000080);
|
||||||
|
__menuet__write_text(3,3,0xFFFFFF,"Netsurf",7);
|
||||||
|
__menuet__debug_out("f65 is mighty!\n");
|
||||||
|
|
||||||
|
//here put image pixels! it's 32bpp
|
||||||
|
f65(0,0, nsfb->width, nsfb->height, pixels);
|
||||||
|
__menuet__window_redraw(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
kolibricopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
|
||||||
|
{
|
||||||
|
|
||||||
|
char *pixels = nsfb->surface_priv;
|
||||||
|
nsfb_bbox_t allbox;
|
||||||
|
struct nsfb_cursor_s *cursor = nsfb->cursor;
|
||||||
|
|
||||||
|
nsfb_plot_add_rect(srcbox, dstbox, &allbox);
|
||||||
|
|
||||||
|
int x,y,w,h;
|
||||||
|
x = srcbox->x0;
|
||||||
|
y = srcbox->y0;
|
||||||
|
w = srcbox->x1 - srcbox->x0;
|
||||||
|
h = srcbox->y1 - srcbox->y0;
|
||||||
|
|
||||||
|
int tx, ty, tw, th;
|
||||||
|
|
||||||
|
tx = dstbox->x0;
|
||||||
|
ty = dstbox->y0;
|
||||||
|
tw = dstbox->x1 - dstbox->x0;
|
||||||
|
th = dstbox->y1 - dstbox->y0;
|
||||||
|
|
||||||
|
char pst[255];
|
||||||
|
sprintf (pst, "Src %d,%d %dx%d Dst %d,%d %dx%d \n", x,y,w,h,tx,ty,tw,th);
|
||||||
|
__menuet__debug_out(pst);
|
||||||
|
|
||||||
|
int px, py, pp;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (px=x; px<w; px++)
|
||||||
|
for (py=y;py<h;py++)
|
||||||
|
for (pp=0; pp<4; pp++) {
|
||||||
|
|
||||||
|
pixels[4*(px+tx)*nsfb->width+4*(py+ty)+pp]=pixels[4*px*nsfb->width+4*py+pp];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
kolibri_redraw(nsfb);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kolibri_set_geometry(nsfb_t *nsfb, int width, int height,
|
||||||
|
enum nsfb_format_e format)
|
||||||
|
{
|
||||||
|
if (nsfb->surface_priv != NULL)
|
||||||
|
return -1; /* fail if surface already initialised */
|
||||||
|
|
||||||
|
nsfb->width = width;
|
||||||
|
nsfb->height = height;
|
||||||
|
nsfb->format = format;
|
||||||
|
|
||||||
|
pixels=(char *)malloc(width*height*4);
|
||||||
|
|
||||||
|
/* select default sw plotters for format */
|
||||||
|
select_plotters(nsfb);
|
||||||
|
|
||||||
|
//nsfb->plotter_fns->copy = kolibricopy;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
unsigned pz, pb;
|
||||||
|
|
||||||
|
static int kolibri_initialise(nsfb_t *nsfb)
|
||||||
|
{
|
||||||
|
enum nsfb_format_e fmt;
|
||||||
|
|
||||||
|
pz=0;
|
||||||
|
pb=0;
|
||||||
|
|
||||||
|
__menuet__debug_out("Start UI\n");
|
||||||
|
|
||||||
|
if (nsfb->surface_priv != NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* sanity checked depth. */
|
||||||
|
if ((nsfb->bpp != 32) ) {
|
||||||
|
|
||||||
|
__menuet__debug_out("Wrong bpp\n");
|
||||||
|
return -1; }
|
||||||
|
|
||||||
|
|
||||||
|
fmt = NSFB_FMT_XRGB8888;
|
||||||
|
|
||||||
|
/* If we didn't get what we asked for, reselect plotters */
|
||||||
|
if (nsfb->format != fmt) {
|
||||||
|
nsfb->format = fmt;
|
||||||
|
|
||||||
|
if (kolibri_set_geometry(nsfb, nsfb->width, nsfb->height,
|
||||||
|
nsfb->format) != 0) {
|
||||||
|
|
||||||
|
__menuet__debug_out("can't set geometry\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsfb->surface_priv = pixels;
|
||||||
|
|
||||||
|
nsfb->ptr = pixels;
|
||||||
|
nsfb->linelen = (nsfb->width * nsfb->bpp) / 8;
|
||||||
|
|
||||||
|
__menuet__debug_out("Redraw\n");
|
||||||
|
kolibri_redraw(nsfb);
|
||||||
|
|
||||||
|
__menuet__set_bitfield_for_wanted_events(EVENT_REDRAW|EVENT_KEY|EVENT_BUTTON|EVENT_MOUSE_CHANGE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int kolibri_finalise(nsfb_t *nsfb)
|
||||||
|
{
|
||||||
|
nsfb=nsfb;
|
||||||
|
__menuet__sys_exit();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned kol_mouse_posw()
|
||||||
|
{
|
||||||
|
unsigned error;
|
||||||
|
asm volatile ("int $0x40":"=a"(error):"a"(37), "b"(1));
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned kol_mouse_btn()
|
||||||
|
{
|
||||||
|
unsigned error;
|
||||||
|
asm volatile ("int $0x40":"=a"(error):"a"(37), "b"(2));
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static bool kolibri_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
|
||||||
|
{
|
||||||
|
int got_event;
|
||||||
|
|
||||||
|
|
||||||
|
nsfb = nsfb; /* unused */
|
||||||
|
|
||||||
|
got_event = __menuet__check_for_event();
|
||||||
|
|
||||||
|
if (got_event == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
event->type = NSFB_EVENT_NONE;
|
||||||
|
|
||||||
|
if (got_event==1) { //key pressed
|
||||||
|
kolibri_redraw(nsfb);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (got_event==2) { //key pressed
|
||||||
|
event->type = NSFB_EVENT_KEY_UP;
|
||||||
|
event->value.keycode = __menuet__getkey();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (got_event==3) { //key pressed
|
||||||
|
if (__menuet__get_button_id()==1) kolibri_finalise(nsfb);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (got_event==6) { //key pressed
|
||||||
|
unsigned z=kol_mouse_posw();
|
||||||
|
unsigned b=kol_mouse_btn();
|
||||||
|
|
||||||
|
|
||||||
|
if (pz!=z) {
|
||||||
|
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
|
||||||
|
event->value.vector.x = (z&0xffff0000)>>16; //sdlevent.motion.x;
|
||||||
|
event->value.vector.y = z&0xffff; //sdlevent.motion.y;
|
||||||
|
event->value.vector.z = 0;
|
||||||
|
pz=z;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (pb!=b) {
|
||||||
|
unsigned t=b&1;
|
||||||
|
if (t==0) {
|
||||||
|
event->type = NSFB_EVENT_KEY_UP;
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_1;
|
||||||
|
} else {
|
||||||
|
event->type = NSFB_EVENT_KEY_DOWN;
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_1;
|
||||||
|
}
|
||||||
|
pb=b;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
event->type = NSFB_EVENT_KEY_DOWN;
|
||||||
|
|
||||||
|
switch (sdlevent.button.button) {
|
||||||
|
|
||||||
|
case SDL_BUTTON_LEFT:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_BUTTON_MIDDLE:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_BUTTON_RIGHT:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
event->type = NSFB_EVENT_KEY_UP;
|
||||||
|
|
||||||
|
switch (sdlevent.button.button) {
|
||||||
|
|
||||||
|
case SDL_BUTTON_LEFT:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_BUTTON_MIDDLE:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_BUTTON_RIGHT:
|
||||||
|
event->value.keycode = NSFB_KEY_MOUSE_3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
|
||||||
|
event->value.vector.x = sdlevent.motion.x;
|
||||||
|
event->value.vector.y = sdlevent.motion.y;
|
||||||
|
event->value.vector.z = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_QUIT:
|
||||||
|
event->type = NSFB_EVENT_CONTROL;
|
||||||
|
event->value.controlcode = NSFB_CONTROL_QUIT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_USEREVENT:
|
||||||
|
event->type = NSFB_EVENT_CONTROL;
|
||||||
|
event->value.controlcode = NSFB_CONTROL_TIMEOUT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int kolibri_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if ((cursor != NULL) &&
|
||||||
|
(cursor->plotted == true) &&
|
||||||
|
(nsfb_plot_bbox_intersect(box, &cursor->loc))) {
|
||||||
|
nsfb_cursor_clear(nsfb, cursor);
|
||||||
|
} */
|
||||||
|
return 0; //stub yet
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kolibri_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
|
||||||
|
{
|
||||||
|
return true; //stub yet
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int kolibri_update(nsfb_t *nsfb, nsfb_bbox_t *box)
|
||||||
|
{
|
||||||
|
/*SDL_Surface *sdl_screen = nsfb->surface_priv;
|
||||||
|
struct nsfb_cursor_s *cursor = nsfb->cursor;
|
||||||
|
|
||||||
|
if ((cursor != NULL) &&
|
||||||
|
(cursor->plotted == false)) {
|
||||||
|
nsfb_cursor_plot(nsfb, cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UpdateRect(sdl_screen,
|
||||||
|
box->x0,
|
||||||
|
box->y0,
|
||||||
|
box->x1 - box->x0,
|
||||||
|
box->y1 - box->y0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Ask for window redraw here!
|
||||||
|
|
||||||
|
kolibri_redraw(nsfb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nsfb_surface_rtns_t kolibri_rtns = {
|
||||||
|
.initialise = kolibri_initialise,
|
||||||
|
.finalise = kolibri_finalise,
|
||||||
|
.input = kolibri_input,
|
||||||
|
.claim = kolibri_claim,
|
||||||
|
.update = kolibri_update,
|
||||||
|
.cursor = kolibri_cursor,
|
||||||
|
.geometry = kolibri_set_geometry,
|
||||||
|
};
|
||||||
|
|
||||||
|
NSFB_SURFACE_DEF(kolibri, NSFB_SURFACE_KOLIBRI, &kolibri_rtns)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* c-basic-offset: 4
|
||||||
|
* tab-width: 8
|
||||||
|
* End:
|
||||||
|
*/
|
Loading…
Reference in New Issue
Block a user