e_comp_wl_output_buffer_transform_get(E_Client *ec)
{
E_Surface *surface;
- E_Comp_Wl_Buffer *buffer;
- enum wl_output_transform buffer_transform, transform, rotation;
if (!ec) return WL_OUTPUT_TRANSFORM_NORMAL;
- if (e_object_is_del(E_OBJECT(ec))) return WL_OUTPUT_TRANSFORM_NORMAL;
surface = e_surface_try_from_ec(ec);
if (!surface)
return WL_OUTPUT_TRANSFORM_NORMAL;
- buffer_transform = e_surface_buffer_transform_get(surface);
-
- buffer = e_surface_buffer_try_get(surface);
-
- if (!buffer ||
- (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE && buffer->type != E_COMP_WL_BUFFER_TYPE_TBM))
- return buffer_transform;
-
- rotation = buffer->transform;
- if (rotation == 0)
- return buffer_transform;
-
- /* ignore the flip value when calculating transform because the screen rotation
- * functionality doesn't consider the flip output transform currently
- */
- transform = (4 + (buffer_transform & 0x3) - rotation) & 0x3;
-
- DBG("ec(%p) window rotation(%d) buffer_transform(%d) : transform(%d)",
- ec, rotation, buffer_transform, transform);
-
- return transform;
+ return e_surface_buffer_transform_get(surface);
}
EINTERN enum wl_output_transform
#include <libds/single_pixel_buffer_v1.h>
+#include <wayland-server-protocol.h>
#include <wayland-tbm-server.h>
typedef struct _E_Buffer E_Buffer;
if (!viewport) return;
viewport->wait_for_transform_change = wait_for_transform_change;
}
+
+EINTERN enum wl_output_transform
+e_comp_wl_buffer_window_rotation_get(E_Comp_Wl_Buffer *buffer)
+{
+ if (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE &&
+ buffer->type != E_COMP_WL_BUFFER_TYPE_TBM)
+ return WL_OUTPUT_TRANSFORM_NORMAL;
+
+ return buffer->transform;
+}
void *e_comp_wl_buffer_single_pixel_buffer_data_get(E_Comp_Wl_Buffer *buffer);
void e_comp_wl_buffer_size_get(E_Comp_Wl_Buffer *comp_buffer, int32_t *width, int32_t *height);
void e_comp_wl_buffer_damage_region_set(E_Comp_Wl_Buffer *buffer, pixman_region32_t *damage);
+enum wl_output_transform e_comp_wl_buffer_window_rotation_get(E_Comp_Wl_Buffer *buffer);
#endif
#include <libds/types/ds_subsurface.h>
#include <libds-tizen/surface_exporter.h>
#include <wayland-server-core.h>
+#include <wayland-server-protocol.h>
typedef struct _E_Subsurface E_Subsurface;
typedef struct _E_Subsurface_View E_Subsurface_View;
EINTERN enum wl_output_transform
e_surface_buffer_transform_get(E_Surface *surface)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL(surface, WL_OUTPUT_TRANSFORM_NORMAL);
+ E_Comp_Wl_Buffer *buffer;
+ enum wl_output_transform buffer_transform;
- return surface->base.scaler.buffer_viewport.buffer.transform;
+ buffer_transform = surface->base.scaler.buffer_viewport.buffer.transform;
+ buffer = surface->base.buffer_ref.buffer;
+ if (!buffer)
+ return buffer_transform;
+
+ /* NOTE: Subtract window_rotation value from buffer_transform
+ *
+ * In Tizen environment, we support window rotation by having clients include
+ * the window rotation value in the buffer_transform. The window rotation
+ * value is passed as the transform value of wayland_tbm buffers.
+ *
+ * To return the actual buffer transform set by the client, we need to
+ * subtract the window rotation value from the buffer_transform.
+ */
+
+ /* ignore the flip value when calculating transform because the screen rotation
+ * functionality doesn't consider the flip output transform currently
+ */
+ return (4 + (buffer_transform & 0x3) - e_comp_wl_buffer_window_rotation_get(buffer)) & 0x3;
}
EINTERN E_Comp_Wl_Buffer *