render: initial impl. of pixman repaint()
authorYuyeon Oh <yuyeon.oh@samsung.com>
Tue, 23 Jun 2015 13:49:29 +0000 (22:49 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Tue, 7 Jul 2015 06:56:51 +0000 (15:56 +0900)
Change-Id: I407c35b7df9448885eae25511737edb74b290510

render/src/pixman-renderer.c

index fb4d2d1..22a9a0d 100644 (file)
@@ -1,6 +1,5 @@
 #include "pepper-pixman-renderer.h"
 #include "pepper-render-internal.h"
-#include <stdlib.h>
 
 typedef struct pixman_renderer      pixman_renderer_t;
 typedef struct pixman_surface_state pixman_surface_state_t;
@@ -229,23 +228,75 @@ pixman_renderer_read_pixels(pepper_renderer_t *renderer,
 }
 
 static void
+repaint_view(pepper_renderer_t *renderer, pepper_object_t *output, pepper_view_state_t *view_state,
+             const pixman_region32_t *global_damage) /* global coordinate */
+{
+    pixman_region32_t repaint;
+    pixman_image_t *dest = ((pixman_render_target_t *)renderer->target)->image;
+    pepper_object_t *view = view_state->view;
+    pepper_object_t *view_surf = pepper_view_get_surface(view);
+    pixman_surface_state_t *ps = get_surface_state(renderer, view_surf);
+    const pixman_region32_t *visible = view_state->visible;
+    const pepper_output_geometry_t *geometry;
+    const pepper_mat4_t *transform = view_state->transform;
+    int viewport_x, viewport_y, viewport_w, viewport_h;
+
+    if (!ps->image || !dest)
+        return;
+
+    pixman_region32_init(&repaint);
+    pixman_region32_intersect(&repaint, (pixman_region32_t*) visible,
+                              (pixman_region32_t*) global_damage);
+
+    if (pixman_region32_not_empty(&repaint))
+    {
+        /* damage region global to output */
+        geometry = pepper_output_get_geometry(output);
+        pixman_region32_translate(&repaint, -geometry->x, -geometry->y);
+        /* set clip on target destination */
+        pixman_image_set_clip_region32(dest, &repaint);
+        /* get viewport */
+        /* TODO: consider transform such as rotation */
+        viewport_x = transform->m[3];
+        viewport_y = transform->m[7];
+        pepper_view_get_size(view, &viewport_w, &viewport_h);
+        /* composite */
+        pixman_image_composite32(PIXMAN_OP_SRC, ps->image, NULL, dest,
+                                 0, 0, /* src_x, src_y */
+                                 0, 0, /* mask_x, mask_y */
+                                 viewport_x, viewport_y, /* dest_x, dest_y */
+                                 viewport_w, viewport_h);
+    }
+
+    pixman_region32_fini(&repaint);
+}
+
+static void
 pixman_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output,
-                               const pepper_list_t *view_list, const pixman_region32_t *damage)
+                               const pepper_list_t *view_list, const pixman_region32_t *output_damage)
 {
-    pixman_image_t *dst = ((pixman_render_target_t *)renderer->target)->image;
+    const pixman_image_t *dst = ((pixman_render_target_t *)renderer->target)->image;
+    const pepper_list_t *cur_list;
+    pepper_view_state_t *view_state;
+    const pepper_output_geometry_t *geometry;
+    pixman_region32_t global_damage;
 
-    if (dst && pixman_region32_not_empty((pixman_region32_t*)damage))
+    if (dst && pixman_region32_not_empty((pixman_region32_t*) output_damage))
     {
-        pixman_fill(pixman_image_get_data(dst),
-                    pixman_image_get_stride(dst) / sizeof(uint32_t),
-                    PIXMAN_FORMAT_BPP(pixman_image_get_format(dst)),
-                    0, 0,
-                    pixman_image_get_width(dst),
-                    pixman_image_get_height(dst),
-                    0x00000000);
+        /* translate damage to global coordinate */
+        geometry = pepper_output_get_geometry(output);
+        pixman_region32_init(&global_damage);
+        pixman_region32_copy(&global_damage, (pixman_region32_t*) output_damage);
+        pixman_region32_translate(&global_damage, geometry->x, geometry->y);
+
+        PEPPER_LIST_FOR_EACH_REVERSE(view_list, cur_list)
+        {
+            view_state = cur_list->item;
+            repaint_view(renderer, output, view_state, (const pixman_region32_t *) &global_damage);
+        }
+
+        pixman_region32_fini(&global_damage);
     }
-
-    /* TODO: */
 }
 
 PEPPER_API pepper_renderer_t *