Back to index

lightning-sunbird  0.9+nobinonly
Classes | Functions
cairo-array.c File Reference
#include "cairoint.h"

Go to the source code of this file.

Classes

struct  cairo_user_data_slot_t

Functions

void _cairo_array_init (cairo_array_t *array, int element_size)
void _cairo_array_fini (cairo_array_t *array)
cairo_status_t _cairo_array_grow_by (cairo_array_t *array, int additional)
void _cairo_array_truncate (cairo_array_t *array, int num_elements)
void_cairo_array_index (cairo_array_t *array, int index)
void _cairo_array_copy_element (cairo_array_t *array, int index, void *dst)
void_cairo_array_append (cairo_array_t *array, const void *elements, int num_elements)
int _cairo_array_num_elements (cairo_array_t *array)
void _cairo_user_data_array_init (cairo_user_data_array_t *array)
 _cairo_user_data_array_init: : a cairo_user_data_array_t
void _cairo_user_data_array_fini (cairo_user_data_array_t *array)
 _cairo_user_data_array_fini: : a cairo_user_data_array_t
void_cairo_user_data_array_get_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key)
 _cairo_user_data_array_get_data: : a cairo_user_data_array_t : the address of the cairo_user_data_key_t the user data was attached to
cairo_status_t _cairo_user_data_array_set_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy)
 _cairo_user_data_array_set_data: : a cairo_user_data_array_t : the address of a cairo_user_data_key_t to attach the user data to : the user data to attach : a cairo_destroy_func_t which will be called when the user data array is destroyed or when new user data is attached using the same key.

Class Documentation

struct cairo_user_data_slot_t

Definition at line 138 of file cairo-array.c.

Collaboration diagram for cairo_user_data_slot_t:
Class Members
cairo_destroy_func_t destroy
const cairo_user_data_key_t * key
void * user_data

Function Documentation

void* _cairo_array_append ( cairo_array_t *  array,
const void elements,
int  num_elements 
)

Definition at line 109 of file cairo-array.c.

{
    cairo_status_t status;
    void *dest;

    status = _cairo_array_grow_by (array, num_elements);
    if (status != CAIRO_STATUS_SUCCESS)
       return NULL;

    assert (array->num_elements + num_elements <= array->size);

    dest = &array->elements[array->num_elements * array->element_size];
    array->num_elements += num_elements;

    if (elements != NULL)
       memcpy (dest, elements, num_elements * array->element_size);

    return dest;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void _cairo_array_copy_element ( cairo_array_t *  array,
int  index,
void dst 
)

Definition at line 103 of file cairo-array.c.

{
    memcpy (dst, _cairo_array_index (array, index), array->element_size);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void _cairo_array_fini ( cairo_array_t *  array)

Definition at line 49 of file cairo-array.c.

{
    free (array->elements);
}

Here is the caller graph for this function:

cairo_status_t _cairo_array_grow_by ( cairo_array_t *  array,
int  additional 
)

Definition at line 55 of file cairo-array.c.

{
    char *new_elements;
    int old_size = array->size;
    int required_size = array->num_elements + additional;
    int new_size;

    if (required_size <= old_size)
       return CAIRO_STATUS_SUCCESS;

    if (old_size == 0)
       new_size = 1;
    else
       new_size = old_size * 2;

    while (new_size < required_size)
       new_size = new_size * 2;

    array->size = new_size;
    new_elements = realloc (array->elements,
                         array->size * array->element_size);

    if (new_elements == NULL) {
       array->size = old_size;
       return CAIRO_STATUS_NO_MEMORY;
    }

    array->elements = new_elements;

    return CAIRO_STATUS_SUCCESS;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void* _cairo_array_index ( cairo_array_t *  array,
int  index 
)

Definition at line 95 of file cairo-array.c.

{
    assert (0 <= index && index < array->num_elements);

    return (void *) &array->elements[index * array->element_size];
}

Here is the caller graph for this function:

void _cairo_array_init ( cairo_array_t *  array,
int  element_size 
)

Definition at line 40 of file cairo-array.c.

{
    array->size = 0;
    array->num_elements = 0;
    array->element_size = element_size;
    array->elements = NULL;
}

Here is the caller graph for this function:

int _cairo_array_num_elements ( cairo_array_t *  array)

Definition at line 131 of file cairo-array.c.

{
    return array->num_elements;
}

Here is the caller graph for this function:

void _cairo_array_truncate ( cairo_array_t *  array,
int  num_elements 
)

Definition at line 88 of file cairo-array.c.

{
    if (num_elements < array->num_elements)
       array->num_elements = num_elements;
}

Here is the caller graph for this function:

_cairo_user_data_array_fini: : a cairo_user_data_array_t

Destroys all current keys in the user data array and deallocates any memory allocated for the array itself.

Definition at line 167 of file cairo-array.c.

{
    int i, num_slots;
    cairo_user_data_slot_t *slots;

    num_slots = array->num_elements;
    slots = (cairo_user_data_slot_t *) array->elements;
    for (i = 0; i < num_slots; i++) {
       if (slots[i].user_data != NULL && slots[i].destroy != NULL)
           slots[i].destroy (slots[i].user_data);
    }

    _cairo_array_fini (array);
}

Here is the call graph for this function:

Here is the caller graph for this function:

_cairo_user_data_array_get_data: : a cairo_user_data_array_t : the address of the cairo_user_data_key_t the user data was attached to

Returns user data previously attached using the specified key. If no user data has been attached with the given key this function returns NULL.

Return value: the user data previously attached or NULL.

Definition at line 195 of file cairo-array.c.

{
    int i, num_slots;
    cairo_user_data_slot_t *slots;

    /* We allow this to support degenerate objects such as
     * cairo_image_surface_nil. */
    if (array == NULL)
       return NULL;

    num_slots = array->num_elements;
    slots = (cairo_user_data_slot_t *) array->elements;
    for (i = 0; i < num_slots; i++) {
       if (slots[i].key == key)
           return slots[i].user_data;
    }

    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

_cairo_user_data_array_init: : a cairo_user_data_array_t

Initializes a cairo_user_data_array_t structure for future use. After initialization, the array has no keys. Call _cairo_user_data_array_fini() to free any allocated memory when done using the array.

Definition at line 154 of file cairo-array.c.

Here is the call graph for this function:

Here is the caller graph for this function:

_cairo_user_data_array_set_data: : a cairo_user_data_array_t : the address of a cairo_user_data_key_t to attach the user data to : the user data to attach : a cairo_destroy_func_t which will be called when the user data array is destroyed or when new user data is attached using the same key.

Attaches user data to a user data array. To remove user data, call this function with the key that was used to set it and NULL for .

Return value: CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a slot could not be allocated for the user data.

Definition at line 233 of file cairo-array.c.

{
    int i, num_slots;
    cairo_user_data_slot_t *slots, *s;

    s = NULL;
    num_slots = array->num_elements;
    slots = (cairo_user_data_slot_t *) array->elements;
    for (i = 0; i < num_slots; i++) {
       if (slots[i].key == key) {
           if (slots[i].user_data != NULL && slots[i].destroy != NULL)
              slots[i].destroy (slots[i].user_data);
           s = &slots[i];
           break;
       }
       if (user_data && slots[i].user_data == NULL) {
           s = &slots[i];   /* Have to keep searching for an exact match */
       }
    }

    if (user_data == NULL) {
       if (s != NULL) {
           s->key = NULL;
           s->user_data = NULL;
           s->destroy = NULL;
       }

       return CAIRO_STATUS_SUCCESS;
       
    } else {
       if (s == NULL)
           s = _cairo_array_append (array, NULL, 1);
       if (s == NULL)
           return CAIRO_STATUS_NO_MEMORY;

       s->key = key;
       s->user_data = user_data;
       s->destroy = destroy;
    }

    return CAIRO_STATUS_SUCCESS;
}

Here is the call graph for this function:

Here is the caller graph for this function: