gsksltype: Add gsk_sl_type_get_index_stride()
This allows operations on GskSlValues that are arrays, because one can
just do code like:
data = gsk_sl_value_get_data (value);
stride = gsk_sl_value_get_index_stride (type);
for (i = 0; i < gsk_sl_value_get_length (type); i++)
{
do_stuff_with_data (data + i * stride);
}
This commit is contained in:
@@ -44,6 +44,7 @@ struct _GskSlTypeClass {
|
||||
const char * (* get_name) (const GskSlType *type);
|
||||
GskSlScalarType (* get_scalar_type) (const GskSlType *type);
|
||||
GskSlType * (* get_index_type) (const GskSlType *type);
|
||||
gsize (* get_index_stride) (const GskSlType *type);
|
||||
guint (* get_length) (const GskSlType *type);
|
||||
gsize (* get_size) (const GskSlType *type);
|
||||
gboolean (* can_convert) (const GskSlType *target,
|
||||
@@ -349,6 +350,12 @@ gsk_sl_type_scalar_get_index_type (const GskSlType *type)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gsize
|
||||
gsk_sl_type_scalar_get_index_stride (const GskSlType *type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static guint
|
||||
gsk_sl_type_scalar_get_length (const GskSlType *type)
|
||||
{
|
||||
@@ -472,6 +479,7 @@ static const GskSlTypeClass GSK_SL_TYPE_SCALAR = {
|
||||
gsk_sl_type_scalar_get_name,
|
||||
gsk_sl_type_scalar_get_scalar_type,
|
||||
gsk_sl_type_scalar_get_index_type,
|
||||
gsk_sl_type_scalar_get_index_stride,
|
||||
gsk_sl_type_scalar_get_length,
|
||||
gsk_sl_type_scalar_get_size,
|
||||
gsk_sl_type_scalar_can_convert,
|
||||
@@ -522,6 +530,14 @@ gsk_sl_type_vector_get_index_type (const GskSlType *type)
|
||||
return gsk_sl_type_get_scalar (vector->scalar);
|
||||
}
|
||||
|
||||
static gsize
|
||||
gsk_sl_type_vector_get_index_stride (const GskSlType *type)
|
||||
{
|
||||
const GskSlTypeVector *vector = (const GskSlTypeVector *) type;
|
||||
|
||||
return scalar_infos[vector->scalar].size;
|
||||
}
|
||||
|
||||
static guint
|
||||
gsk_sl_type_vector_get_length (const GskSlType *type)
|
||||
{
|
||||
@@ -636,6 +652,7 @@ static const GskSlTypeClass GSK_SL_TYPE_VECTOR = {
|
||||
gsk_sl_type_vector_get_name,
|
||||
gsk_sl_type_vector_get_scalar_type,
|
||||
gsk_sl_type_vector_get_index_type,
|
||||
gsk_sl_type_vector_get_index_stride,
|
||||
gsk_sl_type_vector_get_length,
|
||||
gsk_sl_type_vector_get_size,
|
||||
gsk_sl_type_vector_can_convert,
|
||||
@@ -687,6 +704,14 @@ gsk_sl_type_matrix_get_index_type (const GskSlType *type)
|
||||
return gsk_sl_type_get_vector (matrix->scalar, matrix->rows);
|
||||
}
|
||||
|
||||
static gsize
|
||||
gsk_sl_type_matrix_get_index_stride (const GskSlType *type)
|
||||
{
|
||||
const GskSlTypeMatrix *matrix = (const GskSlTypeMatrix *) type;
|
||||
|
||||
return scalar_infos[matrix->scalar].size * matrix->rows;
|
||||
}
|
||||
|
||||
static guint
|
||||
gsk_sl_type_matrix_get_length (const GskSlType *type)
|
||||
{
|
||||
@@ -802,6 +827,7 @@ static const GskSlTypeClass GSK_SL_TYPE_MATRIX = {
|
||||
gsk_sl_type_matrix_get_name,
|
||||
gsk_sl_type_matrix_get_scalar_type,
|
||||
gsk_sl_type_matrix_get_index_type,
|
||||
gsk_sl_type_matrix_get_index_stride,
|
||||
gsk_sl_type_matrix_get_length,
|
||||
gsk_sl_type_matrix_get_size,
|
||||
gsk_sl_type_matrix_can_convert,
|
||||
@@ -1124,6 +1150,12 @@ gsk_sl_type_get_index_type (const GskSlType *type)
|
||||
return type->class->get_index_type (type);
|
||||
}
|
||||
|
||||
gsize
|
||||
gsk_sl_type_get_index_stride (const GskSlType *type)
|
||||
{
|
||||
return type->class->get_index_stride (type);
|
||||
}
|
||||
|
||||
guint
|
||||
gsk_sl_type_get_length (const GskSlType *type)
|
||||
{
|
||||
|
||||
@@ -52,6 +52,7 @@ gboolean gsk_sl_type_is_matrix (const GskSlType
|
||||
const char * gsk_sl_type_get_name (const GskSlType *type);
|
||||
GskSlScalarType gsk_sl_type_get_scalar_type (const GskSlType *type);
|
||||
GskSlType * gsk_sl_type_get_index_type (const GskSlType *type);
|
||||
gsize gsk_sl_type_get_index_stride (const GskSlType *type);
|
||||
guint gsk_sl_type_get_length (const GskSlType *type);
|
||||
gsize gsk_sl_type_get_size (const GskSlType *type);
|
||||
gboolean gsk_sl_scalar_type_can_convert (GskSlScalarType target,
|
||||
|
||||
@@ -113,8 +113,8 @@ gsk_sl_value_new_convert (GskSlValue *source,
|
||||
result = gsk_sl_value_new (new_type);
|
||||
sdata = source->data;
|
||||
ddata = result->data;
|
||||
sstride = gsk_sl_type_get_size (source->type) / n;
|
||||
dstride = gsk_sl_type_get_size (new_type) / n;
|
||||
sstride = gsk_sl_type_get_index_stride (source->type);
|
||||
dstride = gsk_sl_type_get_index_stride (new_type);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
gsk_sl_scalar_type_convert_value (gsk_sl_type_get_scalar_type (new_type),
|
||||
|
||||
Reference in New Issue
Block a user