1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.  All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_translate.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "matrix.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "renderer.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util_array.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "api_consts.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "shader.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_tile.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_format vg_format_to_pipe(VGImageFormat format)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(format) {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_sRGB_565:
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B5G6R5_UNORM;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_sRGBA_5551:
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B5G5R5A1_UNORM;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_sRGBA_4444:
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B4G4R4A4_UNORM;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_sL_8:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_lL_8:
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_L8_UNORM;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BW_1:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8A8_UNORM;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_A_8:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8_UNORM;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef OPENVG_VERSION_1_1
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_A_1:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_A_4:
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8_UNORM;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8A8_UNORM;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void vg_sync_size(VGfloat *src_loc, VGfloat *dst_loc)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[2] = MIN2(src_loc[2], dst_loc[2]);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[3] = MIN2(src_loc[3], dst_loc[3]);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[2] = src_loc[2];
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[3] = src_loc[3];
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vg_get_copy_coords(VGfloat *src_loc,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               VGfloat src_width, VGfloat src_height,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               VGfloat *dst_loc,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               VGfloat dst_width, VGfloat dst_height)
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat dst_bounds[4], src_bounds[4];
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat src_shift[4], dst_shift[4], shift[4];
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_bounds[0] = 0.f;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_bounds[1] = 0.f;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_bounds[2] = dst_width;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_bounds[3] = dst_height;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_bounds[0] = 0.f;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_bounds[1] = 0.f;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_bounds[2] = src_width;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_bounds[3] = src_height;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_bound_rect(src_loc, src_bounds, src_shift);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_bound_rect(dst_loc, dst_bounds, dst_shift);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shift[0] = src_shift[0] - dst_shift[0];
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shift[1] = src_shift[1] - dst_shift[1];
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shift[0] < 0)
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_shift_rectx(src_loc, src_bounds, -shift[0]);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_shift_rectx(dst_loc, dst_bounds, shift[0]);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shift[1] < 0)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_shift_recty(src_loc, src_bounds, -shift[1]);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_shift_recty(dst_loc, dst_bounds, shift[1]);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_sync_size(src_loc, dst_loc);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vg_copy_texture(struct vg_context *ctx,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct pipe_resource *dst, VGint dx, VGint dy,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct pipe_sampler_view *src, VGint sx, VGint sy,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            VGint width, VGint height)
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat dst_loc[4], src_loc[4];
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[0] = dx;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[1] = dy;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[2] = width;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[3] = height;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[0] = sx;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[1] = sy;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[2] = width;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[3] = height;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_get_copy_coords(src_loc, src->texture->width0, src->texture->height0,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      dst_loc, dst->width0, dst->height0);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src_loc[2] >= 0 && src_loc[3] >= 0 &&
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dst_loc[2] >= 0 && dst_loc[3] >= 0) {
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_surface *surf, surf_tmpl;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* get the destination surface */
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      u_surface_default_template(&surf_tmpl, dst, PIPE_BIND_RENDER_TARGET);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surf = ctx->pipe->create_surface(ctx->pipe, dst, &surf_tmpl);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surf && renderer_copy_begin(ctx->renderer, surf, VG_TRUE, src)) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy(ctx->renderer,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dst_loc[0], dst_loc[1], dst_loc[2], dst_loc[3],
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src_loc[0], src_loc[1], src_loc[2], src_loc[3]);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy_end(ctx->renderer);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_surface_reference(&surf, NULL);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_copy_surface(struct vg_context *ctx,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct pipe_surface *dst, VGint dx, VGint dy,
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct pipe_surface *src, VGint sx, VGint sy,
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     VGint width, VGint height)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat dst_loc[4], src_loc[4];
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[0] = dx;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[1] = dy;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[2] = width;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst_loc[3] = height;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[0] = sx;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[1] = sy;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[2] = width;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src_loc[3] = height;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_get_copy_coords(src_loc, src->width, src->height,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      dst_loc, dst->width, dst->height);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src_loc[2] > 0 && src_loc[3] > 0 &&
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dst_loc[2] > 0 && dst_loc[3] > 0) {
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (src == dst)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy_surface(ctx->renderer,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src_loc[0],
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src->height - (src_loc[1] + src_loc[3]),
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src_loc[0] + src_loc[2],
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src->height - src_loc[1],
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst_loc[0],
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst->height - (dst_loc[1] + dst_loc[3]),
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst_loc[0] + dst_loc[2],
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst->height - dst_loc[1],
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               0, 0);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy_surface(ctx->renderer,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src_loc[0],
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src->height - src_loc[1],
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src_loc[0] + src_loc[2],
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               src->height - (src_loc[1] + src_loc[3]),
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst_loc[0],
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst->height - (dst_loc[1] + dst_loc[3]),
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst_loc[0] + dst_loc[2],
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst->height - dst_loc[1],
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               0, 0);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *image_texture(struct vg_image *img)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *tex = img->sampler_view->texture;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return tex;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void image_cleari(struct vg_image *img, VGint clear_colori,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         VGint x, VGint y, VGint width, VGint height)
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint *clearbuf;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat dwidth, dheight;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   clearbuf = malloc(sizeof(VGint)*width*height);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < width*height; ++i)
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      clearbuf[i] = clear_colori;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dwidth = MIN2(width, img->width);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dheight = MIN2(height, img->height);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image_sub_data(img, clearbuf, width * sizeof(VGint),
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  VG_sRGBA_8888,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  x, y, dwidth, dheight);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(clearbuf);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_image * image_create(VGImageFormat format,
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               VGint width, VGint height)
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_image *image = CALLOC_STRUCT(vg_image);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format pformat = vg_format_to_pipe(format);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource pt, *newtex;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view view_templ;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view *view;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = ctx->pipe->screen;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->format = format;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->width = width;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->height = height;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.normalized_coords = 1;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(screen->is_format_supported(screen, pformat, PIPE_TEXTURE_2D,
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      0, PIPE_BIND_SAMPLER_VIEW));
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&pt, 0, sizeof(pt));
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.target = PIPE_TEXTURE_2D;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.format = pformat;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.last_level = 0;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.width0 = width;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.height0 = height;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.depth0 = 1;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.array_size = 1;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pt.bind = PIPE_BIND_SAMPLER_VIEW;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newtex = screen->resource_create(screen, &pt);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_assert(newtex);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_sampler_view_default_template(&view_templ, newtex, newtex->format);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* R, G, and B are treated as 1.0 for alpha-only formats in OpenVG */
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (newtex->format == PIPE_FORMAT_A8_UNORM) {
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view_templ.swizzle_r = PIPE_SWIZZLE_ONE;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view_templ.swizzle_g = PIPE_SWIZZLE_ONE;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view_templ.swizzle_b = PIPE_SWIZZLE_ONE;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   view = pipe->create_sampler_view(pipe, newtex, &view_templ);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* want the texture to go away if the view is freed */
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&newtex, NULL);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler_view = view;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_context_add_object(ctx, &image->base);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image_cleari(image, 0, 0, 0, image->width, image->height);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return image;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_destroy(struct vg_image *img)
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_context_remove_object(ctx, &img->base);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img->parent) {
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* remove img from the parent child array */
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int idx;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct vg_image **array =
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (struct vg_image **)img->parent->children_array->data;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (idx = 0; idx < img->parent->children_array->num_elements; ++idx) {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct vg_image *child = array[idx];
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (child == img) {
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_assert(idx < img->parent->children_array->num_elements);
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      array_remove_element(img->parent->children_array, idx);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img->children_array && img->children_array->num_elements) {
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* reparent the children */
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGint i;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct vg_image *parent = img->parent;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct vg_image **children =
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (struct vg_image **)img->children_array->data;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parent) {
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint min_x = children[0]->x;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         parent = children[0];
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 1; i < img->children_array->num_elements; ++i) {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct vg_image *child = children[i];
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (child->x < min_x) {
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               parent = child;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < img->children_array->num_elements; ++i) {
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct vg_image *child = children[i];
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (child != parent) {
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            child->parent = parent;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!parent->children_array) {
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               parent->children_array = array_create(
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  sizeof(struct vg_image*));
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            array_append_data(parent->children_array,
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &child, 1);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            child->parent = NULL;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      array_destroy(img->children_array);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_free_object(&img->base);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_sampler_view_reference(&img->sampler_view, NULL);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(img);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_clear(struct vg_image *img,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 VGint x, VGint y, VGint width, VGint height)
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat *clear_colorf = ctx->state.vg.clear_color;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGubyte r, g, b ,a;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint clear_colori;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: this is very nasty */
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r = float_to_ubyte(clear_colorf[0]);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   g = float_to_ubyte(clear_colorf[1]);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   b = float_to_ubyte(clear_colorf[2]);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   a = float_to_ubyte(clear_colorf[3]);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   clear_colori = r << 24 | g << 16 | b << 8 | a;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image_cleari(img, clear_colori, x, y, width, height);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_sub_data(struct vg_image *image,
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const void * data,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint dataStride,
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGImageFormat dataFormat,
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint x, VGint y,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint width, VGint height)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const VGint yStep = 1;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGubyte *src = (VGubyte *)data;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat *df = (VGfloat*)temp;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *texture = image_texture(image);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint xoffset = 0, yoffset = 0;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (x < 0) {
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xoffset -= x;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width += x;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x = 0;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (y < 0) {
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      yoffset -= y;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height += y;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y = 0;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width <= 0 || height <= 0) {
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (x > image->width || y > image->width) {
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (x + width > image->width) {
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width = image->width - x;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (y + height > image->height) {
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = image->height - y;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { /* upload color_data */
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_transfer *transfer = pipe_get_transfer(
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe, texture, 0, 0,
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PIPE_TRANSFER_WRITE, 0, 0, texture->width0, texture->height0);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src += (dataStride * yoffset);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < height; i++) {
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _vega_unpack_float_span_rgba(ctx, width, xoffset, src, dataFormat, temp);
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_put_tile_rgba(pipe, transfer, x+image->x, y+image->y, width, 1, df);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         y += yStep;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src += dataStride;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe->transfer_destroy(pipe, transfer);
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_get_sub_data(struct vg_image * image,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        void * data,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        VGint dataStride,
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        VGImageFormat dataFormat,
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        VGint sx, VGint sy,
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        VGint width, VGint height)
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat *df = (VGfloat*)temp;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint y = 0, yStep = 1;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGubyte *dst = (VGubyte *)data;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_transfer *transfer =
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_get_transfer(pipe,
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           image->sampler_view->texture,  0, 0,
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           PIPE_TRANSFER_READ,
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           0, 0,
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           image->x + image->width,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           image->y + image->height);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Do a row at a time to flip image data vertically */
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < height; i++) {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         debug_printf("%d-%d  == %d\n", sy, height, y);
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_get_tile_rgba(pipe, transfer, sx+image->x, y, width, 1, df);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         y += yStep;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _vega_pack_rgba_span_float(ctx, width, temp, dataFormat, dst);
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst += dataStride;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe->transfer_destroy(pipe, transfer);
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_image * image_child_image(struct vg_image *parent,
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    VGint x, VGint y,
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    VGint width, VGint height)
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_image *image = CALLOC_STRUCT(vg_image);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->x = parent->x + x;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->y = parent->y + y;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->width = width;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->height = height;
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->parent = parent;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler_view = NULL;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_sampler_view_reference(&image->sampler_view,
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               parent->sampler_view);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   image->sampler.normalized_coords = 1;
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parent->children_array)
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      parent->children_array = array_create(
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sizeof(struct vg_image*));
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array_append_data(parent->children_array,
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &image, 1);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_context_add_object(ctx, &image->base);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return image;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_copy(struct vg_image *dst, VGint dx, VGint dy,
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct vg_image *src, VGint sx, VGint sy,
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                VGint width, VGint height,
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                VGboolean dither)
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width <= 0 || height <= 0) {
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_copy_texture(ctx, dst->sampler_view->texture, dst->x + dx, dst->y + dy,
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   src->sampler_view, src->x + sx, src->y + sy, width, height);
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_draw(struct vg_image *img, struct matrix *matrix)
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix paint_matrix;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat x1, y1;
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat x2, y2;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat x3, y3;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat x4, y4;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!vg_get_paint_matrix(ctx,
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            &ctx->state.vg.fill_paint_to_user_matrix,
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            matrix,
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            &paint_matrix))
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x1 = 0;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y1 = 0;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x2 = img->width;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y2 = 0;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x3 = img->width;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y3 = img->height;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x4 = 0;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y4 = img->height;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_set_surface_matrix(ctx->shader, matrix);
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_set_drawing_image(ctx->shader, VG_TRUE);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_set_paint(ctx->shader, ctx->state.vg.fill_paint);
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_set_paint_matrix(ctx->shader, &paint_matrix);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_set_image(ctx->shader, img);
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   shader_bind(ctx->shader);
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_texture_quad(ctx->renderer, image_texture(img),
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         img->x, img->y, img->x + img->width, img->y + img->height,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         x1, y1, x2, y2, x3, y3, x4, y4);
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_set_pixels(VGint dx, VGint dy,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      struct vg_image *src, VGint sx, VGint sy,
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint width, VGint height)
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_surface *surf, surf_tmpl;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_renderbuffer *strb = ctx->draw_buffer->strb;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&surf_tmpl, 0, sizeof(surf_tmpl));
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_surface_default_template(&surf_tmpl, image_texture(src),
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              0 /* no bind flag - not a surface*/);
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = pipe->create_surface(pipe, image_texture(src), &surf_tmpl);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_copy_surface(ctx, strb->surface, dx, dy,
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   surf, sx+src->x, sy+src->y, width, height);
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->surface_destroy(pipe, surf);
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid image_get_pixels(struct vg_image *dst, VGint dx, VGint dy,
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint sx, VGint sy,
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint width, VGint height)
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vg_context *ctx = vg_current_context();
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_surface *surf, surf_tmpl;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_renderbuffer *strb = ctx->draw_buffer->strb;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* flip the y coordinates */
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*dy = dst->height - dy - height;*/
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&surf_tmpl, 0, sizeof(surf_tmpl));
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_surface_default_template(&surf_tmpl, image_texture(dst),
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              PIPE_BIND_RENDER_TARGET);
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = pipe->create_surface(pipe, image_texture(dst), &surf_tmpl);
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_copy_surface(ctx, surf, dst->x + dx, dst->y + dy,
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   strb->surface, sx, sy, width, height);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_surface_reference(&surf, NULL);
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean vg_image_overlaps(struct vg_image *dst,
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct vg_image *src)
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst == src || dst->parent == src ||
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dst == src->parent)
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_TRUE;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst->parent && dst->parent == src->parent) {
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat left1 = dst->x;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat left2 = src->x;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat right1 = dst->x + dst->width;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat right2 = src->x + src->width;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat bottom1 = dst->y;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat bottom2 = src->y;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat top1 = dst->y + dst->height;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VGfloat top2 = src->y + src->height;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return !(left2 > right1 || right2 < left1 ||
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               top2 > bottom1 || bottom2 < top1);
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_FALSE;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGint image_bind_samplers(struct vg_image *img, struct pipe_sampler_state **samplers,
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct pipe_sampler_view **sampler_views)
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->sampler.min_img_filter = image_sampler_filter(img->base.ctx);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img->sampler.mag_img_filter = image_sampler_filter(img->base.ctx);
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   samplers[3] = &img->sampler;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_views[3] = img->sampler_view;
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 1;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGint image_sampler_filter(struct vg_context *ctx)
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    switch(ctx->state.vg.image_quality) {
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case VG_IMAGE_QUALITY_NONANTIALIASED:
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return PIPE_TEX_FILTER_NEAREST;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       break;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case VG_IMAGE_QUALITY_FASTER:
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return PIPE_TEX_FILTER_NEAREST;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       break;
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case VG_IMAGE_QUALITY_BETTER:
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       /* possibly use anisotropic filtering */
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return PIPE_TEX_FILTER_LINEAR;
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       break;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       debug_printf("Unknown image quality");
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return PIPE_TEX_FILTER_NEAREST;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
655