From 50ea9beacdd56354be76c441aa5828b1b7e72b93 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Tue, 19 May 2015 14:17:49 +0900 Subject: [PATCH] core: APIs for accessing surface's current buffer and etc. Change-Id: Ic9508440c605c39fc09c825dfb391cc7ff02c527 --- src/pepper-internal.h | 11 +++--- src/pepper.h | 19 +++++++++++ src/surface.c | 79 ++++++++++++++++++++++++++++++++----------- 3 files changed, 85 insertions(+), 24 deletions(-) diff --git a/src/pepper-internal.h b/src/pepper-internal.h index ae816ad..2f6a6c3 100644 --- a/src/pepper-internal.h +++ b/src/pepper-internal.h @@ -8,7 +8,6 @@ typedef struct pepper_region pepper_region_t; typedef struct pepper_surface_state pepper_surface_state_t; -typedef struct pepper_buffer pepper_buffer_t; typedef struct pepper_data_source pepper_data_source_t; typedef struct pepper_data_device pepper_data_device_t; typedef struct pepper_data_offer pepper_data_offer_t; @@ -96,10 +95,12 @@ struct pepper_surface /* Surface states. wl_surface.commit will apply the pending state into current. */ pepper_surface_state_t pending; - pepper_buffer_t *buffer; - int32_t offset_x, offset_y; - int32_t transform; - int32_t scale; + struct { + pepper_buffer_t *buffer; + int32_t x, y; + int32_t transform; + int32_t scale; + } buffer; int32_t w, h; diff --git a/src/pepper.h b/src/pepper.h index 23ec358..e93666e 100644 --- a/src/pepper.h +++ b/src/pepper.h @@ -40,6 +40,7 @@ typedef struct pepper_renderer pepper_renderer_t; typedef struct pepper_surface pepper_surface_t; typedef struct pepper_view pepper_view_t; typedef struct pepper_layer pepper_layer_t; +typedef struct pepper_buffer pepper_buffer_t; typedef struct pepper_matrix pepper_matrix_t; @@ -292,6 +293,24 @@ pepper_surface_get_role(pepper_surface_t *surface); PEPPER_API pepper_bool_t pepper_surface_set_role(pepper_surface_t *surface, const char *role); +PEPPER_API void +pepper_surface_set_user_data(pepper_surface_t *surface, uint32_t key, void *data); + +PEPPER_API void * +pepper_surface_get_user_data(pepper_surface_t *surface, uint32_t key); + +PEPPER_API pepper_buffer_t * +pepper_surface_get_buffer(pepper_surface_t *surface); + +PEPPER_API void +pepper_surface_get_buffer_offset(pepper_surface_t *surface, int32_t *x, int32_t *y); + +PEPPER_API int32_t +pepper_surface_get_buffer_scale(pepper_surface_t *surface); + +PEPPER_API int32_t +pepper_surface_get_buffer_transform(pepper_surface_t *surface); + /* View. */ PEPPER_API pepper_view_t * pepper_view_create(pepper_compositor_t *compositor, pepper_surface_t *surface); diff --git a/src/surface.c b/src/surface.c index c2bb376..c42f67d 100644 --- a/src/surface.c +++ b/src/surface.c @@ -251,8 +251,8 @@ pepper_surface_create(pepper_compositor_t *compositor, pepper_surface_state_init(&surface->pending); - surface->transform = WL_OUTPUT_TRANSFORM_NORMAL; - surface->scale = 1; + surface->buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL; + surface->buffer.scale = 1; pixman_region32_init(&surface->damage_region); pixman_region32_init(&surface->opaque_region); @@ -273,8 +273,8 @@ pepper_surface_destroy(pepper_surface_t *surface) pepper_surface_state_fini(&surface->pending); - if (surface->buffer) - pepper_buffer_unreference(surface->buffer); + if (surface->buffer.buffer) + pepper_buffer_unreference(surface->buffer.buffer); pixman_region32_fini(&surface->damage_region); pixman_region32_fini(&surface->opaque_region); @@ -292,15 +292,15 @@ pepper_surface_commit(pepper_surface_t *surface) { pepper_buffer_reference(surface->pending.buffer); - if (surface->buffer) - pepper_buffer_unreference(surface->buffer); + if (surface->buffer.buffer) + pepper_buffer_unreference(surface->buffer.buffer); /* Commit buffer attachment states. */ - surface->buffer = surface->pending.buffer; - surface->offset_x += surface->pending.x; - surface->offset_y += surface->pending.y; - surface->transform = surface->pending.transform; - surface->scale = surface->pending.scale; + surface->buffer.buffer = surface->pending.buffer; + surface->buffer.x += surface->pending.x; + surface->buffer.y += surface->pending.y; + surface->buffer.transform = surface->pending.transform; + surface->buffer.scale = surface->pending.scale; /* Stop listening on buffer destruction signal of the pending state. */ if (surface->pending.buffer) @@ -314,28 +314,28 @@ pepper_surface_commit(pepper_surface_t *surface) surface->w = 0; surface->h = 0; - if (surface->buffer) + if (surface->buffer.buffer) { - switch (surface->transform) + switch (surface->buffer.transform) { case WL_OUTPUT_TRANSFORM_NORMAL: case WL_OUTPUT_TRANSFORM_180: case WL_OUTPUT_TRANSFORM_FLIPPED_180: - surface->w = surface->buffer->w; - surface->h = surface->buffer->h; + surface->w = surface->buffer.buffer->w; + surface->h = surface->buffer.buffer->h; break; case WL_OUTPUT_TRANSFORM_90: case WL_OUTPUT_TRANSFORM_270: case WL_OUTPUT_TRANSFORM_FLIPPED_90: case WL_OUTPUT_TRANSFORM_FLIPPED_270: - surface->w = surface->buffer->h; - surface->h = surface->buffer->w; + surface->w = surface->buffer.buffer->h; + surface->h = surface->buffer.buffer->w; break; } } - surface->w /= surface->scale; - surface->h /= surface->scale; + surface->w /= surface->buffer.scale; + surface->h /= surface->buffer.scale; /* Commit damage region. Pending state's damage is consumed by commit. */ pixman_region32_union(&surface->damage_region, @@ -373,3 +373,44 @@ pepper_surface_set_role(pepper_surface_t *surface, const char *role) return PEPPER_TRUE; } + +PEPPER_API void +pepper_surface_set_user_data(pepper_surface_t *surface, uint32_t key, void *data) +{ + /* TODO: */ +} + +PEPPER_API void * +pepper_surface_get_user_data(pepper_surface_t *surface, uint32_t key) +{ + /* TODO: */ + return NULL; +} + +PEPPER_API pepper_buffer_t * +pepper_surface_get_buffer(pepper_surface_t *surface) +{ + return surface->buffer.buffer; +} + +PEPPER_API void +pepper_surface_get_buffer_offset(pepper_surface_t *surface, int32_t *x, int32_t *y) +{ + if (x) + *x = surface->buffer.x; + + if (y) + *y = surface->buffer.y; +} + +PEPPER_API int32_t +pepper_surface_get_buffer_scale(pepper_surface_t *surface) +{ + return surface->buffer.scale; +} + +PEPPER_API int32_t +pepper_surface_get_buffer_transform(pepper_surface_t *surface) +{ + return surface->buffer.transform; +} -- 2.34.1