summaryrefslogtreecommitdiffstats
path: root/common/canvas_base.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/canvas_base.c')
-rw-r--r--common/canvas_base.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/common/canvas_base.c b/common/canvas_base.c
index a5519ffc..2b8148d7 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -151,7 +151,10 @@ typedef struct QuicData {
jmp_buf jmp_env;
#ifndef CAIRO_CANVAS_NO_CHUNKS
ADDRESS next;
- ADDRESS address_delta;
+ get_virt_fn_t get_virt;
+ void *get_virt_opaque;
+ validate_virt_fn_t validate_virt;
+ void *validate_virt_opaque;
#endif
char message_buf[512];
} QuicData;
@@ -160,7 +163,6 @@ typedef struct CanvasBase {
uint32_t color_shift;
uint32_t color_mask;
QuicData quic_data;
- ADDRESS address_delta;
#ifdef CAIRO_CANVAS_ACCESS_TEST
unsigned long base;
unsigned long max;
@@ -256,7 +258,6 @@ static cairo_surface_t *canvas_get_quic(CanvasBase *canvas, QUICImage *image, in
tmp = (DataChunk **)image->quic.data;
chunk = *tmp;
quic_data->next = chunk->next;
- quic_data->address_delta = canvas->address_delta;
if (quic_decode_begin(quic_data->quic, (uint32_t *)chunk->data, chunk->size >> 2,
&type, &width, &height) == QUIC_ERROR) {
CANVAS_ERROR("quic decode begin failed");
@@ -1486,14 +1487,20 @@ static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_
{
QuicData *quic_data = (QuicData *)usr;
DataChunk *chunk;
+ uint32_t size;
if (!quic_data->next) {
return 0;
}
- chunk = (DataChunk *)GET_ADDRESS(quic_data->next + quic_data->address_delta);
+ chunk = (DataChunk *)quic_data->get_virt(quic_data->get_virt_opaque, quic_data->next,
+ sizeof(DataChunk));
+ size = chunk->size;
+ quic_data->validate_virt(quic_data->validate_virt_opaque, (unsigned long)chunk->data,
+ quic_data->next, size);
+
quic_data->next = chunk->next;
*io_ptr = (uint32_t *)chunk->data;
- return chunk->size >> 2;
+ return size >> 2;
}
#endif
@@ -1504,20 +1511,11 @@ static int quic_usr_more_lines(QuicUsrContext *usr, uint8_t **lines)
}
#ifdef CAIRO_CANVAS_ACCESS_TEST
-static void __canvas_set_access_params(CanvasBase *canvas, ADDRESS delta, unsigned long base,
- unsigned long max)
+static void __canvas_set_access_params(CanvasBase *canvas, unsigned long base, unsigned long max)
{
- canvas->address_delta = delta;
canvas->base = base;
canvas->max = max;
}
-
-#else
-static void __canvas_set_access_params(CanvasBase *canvas, ADDRESS delta)
-{
- canvas->address_delta = delta;
-}
-
#endif
static void canvas_base_destroy(CanvasBase *canvas)
@@ -1551,6 +1549,10 @@ static int canvas_base_init(CanvasBase *canvas, int depth
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
+#ifndef CAIRO_CANVAS_NO_CHUNKS
+ , void *get_virt_opaque, get_virt_fn_t get_virt,
+ void *validate_virt_opaque, validate_virt_fn_t validate_virt
+#endif
)
{
canvas->quic_data.usr.error = quic_usr_error;
@@ -1560,6 +1562,12 @@ static int canvas_base_init(CanvasBase *canvas, int depth
canvas->quic_data.usr.free = quic_usr_free;
canvas->quic_data.usr.more_space = quic_usr_more_space;
canvas->quic_data.usr.more_lines = quic_usr_more_lines;
+#ifndef CAIRO_CANVAS_NO_CHUNKS
+ canvas->quic_data.get_virt_opaque = get_virt_opaque;
+ canvas->quic_data.get_virt = get_virt;
+ canvas->quic_data.validate_virt_opaque = validate_virt_opaque;
+ canvas->quic_data.validate_virt = validate_virt;
+#endif
if (!(canvas->quic_data.quic = quic_create(&canvas->quic_data.usr))) {
return 0;
}